diff --git a/src/bin/pg_rewind/pg_rewind.c b/src/bin/pg_rewind/pg_rewind.c index 1ab82f07cb..635a3ab96f 100644 --- a/src/bin/pg_rewind/pg_rewind.c +++ b/src/bin/pg_rewind/pg_rewind.c @@ -216,41 +216,46 @@ main(int argc, char **argv) * do. */ if (ControlFile_target.checkPointCopy.ThisTimeLineID == ControlFile_source.checkPointCopy.ThisTimeLineID) - pg_fatal("source and target cluster are on the same timeline\n"); - - findCommonAncestorTimeline(&divergerec, &lastcommontliIndex); - printf(_("servers diverged at WAL position %X/%X on timeline %u\n"), - (uint32) (divergerec >> 32), (uint32) divergerec, - targetHistory[lastcommontliIndex].tli); - - /* - * Check for the possibility that the target is in fact a direct ancestor - * of the source. In that case, there is no divergent history in the - * target that needs rewinding. - */ - if (ControlFile_target.checkPoint >= divergerec) { - rewind_needed = true; + printf(_("source and target cluster are on the same timeline\n")); + rewind_needed = false; } else { - XLogRecPtr chkptendrec; - - /* Read the checkpoint record on the target to see where it ends. */ - chkptendrec = readOneRecord(datadir_target, - ControlFile_target.checkPoint, - targetNentries - 1); + findCommonAncestorTimeline(&divergerec, &lastcommontliIndex); + printf(_("servers diverged at WAL position %X/%X on timeline %u\n"), + (uint32) (divergerec >> 32), (uint32) divergerec, + targetHistory[lastcommontliIndex].tli); /* - * If the histories diverged exactly at the end of the shutdown - * checkpoint record on the target, there are no WAL records in the - * target that don't belong in the source's history, and no rewind is - * needed. + * Check for the possibility that the target is in fact a direct ancestor + * of the source. In that case, there is no divergent history in the + * target that needs rewinding. */ - if (chkptendrec == divergerec) - rewind_needed = false; - else + if (ControlFile_target.checkPoint >= divergerec) + { rewind_needed = true; + } + else + { + XLogRecPtr chkptendrec; + + /* Read the checkpoint record on the target to see where it ends. */ + chkptendrec = readOneRecord(datadir_target, + ControlFile_target.checkPoint, + targetNentries - 1); + + /* + * If the histories diverged exactly at the end of the shutdown + * checkpoint record on the target, there are no WAL records in the + * target that don't belong in the source's history, and no rewind is + * needed. + */ + if (chkptendrec == divergerec) + rewind_needed = false; + else + rewind_needed = true; + } } if (!rewind_needed) diff --git a/src/bin/pg_rewind/t/005_same_timeline.pl b/src/bin/pg_rewind/t/005_same_timeline.pl new file mode 100644 index 0000000000..8ca442671c --- /dev/null +++ b/src/bin/pg_rewind/t/005_same_timeline.pl @@ -0,0 +1,14 @@ +use strict; +use warnings; +use TestLib; +use Test::More tests => 1; + +use RewindTest; + +# Test that running pg_rewind if the two clusters are on the same +# timeline runs successfully. + +RewindTest::setup_cluster(); +RewindTest::start_master(); +RewindTest::create_standby(); +RewindTest::run_pg_rewind('local');