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
     */