Skip to content

Commit 764e21d

Browse files
committed
pg_upgrade: fix --check for live source server checks
Fix for commit 244142d. Backpatch-through: 9.3
1 parent 6680d19 commit 764e21d

File tree

1 file changed

+59
-58
lines changed

1 file changed

+59
-58
lines changed

src/bin/pg_upgrade/controldata.c

Lines changed: 59 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,65 @@ get_control_data(ClusterInfo *cluster, bool live_check)
112112
pg_putenv("LC_ALL", NULL);
113113
pg_putenv("LC_MESSAGES", "C");
114114

115+
/*
116+
* Check for clean shutdown
117+
*/
118+
if (!live_check || cluster == &new_cluster)
119+
{
120+
/* only pg_controldata outputs the cluster state */
121+
snprintf(cmd, sizeof(cmd), "\"%s/pg_controldata\" \"%s\"",
122+
cluster->bindir, cluster->pgdata);
123+
fflush(stdout);
124+
fflush(stderr);
125+
126+
if ((output = popen(cmd, "r")) == NULL)
127+
pg_fatal("could not get control data using %s: %s\n",
128+
cmd, strerror(errno));
129+
130+
/* we have the result of cmd in "output". so parse it line by line now */
131+
while (fgets(bufin, sizeof(bufin), output))
132+
{
133+
if ((p = strstr(bufin, "Database cluster state:")) != NULL)
134+
{
135+
p = strchr(p, ':');
136+
137+
if (p == NULL || strlen(p) <= 1)
138+
pg_fatal("%d: database cluster state problem\n", __LINE__);
139+
140+
p++; /* remove ':' char */
141+
142+
/*
143+
* We checked earlier for a postmaster lock file, and if we found
144+
* one, we tried to start/stop the server to replay the WAL. However,
145+
* pg_ctl -m immediate doesn't leave a lock file, but does require
146+
* WAL replay, so we check here that the server was shut down cleanly,
147+
* from the controldata perspective.
148+
*/
149+
/* remove leading spaces */
150+
while (*p == ' ')
151+
p++;
152+
if (strcmp(p, "shut down\n") != 0)
153+
{
154+
if (cluster == &old_cluster)
155+
pg_fatal("The source cluster was not shut down cleanly.\n");
156+
else
157+
pg_fatal("The target cluster was not shut down cleanly.\n");
158+
}
159+
got_cluster_state = true;
160+
}
161+
}
162+
163+
pclose(output);
164+
165+
if (!got_cluster_state)
166+
{
167+
if (cluster == &old_cluster)
168+
pg_fatal("The source cluster lacks cluster state information:\n");
169+
else
170+
pg_fatal("The target cluster lacks cluster state information:\n");
171+
}
172+
}
173+
115174
snprintf(cmd, sizeof(cmd), "\"%s/%s \"%s\"",
116175
cluster->bindir,
117176
live_check ? "pg_controldata\"" : "pg_resetxlog\" -n",
@@ -417,64 +476,6 @@ get_control_data(ClusterInfo *cluster, bool live_check)
417476

418477
pclose(output);
419478

420-
/*
421-
* Check for clean shutdown
422-
*/
423-
424-
/* only pg_controldata outputs the cluster state */
425-
snprintf(cmd, sizeof(cmd), "\"%s/pg_controldata\" \"%s\"",
426-
cluster->bindir, cluster->pgdata);
427-
fflush(stdout);
428-
fflush(stderr);
429-
430-
if ((output = popen(cmd, "r")) == NULL)
431-
pg_fatal("could not get control data using %s: %s\n",
432-
cmd, strerror(errno));
433-
434-
/* we have the result of cmd in "output". so parse it line by line now */
435-
while (fgets(bufin, sizeof(bufin), output))
436-
{
437-
if ((!live_check || cluster == &new_cluster) &&
438-
(p = strstr(bufin, "Database cluster state:")) != NULL)
439-
{
440-
p = strchr(p, ':');
441-
442-
if (p == NULL || strlen(p) <= 1)
443-
pg_fatal("%d: database cluster state problem\n", __LINE__);
444-
445-
p++; /* remove ':' char */
446-
447-
/*
448-
* We checked earlier for a postmaster lock file, and if we found
449-
* one, we tried to start/stop the server to replay the WAL. However,
450-
* pg_ctl -m immediate doesn't leave a lock file, but does require
451-
* WAL replay, so we check here that the server was shut down cleanly,
452-
* from the controldata perspective.
453-
*/
454-
/* remove leading spaces */
455-
while (*p == ' ')
456-
p++;
457-
if (strcmp(p, "shut down\n") != 0)
458-
{
459-
if (cluster == &old_cluster)
460-
pg_fatal("The source cluster was not shut down cleanly.\n");
461-
else
462-
pg_fatal("The target cluster was not shut down cleanly.\n");
463-
}
464-
got_cluster_state = true;
465-
}
466-
}
467-
468-
pclose(output);
469-
470-
if (!got_cluster_state)
471-
{
472-
if (cluster == &old_cluster)
473-
pg_fatal("The source cluster lacks cluster state information:\n");
474-
else
475-
pg_fatal("The target cluster lacks cluster state information:\n");
476-
}
477-
478479
/*
479480
* Restore environment variables
480481
*/

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy