On 12/28/2015 10:35 AM, Joe Conway wrote: > An alternative would be to not have a space at all for those two, e.g. > > "Latest checkpoint's oldestCommitTsXid:%u\n" > "Latest checkpoint's newestCommitTsXid:%u\n" > > That isn't too bad and would leave everything aligned.
That seems like the best solution to me. 8<----------------------- ... Latest checkpoint's oldestMultiXid: 1 Latest checkpoint's oldestMulti's DB: 1 Latest checkpoint's oldestCommitTsXid:0 Latest checkpoint's newestCommitTsXid:0 Time of latest checkpoint: Thu 24 Dec 2015 08:55:27 AM PST Fake LSN counter for unlogged rels: 0/1 ... 8<----------------------- Anyone parsing based on fixed length would be ok, and so would anyone splitting on the colon. I retract my earlier suggestion of doing HEAD different from REL9_5_STABLE, at least for the moment. My patch for pg_controldata related functions is going to impact all this anyway, so we might as well not fuss about it now. Any objections to the attached? Joe -- Crunchy Data - http://crunchydata.com PostgreSQL Support for Secure Enterprises Consulting, Training, & Open Source Development
diff --git a/src/backend/access/rmgrdesc/xlogdesc.c b/src/backend/access/rmgrdesc/xlogdesc.c index 83cc9e8..5e210b9 100644 *** a/src/backend/access/rmgrdesc/xlogdesc.c --- b/src/backend/access/rmgrdesc/xlogdesc.c *************** xlog_desc(StringInfo buf, XLogReaderStat *** 59,66 **** checkpoint->oldestXidDB, checkpoint->oldestMulti, checkpoint->oldestMultiDB, ! checkpoint->oldestCommitTs, ! checkpoint->newestCommitTs, checkpoint->oldestActiveXid, (info == XLOG_CHECKPOINT_SHUTDOWN) ? "shutdown" : "online"); } --- 59,66 ---- checkpoint->oldestXidDB, checkpoint->oldestMulti, checkpoint->oldestMultiDB, ! checkpoint->oldestCommitTsXid, ! checkpoint->newestCommitTsXid, checkpoint->oldestActiveXid, (info == XLOG_CHECKPOINT_SHUTDOWN) ? "shutdown" : "online"); } diff --git a/src/backend/access/transam/commit_ts.c b/src/backend/access/transam/commit_ts.c index ed8d98a..a284894 100644 *** a/src/backend/access/transam/commit_ts.c --- b/src/backend/access/transam/commit_ts.c *************** TransactionTreeSetCommitTsData(Transacti *** 217,224 **** commitTsShared->dataLastCommit.nodeid = nodeid; /* and move forwards our endpoint, if needed */ ! if (TransactionIdPrecedes(ShmemVariableCache->newestCommitTs, newestXact)) ! ShmemVariableCache->newestCommitTs = newestXact; LWLockRelease(CommitTsLock); } --- 217,224 ---- commitTsShared->dataLastCommit.nodeid = nodeid; /* and move forwards our endpoint, if needed */ ! if (TransactionIdPrecedes(ShmemVariableCache->newestCommitTsXid, newestXact)) ! ShmemVariableCache->newestCommitTsXid = newestXact; LWLockRelease(CommitTsLock); } *************** TransactionIdGetCommitTsData(Transaction *** 285,292 **** int entryno = TransactionIdToCTsEntry(xid); int slotno; CommitTimestampEntry entry; ! TransactionId oldestCommitTs; ! TransactionId newestCommitTs; /* error if the given Xid doesn't normally commit */ if (!TransactionIdIsNormal(xid)) --- 285,292 ---- int entryno = TransactionIdToCTsEntry(xid); int slotno; CommitTimestampEntry entry; ! TransactionId oldestCommitTsXid; ! TransactionId newestCommitTsXid; /* error if the given Xid doesn't normally commit */ if (!TransactionIdIsNormal(xid)) *************** TransactionIdGetCommitTsData(Transaction *** 314,331 **** return *ts != 0; } ! oldestCommitTs = ShmemVariableCache->oldestCommitTs; ! newestCommitTs = ShmemVariableCache->newestCommitTs; /* neither is invalid, or both are */ ! Assert(TransactionIdIsValid(oldestCommitTs) == TransactionIdIsValid(newestCommitTs)); LWLockRelease(CommitTsLock); /* * Return empty if the requested value is outside our valid range. */ ! if (!TransactionIdIsValid(oldestCommitTs) || ! TransactionIdPrecedes(xid, oldestCommitTs) || ! TransactionIdPrecedes(newestCommitTs, xid)) { *ts = 0; if (nodeid) --- 314,331 ---- return *ts != 0; } ! oldestCommitTsXid = ShmemVariableCache->oldestCommitTsXid; ! newestCommitTsXid = ShmemVariableCache->newestCommitTsXid; /* neither is invalid, or both are */ ! Assert(TransactionIdIsValid(oldestCommitTsXid) == TransactionIdIsValid(newestCommitTsXid)); LWLockRelease(CommitTsLock); /* * Return empty if the requested value is outside our valid range. */ ! if (!TransactionIdIsValid(oldestCommitTsXid) || ! TransactionIdPrecedes(xid, oldestCommitTsXid) || ! TransactionIdPrecedes(newestCommitTsXid, xid)) { *ts = 0; if (nodeid) *************** ActivateCommitTs(void) *** 655,668 **** * enabled again? It doesn't look like it does, because there should be a * checkpoint that sets the value to InvalidTransactionId at end of * recovery; and so any chance of injecting new transactions without ! * CommitTs values would occur after the oldestCommitTs has been set to * Invalid temporarily. */ LWLockAcquire(CommitTsLock, LW_EXCLUSIVE); ! if (ShmemVariableCache->oldestCommitTs == InvalidTransactionId) { ! ShmemVariableCache->oldestCommitTs = ! ShmemVariableCache->newestCommitTs = ReadNewTransactionId(); } LWLockRelease(CommitTsLock); --- 655,668 ---- * enabled again? It doesn't look like it does, because there should be a * checkpoint that sets the value to InvalidTransactionId at end of * recovery; and so any chance of injecting new transactions without ! * CommitTs values would occur after the oldestCommitTsXid has been set to * Invalid temporarily. */ LWLockAcquire(CommitTsLock, LW_EXCLUSIVE); ! if (ShmemVariableCache->oldestCommitTsXid == InvalidTransactionId) { ! ShmemVariableCache->oldestCommitTsXid = ! ShmemVariableCache->newestCommitTsXid = ReadNewTransactionId(); } LWLockRelease(CommitTsLock); *************** DeactivateCommitTs(void) *** 711,718 **** TIMESTAMP_NOBEGIN(commitTsShared->dataLastCommit.time); commitTsShared->dataLastCommit.nodeid = InvalidRepOriginId; ! ShmemVariableCache->oldestCommitTs = InvalidTransactionId; ! ShmemVariableCache->newestCommitTs = InvalidTransactionId; LWLockRelease(CommitTsLock); --- 711,718 ---- TIMESTAMP_NOBEGIN(commitTsShared->dataLastCommit.time); commitTsShared->dataLastCommit.nodeid = InvalidRepOriginId; ! ShmemVariableCache->oldestCommitTsXid = InvalidTransactionId; ! ShmemVariableCache->newestCommitTsXid = InvalidTransactionId; LWLockRelease(CommitTsLock); *************** SetCommitTsLimit(TransactionId oldestXac *** 832,847 **** * "future" or signal a disabled committs. */ LWLockAcquire(CommitTsLock, LW_EXCLUSIVE); ! if (ShmemVariableCache->oldestCommitTs != InvalidTransactionId) { ! if (TransactionIdPrecedes(ShmemVariableCache->oldestCommitTs, oldestXact)) ! ShmemVariableCache->oldestCommitTs = oldestXact; ! if (TransactionIdPrecedes(newestXact, ShmemVariableCache->newestCommitTs)) ! ShmemVariableCache->newestCommitTs = newestXact; } else { ! Assert(ShmemVariableCache->newestCommitTs == InvalidTransactionId); } LWLockRelease(CommitTsLock); } --- 832,847 ---- * "future" or signal a disabled committs. */ LWLockAcquire(CommitTsLock, LW_EXCLUSIVE); ! if (ShmemVariableCache->oldestCommitTsXid != InvalidTransactionId) { ! if (TransactionIdPrecedes(ShmemVariableCache->oldestCommitTsXid, oldestXact)) ! ShmemVariableCache->oldestCommitTsXid = oldestXact; ! if (TransactionIdPrecedes(newestXact, ShmemVariableCache->newestCommitTsXid)) ! ShmemVariableCache->newestCommitTsXid = newestXact; } else { ! Assert(ShmemVariableCache->newestCommitTsXid == InvalidTransactionId); } LWLockRelease(CommitTsLock); } *************** SetCommitTsLimit(TransactionId oldestXac *** 850,861 **** * Move forwards the oldest commitTS value that can be consulted */ void ! AdvanceOldestCommitTs(TransactionId oldestXact) { LWLockAcquire(CommitTsLock, LW_EXCLUSIVE); ! if (ShmemVariableCache->oldestCommitTs != InvalidTransactionId && ! TransactionIdPrecedes(ShmemVariableCache->oldestCommitTs, oldestXact)) ! ShmemVariableCache->oldestCommitTs = oldestXact; LWLockRelease(CommitTsLock); } --- 850,861 ---- * Move forwards the oldest commitTS value that can be consulted */ void ! AdvanceOldestCommitTsXid(TransactionId oldestXact) { LWLockAcquire(CommitTsLock, LW_EXCLUSIVE); ! if (ShmemVariableCache->oldestCommitTsXid != InvalidTransactionId && ! TransactionIdPrecedes(ShmemVariableCache->oldestCommitTsXid, oldestXact)) ! ShmemVariableCache->oldestCommitTsXid = oldestXact; LWLockRelease(CommitTsLock); } diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 71fc8ff..06a361a 100644 *** a/src/backend/access/transam/xlog.c --- b/src/backend/access/transam/xlog.c *************** BootStrapXLOG(void) *** 4786,4793 **** checkPoint.oldestXidDB = TemplateDbOid; checkPoint.oldestMulti = FirstMultiXactId; checkPoint.oldestMultiDB = TemplateDbOid; ! checkPoint.oldestCommitTs = InvalidTransactionId; ! checkPoint.newestCommitTs = InvalidTransactionId; checkPoint.time = (pg_time_t) time(NULL); checkPoint.oldestActiveXid = InvalidTransactionId; --- 4786,4793 ---- checkPoint.oldestXidDB = TemplateDbOid; checkPoint.oldestMulti = FirstMultiXactId; checkPoint.oldestMultiDB = TemplateDbOid; ! checkPoint.oldestCommitTsXid = InvalidTransactionId; ! checkPoint.newestCommitTsXid = InvalidTransactionId; checkPoint.time = (pg_time_t) time(NULL); checkPoint.oldestActiveXid = InvalidTransactionId; *************** StartupXLOG(void) *** 6302,6309 **** checkPoint.oldestMulti, checkPoint.oldestMultiDB))); ereport(DEBUG1, (errmsg_internal("commit timestamp Xid oldest/newest: %u/%u", ! checkPoint.oldestCommitTs, ! checkPoint.newestCommitTs))); if (!TransactionIdIsNormal(checkPoint.nextXid)) ereport(PANIC, (errmsg("invalid next transaction ID"))); --- 6302,6309 ---- checkPoint.oldestMulti, checkPoint.oldestMultiDB))); ereport(DEBUG1, (errmsg_internal("commit timestamp Xid oldest/newest: %u/%u", ! checkPoint.oldestCommitTsXid, ! checkPoint.newestCommitTsXid))); if (!TransactionIdIsNormal(checkPoint.nextXid)) ereport(PANIC, (errmsg("invalid next transaction ID"))); *************** StartupXLOG(void) *** 6315,6322 **** MultiXactSetNextMXact(checkPoint.nextMulti, checkPoint.nextMultiOffset); SetTransactionIdLimit(checkPoint.oldestXid, checkPoint.oldestXidDB); SetMultiXactIdLimit(checkPoint.oldestMulti, checkPoint.oldestMultiDB); ! SetCommitTsLimit(checkPoint.oldestCommitTs, ! checkPoint.newestCommitTs); XLogCtl->ckptXidEpoch = checkPoint.nextXidEpoch; XLogCtl->ckptXid = checkPoint.nextXid; --- 6315,6322 ---- MultiXactSetNextMXact(checkPoint.nextMulti, checkPoint.nextMultiOffset); SetTransactionIdLimit(checkPoint.oldestXid, checkPoint.oldestXidDB); SetMultiXactIdLimit(checkPoint.oldestMulti, checkPoint.oldestMultiDB); ! SetCommitTsLimit(checkPoint.oldestCommitTsXid, ! checkPoint.newestCommitTsXid); XLogCtl->ckptXidEpoch = checkPoint.nextXidEpoch; XLogCtl->ckptXid = checkPoint.nextXid; *************** CreateCheckPoint(int flags) *** 8334,8341 **** LWLockRelease(XidGenLock); LWLockAcquire(CommitTsLock, LW_SHARED); ! checkPoint.oldestCommitTs = ShmemVariableCache->oldestCommitTs; ! checkPoint.newestCommitTs = ShmemVariableCache->newestCommitTs; LWLockRelease(CommitTsLock); /* Increase XID epoch if we've wrapped around since last checkpoint */ --- 8334,8341 ---- LWLockRelease(XidGenLock); LWLockAcquire(CommitTsLock, LW_SHARED); ! checkPoint.oldestCommitTsXid = ShmemVariableCache->oldestCommitTsXid; ! checkPoint.newestCommitTsXid = ShmemVariableCache->newestCommitTsXid; LWLockRelease(CommitTsLock); /* Increase XID epoch if we've wrapped around since last checkpoint */ diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 7c4ef58..be89b9b 100644 *** a/src/backend/commands/vacuum.c --- b/src/backend/commands/vacuum.c *************** vac_truncate_clog(TransactionId frozenXI *** 1151,1157 **** */ SetTransactionIdLimit(frozenXID, oldestxid_datoid); SetMultiXactIdLimit(minMulti, minmulti_datoid); ! AdvanceOldestCommitTs(frozenXID); } --- 1151,1157 ---- */ SetTransactionIdLimit(frozenXID, oldestxid_datoid); SetMultiXactIdLimit(minMulti, minmulti_datoid); ! AdvanceOldestCommitTsXid(frozenXID); } diff --git a/src/bin/pg_controldata/pg_controldata.c b/src/bin/pg_controldata/pg_controldata.c index 32e1d81..e7e072f 100644 *** a/src/bin/pg_controldata/pg_controldata.c --- b/src/bin/pg_controldata/pg_controldata.c *************** main(int argc, char *argv[]) *** 271,280 **** ControlFile.checkPointCopy.oldestMulti); printf(_("Latest checkpoint's oldestMulti's DB: %u\n"), ControlFile.checkPointCopy.oldestMultiDB); ! printf(_("Latest checkpoint's oldestCommitTs: %u\n"), ! ControlFile.checkPointCopy.oldestCommitTs); ! printf(_("Latest checkpoint's newestCommitTs: %u\n"), ! ControlFile.checkPointCopy.newestCommitTs); printf(_("Time of latest checkpoint: %s\n"), ckpttime_str); printf(_("Fake LSN counter for unlogged rels: %X/%X\n"), --- 271,280 ---- ControlFile.checkPointCopy.oldestMulti); printf(_("Latest checkpoint's oldestMulti's DB: %u\n"), ControlFile.checkPointCopy.oldestMultiDB); ! printf(_("Latest checkpoint's oldestCommitTsXid:%u\n"), ! ControlFile.checkPointCopy.oldestCommitTsXid); ! printf(_("Latest checkpoint's newestCommitTsXid:%u\n"), ! ControlFile.checkPointCopy.newestCommitTsXid); printf(_("Time of latest checkpoint: %s\n"), ckpttime_str); printf(_("Fake LSN counter for unlogged rels: %X/%X\n"), diff --git a/src/bin/pg_resetxlog/pg_resetxlog.c b/src/bin/pg_resetxlog/pg_resetxlog.c index 8826960..6615aea 100644 *** a/src/bin/pg_resetxlog/pg_resetxlog.c --- b/src/bin/pg_resetxlog/pg_resetxlog.c *************** static bool guessed = false; /* T if we *** 64,71 **** static const char *progname; static uint32 set_xid_epoch = (uint32) -1; static TransactionId set_xid = 0; ! static TransactionId set_oldest_commit_ts = 0; ! static TransactionId set_newest_commit_ts = 0; static Oid set_oid = 0; static MultiXactId set_mxid = 0; static MultiXactOffset set_mxoff = (MultiXactOffset) -1; --- 64,71 ---- static const char *progname; static uint32 set_xid_epoch = (uint32) -1; 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 MultiXactId set_mxid = 0; static MultiXactOffset set_mxoff = (MultiXactOffset) -1; *************** main(int argc, char *argv[]) *** 164,177 **** break; case 'c': ! set_oldest_commit_ts = strtoul(optarg, &endptr, 0); if (endptr == optarg || *endptr != ',') { fprintf(stderr, _("%s: invalid argument for option %s\n"), progname, "-c"); fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); exit(1); } ! set_newest_commit_ts = strtoul(endptr + 1, &endptr2, 0); if (endptr2 == endptr + 1 || *endptr2 != '\0') { fprintf(stderr, _("%s: invalid argument for option %s\n"), progname, "-c"); --- 164,177 ---- break; case 'c': ! set_oldest_commit_ts_xid = strtoul(optarg, &endptr, 0); if (endptr == optarg || *endptr != ',') { fprintf(stderr, _("%s: invalid argument for option %s\n"), progname, "-c"); fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); exit(1); } ! set_newest_commit_ts_xid = strtoul(endptr + 1, &endptr2, 0); if (endptr2 == endptr + 1 || *endptr2 != '\0') { fprintf(stderr, _("%s: invalid argument for option %s\n"), progname, "-c"); *************** main(int argc, char *argv[]) *** 179,193 **** exit(1); } ! if (set_oldest_commit_ts < 2 && ! set_oldest_commit_ts != 0) { fprintf(stderr, _("%s: transaction ID (-c) must be either 0 or greater than or equal to 2\n"), progname); exit(1); } ! if (set_newest_commit_ts < 2 && ! set_newest_commit_ts != 0) { fprintf(stderr, _("%s: transaction ID (-c) must be either 0 or greater than or equal to 2\n"), progname); exit(1); --- 179,193 ---- exit(1); } ! if (set_oldest_commit_ts_xid < 2 && ! set_oldest_commit_ts_xid != 0) { fprintf(stderr, _("%s: transaction ID (-c) must be either 0 or greater than or equal to 2\n"), progname); exit(1); } ! if (set_newest_commit_ts_xid < 2 && ! set_newest_commit_ts_xid != 0) { fprintf(stderr, _("%s: transaction ID (-c) must be either 0 or greater than or equal to 2\n"), progname); exit(1); *************** main(int argc, char *argv[]) *** 383,392 **** ControlFile.checkPointCopy.oldestXidDB = InvalidOid; } ! if (set_oldest_commit_ts != 0) ! ControlFile.checkPointCopy.oldestCommitTs = set_oldest_commit_ts; ! if (set_newest_commit_ts != 0) ! ControlFile.checkPointCopy.newestCommitTs = set_newest_commit_ts; if (set_oid != 0) ControlFile.checkPointCopy.nextOid = set_oid; --- 383,392 ---- ControlFile.checkPointCopy.oldestXidDB = InvalidOid; } ! if (set_oldest_commit_ts_xid != 0) ! ControlFile.checkPointCopy.oldestCommitTsXid = set_oldest_commit_ts_xid; ! if (set_newest_commit_ts_xid != 0) ! ControlFile.checkPointCopy.newestCommitTsXid = set_newest_commit_ts_xid; if (set_oid != 0) ControlFile.checkPointCopy.nextOid = set_oid; *************** PrintControlValues(bool guessed) *** 665,674 **** ControlFile.checkPointCopy.oldestMulti); printf(_("Latest checkpoint's oldestMulti's DB: %u\n"), ControlFile.checkPointCopy.oldestMultiDB); ! printf(_("Latest checkpoint's oldestCommitTs: %u\n"), ! ControlFile.checkPointCopy.oldestCommitTs); ! printf(_("Latest checkpoint's newestCommitTs: %u\n"), ! ControlFile.checkPointCopy.newestCommitTs); printf(_("Maximum data alignment: %u\n"), ControlFile.maxAlign); /* we don't print floatFormat since can't say much useful about it */ --- 665,674 ---- ControlFile.checkPointCopy.oldestMulti); printf(_("Latest checkpoint's oldestMulti's DB: %u\n"), ControlFile.checkPointCopy.oldestMultiDB); ! printf(_("Latest checkpoint's oldestCommitTsXid:%u\n"), ! ControlFile.checkPointCopy.oldestCommitTsXid); ! printf(_("Latest checkpoint's newestCommitTsXid:%u\n"), ! ControlFile.checkPointCopy.newestCommitTsXid); printf(_("Maximum data alignment: %u\n"), ControlFile.maxAlign); /* we don't print floatFormat since can't say much useful about it */ *************** PrintNewControlValues() *** 751,765 **** ControlFile.checkPointCopy.nextXidEpoch); } ! if (set_oldest_commit_ts != 0) { ! printf(_("oldestCommitTs: %u\n"), ! ControlFile.checkPointCopy.oldestCommitTs); } ! if (set_newest_commit_ts != 0) { ! printf(_("newestCommitTs: %u\n"), ! ControlFile.checkPointCopy.newestCommitTs); } } --- 751,765 ---- ControlFile.checkPointCopy.nextXidEpoch); } ! if (set_oldest_commit_ts_xid != 0) { ! printf(_("oldestCommitTsXid: %u\n"), ! ControlFile.checkPointCopy.oldestCommitTsXid); } ! if (set_newest_commit_ts_xid != 0) { ! printf(_("newestCommitTsXid: %u\n"), ! ControlFile.checkPointCopy.newestCommitTsXid); } } diff --git a/src/include/access/commit_ts.h b/src/include/access/commit_ts.h index 425f258..b11715a 100644 *** a/src/include/access/commit_ts.h --- b/src/include/access/commit_ts.h *************** extern void ExtendCommitTs(TransactionId *** 43,49 **** extern void TruncateCommitTs(TransactionId oldestXact); extern void SetCommitTsLimit(TransactionId oldestXact, TransactionId newestXact); ! extern void AdvanceOldestCommitTs(TransactionId oldestXact); /* XLOG stuff */ #define COMMIT_TS_ZEROPAGE 0x00 --- 43,49 ---- extern void TruncateCommitTs(TransactionId oldestXact); extern void SetCommitTsLimit(TransactionId oldestXact, TransactionId newestXact); ! extern void AdvanceOldestCommitTsXid(TransactionId oldestXact); /* XLOG stuff */ #define COMMIT_TS_ZEROPAGE 0x00 diff --git a/src/include/access/transam.h b/src/include/access/transam.h index 96b3fac..9ad5761 100644 *** a/src/include/access/transam.h --- b/src/include/access/transam.h *************** typedef struct VariableCacheData *** 126,133 **** /* * These fields are protected by CommitTsLock */ ! TransactionId oldestCommitTs; ! TransactionId newestCommitTs; /* * These fields are protected by ProcArrayLock. --- 126,133 ---- /* * These fields are protected by CommitTsLock */ ! TransactionId oldestCommitTsXid; ! TransactionId newestCommitTsXid; /* * These fields are protected by ProcArrayLock. diff --git a/src/include/catalog/pg_control.h b/src/include/catalog/pg_control.h index ad1eb4b..0b8bea7 100644 *** a/src/include/catalog/pg_control.h --- b/src/include/catalog/pg_control.h *************** typedef struct CheckPoint *** 46,54 **** MultiXactId oldestMulti; /* cluster-wide minimum datminmxid */ Oid oldestMultiDB; /* database with minimum datminmxid */ pg_time_t time; /* time stamp of checkpoint */ ! TransactionId oldestCommitTs; /* oldest Xid with valid commit * timestamp */ ! TransactionId newestCommitTs; /* newest Xid with valid commit * timestamp */ /* --- 46,54 ---- MultiXactId oldestMulti; /* cluster-wide minimum datminmxid */ Oid oldestMultiDB; /* database with minimum datminmxid */ pg_time_t time; /* time stamp of checkpoint */ ! TransactionId oldestCommitTsXid; /* oldest Xid with valid commit * timestamp */ ! TransactionId newestCommitTsXid; /* newest Xid with valid commit * timestamp */ /*
signature.asc
Description: OpenPGP digital signature