43 bool got_log_id =
false;
44 bool got_log_seg =
false;
47 bool got_multi =
false;
48 bool got_oldestmulti =
false;
49 bool got_oldestxid =
false;
50 bool got_mxoff =
false;
51 bool got_nextxlogfile =
false;
52 bool got_float8_pass_by_value =
false;
53 bool got_align =
false;
54 bool got_blocksz =
false;
55 bool got_largesz =
false;
56 bool got_walsz =
false;
57 bool got_walseg =
false;
58 bool got_ident =
false;
59 bool got_index =
false;
60 bool got_toast =
false;
61 bool got_large_object =
false;
62 bool got_date_is_int =
false;
63 bool got_data_checksum_version =
false;
64 bool got_cluster_state =
false;
71 char *language = NULL;
85 if (getenv(
"LC_COLLATE"))
87 if (getenv(
"LC_CTYPE"))
89 if (getenv(
"LC_MONETARY"))
91 if (getenv(
"LC_NUMERIC"))
93 if (getenv(
"LC_TIME"))
97 if (getenv(
"LANGUAGE"))
101 if (getenv(
"LC_MESSAGES"))
117 setenv(
"LC_MESSAGES",
"C", 1);
125 snprintf(cmd,
sizeof(cmd),
"\"%s/pg_controldata\" \"%s\"",
129 if ((
output = popen(cmd,
"r")) == NULL)
130 pg_fatal(
"could not get control data using %s: %m", cmd);
133 while (fgets(bufin,
sizeof(bufin),
output))
135 if ((p = strstr(bufin,
"Database cluster state:")) != NULL)
139 if (p == NULL || strlen(p) <= 1)
140 pg_fatal(
"%d: database cluster state problem", __LINE__);
156 if (strcmp(p,
"shut down in recovery") == 0)
159 pg_fatal(
"The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.");
161 pg_fatal(
"The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.");
163 else if (strcmp(p,
"shut down") != 0)
166 pg_fatal(
"The source cluster was not shut down cleanly, state reported as: \"%s\"", p);
168 pg_fatal(
"The target cluster was not shut down cleanly, state reported as: \"%s\"", p);
170 got_cluster_state =
true;
176 pg_fatal(
"could not get control data using %s: %s",
179 if (!got_cluster_state)
182 pg_fatal(
"The source cluster lacks cluster state information:");
184 pg_fatal(
"The target cluster lacks cluster state information:");
190 resetwal_bin =
"pg_resetxlog\" -n";
192 resetwal_bin =
"pg_resetwal\" -n";
193 snprintf(cmd,
sizeof(cmd),
"\"%s/%s \"%s\"",
195 live_check ?
"pg_controldata\"" : resetwal_bin,
199 if ((
output = popen(cmd,
"r")) == NULL)
200 pg_fatal(
"could not get control data using %s: %m", cmd);
205 cluster->controldata.data_checksum_version = 0;
206 got_data_checksum_version =
true;
210 while (fgets(bufin,
sizeof(bufin),
output))
216 if ((p = strstr(bufin,
"pg_control version number:")) != NULL)
220 if (p == NULL || strlen(p) <= 1)
221 pg_fatal(
"%d: pg_resetwal problem", __LINE__);
226 else if ((p = strstr(bufin,
"Catalog version number:")) != NULL)
230 if (p == NULL || strlen(p) <= 1)
231 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
236 else if ((p = strstr(bufin,
"Latest checkpoint's TimeLineID:")) != NULL)
240 if (p == NULL || strlen(p) <= 1)
241 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
247 else if ((p = strstr(bufin,
"First log file ID after reset:")) != NULL)
251 if (p == NULL || strlen(p) <= 1)
252 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
258 else if ((p = strstr(bufin,
"First log file segment after reset:")) != NULL)
262 if (p == NULL || strlen(p) <= 1)
263 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
269 else if ((p = strstr(bufin,
"Latest checkpoint's NextXID:")) != NULL)
273 if (p == NULL || strlen(p) <= 1)
274 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
285 if (strchr(p,
'/') != NULL)
292 if (p == NULL || strlen(p) <= 1)
293 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
299 else if ((p = strstr(bufin,
"Latest checkpoint's NextOID:")) != NULL)
303 if (p == NULL || strlen(p) <= 1)
304 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
310 else if ((p = strstr(bufin,
"Latest checkpoint's NextMultiXactId:")) != NULL)
314 if (p == NULL || strlen(p) <= 1)
315 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
321 else if ((p = strstr(bufin,
"Latest checkpoint's oldestXID:")) != NULL)
325 if (p == NULL || strlen(p) <= 1)
326 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
330 got_oldestxid =
true;
332 else if ((p = strstr(bufin,
"Latest checkpoint's oldestMultiXid:")) != NULL)
336 if (p == NULL || strlen(p) <= 1)
337 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
341 got_oldestmulti =
true;
343 else if ((p = strstr(bufin,
"Latest checkpoint's NextMultiOffset:")) != NULL)
347 if (p == NULL || strlen(p) <= 1)
348 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
354 else if ((p = strstr(bufin,
"First log segment after reset:")) != NULL)
358 if (p == NULL || strlen(p) <= 1)
359 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
360 p = strpbrk(p,
"01234567890ABCDEF");
361 if (p == NULL || strlen(p) <= 1)
362 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
365 if (strspn(p,
"0123456789ABCDEF") != 24)
366 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
369 got_nextxlogfile =
true;
371 else if ((p = strstr(bufin,
"Float8 argument passing:")) != NULL)
375 if (p == NULL || strlen(p) <= 1)
376 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
380 cluster->controldata.float8_pass_by_value = strstr(p,
"by value") != NULL;
381 got_float8_pass_by_value =
true;
383 else if ((p = strstr(bufin,
"Maximum data alignment:")) != NULL)
387 if (p == NULL || strlen(p) <= 1)
388 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
394 else if ((p = strstr(bufin,
"Database block size:")) != NULL)
398 if (p == NULL || strlen(p) <= 1)
399 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
405 else if ((p = strstr(bufin,
"Blocks per segment of large relation:")) != NULL)
409 if (p == NULL || strlen(p) <= 1)
410 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
416 else if ((p = strstr(bufin,
"WAL block size:")) != NULL)
420 if (p == NULL || strlen(p) <= 1)
421 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
427 else if ((p = strstr(bufin,
"Bytes per WAL segment:")) != NULL)
431 if (p == NULL || strlen(p) <= 1)
432 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
438 else if ((p = strstr(bufin,
"Maximum length of identifiers:")) != NULL)
442 if (p == NULL || strlen(p) <= 1)
443 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
449 else if ((p = strstr(bufin,
"Maximum columns in an index:")) != NULL)
453 if (p == NULL || strlen(p) <= 1)
454 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
460 else if ((p = strstr(bufin,
"Maximum size of a TOAST chunk:")) != NULL)
464 if (p == NULL || strlen(p) <= 1)
465 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
471 else if ((p = strstr(bufin,
"Size of a large-object chunk:")) != NULL)
475 if (p == NULL || strlen(p) <= 1)
476 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
480 got_large_object =
true;
482 else if ((p = strstr(bufin,
"Date/time type storage:")) != NULL)
486 if (p == NULL || strlen(p) <= 1)
487 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
490 cluster->controldata.date_is_int = strstr(p,
"64-bit integers") != NULL;
491 got_date_is_int =
true;
493 else if ((p = strstr(bufin,
"checksum")) != NULL)
497 if (p == NULL || strlen(p) <= 1)
498 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
502 got_data_checksum_version =
true;
508 pg_fatal(
"could not get control data using %s: %s",
530 setenv(
"LANGUAGE", language, 1);
532 setenv(
"LC_ALL", lc_all, 1);
556 if (got_tli && got_log_id && got_log_seg)
560 got_nextxlogfile =
true;
565 if (!got_xid || !got_oid ||
566 !got_multi || !got_oldestxid ||
569 !got_mxoff || (!live_check && !got_nextxlogfile) ||
570 !got_float8_pass_by_value || !got_align || !got_blocksz ||
571 !got_largesz || !got_walsz || !got_walseg || !got_ident ||
572 !got_index || !got_toast ||
573 (!got_large_object &&
575 !got_date_is_int || !got_data_checksum_version)
579 "The source cluster lacks some required control information:");
582 "The target cluster lacks some required control information:");
593 if (!got_oldestmulti &&
603 if (!live_check && !got_nextxlogfile)
606 if (!got_float8_pass_by_value)
633 if (!got_large_object &&
637 if (!got_date_is_int)
641 if (!got_data_checksum_version)
644 pg_fatal(
"Cannot continue without required control information, terminating");
void cluster(ParseState *pstate, ClusterStmt *stmt, bool isTopLevel)
char * pg_strdup(const char *in)
static char * lc_messages
static char * lc_monetary
static void const char fflush(stdout)
#define LARGE_OBJECT_SIZE_PG_CONTROL_VER
#define MULTIXACT_FORMATCHANGE_CAT_VER
void void unsigned int str2uint(const char *str)
#define GET_MAJOR_VERSION(v)
size_t strlcpy(char *dst, const char *src, size_t siz)
int pg_strip_crlf(char *str)
char * wait_result_to_str(int exitstatus)