From 6b34e5563849edc12896bf5754e8fe7b88012697 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter_e@gmx.net>
Date: Thu, 3 Dec 2015 22:21:16 -0500
Subject: [PATCH] pg_rewind: Don't error if the two clusters are already on the
 same timeline

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            | 59 +++++++++++++-----------
 src/bin/pg_rewind/t/005_same_timeline.pl | 14 ++++++
 2 files changed, 46 insertions(+), 27 deletions(-)
 create mode 100644 src/bin/pg_rewind/t/005_same_timeline.pl

diff --git a/src/bin/pg_rewind/pg_rewind.c b/src/bin/pg_rewind/pg_rewind.c
index 1ab82f07cb4..635a3ab96f1 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 00000000000..8ca442671cd
--- /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');
-- 
GitLab