PostgreSQL Source Code git master
commit_ts.h File Reference
#include "access/xlog.h"
#include "datatype/timestamp.h"
#include "replication/origin.h"
#include "storage/sync.h"
Include dependency graph for commit_ts.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  xl_commit_ts_truncate
 

Macros

#define COMMIT_TS_ZEROPAGE   0x00
 
#define COMMIT_TS_TRUNCATE   0x10
 
#define SizeOfCommitTsTruncate
 

Typedefs

typedef struct xl_commit_ts_truncate xl_commit_ts_truncate
 

Functions

void TransactionTreeSetCommitTsData (TransactionId xid, int nsubxids, TransactionId *subxids, TimestampTz timestamp, RepOriginId nodeid)
 
bool TransactionIdGetCommitTsData (TransactionId xid, TimestampTz *ts, RepOriginId *nodeid)
 
TransactionId GetLatestCommitTsData (TimestampTz *ts, RepOriginId *nodeid)
 
Size CommitTsShmemSize (void)
 
void CommitTsShmemInit (void)
 
void BootStrapCommitTs (void)
 
void StartupCommitTs (void)
 
void CommitTsParameterChange (bool newvalue, bool oldvalue)
 
void CompleteCommitTsInitialization (void)
 
void CheckPointCommitTs (void)
 
void ExtendCommitTs (TransactionId newestXact)
 
void TruncateCommitTs (TransactionId oldestXact)
 
void SetCommitTsLimit (TransactionId oldestXact, TransactionId newestXact)
 
void AdvanceOldestCommitTsXid (TransactionId oldestXact)
 
int committssyncfiletag (const FileTag *ftag, char *path)
 
void commit_ts_redo (XLogReaderState *record)
 
void commit_ts_desc (StringInfo buf, XLogReaderState *record)
 
const char * commit_ts_identify (uint8 info)
 

Variables

PGDLLIMPORT bool track_commit_timestamp
 

Macro Definition Documentation

◆ COMMIT_TS_TRUNCATE

#define COMMIT_TS_TRUNCATE   0x10

Definition at line 47 of file commit_ts.h.

◆ COMMIT_TS_ZEROPAGE

#define COMMIT_TS_ZEROPAGE   0x00

Definition at line 46 of file commit_ts.h.

◆ SizeOfCommitTsTruncate

#define SizeOfCommitTsTruncate
Value:
(offsetof(xl_commit_ts_truncate, oldestXid) + \
sizeof(TransactionId))
uint32 TransactionId
Definition: c.h:662

Definition at line 55 of file commit_ts.h.

Typedef Documentation

◆ xl_commit_ts_truncate

Function Documentation

◆ AdvanceOldestCommitTsXid()

void AdvanceOldestCommitTsXid ( TransactionId  oldestXact)

Definition at line 914 of file commit_ts.c.

915{
916 LWLockAcquire(CommitTsLock, LW_EXCLUSIVE);
920 LWLockRelease(CommitTsLock);
921}
bool LWLockAcquire(LWLock *lock, LWLockMode mode)
Definition: lwlock.c:1174
void LWLockRelease(LWLock *lock)
Definition: lwlock.c:1894
@ LW_EXCLUSIVE
Definition: lwlock.h:112
TransactionId oldestCommitTsXid
Definition: transam.h:232
#define InvalidTransactionId
Definition: transam.h:31
static bool TransactionIdPrecedes(TransactionId id1, TransactionId id2)
Definition: transam.h:263
TransamVariablesData * TransamVariables
Definition: varsup.c:34

References InvalidTransactionId, LW_EXCLUSIVE, LWLockAcquire(), LWLockRelease(), TransamVariablesData::oldestCommitTsXid, TransactionIdPrecedes(), and TransamVariables.

Referenced by commit_ts_redo(), and vac_truncate_clog().

◆ BootStrapCommitTs()

void BootStrapCommitTs ( void  )

Definition at line 594 of file commit_ts.c.

595{
596 /*
597 * Nothing to do here at present, unlike most other SLRU modules; segments
598 * are created when the server is started with this module enabled. See
599 * ActivateCommitTs.
600 */
601}

Referenced by BootStrapXLOG().

◆ CheckPointCommitTs()

void CheckPointCommitTs ( void  )

Definition at line 794 of file commit_ts.c.

795{
796 /*
797 * Write dirty CommitTs pages to disk. This may result in sync requests
798 * queued for later handling by ProcessSyncRequests(), as part of the
799 * checkpoint.
800 */
802}
#define CommitTsCtl
Definition: commit_ts.c:85
void SimpleLruWriteAll(SlruCtl ctl, bool allow_redirtied)
Definition: slru.c:1347

References CommitTsCtl, and SimpleLruWriteAll().

Referenced by CheckPointGuts().

◆ commit_ts_desc()

void commit_ts_desc ( StringInfo  buf,
XLogReaderState record 
)

Definition at line 21 of file committsdesc.c.

22{
23 char *rec = XLogRecGetData(record);
24 uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
25
26 if (info == COMMIT_TS_ZEROPAGE)
27 {
28 int64 pageno;
29
30 memcpy(&pageno, rec, sizeof(pageno));
31 appendStringInfo(buf, "%" PRId64, pageno);
32 }
33 else if (info == COMMIT_TS_TRUNCATE)
34 {
36
37 appendStringInfo(buf, "pageno %" PRId64 ", oldestXid %u",
38 trunc->pageno, trunc->oldestXid);
39 }
40}
uint8_t uint8
Definition: c.h:541
int64_t int64
Definition: c.h:540
#define COMMIT_TS_ZEROPAGE
Definition: commit_ts.h:46
#define COMMIT_TS_TRUNCATE
Definition: commit_ts.h:47
static char * buf
Definition: pg_test_fsync.c:72
void appendStringInfo(StringInfo str, const char *fmt,...)
Definition: stringinfo.c:145
TransactionId oldestXid
Definition: commit_ts.h:52
#define XLogRecGetInfo(decoder)
Definition: xlogreader.h:409
#define XLogRecGetData(decoder)
Definition: xlogreader.h:414

References appendStringInfo(), buf, COMMIT_TS_TRUNCATE, COMMIT_TS_ZEROPAGE, xl_commit_ts_truncate::oldestXid, xl_commit_ts_truncate::pageno, XLogRecGetData, and XLogRecGetInfo.

◆ commit_ts_identify()

const char * commit_ts_identify ( uint8  info)

Definition at line 43 of file committsdesc.c.

44{
45 switch (info)
46 {
48 return "ZEROPAGE";
50 return "TRUNCATE";
51 default:
52 return NULL;
53 }
54}

References COMMIT_TS_TRUNCATE, and COMMIT_TS_ZEROPAGE.

◆ commit_ts_redo()

void commit_ts_redo ( XLogReaderState record)

Definition at line 983 of file commit_ts.c.

984{
985 uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
986
987 /* Backup blocks are not used in commit_ts records */
989
990 if (info == COMMIT_TS_ZEROPAGE)
991 {
992 int64 pageno;
993
994 memcpy(&pageno, XLogRecGetData(record), sizeof(pageno));
996 }
997 else if (info == COMMIT_TS_TRUNCATE)
998 {
1000
1002
1003 /*
1004 * During XLOG replay, latest_page_number isn't set up yet; insert a
1005 * suitable value to bypass the sanity test in SimpleLruTruncate.
1006 */
1007 pg_atomic_write_u64(&CommitTsCtl->shared->latest_page_number,
1008 trunc->pageno);
1009
1011 }
1012 else
1013 elog(PANIC, "commit_ts_redo: unknown op code %u", info);
1014}
static void pg_atomic_write_u64(volatile pg_atomic_uint64 *ptr, uint64 val)
Definition: atomics.h:483
void AdvanceOldestCommitTsXid(TransactionId oldestXact)
Definition: commit_ts.c:914
#define PANIC
Definition: elog.h:42
#define elog(elevel,...)
Definition: elog.h:226
Assert(PointerIsAligned(start, uint64))
void SimpleLruZeroAndWritePage(SlruCtl ctl, int64 pageno)
Definition: slru.c:444
void SimpleLruTruncate(SlruCtl ctl, int64 cutoffPage)
Definition: slru.c:1433
#define XLogRecHasAnyBlockRefs(decoder)
Definition: xlogreader.h:416

References AdvanceOldestCommitTsXid(), Assert(), COMMIT_TS_TRUNCATE, COMMIT_TS_ZEROPAGE, CommitTsCtl, elog, xl_commit_ts_truncate::oldestXid, xl_commit_ts_truncate::pageno, PANIC, pg_atomic_write_u64(), SimpleLruTruncate(), SimpleLruZeroAndWritePage(), XLogRecGetData, XLogRecGetInfo, and XLogRecHasAnyBlockRefs.

◆ CommitTsParameterChange()

void CommitTsParameterChange ( bool  newvalue,
bool  oldvalue 
)

Definition at line 640 of file commit_ts.c.

641{
642 /*
643 * If the commit_ts module is disabled in this server and we get word from
644 * the primary server that it is enabled there, activate it so that we can
645 * replay future WAL records involving it; also mark it as active on
646 * pg_control. If the old value was already set, we already did this, so
647 * don't do anything.
648 *
649 * If the module is disabled in the primary, disable it here too, unless
650 * the module is enabled locally.
651 *
652 * Note this only runs in the recovery process, so an unlocked read is
653 * fine.
654 */
655 if (newvalue)
656 {
659 }
662}
static void DeactivateCommitTs(void)
Definition: commit_ts.c:752
static CommitTimestampShared * commitTsShared
Definition: commit_ts.c:105
static void ActivateCommitTs(void)
Definition: commit_ts.c:681

References ActivateCommitTs(), CommitTimestampShared::commitTsActive, commitTsShared, and DeactivateCommitTs().

Referenced by xlog_redo().

◆ CommitTsShmemInit()

void CommitTsShmemInit ( void  )

Definition at line 528 of file commit_ts.c.

529{
530 bool found;
531
532 /* If auto-tuning is requested, now is the time to do it */
534 {
535 char buf[32];
536
537 snprintf(buf, sizeof(buf), "%d", CommitTsShmemBuffers());
538 SetConfigOption("commit_timestamp_buffers", buf, PGC_POSTMASTER,
540
541 /*
542 * We prefer to report this value's source as PGC_S_DYNAMIC_DEFAULT.
543 * However, if the DBA explicitly set commit_timestamp_buffers = 0 in
544 * the config file, then PGC_S_DYNAMIC_DEFAULT will fail to override
545 * that and we must force the matter with PGC_S_OVERRIDE.
546 */
547 if (commit_timestamp_buffers == 0) /* failed to apply it? */
548 SetConfigOption("commit_timestamp_buffers", buf, PGC_POSTMASTER,
550 }
552
553 CommitTsCtl->PagePrecedes = CommitTsPagePrecedes;
554 SimpleLruInit(CommitTsCtl, "commit_timestamp", CommitTsShmemBuffers(), 0,
555 "pg_commit_ts", LWTRANCHE_COMMITTS_BUFFER,
556 LWTRANCHE_COMMITTS_SLRU,
558 false);
560
561 commitTsShared = ShmemInitStruct("CommitTs shared",
562 sizeof(CommitTimestampShared),
563 &found);
564
566 {
567 Assert(!found);
568
573 }
574 else
575 Assert(found);
576}
#define COMMIT_TS_XACTS_PER_PAGE
Definition: commit_ts.c:63
static int CommitTsShmemBuffers(void)
Definition: commit_ts.c:504
static bool CommitTsPagePrecedes(int64 page1, int64 page2)
Definition: commit_ts.c:948
#define TIMESTAMP_NOBEGIN(j)
Definition: timestamp.h:159
bool IsUnderPostmaster
Definition: globals.c:120
int commit_timestamp_buffers
Definition: globals.c:161
void SetConfigOption(const char *name, const char *value, GucContext context, GucSource source)
Definition: guc.c:4196
@ PGC_S_DYNAMIC_DEFAULT
Definition: guc.h:114
@ PGC_S_OVERRIDE
Definition: guc.h:123
@ PGC_POSTMASTER
Definition: guc.h:74
#define InvalidRepOriginId
Definition: origin.h:33
#define snprintf
Definition: port.h:239
void * ShmemInitStruct(const char *name, Size size, bool *foundPtr)
Definition: shmem.c:388
void SimpleLruInit(SlruCtl ctl, const char *name, int nslots, int nlsns, const char *subdir, int buffer_tranche_id, int bank_tranche_id, SyncRequestHandler sync_handler, bool long_segment_names)
Definition: slru.c:252
#define SlruPagePrecedesUnitTests(ctl, per_page)
Definition: slru.h:185
TimestampTz time
Definition: commit_ts.c:56
RepOriginId nodeid
Definition: commit_ts.c:57
CommitTimestampEntry dataLastCommit
Definition: commit_ts.c:101
TransactionId xidLastCommit
Definition: commit_ts.c:100
@ SYNC_HANDLER_COMMIT_TS
Definition: sync.h:39

References Assert(), buf, commit_timestamp_buffers, COMMIT_TS_XACTS_PER_PAGE, CommitTimestampShared::commitTsActive, CommitTsCtl, CommitTsPagePrecedes(), commitTsShared, CommitTsShmemBuffers(), CommitTimestampShared::dataLastCommit, InvalidRepOriginId, InvalidTransactionId, IsUnderPostmaster, CommitTimestampEntry::nodeid, PGC_POSTMASTER, PGC_S_DYNAMIC_DEFAULT, PGC_S_OVERRIDE, SetConfigOption(), ShmemInitStruct(), SimpleLruInit(), SlruPagePrecedesUnitTests, snprintf, SYNC_HANDLER_COMMIT_TS, CommitTimestampEntry::time, TIMESTAMP_NOBEGIN, and CommitTimestampShared::xidLastCommit.

Referenced by CreateOrAttachShmemStructs().

◆ CommitTsShmemSize()

Size CommitTsShmemSize ( void  )

Definition at line 517 of file commit_ts.c.

518{
520 sizeof(CommitTimestampShared);
521}
struct CommitTimestampShared CommitTimestampShared
Size SimpleLruShmemSize(int nslots, int nlsns)
Definition: slru.c:198

References CommitTsShmemBuffers(), and SimpleLruShmemSize().

Referenced by CalculateShmemSize().

◆ committssyncfiletag()

int committssyncfiletag ( const FileTag ftag,
char *  path 
)

Definition at line 1020 of file commit_ts.c.

1021{
1022 return SlruSyncFileTag(CommitTsCtl, ftag, path);
1023}
int SlruSyncFileTag(SlruCtl ctl, const FileTag *ftag, char *path)
Definition: slru.c:1856

References CommitTsCtl, and SlruSyncFileTag().

◆ CompleteCommitTsInitialization()

void CompleteCommitTsInitialization ( void  )

Definition at line 618 of file commit_ts.c.

619{
620 /*
621 * If the feature is not enabled, turn it off for good. This also removes
622 * any leftover data.
623 *
624 * Conversely, we activate the module if the feature is enabled. This is
625 * necessary for primary and standby as the activation depends on the
626 * control file contents at the beginning of recovery or when a
627 * XLOG_PARAMETER_CHANGE is replayed.
628 */
631 else
633}
bool track_commit_timestamp
Definition: commit_ts.c:109

References ActivateCommitTs(), DeactivateCommitTs(), and track_commit_timestamp.

Referenced by StartupXLOG().

◆ ExtendCommitTs()

void ExtendCommitTs ( TransactionId  newestXact)

Definition at line 816 of file commit_ts.c.

817{
818 int64 pageno;
819 LWLock *lock;
820
821 /*
822 * Nothing to do if module not enabled. Note we do an unlocked read of
823 * the flag here, which is okay because this routine is only called from
824 * GetNewTransactionId, which is never called in a standby.
825 */
828 return;
829
830 /*
831 * No work except at first XID of a page. But beware: just after
832 * wraparound, the first XID of page zero is FirstNormalTransactionId.
833 */
834 if (TransactionIdToCTsEntry(newestXact) != 0 &&
836 return;
837
838 pageno = TransactionIdToCTsPage(newestXact);
839
840 lock = SimpleLruGetBankLock(CommitTsCtl, pageno);
841
843
844 /* Zero the page ... */
846
847 /* and make a WAL entry about that, unless we're in REDO */
848 if (!InRecovery)
849 XLogSimpleInsertInt64(RM_COMMIT_TS_ID, COMMIT_TS_ZEROPAGE, pageno);
850
851 LWLockRelease(lock);
852}
#define TransactionIdToCTsEntry(xid)
Definition: commit_ts.c:77
static int64 TransactionIdToCTsPage(TransactionId xid)
Definition: commit_ts.c:72
int SimpleLruZeroPage(SlruCtl ctl, int64 pageno)
Definition: slru.c:375
static LWLock * SimpleLruGetBankLock(SlruCtl ctl, int64 pageno)
Definition: slru.h:160
Definition: lwlock.h:42
#define TransactionIdEquals(id1, id2)
Definition: transam.h:43
#define FirstNormalTransactionId
Definition: transam.h:34
XLogRecPtr XLogSimpleInsertInt64(RmgrId rmid, uint8 info, int64 value)
Definition: xloginsert.c:543
bool InRecovery
Definition: xlogutils.c:50

References Assert(), COMMIT_TS_ZEROPAGE, CommitTimestampShared::commitTsActive, CommitTsCtl, commitTsShared, FirstNormalTransactionId, InRecovery, LW_EXCLUSIVE, LWLockAcquire(), LWLockRelease(), SimpleLruGetBankLock(), SimpleLruZeroPage(), TransactionIdEquals, TransactionIdToCTsEntry, TransactionIdToCTsPage(), and XLogSimpleInsertInt64().

Referenced by GetNewTransactionId().

◆ GetLatestCommitTsData()

TransactionId GetLatestCommitTsData ( TimestampTz ts,
RepOriginId nodeid 
)

Definition at line 358 of file commit_ts.c.

359{
360 TransactionId xid;
361
362 LWLockAcquire(CommitTsLock, LW_SHARED);
363
364 /* Error if module not enabled */
367
369 if (ts)
371 if (nodeid)
373 LWLockRelease(CommitTsLock);
374
375 return xid;
376}
static void error_commit_ts_disabled(void)
Definition: commit_ts.c:379
@ LW_SHARED
Definition: lwlock.h:113

References CommitTimestampShared::commitTsActive, commitTsShared, CommitTimestampShared::dataLastCommit, error_commit_ts_disabled(), LW_SHARED, LWLockAcquire(), LWLockRelease(), CommitTimestampEntry::nodeid, CommitTimestampEntry::time, and CommitTimestampShared::xidLastCommit.

Referenced by pg_last_committed_xact().

◆ SetCommitTsLimit()

void SetCommitTsLimit ( TransactionId  oldestXact,
TransactionId  newestXact 
)

Definition at line 887 of file commit_ts.c.

888{
889 /*
890 * Be careful not to overwrite values that are either further into the
891 * "future" or signal a disabled committs.
892 */
893 LWLockAcquire(CommitTsLock, LW_EXCLUSIVE);
895 {
900 }
901 else
902 {
906 }
907 LWLockRelease(CommitTsLock);
908}
TransactionId newestCommitTsXid
Definition: transam.h:233

References Assert(), InvalidTransactionId, LW_EXCLUSIVE, LWLockAcquire(), LWLockRelease(), TransamVariablesData::newestCommitTsXid, TransamVariablesData::oldestCommitTsXid, TransactionIdPrecedes(), and TransamVariables.

Referenced by BootStrapXLOG(), and StartupXLOG().

◆ StartupCommitTs()

void StartupCommitTs ( void  )

Definition at line 608 of file commit_ts.c.

609{
611}

References ActivateCommitTs().

Referenced by StartupXLOG().

◆ TransactionIdGetCommitTsData()

bool TransactionIdGetCommitTsData ( TransactionId  xid,
TimestampTz ts,
RepOriginId nodeid 
)

Definition at line 272 of file commit_ts.c.

274{
275 int64 pageno = TransactionIdToCTsPage(xid);
276 int entryno = TransactionIdToCTsEntry(xid);
277 int slotno;
279 TransactionId oldestCommitTsXid;
280 TransactionId newestCommitTsXid;
281
282 if (!TransactionIdIsValid(xid))
284 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
285 errmsg("cannot retrieve commit timestamp for transaction %u", xid)));
286 else if (!TransactionIdIsNormal(xid))
287 {
288 /* frozen and bootstrap xids are always committed far in the past */
289 *ts = 0;
290 if (nodeid)
291 *nodeid = 0;
292 return false;
293 }
294
295 LWLockAcquire(CommitTsLock, LW_SHARED);
296
297 /* Error if module not enabled */
300
301 /*
302 * If we're asked for the cached value, return that. Otherwise, fall
303 * through to read from SLRU.
304 */
305 if (commitTsShared->xidLastCommit == xid)
306 {
308 if (nodeid)
310
311 LWLockRelease(CommitTsLock);
312 return *ts != 0;
313 }
314
315 oldestCommitTsXid = TransamVariables->oldestCommitTsXid;
316 newestCommitTsXid = TransamVariables->newestCommitTsXid;
317 /* neither is invalid, or both are */
318 Assert(TransactionIdIsValid(oldestCommitTsXid) == TransactionIdIsValid(newestCommitTsXid));
319 LWLockRelease(CommitTsLock);
320
321 /*
322 * Return empty if the requested value is outside our valid range.
323 */
324 if (!TransactionIdIsValid(oldestCommitTsXid) ||
325 TransactionIdPrecedes(xid, oldestCommitTsXid) ||
326 TransactionIdPrecedes(newestCommitTsXid, xid))
327 {
328 *ts = 0;
329 if (nodeid)
330 *nodeid = InvalidRepOriginId;
331 return false;
332 }
333
334 /* lock is acquired by SimpleLruReadPage_ReadOnly */
335 slotno = SimpleLruReadPage_ReadOnly(CommitTsCtl, pageno, xid);
336 memcpy(&entry,
337 CommitTsCtl->shared->page_buffer[slotno] +
340
341 *ts = entry.time;
342 if (nodeid)
343 *nodeid = entry.nodeid;
344
346 return *ts != 0;
347}
#define SizeOfCommitTimestampEntry
Definition: commit_ts.c:60
int errcode(int sqlerrcode)
Definition: elog.c:863
int errmsg(const char *fmt,...)
Definition: elog.c:1080
#define ERROR
Definition: elog.h:39
#define ereport(elevel,...)
Definition: elog.h:150
int SimpleLruReadPage_ReadOnly(SlruCtl ctl, int64 pageno, TransactionId xid)
Definition: slru.c:630
#define TransactionIdIsValid(xid)
Definition: transam.h:41
#define TransactionIdIsNormal(xid)
Definition: transam.h:42

References Assert(), CommitTimestampShared::commitTsActive, CommitTsCtl, commitTsShared, CommitTimestampShared::dataLastCommit, ereport, errcode(), errmsg(), ERROR, error_commit_ts_disabled(), InvalidRepOriginId, LW_SHARED, LWLockAcquire(), LWLockRelease(), TransamVariablesData::newestCommitTsXid, CommitTimestampEntry::nodeid, TransamVariablesData::oldestCommitTsXid, SimpleLruGetBankLock(), SimpleLruReadPage_ReadOnly(), SizeOfCommitTimestampEntry, CommitTimestampEntry::time, TransactionIdIsNormal, TransactionIdIsValid, TransactionIdPrecedes(), TransactionIdToCTsEntry, TransactionIdToCTsPage(), TransamVariables, and CommitTimestampShared::xidLastCommit.

Referenced by GetTupleTransactionInfo(), pg_xact_commit_timestamp(), pg_xact_commit_timestamp_origin(), and update_most_recent_deletion_info().

◆ TransactionTreeSetCommitTsData()

void TransactionTreeSetCommitTsData ( TransactionId  xid,
int  nsubxids,
TransactionId subxids,
TimestampTz  timestamp,
RepOriginId  nodeid 
)

Definition at line 139 of file commit_ts.c.

142{
143 int i;
144 TransactionId headxid;
145 TransactionId newestXact;
146
147 /*
148 * No-op if the module is not active.
149 *
150 * An unlocked read here is fine, because in a standby (the only place
151 * where the flag can change in flight) this routine is only called by the
152 * recovery process, which is also the only process which can change the
153 * flag.
154 */
156 return;
157
158 /*
159 * Figure out the latest Xid in this batch: either the last subxid if
160 * there's any, otherwise the parent xid.
161 */
162 if (nsubxids > 0)
163 newestXact = subxids[nsubxids - 1];
164 else
165 newestXact = xid;
166
167 /*
168 * We split the xids to set the timestamp to in groups belonging to the
169 * same SLRU page; the first element in each such set is its head. The
170 * first group has the main XID as the head; subsequent sets use the first
171 * subxid not on the previous page as head. This way, we only have to
172 * lock/modify each SLRU page once.
173 */
174 headxid = xid;
175 i = 0;
176 for (;;)
177 {
178 int64 pageno = TransactionIdToCTsPage(headxid);
179 int j;
180
181 for (j = i; j < nsubxids; j++)
182 {
183 if (TransactionIdToCTsPage(subxids[j]) != pageno)
184 break;
185 }
186 /* subxids[i..j] are on the same page as the head */
187
188 SetXidCommitTsInPage(headxid, j - i, subxids + i, timestamp, nodeid,
189 pageno);
190
191 /* if we wrote out all subxids, we're done. */
192 if (j >= nsubxids)
193 break;
194
195 /*
196 * Set the new head and skip over it, as well as over the subxids we
197 * just wrote.
198 */
199 headxid = subxids[j];
200 i = j + 1;
201 }
202
203 /* update the cached value in shared memory */
204 LWLockAcquire(CommitTsLock, LW_EXCLUSIVE);
208
209 /* and move forwards our endpoint, if needed */
212 LWLockRelease(CommitTsLock);
213}
static void SetXidCommitTsInPage(TransactionId xid, int nsubxids, TransactionId *subxids, TimestampTz ts, RepOriginId nodeid, int64 pageno)
Definition: commit_ts.c:220
int j
Definition: isn.c:78
int i
Definition: isn.c:77
int64 timestamp

References CommitTimestampShared::commitTsActive, commitTsShared, CommitTimestampShared::dataLastCommit, i, j, LW_EXCLUSIVE, LWLockAcquire(), LWLockRelease(), TransamVariablesData::newestCommitTsXid, CommitTimestampEntry::nodeid, SetXidCommitTsInPage(), CommitTimestampEntry::time, TransactionIdPrecedes(), TransactionIdToCTsPage(), TransamVariables, and CommitTimestampShared::xidLastCommit.

Referenced by RecordTransactionCommit(), RecordTransactionCommitPrepared(), and xact_redo_commit().

◆ TruncateCommitTs()

void TruncateCommitTs ( TransactionId  oldestXact)

Definition at line 861 of file commit_ts.c.

862{
863 int64 cutoffPage;
864
865 /*
866 * The cutoff point is the start of the segment containing oldestXact. We
867 * pass the *page* containing oldestXact to SimpleLruTruncate.
868 */
869 cutoffPage = TransactionIdToCTsPage(oldestXact);
870
871 /* Check to see if there's any files that could be removed */
873 &cutoffPage))
874 return; /* nothing to remove */
875
876 /* Write XLOG record */
877 WriteTruncateXlogRec(cutoffPage, oldestXact);
878
879 /* Now we can remove the old CommitTs segment(s) */
880 SimpleLruTruncate(CommitTsCtl, cutoffPage);
881}
static void WriteTruncateXlogRec(int64 pageno, TransactionId oldestXid)
Definition: commit_ts.c:967
bool SlruScanDirectory(SlruCtl ctl, SlruScanCallback callback, void *data)
Definition: slru.c:1816
bool SlruScanDirCbReportPresence(SlruCtl ctl, char *filename, int64 segpage, void *data)
Definition: slru.c:1737

References CommitTsCtl, SimpleLruTruncate(), SlruScanDirCbReportPresence(), SlruScanDirectory(), TransactionIdToCTsPage(), and WriteTruncateXlogRec().

Referenced by vac_truncate_clog().

Variable Documentation

◆ track_commit_timestamp