From b6d6488a3a7077fb2305c360c241a0789d7b657e Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Tue, 31 Jul 2018 18:10:06 -0400 Subject: [PATCH] pg_upgrade: fix --check for live source server checks Fix for commit 244142d32afd02e7408a2ef1f249b00393983822. Backpatch-through: 9.3 --- src/bin/pg_upgrade/controldata.c | 117 ++++++++++++++++--------------- 1 file changed, 59 insertions(+), 58 deletions(-) diff --git a/src/bin/pg_upgrade/controldata.c b/src/bin/pg_upgrade/controldata.c index bba3b1b76e..ce3f263b10 100644 --- a/src/bin/pg_upgrade/controldata.c +++ b/src/bin/pg_upgrade/controldata.c @@ -113,6 +113,65 @@ get_control_data(ClusterInfo *cluster, bool live_check) pg_putenv("LC_ALL", NULL); pg_putenv("LC_MESSAGES", "C"); + /* + * Check for clean shutdown + */ + if (!live_check || cluster == &new_cluster) + { + /* only pg_controldata outputs the cluster state */ + snprintf(cmd, sizeof(cmd), "\"%s/pg_controldata\" \"%s\"", + cluster->bindir, cluster->pgdata); + fflush(stdout); + fflush(stderr); + + if ((output = popen(cmd, "r")) == NULL) + pg_fatal("could not get control data using %s: %s\n", + cmd, strerror(errno)); + + /* we have the result of cmd in "output". so parse it line by line now */ + while (fgets(bufin, sizeof(bufin), output)) + { + if ((p = strstr(bufin, "Database cluster state:")) != NULL) + { + p = strchr(p, ':'); + + if (p == NULL || strlen(p) <= 1) + pg_fatal("%d: database cluster state problem\n", __LINE__); + + p++; /* remove ':' char */ + + /* + * We checked earlier for a postmaster lock file, and if we found + * one, we tried to start/stop the server to replay the WAL. However, + * pg_ctl -m immediate doesn't leave a lock file, but does require + * WAL replay, so we check here that the server was shut down cleanly, + * from the controldata perspective. + */ + /* remove leading spaces */ + while (*p == ' ') + p++; + if (strcmp(p, "shut down\n") != 0) + { + if (cluster == &old_cluster) + pg_fatal("The source cluster was not shut down cleanly.\n"); + else + pg_fatal("The target cluster was not shut down cleanly.\n"); + } + got_cluster_state = true; + } + } + + pclose(output); + + if (!got_cluster_state) + { + if (cluster == &old_cluster) + pg_fatal("The source cluster lacks cluster state information:\n"); + else + pg_fatal("The target cluster lacks cluster state information:\n"); + } + } + /* pg_resetxlog has been renamed to pg_resetwal in version 10 */ if (GET_MAJOR_VERSION(cluster->bin_version) < 1000) resetwal_bin = "pg_resetxlog\" -n"; @@ -423,64 +482,6 @@ get_control_data(ClusterInfo *cluster, bool live_check) pclose(output); - /* - * Check for clean shutdown - */ - - /* only pg_controldata outputs the cluster state */ - snprintf(cmd, sizeof(cmd), "\"%s/pg_controldata\" \"%s\"", - cluster->bindir, cluster->pgdata); - fflush(stdout); - fflush(stderr); - - if ((output = popen(cmd, "r")) == NULL) - pg_fatal("could not get control data using %s: %s\n", - cmd, strerror(errno)); - - /* we have the result of cmd in "output". so parse it line by line now */ - while (fgets(bufin, sizeof(bufin), output)) - { - if ((!live_check || cluster == &new_cluster) && - (p = strstr(bufin, "Database cluster state:")) != NULL) - { - p = strchr(p, ':'); - - if (p == NULL || strlen(p) <= 1) - pg_fatal("%d: database cluster state problem\n", __LINE__); - - p++; /* remove ':' char */ - - /* - * We checked earlier for a postmaster lock file, and if we found - * one, we tried to start/stop the server to replay the WAL. However, - * pg_ctl -m immediate doesn't leave a lock file, but does require - * WAL replay, so we check here that the server was shut down cleanly, - * from the controldata perspective. - */ - /* remove leading spaces */ - while (*p == ' ') - p++; - if (strcmp(p, "shut down\n") != 0) - { - if (cluster == &old_cluster) - pg_fatal("The source cluster was not shut down cleanly.\n"); - else - pg_fatal("The target cluster was not shut down cleanly.\n"); - } - got_cluster_state = true; - } - } - - pclose(output); - - if (!got_cluster_state) - { - if (cluster == &old_cluster) - pg_fatal("The source cluster lacks cluster state information:\n"); - else - pg_fatal("The target cluster lacks cluster state information:\n"); - } - /* * Restore environment variables */