mirror of
https://github.com/postgres/postgres.git
synced 2025-09-03 15:22:11 +03:00
Tolerate timeline switches while "pg_basebackup -X fetch" is running.
If you take a base backup from a standby server with "pg_basebackup -X fetch", and the timeline switches while the backup is being taken, the backup used to fail with an error "requested WAL segment %s has already been removed". This is because the server-side code that sends over the required WAL files would not construct the WAL filename with the correct timeline after a switch. Fix that by using readdir() to scan pg_xlog for all the WAL segments in the range, regardless of timeline. Also, include all timeline history files in the backup, if taken with "-X fetch". That fixes another related bug: If a timeline switch happened just before the backup was initiated in a standby, the WAL segment containing the initial checkpoint record contains WAL from the older timeline too. Recovery will not accept that without a timeline history file that lists the older timeline. Backpatch to 9.2. Versions prior to that were not affected as you could not take a base backup from a standby before 9.2.
This commit is contained in:
@@ -1170,7 +1170,6 @@ XLogRead(char *buf, TimeLineID tli, XLogRecPtr startptr, Size count)
|
||||
char *p;
|
||||
XLogRecPtr recptr;
|
||||
Size nbytes;
|
||||
XLogSegNo lastRemovedSegNo;
|
||||
XLogSegNo segno;
|
||||
|
||||
retry:
|
||||
@@ -1263,13 +1262,8 @@ retry:
|
||||
* read() succeeds in that case, but the data we tried to read might
|
||||
* already have been overwritten with new WAL records.
|
||||
*/
|
||||
XLogGetLastRemoved(&lastRemovedSegNo);
|
||||
XLByteToSeg(startptr, segno);
|
||||
if (segno <= lastRemovedSegNo)
|
||||
ereport(ERROR,
|
||||
(errcode_for_file_access(),
|
||||
errmsg("requested WAL segment %s has already been removed",
|
||||
XLogFileNameP(sendTimeLine, segno))));
|
||||
CheckXLogRemoved(segno, ThisTimeLineID);
|
||||
|
||||
/*
|
||||
* During recovery, the currently-open WAL file might be replaced with the
|
||||
|
Reference in New Issue
Block a user