pg_upgrade: make controldata checks more consistent
authorBruce Momjian <bruce@momjian.us>
Fri, 15 May 2015 01:56:10 +0000 (21:56 -0400)
committerBruce Momjian <bruce@momjian.us>
Fri, 15 May 2015 01:56:31 +0000 (21:56 -0400)
Also add missing float8_pass_by_value check.

src/bin/pg_upgrade/controldata.c
src/bin/pg_upgrade/pg_upgrade.h

index bf53db05515b2a9fb7f42f4ceab5a4e6e2e21d62..0608b644796d837daae39c8cabe788676b540451 100644 (file)
@@ -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.
index bb035e18813dd1314919dd7e3193daae56298397..aecf0df30c2469fbb9b60d525159e90828f7dce4 100644 (file)
@@ -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;