Skip to content

Commit b2a667b

Browse files
committed
Add a new option to RestoreBkpBlocks() to indicate if a cleanup lock should
be used instead of the normal exclusive lock, and make WAL redo functions responsible for calling RestoreBkpBlocks(). They know better what kind of a lock they need. At the moment, this just moves things around with no functional change, but makes the hot standby patch that's under review cleaner.
1 parent b287f0a commit b2a667b

File tree

15 files changed

+95
-36
lines changed

15 files changed

+95
-36
lines changed

src/backend/access/gin/ginxlog.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/access/gin/ginxlog.c,v 1.16 2009/01/01 17:23:34 momjian Exp $
11+
* $PostgreSQL: pgsql/src/backend/access/gin/ginxlog.c,v 1.17 2009/01/20 18:59:36 heikki Exp $
1212
*-------------------------------------------------------------------------
1313
*/
1414
#include "postgres.h"
@@ -438,6 +438,8 @@ gin_redo(XLogRecPtr lsn, XLogRecord *record)
438438
{
439439
uint8 info = record->xl_info & ~XLR_INFO_MASK;
440440

441+
RestoreBkpBlocks(lsn, record, false);
442+
441443
topCtx = MemoryContextSwitchTo(opCtx);
442444
switch (info)
443445
{

src/backend/access/gist/gistxlog.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/access/gist/gistxlog.c,v 1.31 2009/01/01 17:23:35 momjian Exp $
11+
* $PostgreSQL: pgsql/src/backend/access/gist/gistxlog.c,v 1.32 2009/01/20 18:59:36 heikki Exp $
1212
*-------------------------------------------------------------------------
1313
*/
1414
#include "postgres.h"
@@ -394,9 +394,10 @@ void
394394
gist_redo(XLogRecPtr lsn, XLogRecord *record)
395395
{
396396
uint8 info = record->xl_info & ~XLR_INFO_MASK;
397-
398397
MemoryContext oldCxt;
399398

399+
RestoreBkpBlocks(lsn, record, false);
400+
400401
oldCxt = MemoryContextSwitchTo(opCtx);
401402
switch (info)
402403
{

src/backend/access/heap/heapam.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.273 2009/01/01 17:23:35 momjian Exp $
11+
* $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.274 2009/01/20 18:59:36 heikki Exp $
1212
*
1313
*
1414
* INTERFACE ROUTINES
@@ -4777,6 +4777,8 @@ heap_redo(XLogRecPtr lsn, XLogRecord *record)
47774777
{
47784778
uint8 info = record->xl_info & ~XLR_INFO_MASK;
47794779

4780+
RestoreBkpBlocks(lsn, record, false);
4781+
47804782
switch (info & XLOG_HEAP_OPMASK)
47814783
{
47824784
case XLOG_HEAP_INSERT:
@@ -4816,12 +4818,15 @@ heap2_redo(XLogRecPtr lsn, XLogRecord *record)
48164818
switch (info & XLOG_HEAP_OPMASK)
48174819
{
48184820
case XLOG_HEAP2_FREEZE:
4821+
RestoreBkpBlocks(lsn, record, false);
48194822
heap_xlog_freeze(lsn, record);
48204823
break;
48214824
case XLOG_HEAP2_CLEAN:
4825+
RestoreBkpBlocks(lsn, record, true);
48224826
heap_xlog_clean(lsn, record, false);
48234827
break;
48244828
case XLOG_HEAP2_CLEAN_MOVE:
4829+
RestoreBkpBlocks(lsn, record, true);
48254830
heap_xlog_clean(lsn, record, true);
48264831
break;
48274832
default:

src/backend/access/nbtree/nbtxlog.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/access/nbtree/nbtxlog.c,v 1.53 2009/01/01 17:23:36 momjian Exp $
11+
* $PostgreSQL: pgsql/src/backend/access/nbtree/nbtxlog.c,v 1.54 2009/01/20 18:59:37 heikki Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -714,6 +714,8 @@ btree_redo(XLogRecPtr lsn, XLogRecord *record)
714714
{
715715
uint8 info = record->xl_info & ~XLR_INFO_MASK;
716716

717+
RestoreBkpBlocks(lsn, record, false);
718+
717719
switch (info)
718720
{
719721
case XLOG_BTREE_INSERT_LEAF:

src/backend/access/transam/clog.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
2727
* Portions Copyright (c) 1994, Regents of the University of California
2828
*
29-
* $PostgreSQL: pgsql/src/backend/access/transam/clog.c,v 1.51 2009/01/01 17:23:36 momjian Exp $
29+
* $PostgreSQL: pgsql/src/backend/access/transam/clog.c,v 1.52 2009/01/20 18:59:37 heikki Exp $
3030
*
3131
*-------------------------------------------------------------------------
3232
*/
@@ -684,6 +684,9 @@ clog_redo(XLogRecPtr lsn, XLogRecord *record)
684684
{
685685
uint8 info = record->xl_info & ~XLR_INFO_MASK;
686686

687+
/* Backup blocks are not used in clog records */
688+
Assert(!(record->xl_info & XLR_BKP_BLOCK_MASK));
689+
687690
if (info == CLOG_ZEROPAGE)
688691
{
689692
int pageno;

src/backend/access/transam/multixact.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
4343
* Portions Copyright (c) 1994, Regents of the University of California
4444
*
45-
* $PostgreSQL: pgsql/src/backend/access/transam/multixact.c,v 1.29 2009/01/01 17:23:36 momjian Exp $
45+
* $PostgreSQL: pgsql/src/backend/access/transam/multixact.c,v 1.30 2009/01/20 18:59:37 heikki Exp $
4646
*
4747
*-------------------------------------------------------------------------
4848
*/
@@ -1870,6 +1870,9 @@ multixact_redo(XLogRecPtr lsn, XLogRecord *record)
18701870
{
18711871
uint8 info = record->xl_info & ~XLR_INFO_MASK;
18721872

1873+
/* Backup blocks are not used in multixact records */
1874+
Assert(!(record->xl_info & XLR_BKP_BLOCK_MASK));
1875+
18731876
if (info == XLOG_MULTIXACT_ZERO_OFF_PAGE)
18741877
{
18751878
int pageno;

src/backend/access/transam/xact.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*
1111
*
1212
* IDENTIFICATION
13-
* $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.271 2009/01/01 17:23:36 momjian Exp $
13+
* $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.272 2009/01/20 18:59:37 heikki Exp $
1414
*
1515
*-------------------------------------------------------------------------
1616
*/
@@ -4308,6 +4308,9 @@ xact_redo(XLogRecPtr lsn, XLogRecord *record)
43084308
{
43094309
uint8 info = record->xl_info & ~XLR_INFO_MASK;
43104310

4311+
/* Backup blocks are not used in xact records */
4312+
Assert(!(record->xl_info & XLR_BKP_BLOCK_MASK));
4313+
43114314
if (info == XLOG_XACT_COMMIT)
43124315
{
43134316
xl_xact_commit *xlrec = (xl_xact_commit *) XLogRecGetData(record);

src/backend/access/transam/xlog.c

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
10-
* $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.327 2009/01/11 18:02:17 tgl Exp $
10+
* $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.328 2009/01/20 18:59:37 heikki Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -2922,9 +2922,15 @@ CleanupBackupHistory(void)
29222922
* page might not be. This will force us to replay all subsequent
29232923
* modifications of the page that appear in XLOG, rather than possibly
29242924
* ignoring them as already applied, but that's not a huge drawback.
2925+
*
2926+
* If 'cleanup' is true, a cleanup lock is used when restoring blocks.
2927+
* Otherwise, a normal exclusive lock is used. At the moment, that's just
2928+
* pro forma, because there can't be any regular backends in the system
2929+
* during recovery. The 'cleanup' argument applies to all backup blocks
2930+
* in the WAL record, that suffices for now.
29252931
*/
2926-
static void
2927-
RestoreBkpBlocks(XLogRecord *record, XLogRecPtr lsn)
2932+
void
2933+
RestoreBkpBlocks(XLogRecPtr lsn, XLogRecord *record, bool cleanup)
29282934
{
29292935
Buffer buffer;
29302936
Page page;
@@ -2944,6 +2950,11 @@ RestoreBkpBlocks(XLogRecord *record, XLogRecPtr lsn)
29442950
buffer = XLogReadBufferExtended(bkpb.node, bkpb.fork, bkpb.block,
29452951
RBM_ZERO);
29462952
Assert(BufferIsValid(buffer));
2953+
if (cleanup)
2954+
LockBufferForCleanup(buffer);
2955+
else
2956+
LockBuffer(buffer, BUFFER_LOCK_EXCLUSIVE);
2957+
29472958
page = (Page) BufferGetPage(buffer);
29482959

29492960
if (bkpb.hole_length == 0)
@@ -5199,9 +5210,6 @@ StartupXLOG(void)
51995210
TransactionIdAdvance(ShmemVariableCache->nextXid);
52005211
}
52015212

5202-
if (record->xl_info & XLR_BKP_BLOCK_MASK)
5203-
RestoreBkpBlocks(record, EndRecPtr);
5204-
52055213
RmgrTable[record->xl_rmid].rm_redo(EndRecPtr, record);
52065214

52075215
/* Pop the error context stack */
@@ -6233,6 +6241,9 @@ xlog_redo(XLogRecPtr lsn, XLogRecord *record)
62336241
{
62346242
uint8 info = record->xl_info & ~XLR_INFO_MASK;
62356243

6244+
/* Backup blocks are not used in xlog records */
6245+
Assert(!(record->xl_info & XLR_BKP_BLOCK_MASK));
6246+
62366247
if (info == XLOG_NEXTOID)
62376248
{
62386249
Oid nextOid;

src/backend/access/transam/xlogutils.c

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
1212
* Portions Copyright (c) 1994, Regents of the University of California
1313
*
14-
* $PostgreSQL: pgsql/src/backend/access/transam/xlogutils.c,v 1.66 2009/01/01 17:23:36 momjian Exp $
14+
* $PostgreSQL: pgsql/src/backend/access/transam/xlogutils.c,v 1.67 2009/01/20 18:59:37 heikki Exp $
1515
*
1616
*-------------------------------------------------------------------------
1717
*/
@@ -217,31 +217,41 @@ XLogCheckInvalidPages(void)
217217

218218
/*
219219
* XLogReadBuffer
220-
* A shorthand of XLogReadBufferExtended(), for reading from the main
221-
* fork.
220+
* Read a page during XLOG replay.
221+
*
222+
* This is a shorthand of XLogReadBufferExtended() followed by
223+
* LockBuffer(buffer, BUFFER_LOCK_EXCLUSIVE), for reading from the main
224+
* fork.
225+
*
226+
* (Getting the lock is not really necessary, since we expect that this is
227+
* only used during single-process XLOG replay, but some subroutines such
228+
* as MarkBufferDirty will complain if we don't. And hopefully we'll get
229+
* hot standby support in the future, where there will be backends running
230+
* read-only queries during XLOG replay.)
231+
*
232+
* The returned buffer is exclusively-locked.
222233
*
223234
* For historical reasons, instead of a ReadBufferMode argument, this only
224235
* supports RBM_ZERO (init == true) and RBM_NORMAL (init == false) modes.
225236
*/
226237
Buffer
227238
XLogReadBuffer(RelFileNode rnode, BlockNumber blkno, bool init)
228239
{
229-
return XLogReadBufferExtended(rnode, MAIN_FORKNUM, blkno,
230-
init ? RBM_ZERO : RBM_NORMAL);
240+
Buffer buf;
241+
buf = XLogReadBufferExtended(rnode, MAIN_FORKNUM, blkno,
242+
init ? RBM_ZERO : RBM_NORMAL);
243+
if (BufferIsValid(buf))
244+
LockBuffer(buf, BUFFER_LOCK_EXCLUSIVE);
245+
246+
return buf;
231247
}
232248

233249
/*
234250
* XLogReadBufferExtended
235251
* Read a page during XLOG replay
236252
*
237-
* This is functionally comparable to ReadBuffer followed by
238-
* LockBuffer(buffer, BUFFER_LOCK_EXCLUSIVE): you get back a pinned
239-
* and locked buffer. (Getting the lock is not really necessary, since we
240-
* expect that this is only used during single-process XLOG replay, but
241-
* some subroutines such as MarkBufferDirty will complain if we don't.)
242-
*
243-
* There's some differences in the behavior wrt. the "mode" argument,
244-
* compared to ReadBufferExtended:
253+
* This is functionally comparable to ReadBufferExtended. There's some
254+
* differences in the behavior wrt. the "mode" argument:
245255
*
246256
* In RBM_NORMAL mode, if the page doesn't exist, or contains all-zeroes, we
247257
* return InvalidBuffer. In this case the caller should silently skip the
@@ -306,16 +316,19 @@ XLogReadBufferExtended(RelFileNode rnode, ForkNumber forknum,
306316
Assert(BufferGetBlockNumber(buffer) == blkno);
307317
}
308318

309-
LockBuffer(buffer, BUFFER_LOCK_EXCLUSIVE);
310-
311319
if (mode == RBM_NORMAL)
312320
{
313321
/* check that page has been initialized */
314322
Page page = (Page) BufferGetPage(buffer);
315323

324+
/*
325+
* We assume that PageIsNew is safe without a lock. During recovery,
326+
* there should be no other backends that could modify the buffer at
327+
* the same time.
328+
*/
316329
if (PageIsNew(page))
317330
{
318-
UnlockReleaseBuffer(buffer);
331+
ReleaseBuffer(buffer);
319332
log_invalid_page(rnode, forknum, blkno, true);
320333
return InvalidBuffer;
321334
}

src/backend/catalog/storage.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/catalog/storage.c,v 1.4 2009/01/04 14:59:22 heikki Exp $
11+
* $PostgreSQL: pgsql/src/backend/catalog/storage.c,v 1.5 2009/01/20 18:59:37 heikki Exp $
1212
*
1313
* NOTES
1414
* Some of this code used to be in storage/smgr/smgr.c, and the
@@ -401,6 +401,9 @@ smgr_redo(XLogRecPtr lsn, XLogRecord *record)
401401
{
402402
uint8 info = record->xl_info & ~XLR_INFO_MASK;
403403

404+
/* Backup blocks are not used in smgr records */
405+
Assert(!(record->xl_info & XLR_BKP_BLOCK_MASK));
406+
404407
if (info == XLOG_SMGR_CREATE)
405408
{
406409
xl_smgr_create *xlrec = (xl_smgr_create *) XLogRecGetData(record);

src/backend/commands/dbcommands.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
*
1414
*
1515
* IDENTIFICATION
16-
* $PostgreSQL: pgsql/src/backend/commands/dbcommands.c,v 1.217 2009/01/01 17:23:37 momjian Exp $
16+
* $PostgreSQL: pgsql/src/backend/commands/dbcommands.c,v 1.218 2009/01/20 18:59:37 heikki Exp $
1717
*
1818
*-------------------------------------------------------------------------
1919
*/
@@ -1941,6 +1941,9 @@ dbase_redo(XLogRecPtr lsn, XLogRecord *record)
19411941
{
19421942
uint8 info = record->xl_info & ~XLR_INFO_MASK;
19431943

1944+
/* Backup blocks are not used in dbase records */
1945+
Assert(!(record->xl_info & XLR_BKP_BLOCK_MASK));
1946+
19441947
if (info == XLOG_DBASE_CREATE)
19451948
{
19461949
xl_dbase_create_rec *xlrec = (xl_dbase_create_rec *) XLogRecGetData(record);

src/backend/commands/sequence.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/commands/sequence.c,v 1.156 2009/01/01 17:23:39 momjian Exp $
11+
* $PostgreSQL: pgsql/src/backend/commands/sequence.c,v 1.157 2009/01/20 18:59:37 heikki Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -1339,6 +1339,9 @@ seq_redo(XLogRecPtr lsn, XLogRecord *record)
13391339
xl_seq_rec *xlrec = (xl_seq_rec *) XLogRecGetData(record);
13401340
sequence_magic *sm;
13411341

1342+
/* Backup blocks are not used in seq records */
1343+
Assert(!(record->xl_info & XLR_BKP_BLOCK_MASK));
1344+
13421345
if (info != XLOG_SEQ_LOG)
13431346
elog(PANIC, "seq_redo: unknown op code %u", info);
13441347

src/backend/commands/tablespace.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
*
3838
*
3939
* IDENTIFICATION
40-
* $PostgreSQL: pgsql/src/backend/commands/tablespace.c,v 1.59 2009/01/01 17:23:40 momjian Exp $
40+
* $PostgreSQL: pgsql/src/backend/commands/tablespace.c,v 1.60 2009/01/20 18:59:37 heikki Exp $
4141
*
4242
*-------------------------------------------------------------------------
4343
*/
@@ -1276,6 +1276,9 @@ tblspc_redo(XLogRecPtr lsn, XLogRecord *record)
12761276
{
12771277
uint8 info = record->xl_info & ~XLR_INFO_MASK;
12781278

1279+
/* Backup blocks are not used in tblspc records */
1280+
Assert(!(record->xl_info & XLR_BKP_BLOCK_MASK));
1281+
12791282
if (info == XLOG_TBLSPC_CREATE)
12801283
{
12811284
xl_tblspc_create_rec *xlrec = (xl_tblspc_create_rec *) XLogRecGetData(record);

src/backend/storage/freespace/freespace.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/storage/freespace/freespace.c,v 1.71 2009/01/01 17:23:47 momjian Exp $
11+
* $PostgreSQL: pgsql/src/backend/storage/freespace/freespace.c,v 1.72 2009/01/20 18:59:37 heikki Exp $
1212
*
1313
*
1414
* NOTES:
@@ -212,6 +212,8 @@ XLogRecordPageWithFreeSpace(RelFileNode rnode, BlockNumber heapBlk,
212212

213213
/* If the page doesn't exist already, extend */
214214
buf = XLogReadBufferExtended(rnode, FSM_FORKNUM, blkno, RBM_ZERO_ON_ERROR);
215+
LockBuffer(buf, BUFFER_LOCK_EXCLUSIVE);
216+
215217
page = BufferGetPage(buf);
216218
if (PageIsNew(page))
217219
PageInit(page, BLCKSZ, 0);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy