1
0
mirror of https://github.com/postgrespro/pg_probackup.git synced 2025-02-11 14:50:31 +02:00

[Issue #192] Handle 0 offset STOP LSN on master

This commit is contained in:
Grigory Smolkin 2020-04-21 02:09:33 +03:00
parent 33472260f4
commit 726d8916e2
3 changed files with 34 additions and 15 deletions

View File

@ -1740,8 +1740,10 @@ pg_stop_backup(pgBackup *backup, PGconn *pg_startbackup_conn,
if (!XRecOffIsValid(stop_backup_lsn_tmp))
{
/* It is ok for replica to return STOP LSN with NullXRecOff */
if (backup->from_replica && XRecOffIsNull(stop_backup_lsn_tmp))
/* It is ok for replica to return STOP LSN with NullXRecOff
* UPD: Apparently it is ok even for master.
*/
if (XRecOffIsNull(stop_backup_lsn_tmp))
{
char *xlog_path,
stream_xlog_path[MAXPGPATH];
@ -1798,13 +1800,20 @@ pg_stop_backup(pgBackup *backup, PGconn *pg_startbackup_conn,
/* Get the first record in segment with current stop_lsn */
lsn_tmp = get_first_record_lsn(xlog_path, segno, backup->tli,
instance_config.xlog_seg_size);
instance_config.xlog_seg_size,
instance_config.archive_timeout);
/* Check that returned LSN is valid and greater than stop_lsn */
if (XLogRecPtrIsInvalid(lsn_tmp) ||
!XRecOffIsValid(lsn_tmp) ||
lsn_tmp < stop_backup_lsn_tmp)
{
/* Backup from master should error out here */
if (!backup->from_replica)
elog(ERROR, "Failed to get next WAL record after %X/%X",
(uint32) (stop_backup_lsn_tmp >> 32),
(uint32) (stop_backup_lsn_tmp));
/* No luck, falling back to looking up for previous record */
elog(WARNING, "Failed to get next WAL record after %X/%X, "
"looking for previous WAL record",

View File

@ -631,13 +631,14 @@ wal_contains_lsn(const char *archivedir, XLogRecPtr target_lsn,
*/
XLogRecPtr
get_first_record_lsn(const char *archivedir, XLogSegNo segno,
TimeLineID tli, uint32 wal_seg_size)
TimeLineID tli, uint32 wal_seg_size, int timeout)
{
XLogReaderState *xlogreader;
XLogReaderData reader_data;
XLogRecPtr record = InvalidXLogRecPtr;
XLogRecPtr startpoint;
char wal_segment[MAXFNAMELEN];
XLogReaderData reader_data;
XLogRecPtr record = InvalidXLogRecPtr;
XLogRecPtr startpoint;
char wal_segment[MAXFNAMELEN];
int attempts = 0;
if (segno <= 1)
elog(ERROR, "Invalid WAL segment number " UINT64_FORMAT, segno);
@ -653,13 +654,22 @@ get_first_record_lsn(const char *archivedir, XLogSegNo segno,
/* Set startpoint to 0 in segno */
GetXLogRecPtr(segno, 0, wal_seg_size, startpoint);
record = XLogFindNextRecord(xlogreader, startpoint);
while (attempts <= timeout)
{
record = XLogFindNextRecord(xlogreader, startpoint);
if (XLogRecPtrIsInvalid(record))
record = InvalidXLogRecPtr;
else
elog(LOG, "First record in WAL segment \"%s\": %X/%X", wal_segment,
(uint32) (record >> 32), (uint32) (record));
if (XLogRecPtrIsInvalid(record))
record = InvalidXLogRecPtr;
else
{
elog(LOG, "First record in WAL segment \"%s\": %X/%X", wal_segment,
(uint32) (record >> 32), (uint32) (record));
break;
}
attempts++;
sleep(1);
}
/* cleanup */
CleanupXLogPageRead(xlogreader);

View File

@ -957,7 +957,7 @@ extern XLogRecPtr get_prior_record_lsn(const char *archivedir, XLogRecPtr start_
bool seek_prev_segment, uint32 seg_size);
extern XLogRecPtr get_first_record_lsn(const char *archivedir, XLogRecPtr start_lsn,
TimeLineID tli, uint32 wal_seg_size);
TimeLineID tli, uint32 wal_seg_size, int timeout);
/* in util.c */
extern TimeLineID get_current_timeline(PGconn *conn);