summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2018-07-31 18:10:06 -0400
committerBruce Momjian <bruce@momjian.us>2018-07-31 18:10:06 -0400
commit92a11a0d82724d365c0c32ebb12967ad83bc1200 (patch)
tree6305ee1007ff05da1d390f5df38ec7dba26ede2d
parent12f2d814ac61a63c5dd1745fe0f0ff5f5202cd44 (diff)
downloadpostgresql-92a11a0d82724d365c0c32ebb12967ad83bc1200.tar.gz
pg_upgrade: fix --check for live source server checks
Fix for commit 244142d32afd02e7408a2ef1f249b00393983822. Backpatch-through: 9.3
-rw-r--r--src/bin/pg_upgrade/controldata.c117
1 files changed, 59 insertions, 58 deletions
diff --git a/src/bin/pg_upgrade/controldata.c b/src/bin/pg_upgrade/controldata.c
index c189fa845f..b29b0036fa 100644
--- a/src/bin/pg_upgrade/controldata.c
+++ b/src/bin/pg_upgrade/controldata.c
@@ -112,6 +112,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");
+ }
+ }
+
snprintf(cmd, sizeof(cmd), "\"%s/%s \"%s\"",
cluster->bindir,
live_check ? "pg_controldata\"" : "pg_resetxlog\" -n",
@@ -406,64 +465,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
*/
pg_putenv("LC_COLLATE", lc_collate);