pg_rewind: Don't error if the two clusters are already on the same timeline
authorPeter Eisentraut
Fri, 4 Dec 2015 03:21:16 +0000 (22:21 -0500)
committerPeter Eisentraut
Fri, 11 Dec 2015 23:32:03 +0000 (18:32 -0500)
This previously resulted in an error and a nonzero exit status, but
after discussion this should rather be a noop with a zero exit status.

src/bin/pg_rewind/pg_rewind.c
src/bin/pg_rewind/t/005_same_timeline.pl [new file with mode: 0644]

index 1ab82f07cb471c0eb687d45432c39e4490de18ee..635a3ab96f10ea7feae97b30ded73e11be07439b 100644 (file)
@@ -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 (file)
index 0000000..8ca4426
--- /dev/null
@@ -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');