mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-02-05 19:09:58 +08:00
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.
This commit is contained in:
parent
381d6a05ae
commit
268fecc62c
@ -363,7 +363,7 @@ typedef struct XLogCtlData
|
||||
uint32 ckptXidEpoch; /* nextXID & epoch of latest checkpoint */
|
||||
TransactionId ckptXid;
|
||||
XLogRecPtr asyncXactLSN; /* LSN of newest async commit/abort */
|
||||
uint32 lastRemovedLog; /* latest removed/recycled XLOG segment */
|
||||
uint32 lastRemovedLog; /* latest removed/recycled XLOG segment + 1 */
|
||||
uint32 lastRemovedSeg;
|
||||
|
||||
/* Protected by WALWriteLock: */
|
||||
@ -3210,8 +3210,10 @@ PreallocXlogFiles(XLogRecPtr endptr)
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the log/seg of the latest removed or recycled WAL segment.
|
||||
* Returns 0 if no WAL segments have been removed since startup.
|
||||
* Get the log/seg of the first WAL segment that has not been removed or
|
||||
* recycled. In other words, the log/seg of the last removed/recycled WAL
|
||||
* segment + 1.
|
||||
* Returns 0/0 if no WAL segments have been removed since startup.
|
||||
*/
|
||||
void
|
||||
XLogGetLastRemoved(uint32 *log, uint32 *seg)
|
||||
@ -3239,6 +3241,7 @@ UpdateLastRemovedPtr(char *filename)
|
||||
seg;
|
||||
|
||||
XLogFromFileName(filename, &tli, &log, &seg);
|
||||
NextLogSeg(log, seg);
|
||||
|
||||
SpinLockAcquire(&xlogctl->info_lck);
|
||||
if (log > xlogctl->lastRemovedLog ||
|
||||
|
@ -630,7 +630,7 @@ XLogRead(char *buf, XLogRecPtr recptr, Size nbytes)
|
||||
XLogGetLastRemoved(&lastRemovedLog, &lastRemovedSeg);
|
||||
XLByteToSeg(startRecPtr, log, seg);
|
||||
if (log < lastRemovedLog ||
|
||||
(log == lastRemovedLog && seg <= lastRemovedSeg))
|
||||
(log == lastRemovedLog && seg < lastRemovedSeg))
|
||||
{
|
||||
char filename[MAXFNAMELEN];
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user