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:
parent
33472260f4
commit
726d8916e2
15
src/backup.c
15
src/backup.c
@ -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",
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user