45 bool got_log_id =
false;
46 bool got_log_seg =
false;
49 bool got_multi =
false;
50 bool got_oldestmulti =
false;
51 bool got_oldestxid =
false;
52 bool got_mxoff =
false;
53 bool got_nextxlogfile =
false;
54 bool got_float8_pass_by_value =
false;
55 bool got_align =
false;
56 bool got_blocksz =
false;
57 bool got_largesz =
false;
58 bool got_walsz =
false;
59 bool got_walseg =
false;
60 bool got_ident =
false;
61 bool got_index =
false;
62 bool got_toast =
false;
63 bool got_large_object =
false;
64 bool got_date_is_int =
false;
65 bool got_data_checksum_version =
false;
66 bool got_cluster_state =
false;
67 bool got_default_char_signedness =
false;
74 char *language = NULL;
88 if (getenv(
"LC_COLLATE"))
90 if (getenv(
"LC_CTYPE"))
92 if (getenv(
"LC_MONETARY"))
94 if (getenv(
"LC_NUMERIC"))
96 if (getenv(
"LC_TIME"))
100 if (getenv(
"LANGUAGE"))
101 language =
pg_strdup(getenv(
"LANGUAGE"));
102 if (getenv(
"LC_ALL"))
104 if (getenv(
"LC_MESSAGES"))
120 setenv(
"LC_MESSAGES",
"C", 1);
128 snprintf(cmd,
sizeof(cmd),
"\"%s/pg_controldata\" \"%s\"",
132 if ((
output = popen(cmd,
"r")) == NULL)
133 pg_fatal(
"could not get control data using %s: %m", cmd);
136 while (fgets(bufin,
sizeof(bufin),
output))
138 if ((p = strstr(bufin,
"Database cluster state:")) != NULL)
142 if (p == NULL || strlen(p) <= 1)
143 pg_fatal(
"%d: database cluster state problem", __LINE__);
159 if (strcmp(p,
"shut down in recovery") == 0)
162 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.");
164 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.");
166 else if (strcmp(p,
"shut down") != 0)
169 pg_fatal(
"The source cluster was not shut down cleanly, state reported as: \"%s\"", p);
171 pg_fatal(
"The target cluster was not shut down cleanly, state reported as: \"%s\"", p);
173 got_cluster_state =
true;
179 pg_fatal(
"could not get control data using %s: %s",
182 if (!got_cluster_state)
185 pg_fatal(
"The source cluster lacks cluster state information:");
187 pg_fatal(
"The target cluster lacks cluster state information:");
193 resetwal_bin =
"pg_resetxlog\" -n";
195 resetwal_bin =
"pg_resetwal\" -n";
196 snprintf(cmd,
sizeof(cmd),
"\"%s/%s \"%s\"",
198 live_check ?
"pg_controldata\"" : resetwal_bin,
202 if ((
output = popen(cmd,
"r")) == NULL)
203 pg_fatal(
"could not get control data using %s: %m", cmd);
208 cluster->controldata.data_checksum_version = 0;
209 got_data_checksum_version =
true;
213 while (fgets(bufin,
sizeof(bufin),
output))
219 if ((p = strstr(bufin,
"pg_control version number:")) != NULL)
223 if (p == NULL || strlen(p) <= 1)
224 pg_fatal(
"%d: pg_resetwal problem", __LINE__);
229 else if ((p = strstr(bufin,
"Catalog version number:")) != NULL)
233 if (p == NULL || strlen(p) <= 1)
234 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
239 else if ((p = strstr(bufin,
"Latest checkpoint's TimeLineID:")) != NULL)
243 if (p == NULL || strlen(p) <= 1)
244 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
250 else if ((p = strstr(bufin,
"First log file ID after reset:")) != NULL)
254 if (p == NULL || strlen(p) <= 1)
255 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
261 else if ((p = strstr(bufin,
"First log file segment after reset:")) != NULL)
265 if (p == NULL || strlen(p) <= 1)
266 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
272 else if ((p = strstr(bufin,
"Latest checkpoint's NextXID:")) != NULL)
276 if (p == NULL || strlen(p) <= 1)
277 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
288 if (strchr(p,
'/') != NULL)
295 if (p == NULL || strlen(p) <= 1)
296 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
302 else if ((p = strstr(bufin,
"Latest checkpoint's NextOID:")) != NULL)
306 if (p == NULL || strlen(p) <= 1)
307 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
313 else if ((p = strstr(bufin,
"Latest checkpoint's NextMultiXactId:")) != NULL)
317 if (p == NULL || strlen(p) <= 1)
318 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
324 else if ((p = strstr(bufin,
"Latest checkpoint's oldestXID:")) != NULL)
328 if (p == NULL || strlen(p) <= 1)
329 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
333 got_oldestxid =
true;
335 else if ((p = strstr(bufin,
"Latest checkpoint's oldestMultiXid:")) != NULL)
339 if (p == NULL || strlen(p) <= 1)
340 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
344 got_oldestmulti =
true;
346 else if ((p = strstr(bufin,
"Latest checkpoint's NextMultiOffset:")) != NULL)
350 if (p == NULL || strlen(p) <= 1)
351 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
357 else if ((p = strstr(bufin,
"First log segment after reset:")) != NULL)
361 if (p == NULL || strlen(p) <= 1)
362 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
363 p = strpbrk(p,
"01234567890ABCDEF");
364 if (p == NULL || strlen(p) <= 1)
365 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
368 if (strspn(p,
"0123456789ABCDEF") != 24)
369 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
372 got_nextxlogfile =
true;
374 else if ((p = strstr(bufin,
"Float8 argument passing:")) != NULL)
378 if (p == NULL || strlen(p) <= 1)
379 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
383 cluster->controldata.float8_pass_by_value = strstr(p,
"by value") != NULL;
384 got_float8_pass_by_value =
true;
386 else if ((p = strstr(bufin,
"Maximum data alignment:")) != NULL)
390 if (p == NULL || strlen(p) <= 1)
391 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
397 else if ((p = strstr(bufin,
"Database block size:")) != NULL)
401 if (p == NULL || strlen(p) <= 1)
402 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
408 else if ((p = strstr(bufin,
"Blocks per segment of large relation:")) != NULL)
412 if (p == NULL || strlen(p) <= 1)
413 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
419 else if ((p = strstr(bufin,
"WAL block size:")) != NULL)
423 if (p == NULL || strlen(p) <= 1)
424 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
430 else if ((p = strstr(bufin,
"Bytes per WAL segment:")) != NULL)
434 if (p == NULL || strlen(p) <= 1)
435 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
441 else if ((p = strstr(bufin,
"Maximum length of identifiers:")) != NULL)
445 if (p == NULL || strlen(p) <= 1)
446 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
452 else if ((p = strstr(bufin,
"Maximum columns in an index:")) != NULL)
456 if (p == NULL || strlen(p) <= 1)
457 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
463 else if ((p = strstr(bufin,
"Maximum size of a TOAST chunk:")) != NULL)
467 if (p == NULL || strlen(p) <= 1)
468 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
474 else if ((p = strstr(bufin,
"Size of a large-object chunk:")) != NULL)
478 if (p == NULL || strlen(p) <= 1)
479 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
483 got_large_object =
true;
485 else if ((p = strstr(bufin,
"Date/time type storage:")) != NULL)
489 if (p == NULL || strlen(p) <= 1)
490 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
493 cluster->controldata.date_is_int = strstr(p,
"64-bit integers") != NULL;
494 got_date_is_int =
true;
496 else if ((p = strstr(bufin,
"checksum")) != NULL)
500 if (p == NULL || strlen(p) <= 1)
501 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
505 got_data_checksum_version =
true;
507 else if ((p = strstr(bufin,
"Default char data signedness:")) != NULL)
511 if (p == NULL || strlen(p) <= 1)
512 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
516 while (isspace((
unsigned char) *p))
520 if (strcmp(p,
"signed") != 0 && strcmp(p,
"unsigned") != 0)
521 pg_fatal(
"%d: controldata retrieval problem", __LINE__);
523 cluster->controldata.default_char_signedness = strcmp(p,
"signed") == 0;
524 got_default_char_signedness =
true;
530 pg_fatal(
"could not get control data using %s: %s",
552 setenv(
"LANGUAGE", language, 1);
554 setenv(
"LC_ALL", lc_all, 1);
578 if (got_tli && got_log_id && got_log_seg)
582 got_nextxlogfile =
true;
593 Assert(!got_default_char_signedness);
595 cluster->controldata.default_char_signedness =
true;
597 cluster->controldata.default_char_signedness =
false;
602 if (!got_xid || !got_oid ||
603 !got_multi || !got_oldestxid ||
606 !got_mxoff || (!live_check && !got_nextxlogfile) ||
607 !got_float8_pass_by_value || !got_align || !got_blocksz ||
608 !got_largesz || !got_walsz || !got_walseg || !got_ident ||
609 !got_index || !got_toast ||
610 (!got_large_object &&
612 !got_date_is_int || !got_data_checksum_version ||
613 (!got_default_char_signedness &&
618 "The source cluster lacks some required control information:");
621 "The target cluster lacks some required control information:");
632 if (!got_oldestmulti &&
642 if (!live_check && !got_nextxlogfile)
645 if (!got_float8_pass_by_value)
672 if (!got_large_object &&
676 if (!got_date_is_int)
680 if (!got_data_checksum_version)
684 if (!got_default_char_signedness)
687 pg_fatal(
"Cannot continue without required control information, terminating");
702 pg_fatal(
"old and new pg_controldata alignments are invalid or do not match.\n"
703 "Likely one cluster is a 32-bit install, the other 64-bit");
706 pg_fatal(
"old and new pg_controldata block sizes are invalid or do not match");
709 pg_fatal(
"old and new pg_controldata maximum relation segment sizes are invalid or do not match");
712 pg_fatal(
"old and new pg_controldata WAL block sizes are invalid or do not match");
715 pg_fatal(
"old and new pg_controldata WAL segment sizes are invalid or do not match");
718 pg_fatal(
"old and new pg_controldata maximum identifier lengths are invalid or do not match");
721 pg_fatal(
"old and new pg_controldata maximum indexed columns are invalid or do not match");
724 pg_fatal(
"old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match");
729 pg_fatal(
"old and new pg_controldata large-object chunk sizes are invalid or do not match");
732 pg_fatal(
"old and new pg_controldata date/time storage types do not match");
745 pg_fatal(
"old cluster does not use data checksums but the new one does");
748 pg_fatal(
"old cluster uses data checksums but the new one does not");
750 pg_fatal(
"old and new cluster pg_controldata checksum versions do not match");
767 pg_fatal(
"could not rename file \"%s\" to \"%s\": %m",
774 "If you want to start the old cluster, you will need to remove\n"
775 "the \".old\" suffix from \"%s/%s.old\".\n"
776 "Because \"link\" mode was used, the old cluster cannot be safely\n"
777 "started once the new cluster has been started.",
781 "Because \"swap\" mode was used, the old cluster can no longer be\n"
784 pg_fatal(
"unrecognized transfer mode");
void cluster(ParseState *pstate, ClusterStmt *stmt, bool isTopLevel)
void get_control_data(ClusterInfo *cluster)
void check_control_data(ControlData *oldctrl, ControlData *newctrl)
void disable_old_cluster(transferMode transfer_mode)
char * pg_strdup(const char *in)
Assert(PointerIsAligned(start, uint64))
static char * lc_messages
static void check_ok(void)
static char * lc_monetary
#define LARGE_OBJECT_SIZE_PG_CONTROL_VER
#define MULTIXACT_FORMATCHANGE_CAT_VER
void void unsigned int str2uint(const char *str)
void void pg_log(eLogType type, const char *fmt,...) pg_attribute_printf(2
#define GET_MAJOR_VERSION(v)
#define DEFAULT_CHAR_SIGNEDNESS_CAT_VER
void prep_status(const char *fmt,...) pg_attribute_printf(1
size_t strlcpy(char *dst, const char *src, size_t siz)
int pg_strip_crlf(char *str)
uint32 data_checksum_version
char * wait_result_to_str(int exitstatus)
#define XLOG_CONTROL_FILE