@@ -631,13 +631,14 @@ wal_contains_lsn(const char *archivedir, XLogRecPtr target_lsn,
631631 */
632632XLogRecPtr
633633get_first_record_lsn (const char * archivedir , XLogSegNo segno ,
634- TimeLineID tli , uint32 wal_seg_size )
634+ TimeLineID tli , uint32 wal_seg_size , int timeout )
635635{
636636 XLogReaderState * xlogreader ;
637- XLogReaderData reader_data ;
638- XLogRecPtr record = InvalidXLogRecPtr ;
639- XLogRecPtr startpoint ;
640- char wal_segment [MAXFNAMELEN ];
637+ XLogReaderData reader_data ;
638+ XLogRecPtr record = InvalidXLogRecPtr ;
639+ XLogRecPtr startpoint ;
640+ char wal_segment [MAXFNAMELEN ];
641+ int attempts = 0 ;
641642
642643 if (segno <= 1 )
643644 elog (ERROR , "Invalid WAL segment number " UINT64_FORMAT , segno );
@@ -653,13 +654,22 @@ get_first_record_lsn(const char *archivedir, XLogSegNo segno,
653654 /* Set startpoint to 0 in segno */
654655 GetXLogRecPtr (segno , 0 , wal_seg_size , startpoint );
655656
656- record = XLogFindNextRecord (xlogreader , startpoint );
657+ while (attempts <= timeout )
658+ {
659+ record = XLogFindNextRecord (xlogreader , startpoint );
657660
658- if (XLogRecPtrIsInvalid (record ))
659- record = InvalidXLogRecPtr ;
660- else
661- elog (LOG , "First record in WAL segment \"%s\": %X/%X" , wal_segment ,
662- (uint32 ) (record >> 32 ), (uint32 ) (record ));
661+ if (XLogRecPtrIsInvalid (record ))
662+ record = InvalidXLogRecPtr ;
663+ else
664+ {
665+ elog (LOG , "First record in WAL segment \"%s\": %X/%X" , wal_segment ,
666+ (uint32 ) (record >> 32 ), (uint32 ) (record ));
667+ break ;
668+ }
669+
670+ attempts ++ ;
671+ sleep (1 );
672+ }
663673
664674 /* cleanup */
665675 CleanupXLogPageRead (xlogreader );
0 commit comments