Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 1cb8cd3

Browse files
committed
PGPRO-646: Set need_repair to false before SetLatch().
Otherwise next call of WalSndRequestRepairBlock() could fail because of RprBlockState->need_repair checking.
1 parent c0e0a2b commit 1cb8cd3

File tree

3 files changed

+10
-7
lines changed

3 files changed

+10
-7
lines changed

src/backend/replication/walsender.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2037,9 +2037,9 @@ ProcessStandbyRepairBlockMessage(void)
20372037

20382038
/* Send signal to backend that block is in shared memory */
20392039
RprBlockState->block_is_read = true;
2040+
RprBlockState->need_repair = false;
20402041
SetLatch(RprBlockState->backendLatch);
20412042

2042-
RprBlockState->need_repair = false;
20432043
/* Set flag that walsenders are ready to repair another block */
20442044
pg_atomic_clear_flag(&WalSndCtl->block_repair_flag);
20452045
}
@@ -3647,7 +3647,7 @@ LagTrackerRead(int head, XLogRecPtr lsn, TimestampTz now)
36473647
* Backend requests walsender to a repair block. Backend will wait for the
36483648
* repair block from a walreceiver.
36493649
*/
3650-
void
3650+
bool
36513651
WalSndRequestRepairBlock(RelFileNode rnode,
36523652
ForkNumber forkNum, BlockNumber blockNum,
36533653
XLogRecPtr wal_lsn, Latch *backendLatch)
@@ -3656,7 +3656,7 @@ WalSndRequestRepairBlock(RelFileNode rnode,
36563656
{
36573657
ereport(WARNING,
36583658
(errmsg("walsender reads a repair block already")));
3659-
return;
3659+
return false;
36603660
}
36613661

36623662
RprBlockState->rnode = rnode;
@@ -3673,6 +3673,8 @@ WalSndRequestRepairBlock(RelFileNode rnode,
36733673

36743674
RprBlockState->need_repair = true;
36753675
WalSndWakeup();
3676+
3677+
return true;
36763678
}
36773679

36783680
/*

src/backend/storage/buffer/block_repair.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,10 @@ RepairCorruptedBlock(SMgrRelation smgr, ForkNumber forkNum,
3737
currentLSN = GetXLogWriteRecPtr();
3838
LWLockAcquire(RepairLockInfo->repair_lock, LW_EXCLUSIVE);
3939

40-
WalSndRequestRepairBlock(smgr->smgr_rnode.node,
41-
forkNum, blockNum, currentLSN,
42-
MyLatch);
40+
if (!WalSndRequestRepairBlock(smgr->smgr_rnode.node,
41+
forkNum, blockNum, currentLSN,
42+
MyLatch))
43+
return false;
4344

4445
elog(DEBUG1, "repairing block %u of tablespace %u, database %u, "
4546
"relation %u, fork %d, checkpoint %X/%X",

src/include/replication/walsender.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ extern void WalSndWaitStopping(void);
5555
extern void HandleWalSndInitStopping(void);
5656
extern void WalSndRqstFileReload(void);
5757

58-
extern void WalSndRequestRepairBlock(RelFileNode rnode,
58+
extern bool WalSndRequestRepairBlock(RelFileNode rnode,
5959
ForkNumber forkNum, BlockNumber blockNum,
6060
XLogRecPtr wal_lsn,
6161
Latch *backendLatch);

0 commit comments

Comments
 (0)