From 5a3022fde018aca9b23b7f7506233b437d943de2 Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Thu, 14 May 2015 21:56:10 -0400
Subject: [PATCH] pg_upgrade:  make controldata checks more consistent

Also add missing float8_pass_by_value check.
---
 src/bin/pg_upgrade/controldata.c | 55 ++++++++++++++++----------------
 src/bin/pg_upgrade/pg_upgrade.h  |  1 -
 2 files changed, 27 insertions(+), 29 deletions(-)

diff --git a/src/bin/pg_upgrade/controldata.c b/src/bin/pg_upgrade/controldata.c
index bf53db05515..0608b644796 100644
--- a/src/bin/pg_upgrade/controldata.c
+++ b/src/bin/pg_upgrade/controldata.c
@@ -154,23 +154,6 @@ get_control_data(ClusterInfo *cluster, bool live_check)
 			p++;				/* remove ':' char */
 			cluster->controldata.cat_ver = str2uint(p);
 		}
-		else if ((p = strstr(bufin, "First log segment after reset:")) != NULL)
-		{
-			/* Skip the colon and any whitespace after it */
-			p = strchr(p, ':');
-			if (p == NULL || strlen(p) <= 1)
-				pg_fatal("%d: controldata retrieval problem\n", __LINE__);
-			p = strpbrk(p, "01234567890ABCDEF");
-			if (p == NULL || strlen(p) <= 1)
-				pg_fatal("%d: controldata retrieval problem\n", __LINE__);
-
-			/* Make sure it looks like a valid WAL file name */
-			if (strspn(p, "0123456789ABCDEF") != 24)
-				pg_fatal("%d: controldata retrieval problem\n", __LINE__);
-
-			strlcpy(cluster->controldata.nextxlogfile, p, 25);
-			got_nextxlogfile = true;
-		}
 		else if ((p = strstr(bufin, "First log file ID after reset:")) != NULL)
 		{
 			p = strchr(p, ':');
@@ -201,7 +184,7 @@ get_control_data(ClusterInfo *cluster, bool live_check)
 				pg_fatal("%d: controldata retrieval problem\n", __LINE__);
 
 			p++;				/* remove ':' char */
-			cluster->controldata.chkpnt_tli = str2uint(p);
+			tli = str2uint(p);
 			got_tli = true;
 		}
 		else if ((p = strstr(bufin, "Latest checkpoint's NextXID:")) != NULL)
@@ -266,6 +249,23 @@ get_control_data(ClusterInfo *cluster, bool live_check)
 			cluster->controldata.chkpnt_nxtmxoff = str2uint(p);
 			got_mxoff = true;
 		}
+		else if ((p = strstr(bufin, "First log segment after reset:")) != NULL)
+		{
+			/* Skip the colon and any whitespace after it */
+			p = strchr(p, ':');
+			if (p == NULL || strlen(p) <= 1)
+				pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+			p = strpbrk(p, "01234567890ABCDEF");
+			if (p == NULL || strlen(p) <= 1)
+				pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+			/* Make sure it looks like a valid WAL file name */
+			if (strspn(p, "0123456789ABCDEF") != 24)
+				pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+			strlcpy(cluster->controldata.nextxlogfile, p, 25);
+			got_nextxlogfile = true;
+		}
 		else if ((p = strstr(bufin, "Maximum data alignment:")) != NULL)
 		{
 			p = strchr(p, ':');
@@ -436,7 +436,7 @@ get_control_data(ClusterInfo *cluster, bool live_check)
 	 */
 	if (GET_MAJOR_VERSION(cluster->major_version) <= 902)
 	{
-		if (got_log_id && got_log_seg)
+		if (got_tli && got_log_id && got_log_seg)
 		{
 			snprintf(cluster->controldata.nextxlogfile, 25, "%08X%08X%08X",
 					 tli, logid, segno);
@@ -446,11 +446,10 @@ get_control_data(ClusterInfo *cluster, bool live_check)
 
 	/* verify that we got all the mandatory pg_control data */
 	if (!got_xid || !got_oid ||
-		!got_multi || !got_mxoff ||
+		!got_multi ||
 		(!got_oldestmulti &&
 		 cluster->controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER) ||
-		(!live_check && !got_nextxlogfile) ||
-		!got_tli ||
+		!got_mxoff || (!live_check && !got_nextxlogfile) ||
 		!got_align || !got_blocksz || !got_largesz || !got_walsz ||
 		!got_walseg || !got_ident || !got_index || !got_toast ||
 		(!got_large_object &&
@@ -470,19 +469,16 @@ get_control_data(ClusterInfo *cluster, bool live_check)
 		if (!got_multi)
 			pg_log(PG_REPORT, "  latest checkpoint next MultiXactId\n");
 
-		if (!got_mxoff)
-			pg_log(PG_REPORT, "  latest checkpoint next MultiXactOffset\n");
-
 		if (!got_oldestmulti &&
 			cluster->controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER)
 			pg_log(PG_REPORT, "  latest checkpoint oldest MultiXactId\n");
 
+		if (!got_mxoff)
+			pg_log(PG_REPORT, "  latest checkpoint next MultiXactOffset\n");
+
 		if (!live_check && !got_nextxlogfile)
 			pg_log(PG_REPORT, "  first WAL segment after reset\n");
 
-		if (!got_tli)
-			pg_log(PG_REPORT, "  latest checkpoint timeline ID\n");
-
 		if (!got_align)
 			pg_log(PG_REPORT, "  maximum alignment\n");
 
@@ -568,6 +564,9 @@ check_control_data(ControlData *oldctrl,
 	if (oldctrl->date_is_int != newctrl->date_is_int)
 		pg_fatal("old and new pg_controldata date/time storage types do not match\n");
 
+	if (oldctrl->float8_pass_by_value != newctrl->float8_pass_by_value)
+		pg_fatal("old and new pg_controldata float8 argument passing methods do not match\n");
+
 	/*
 	 * We might eventually allow upgrades from checksum to no-checksum
 	 * clusters.
diff --git a/src/bin/pg_upgrade/pg_upgrade.h b/src/bin/pg_upgrade/pg_upgrade.h
index bb035e18813..aecf0df30c2 100644
--- a/src/bin/pg_upgrade/pg_upgrade.h
+++ b/src/bin/pg_upgrade/pg_upgrade.h
@@ -206,7 +206,6 @@ typedef struct
 	uint32		ctrl_ver;
 	uint32		cat_ver;
 	char		nextxlogfile[25];
-	uint32		chkpnt_tli;
 	uint32		chkpnt_nxtxid;
 	uint32		chkpnt_nxtepoch;
 	uint32		chkpnt_nxtoid;
-- 
GitLab