Skip to content

Commit 06b1dbe

Browse files
committed
PGPRO-2180: Rewrite stop_lsn during pg_stop_backup
1 parent aab0ce3 commit 06b1dbe

File tree

1 file changed

+25
-28
lines changed

1 file changed

+25
-28
lines changed

src/backup.c

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ static int checkpoint_timeout(void);
109109
//static void backup_list_file(parray *files, const char *root, )
110110
static void parse_backup_filelist_filenames(parray *files, const char *root);
111111
static XLogRecPtr wait_wal_lsn(XLogRecPtr lsn, bool is_start_lsn,
112-
bool wait_prev_lsn, bool wait_prev_segment);
112+
bool wait_prev_segment);
113113
static void wait_replica_wal_lsn(XLogRecPtr lsn, bool is_start_backup);
114114
static void make_pagemap_from_ptrack(parray *files);
115115
static void *StreamLog(void *arg);
@@ -1166,15 +1166,15 @@ pg_start_backup(const char *label, bool smooth, pgBackup *backup)
11661166

11671167
if (current.backup_mode == BACKUP_MODE_DIFF_PAGE)
11681168
/* In PAGE mode wait for current segment... */
1169-
wait_wal_lsn(backup->start_lsn, true, false, false);
1169+
wait_wal_lsn(backup->start_lsn, true, false);
11701170
/*
11711171
* Do not wait start_lsn for stream backup.
11721172
* Because WAL streaming will start after pg_start_backup() in stream
11731173
* mode.
11741174
*/
11751175
else if (!stream_wal)
11761176
/* ...for others wait for previous segment */
1177-
wait_wal_lsn(backup->start_lsn, true, false, true);
1177+
wait_wal_lsn(backup->start_lsn, true, true);
11781178

11791179
/* In case of backup from replica for PostgreSQL 9.5
11801180
* wait for start_lsn to be replayed by replica
@@ -1507,8 +1507,7 @@ pg_ptrack_get_and_clear(Oid tablespace_oid, Oid db_oid, Oid rel_filenode,
15071507
* returns InvalidXLogRecPtr.
15081508
*/
15091509
static XLogRecPtr
1510-
wait_wal_lsn(XLogRecPtr lsn, bool is_start_lsn, bool wait_prev_lsn,
1511-
bool wait_prev_segment)
1510+
wait_wal_lsn(XLogRecPtr lsn, bool is_start_lsn, bool wait_prev_segment)
15121511
{
15131512
TimeLineID tli;
15141513
XLogSegNo targetSegNo;
@@ -1519,7 +1518,6 @@ wait_wal_lsn(XLogRecPtr lsn, bool is_start_lsn, bool wait_prev_lsn,
15191518
bool file_exists = false;
15201519
uint32 try_count = 0,
15211520
timeout;
1522-
char *prior_to = (wait_prev_lsn) ? " prior to " : "";
15231521

15241522
#ifdef HAVE_LIBZ
15251523
char gz_wal_segment_path[MAXPGPATH];
@@ -1565,8 +1563,8 @@ wait_wal_lsn(XLogRecPtr lsn, bool is_start_lsn, bool wait_prev_lsn,
15651563
if (wait_prev_segment)
15661564
elog(LOG, "Looking for segment: %s", wal_segment);
15671565
else
1568-
elog(LOG, "Looking for LSN %s%X/%X in segment: %s",
1569-
prior_to, (uint32) (lsn >> 32), (uint32) lsn, wal_segment);
1566+
elog(LOG, "Looking for LSN %X/%X in segment: %s",
1567+
(uint32) (lsn >> 32), (uint32) lsn, wal_segment);
15701568

15711569
#ifdef HAVE_LIBZ
15721570
snprintf(gz_wal_segment_path, sizeof(gz_wal_segment_path), "%s.gz",
@@ -1602,16 +1600,19 @@ wait_wal_lsn(XLogRecPtr lsn, bool is_start_lsn, bool wait_prev_lsn,
16021600
/*
16031601
* A WAL segment found. Check LSN on it.
16041602
*/
1605-
if (!wait_prev_lsn)
1603+
if (wal_contains_lsn(wal_segment_dir, lsn, tli, xlog_seg_size))
1604+
/* Target LSN was found */
16061605
{
1607-
if (wal_contains_lsn(wal_segment_dir, lsn, tli, xlog_seg_size))
1608-
/* Target LSN was found */
1609-
{
1610-
elog(LOG, "Found LSN: %X/%X", (uint32) (lsn >> 32), (uint32) lsn);
1611-
return lsn;
1612-
}
1606+
elog(LOG, "Found LSN: %X/%X", (uint32) (lsn >> 32), (uint32) lsn);
1607+
return lsn;
16131608
}
1614-
else
1609+
1610+
/*
1611+
* If we failed to get LSN of valid record in a reasonable time, try
1612+
* to get LSN of last valid record prior to the target LSN. But only
1613+
* in case of a backup from a replica.
1614+
*/
1615+
if (!exclusive_backup && current.from_replica)
16151616
{
16161617
XLogRecPtr res;
16171618

@@ -1620,7 +1621,8 @@ wait_wal_lsn(XLogRecPtr lsn, bool is_start_lsn, bool wait_prev_lsn,
16201621
if (!XLogRecPtrIsInvalid(res))
16211622
{
16221623
/* LSN of the prior record was found */
1623-
elog(LOG, "Found LSN: %X/%X", (uint32) (res >> 32), (uint32) res);
1624+
elog(LOG, "Found prior LSN: %X/%X, it is used as stop LSN",
1625+
(uint32) (res >> 32), (uint32) res);
16241626
return res;
16251627
}
16261628
}
@@ -1638,18 +1640,16 @@ wait_wal_lsn(XLogRecPtr lsn, bool is_start_lsn, bool wait_prev_lsn,
16381640
elog(INFO, "Wait for WAL segment %s to be archived",
16391641
wal_segment_path);
16401642
else
1641-
elog(INFO, "Wait for LSN %s%X/%X in archived WAL segment %s",
1642-
prior_to, (uint32) (lsn >> 32), (uint32) lsn,
1643-
wal_segment_path);
1643+
elog(INFO, "Wait for LSN %X/%X in archived WAL segment %s",
1644+
(uint32) (lsn >> 32), (uint32) lsn, wal_segment_path);
16441645
}
16451646

16461647
if (timeout > 0 && try_count > timeout)
16471648
{
16481649
if (file_exists)
16491650
elog(ERROR, "WAL segment %s was archived, "
1650-
"but target LSN %s%X/%X could not be archived in %d seconds",
1651-
wal_segment, prior_to, (uint32) (lsn >> 32), (uint32) lsn,
1652-
timeout);
1651+
"but target LSN %X/%X could not be archived in %d seconds",
1652+
wal_segment, (uint32) (lsn >> 32), (uint32) lsn, timeout);
16531653
/* If WAL segment doesn't exist or we wait for previous segment */
16541654
else
16551655
elog(ERROR,
@@ -2056,7 +2056,6 @@ pg_stop_backup(pgBackup *backup)
20562056
{
20572057
char *xlog_path,
20582058
stream_xlog_path[MAXPGPATH];
2059-
XLogRecPtr stop_valid_lsn = InvalidXLogRecPtr;
20602059

20612060
/* Wait for stop_lsn to be received by replica */
20622061
/* XXX Do we need this? */
@@ -2067,9 +2066,7 @@ pg_stop_backup(pgBackup *backup)
20672066
* We wait for stop_lsn in stream mode just in case.
20682067
*/
20692068
if (!stop_lsn_exists)
2070-
stop_valid_lsn = wait_wal_lsn(stop_backup_lsn, false,
2071-
!exclusive_backup && current.from_replica,
2072-
false);
2069+
stop_backup_lsn = wait_wal_lsn(stop_backup_lsn, false, false);
20732070

20742071
if (stream_wal)
20752072
{
@@ -2088,7 +2085,7 @@ pg_stop_backup(pgBackup *backup)
20882085

20892086
/* iterate over WAL from stop_backup lsn to start_backup lsn */
20902087
if (!read_recovery_info(xlog_path, backup->tli, xlog_seg_size,
2091-
backup->start_lsn, stop_valid_lsn,
2088+
backup->start_lsn, stop_backup_lsn,
20922089
&backup->recovery_time, &backup->recovery_xid))
20932090
{
20942091
elog(LOG, "Failed to find Recovery Time in WAL. Forced to trust current_timestamp");

0 commit comments

Comments
 (0)