@@ -109,7 +109,7 @@ static int checkpoint_timeout(void);
109109//static void backup_list_file(parray *files, const char *root, )
110110static void parse_backup_filelist_filenames (parray * files , const char * root );
111111static XLogRecPtr wait_wal_lsn (XLogRecPtr lsn , bool is_start_lsn ,
112- bool wait_prev_lsn , bool wait_prev_segment );
112+ bool wait_prev_segment );
113113static void wait_replica_wal_lsn (XLogRecPtr lsn , bool is_start_backup );
114114static void make_pagemap_from_ptrack (parray * files );
115115static 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 */
15091509static 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