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

contrib/pg_upgrade/controldata.c

index 891a054be73ab15e595abacc85c62d46589d49e3..aef830882cdfbeca91567f38d963bd7d8c5c7a73 100644 (file)
@@ -111,6 +111,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_log(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_log(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_log(PG_FATAL, "The source cluster was not shut down cleanly.\n");
+                   else
+                       pg_log(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_log(PG_FATAL, "The source cluster lacks cluster state information:\n");
+           else
+               pg_log(PG_FATAL, "The target cluster lacks cluster state information:\n");
+       }
+   }
+
    snprintf(cmd, sizeof(cmd), SYSTEMQUOTE "\"%s/%s \"%s\"" SYSTEMQUOTE,
             cluster->bindir,
             live_check ? "pg_controldata\"" : "pg_resetxlog\" -n",
@@ -453,64 +512,6 @@ get_control_data(ClusterInfo *cluster, bool live_check)
    if (output)
        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_log(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_log(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_log(PG_FATAL, "The source cluster was not shut down cleanly.\n");
-               else
-                   pg_log(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_log(PG_FATAL, "The source cluster lacks cluster state information:\n");
-       else
-           pg_log(PG_FATAL, "The target cluster lacks cluster state information:\n");
-   }
-
    /*
     * Restore environment variables
     */