@@ -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