diff options
Diffstat (limited to 'src/bin/pg_resetxlog/pg_resetxlog.c')
-rw-r--r-- | src/bin/pg_resetxlog/pg_resetxlog.c | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/src/bin/pg_resetxlog/pg_resetxlog.c b/src/bin/pg_resetxlog/pg_resetxlog.c index 8734f2c8688..8e7fe7eb72e 100644 --- a/src/bin/pg_resetxlog/pg_resetxlog.c +++ b/src/bin/pg_resetxlog/pg_resetxlog.c @@ -85,10 +85,12 @@ main(int argc, char *argv[]) TransactionId set_xid = 0; Oid set_oid = 0; MultiXactId set_mxid = 0; + MultiXactId set_oldestmxid = 0; MultiXactOffset set_mxoff = (MultiXactOffset) -1; uint32 minXlogTli = 0; XLogSegNo minXlogSegNo = 0; char *endptr; + char *endptr2; char *DataDir; int fd; @@ -170,7 +172,15 @@ main(int argc, char *argv[]) case 'm': set_mxid = strtoul(optarg, &endptr, 0); - if (endptr == optarg || *endptr != '\0') + if (endptr == optarg || *endptr != ',') + { + fprintf(stderr, _("%s: invalid argument for option -m\n"), progname); + fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + exit(1); + } + + set_oldestmxid = strtoul(endptr + 1, &endptr2, 0); + if (endptr2 == endptr + 1 || *endptr2 != '\0') { fprintf(stderr, _("%s: invalid argument for option -m\n"), progname); fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); @@ -181,6 +191,16 @@ main(int argc, char *argv[]) fprintf(stderr, _("%s: multitransaction ID (-m) must not be 0\n"), progname); exit(1); } + /* + * XXX It'd be nice to have more sanity checks here, e.g. so + * that oldest is not wrapped around w.r.t. nextMulti. + */ + if (set_oldestmxid == 0) + { + fprintf(stderr, _("%s: oldest multitransaction ID (-m) must not be 0\n"), + progname); + exit(1); + } break; case 'O': @@ -307,8 +327,15 @@ main(int argc, char *argv[]) ControlFile.checkPointCopy.nextOid = set_oid; if (set_mxid != 0) + { ControlFile.checkPointCopy.nextMulti = set_mxid; + ControlFile.checkPointCopy.oldestMulti = set_oldestmxid; + if (ControlFile.checkPointCopy.oldestMulti < FirstMultiXactId) + ControlFile.checkPointCopy.oldestMulti += FirstMultiXactId; + ControlFile.checkPointCopy.oldestMultiDB = InvalidOid; + } + if (set_mxoff != -1) ControlFile.checkPointCopy.nextMultiOffset = set_mxoff; @@ -471,6 +498,8 @@ GuessControlValues(void) ControlFile.checkPointCopy.nextMultiOffset = 0; ControlFile.checkPointCopy.oldestXid = FirstNormalTransactionId; ControlFile.checkPointCopy.oldestXidDB = InvalidOid; + ControlFile.checkPointCopy.oldestMulti = FirstMultiXactId; + ControlFile.checkPointCopy.oldestMultiDB = InvalidOid; ControlFile.checkPointCopy.time = (pg_time_t) time(NULL); ControlFile.checkPointCopy.oldestActiveXid = InvalidTransactionId; @@ -562,6 +591,10 @@ PrintControlValues(bool guessed) ControlFile.checkPointCopy.oldestXidDB); printf(_("Latest checkpoint's oldestActiveXID: %u\n"), ControlFile.checkPointCopy.oldestActiveXid); + printf(_("Latest checkpoint's oldestMultiXid: %u\n"), + ControlFile.checkPointCopy.oldestMulti); + printf(_("Latest checkpoint's oldestMulti's DB: %u\n"), + ControlFile.checkPointCopy.oldestMultiDB); printf(_("Maximum data alignment: %u\n"), ControlFile.maxAlign); /* we don't print floatFormat since can't say much useful about it */ @@ -994,7 +1027,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(_(" -m XID set next multitransaction ID\n")); + printf(_(" -m XID,OLDEST set next multitransaction ID and oldest value\n")); printf(_(" -n no update, just show extracted control values (for testing)\n")); printf(_(" -o OID set next OID\n")); printf(_(" -O OFFSET set next multitransaction offset\n")); |