@@ -646,7 +646,7 @@ static void CreateEndOfRecoveryRecord(void);
646
646
static void CheckPointGuts (XLogRecPtr checkPointRedo , int flags );
647
647
static void KeepLogSeg (XLogRecPtr recptr , XLogSegNo * logSegNo );
648
648
649
- static bool XLogCheckBuffer (XLogRecData * rdata , bool doPageWrites ,
649
+ static bool XLogCheckBuffer (XLogRecData * rdata , bool holdsExclusiveLock ,
650
650
XLogRecPtr * lsn , BkpBlock * bkpb );
651
651
static Buffer RestoreBackupBlockContents (XLogRecPtr lsn , BkpBlock bkpb ,
652
652
char * blk , bool get_cleanup_lock , bool keep_buffer );
@@ -822,7 +822,7 @@ begin:;
822
822
{
823
823
/* OK, put it in this slot */
824
824
dtbuf [i ] = rdt -> buffer ;
825
- if (XLogCheckBuffer (rdt , doPageWrites ,
825
+ if (doPageWrites && XLogCheckBuffer (rdt , true ,
826
826
& (dtbuf_lsn [i ]), & (dtbuf_xlg [i ])))
827
827
{
828
828
dtbuf_bkp [i ] = true;
@@ -1243,23 +1243,25 @@ begin:;
1243
1243
* save the buffer's LSN at *lsn.
1244
1244
*/
1245
1245
static bool
1246
- XLogCheckBuffer (XLogRecData * rdata , bool doPageWrites ,
1246
+ XLogCheckBuffer (XLogRecData * rdata , bool holdsExclusiveLock ,
1247
1247
XLogRecPtr * lsn , BkpBlock * bkpb )
1248
1248
{
1249
1249
Page page ;
1250
1250
1251
1251
page = BufferGetPage (rdata -> buffer );
1252
1252
1253
1253
/*
1254
- * XXX We assume page LSN is first data on *every* page that can be passed
1255
- * to XLogInsert, whether it otherwise has the standard page layout or
1256
- * not. We don't need the buffer header lock for PageGetLSN because we
1257
- * have exclusive lock on the page and/or the relation.
1254
+ * We assume page LSN is first data on *every* page that can be passed
1255
+ * to XLogInsert, whether it has the standard page layout or not. We
1256
+ * don't need to take the buffer header lock for PageGetLSN if we hold
1257
+ * an exclusive lock on the page and/or the relation.
1258
1258
*/
1259
- * lsn = BufferGetLSNAtomic (rdata -> buffer );
1259
+ if (holdsExclusiveLock )
1260
+ * lsn = PageGetLSN (page );
1261
+ else
1262
+ * lsn = BufferGetLSNAtomic (rdata -> buffer );
1260
1263
1261
- if (doPageWrites &&
1262
- * lsn <= RedoRecPtr )
1264
+ if (* lsn <= RedoRecPtr )
1263
1265
{
1264
1266
/*
1265
1267
* The page needs to be backed up, so set up *bkpb
@@ -7683,7 +7685,10 @@ XLogSaveBufferForHint(Buffer buffer)
7683
7685
rdata [0 ].buffer = buffer ;
7684
7686
rdata [0 ].buffer_std = true;
7685
7687
7686
- if (XLogCheckBuffer (rdata , true, & lsn , & bkpb ))
7688
+ /*
7689
+ * Check buffer while not holding an exclusive lock.
7690
+ */
7691
+ if (XLogCheckBuffer (rdata , false, & lsn , & bkpb ))
7687
7692
{
7688
7693
char copied_buffer [BLCKSZ ];
7689
7694
char * origdata = (char * ) BufferGetBlock (buffer );
0 commit comments