diff --git a/src/bin/pg_resetxlog/pg_resetxlog.c b/src/bin/pg_resetxlog/pg_resetxlog.c index 3e79482ca2..f2e9824cb5 100644 --- a/src/bin/pg_resetxlog/pg_resetxlog.c +++ b/src/bin/pg_resetxlog/pg_resetxlog.c @@ -67,6 +67,7 @@ static TransactionId set_xid = 0; static TransactionId set_oldest_commit_ts_xid = 0; static TransactionId set_newest_commit_ts_xid = 0; static Oid set_oid = 0; +static Oid max_limit_xid = 2000000000; static MultiXactId set_mxid = 0; static MultiXactOffset set_mxoff = (MultiXactOffset) -1; static uint32 minXlogTli = 0; @@ -116,7 +117,7 @@ main(int argc, char *argv[]) } - while ((c = getopt(argc, argv, "c:D:e:fl:m:no:O:x:")) != -1) + while ((c = getopt(argc, argv, "c:D:e:fl:L:m:no:O:x:")) != -1) { switch (c) { @@ -210,6 +211,21 @@ main(int argc, char *argv[]) } break; + case 'L': + max_limit_xid = strtoul(optarg, &endptr, 0); + if (endptr == optarg || *endptr != '\0') + { + fprintf(stderr, _("%s: invalid argument for option %s\n"), progname, "-L"); + fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + exit(1); + } + if (max_limit_xid <= 500000000) + { + fprintf(stderr, _("%s: Max Limit XID (-L) must not be less than 500 Million\n"), progname); + exit(1); + } + break; + case 'm': set_mxid = strtoul(optarg, &endptr, 0); if (endptr == optarg || *endptr != ',') @@ -381,7 +397,7 @@ main(int argc, char *argv[]) * reasonably safe. The magic constant here corresponds to the * maximum allowed value of autovacuum_freeze_max_age. */ - ControlFile.checkPointCopy.oldestXid = set_xid - 2000000000; + ControlFile.checkPointCopy.oldestXid = set_xid - max_limit_xid; if (ControlFile.checkPointCopy.oldestXid < FirstNormalTransactionId) ControlFile.checkPointCopy.oldestXid += FirstNormalTransactionId; ControlFile.checkPointCopy.oldestXidDB = InvalidOid; @@ -1239,6 +1255,7 @@ usage(void) printf(_(" -e XIDEPOCH set next transaction ID epoch\n")); printf(_(" -f force update to be done\n")); printf(_(" -l XLOGFILE force minimum WAL starting location for new transaction log\n")); + printf(_(" -L MAXLIMITXID force max XID starting location for new transaction log\n")); printf(_(" -m MXID,MXID set next and oldest multitransaction ID\n")); printf(_(" -n no update, just show what would be done (for testing)\n")); printf(_(" -o OID set next OID\n")); diff --git a/src/bin/pg_upgrade/option.c b/src/bin/pg_upgrade/option.c index 7ab284a51b..3a861739f7 100644 --- a/src/bin/pg_upgrade/option.c +++ b/src/bin/pg_upgrade/option.c @@ -53,6 +53,7 @@ parseCommandLine(int argc, char *argv[]) {"link", no_argument, NULL, 'k'}, {"retain", no_argument, NULL, 'r'}, {"jobs", required_argument, NULL, 'j'}, + {"max-limit-xid", required_argument, NULL, 'L'}, {"verbose", no_argument, NULL, 'v'}, {NULL, 0, NULL, 0} }; @@ -64,6 +65,7 @@ parseCommandLine(int argc, char *argv[]) time_t run_time = time(NULL); user_opts.transfer_mode = TRANSFER_MODE_COPY; + user_opts.maxlimitxid = 2000000000; os_info.progname = get_progname(argv[0]); @@ -101,7 +103,7 @@ parseCommandLine(int argc, char *argv[]) if ((log_opts.internal = fopen_priv(INTERNAL_LOG_FILE, "a")) == NULL) pg_fatal("cannot write to log file %s\n", INTERNAL_LOG_FILE); - while ((option = getopt_long(argc, argv, "d:D:b:B:cj:ko:O:p:P:rU:v", + while ((option = getopt_long(argc, argv, "d:D:b:B:cj:ko:L:O:p:P:rU:v", long_options, &optindex)) != -1) { switch (option) @@ -132,6 +134,10 @@ parseCommandLine(int argc, char *argv[]) user_opts.jobs = atoi(optarg); break; + case 'L': + user_opts.maxlimitxid = atoi(optarg); + break; + case 'k': user_opts.transfer_mode = TRANSFER_MODE_LINK; break; @@ -287,6 +293,7 @@ Options:\n\ -D, --new-datadir=DATADIR new cluster data directory\n\ -j, --jobs=NUM number of simultaneous processes or threads to use\n\ -k, --link link instead of copying files to new cluster\n\ + -L, --max-limit-xid=NUM max-limit XIDs to consider\n\ -o, --old-options=OPTIONS old cluster options to pass to the server\n\ -O, --new-options=OPTIONS new cluster options to pass to the server\n\ -p, --old-port=PORT old cluster port number (default %d)\n\ diff --git a/src/bin/pg_upgrade/pg_upgrade.c b/src/bin/pg_upgrade/pg_upgrade.c index 02078c0357..2d0f3a7e04 100644 --- a/src/bin/pg_upgrade/pg_upgrade.c +++ b/src/bin/pg_upgrade/pg_upgrade.c @@ -411,8 +411,10 @@ copy_clog_xlog_xid(void) /* set the next transaction id and epoch of the new cluster */ prep_status("Setting next transaction ID and epoch for new cluster"); exec_prog(UTILITY_LOG_FILE, NULL, true, - "\"%s/pg_resetxlog\" -f -x %u \"%s\"", - new_cluster.bindir, old_cluster.controldata.chkpnt_nxtxid, + "\"%s/pg_resetxlog\" -L %u -f -x %u \"%s\"", + new_cluster.bindir, + user_opts.maxlimitxid, + old_cluster.controldata.chkpnt_nxtxid, new_cluster.pgdata); exec_prog(UTILITY_LOG_FILE, NULL, true, "\"%s/pg_resetxlog\" -f -e %u \"%s\"", diff --git a/src/bin/pg_upgrade/pg_upgrade.h b/src/bin/pg_upgrade/pg_upgrade.h index 9fbdacc53e..50fe73ae09 100644 --- a/src/bin/pg_upgrade/pg_upgrade.h +++ b/src/bin/pg_upgrade/pg_upgrade.h @@ -298,6 +298,7 @@ typedef struct * changes */ transferMode transfer_mode; /* copy files or link them? */ int jobs; + int maxlimitxid; } UserOpts;