pg_upgrade: fix --check for live source server checks

Fix for commit 244142d32a.

Backpatch-through: 9.3
This commit is contained in:
Bruce Momjian 2018-07-31 18:10:06 -04:00
parent df163230b9
commit b6d6488a3a
1 changed files with 59 additions and 58 deletions

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