Skip to content

Commit 268fecc

Browse files
committed
Fix corner-case bug in tracking of latest removed WAL segment during
streaming replication. We used log/seg 0/0 to indicate that no WAL segments have been removed since startup, but 0/0 is a valid value for the very first WAL segment after initdb. To make that disambiguous, store (latest removed WAL segment + 1) in the global variable. Per report from Matt Chesler, also reproduced by Greg Smith.
1 parent 381d6a0 commit 268fecc

File tree

2 files changed

+7
-4
lines changed

2 files changed

+7
-4
lines changed

src/backend/access/transam/xlog.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,7 @@ typedef struct XLogCtlData
363363
uint32 ckptXidEpoch; /* nextXID & epoch of latest checkpoint */
364364
TransactionId ckptXid;
365365
XLogRecPtr asyncXactLSN; /* LSN of newest async commit/abort */
366-
uint32 lastRemovedLog; /* latest removed/recycled XLOG segment */
366+
uint32 lastRemovedLog; /* latest removed/recycled XLOG segment + 1 */
367367
uint32 lastRemovedSeg;
368368

369369
/* Protected by WALWriteLock: */
@@ -3210,8 +3210,10 @@ PreallocXlogFiles(XLogRecPtr endptr)
32103210
}
32113211

32123212
/*
3213-
* Get the log/seg of the latest removed or recycled WAL segment.
3214-
* Returns 0 if no WAL segments have been removed since startup.
3213+
* Get the log/seg of the first WAL segment that has not been removed or
3214+
* recycled. In other words, the log/seg of the last removed/recycled WAL
3215+
* segment + 1.
3216+
* Returns 0/0 if no WAL segments have been removed since startup.
32153217
*/
32163218
void
32173219
XLogGetLastRemoved(uint32 *log, uint32 *seg)
@@ -3239,6 +3241,7 @@ UpdateLastRemovedPtr(char *filename)
32393241
seg;
32403242

32413243
XLogFromFileName(filename, &tli, &log, &seg);
3244+
NextLogSeg(log, seg);
32423245

32433246
SpinLockAcquire(&xlogctl->info_lck);
32443247
if (log > xlogctl->lastRemovedLog ||

src/backend/replication/walsender.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -630,7 +630,7 @@ XLogRead(char *buf, XLogRecPtr recptr, Size nbytes)
630630
XLogGetLastRemoved(&lastRemovedLog, &lastRemovedSeg);
631631
XLByteToSeg(startRecPtr, log, seg);
632632
if (log < lastRemovedLog ||
633-
(log == lastRemovedLog && seg <= lastRemovedSeg))
633+
(log == lastRemovedLog && seg < lastRemovedSeg))
634634
{
635635
char filename[MAXFNAMELEN];
636636

0 commit comments

Comments
 (0)