Fix single-record reads to use restore_command if available in pg_rewind

readOneRecord() is used now when looking for a checkpoint record to
check if the target server is an ancestor of the source across multiple
timelines, and using a restore_command if available improves the
stability of the operation.  This part was missed in a7e8ece.

Reported-by: Kyotaro Horiguchi
Discussion: https://postgr.es/m/20200421.150830.1410714948345179794.horikyota.ntt@gmail.com
This commit is contained in:
Michael Paquier 2020-04-22 08:08:28 +09:00
parent c33869cc3b
commit cd12323440
3 changed files with 6 additions and 3 deletions

View file

@ -106,7 +106,8 @@ extractPageMap(const char *datadir, XLogRecPtr startpoint, int tliIndex,
* doing anything with the record itself.
*/
XLogRecPtr
readOneRecord(const char *datadir, XLogRecPtr ptr, int tliIndex)
readOneRecord(const char *datadir, XLogRecPtr ptr, int tliIndex,
const char *restoreCommand)
{
XLogRecord *record;
XLogReaderState *xlogreader;
@ -115,6 +116,7 @@ readOneRecord(const char *datadir, XLogRecPtr ptr, int tliIndex)
XLogRecPtr endptr;
private.tliIndex = tliIndex;
private.restoreCommand = restoreCommand;
xlogreader = XLogReaderAllocate(WalSegSz, datadir, &SimpleXLogPageRead,
&private);
if (xlogreader == NULL)

View file

@ -339,7 +339,8 @@ main(int argc, char **argv)
/* Read the checkpoint record on the target to see where it ends. */
chkptendrec = readOneRecord(datadir_target,
ControlFile_target.checkPoint,
targetNentries - 1);
targetNentries - 1,
restore_command);
/*
* If the histories diverged exactly at the end of the shutdown

View file

@ -50,7 +50,7 @@ extern void findLastCheckpoint(const char *datadir, XLogRecPtr searchptr,
XLogRecPtr *lastchkptredo,
const char *restoreCommand);
extern XLogRecPtr readOneRecord(const char *datadir, XLogRecPtr ptr,
int tliIndex);
int tliIndex, const char *restoreCommand);
/* in pg_rewind.c */
extern void progress_report(bool force);