]> granicus.if.org Git - postgresql/commitdiff
pg_upgrade: fix --check for live source server checks
authorBruce Momjian <bruce@momjian.us>
Tue, 31 Jul 2018 22:10:06 +0000 (18:10 -0400)
committerBruce Momjian <bruce@momjian.us>
Tue, 31 Jul 2018 22:10:06 +0000 (18:10 -0400)
Fix for commit 244142d32afd02e7408a2ef1f249b00393983822.

Backpatch-through: 9.3

src/bin/pg_upgrade/controldata.c

index bba3b1b76e5fc4e033fb57f5e67ab60e9c5feda2..ce3f263b107ce8261e5040afa119c891b64ec5cb 100644 (file)
@@ -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
         */