From 5a3022fde018aca9b23b7f7506233b437d943de2 Mon Sep 17 00:00:00 2001 From: Bruce Momjian 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 bf53db0551..0608b64479 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 bb035e1881..aecf0df30c 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;