PostgreSQL Source Code: src/backend/access/transam/commit_ts.c File Reference (original) (raw)

Go to the source code of this file.

Macros
#define SizeOfCommitTimestampEntry
#define COMMIT_TS_XACTS_PER_PAGE (BLCKSZ / SizeOfCommitTimestampEntry)
#define TransactionIdToCTsEntry(xid) ((xid) % (TransactionId) COMMIT_TS_XACTS_PER_PAGE)
#define CommitTsCtl (&CommitTsCtlData)
Functions
static int64 TransactionIdToCTsPage (TransactionId xid)
static void SetXidCommitTsInPage (TransactionId xid, int nsubxids, TransactionId *subxids, TimestampTz ts, RepOriginId nodeid, int64 pageno)
static void TransactionIdSetCommitTs (TransactionId xid, TimestampTz ts, RepOriginId nodeid, int slotno)
static void error_commit_ts_disabled (void)
static int ZeroCommitTsPage (int64 pageno, bool writeXlog)
static bool CommitTsPagePrecedes (int64 page1, int64 page2)
static void ActivateCommitTs (void)
static void DeactivateCommitTs (void)
static void WriteZeroPageXlogRec (int64 pageno)
static void WriteTruncateXlogRec (int64 pageno, TransactionId oldestXid)
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)
Datum pg_xact_commit_timestamp (PG_FUNCTION_ARGS)
Datum pg_last_committed_xact (PG_FUNCTION_ARGS)
Datum pg_xact_commit_timestamp_origin (PG_FUNCTION_ARGS)
static int CommitTsShmemBuffers (void)
Size CommitTsShmemSize (void)
void CommitTsShmemInit (void)
bool check_commit_ts_buffers (int *newval, void **extra, GucSource source)
void BootStrapCommitTs (void)
void StartupCommitTs (void)
void CompleteCommitTsInitialization (void)
void CommitTsParameterChange (bool newvalue, bool oldvalue)
void CheckPointCommitTs (void)
void ExtendCommitTs (TransactionId newestXact)
void TruncateCommitTs (TransactionId oldestXact)
void SetCommitTsLimit (TransactionId oldestXact, TransactionId newestXact)
void AdvanceOldestCommitTsXid (TransactionId oldestXact)
void commit_ts_redo (XLogReaderState *record)
int committssyncfiletag (const FileTag *ftag, char *path)
Variables
static SlruCtlData CommitTsCtlData
static CommitTimestampShared * commitTsShared
bool track_commit_timestamp

COMMIT_TS_XACTS_PER_PAGE

CommitTsCtl

SizeOfCommitTimestampEntry

#define SizeOfCommitTimestampEntry

TransactionIdToCTsEntry

CommitTimestampEntry

CommitTimestampShared

ActivateCommitTs()

static void ActivateCommitTs ( void ) static

Definition at line 705 of file commit_ts.c.

706{

709

710

713 {

715 return;

716 }

718

721

722

723

724

726

727

728

729

730

731

732

733

734

735

736

737

738

739

742 {

745 }

747

748

750 {

752 int slotno;

753

759 }

760

761

765}

static void pg_atomic_write_u64(volatile pg_atomic_uint64 *ptr, uint64 val)

static CommitTimestampShared * commitTsShared

static int64 TransactionIdToCTsPage(TransactionId xid)

static int ZeroCommitTsPage(int64 pageno, bool writeXlog)

Assert(PointerIsAligned(start, uint64))

bool LWLockAcquire(LWLock *lock, LWLockMode mode)

void LWLockRelease(LWLock *lock)

void SimpleLruWritePage(SlruCtl ctl, int slotno)

bool SimpleLruDoesPhysicalPageExist(SlruCtl ctl, int64 pageno)

static LWLock * SimpleLruGetBankLock(SlruCtl ctl, int64 pageno)

TransactionId oldestCommitTsXid

TransactionId newestCommitTsXid

FullTransactionId nextXid

static TransactionId ReadNextTransactionId(void)

#define InvalidTransactionId

#define XidFromFullTransactionId(x)

TransamVariablesData * TransamVariables

References Assert(), CommitTimestampShared::commitTsActive, CommitTsCtl, commitTsShared, InvalidTransactionId, LW_EXCLUSIVE, LWLockAcquire(), LWLockRelease(), TransamVariablesData::newestCommitTsXid, TransamVariablesData::nextXid, TransamVariablesData::oldestCommitTsXid, pg_atomic_write_u64(), ReadNextTransactionId(), SimpleLruDoesPhysicalPageExist(), SimpleLruGetBankLock(), SimpleLruWritePage(), TransactionIdToCTsPage(), TransamVariables, XidFromFullTransactionId, and ZeroCommitTsPage().

Referenced by CommitTsParameterChange(), CompleteCommitTsInitialization(), and StartupCommitTs().

AdvanceOldestCommitTsXid()

BootStrapCommitTs()

void BootStrapCommitTs ( void )

check_commit_ts_buffers()

bool check_commit_ts_buffers ( int * newval,
void ** extra,
GucSource source
)

CheckPointCommitTs()

void CheckPointCommitTs ( void )

commit_ts_redo()

Definition at line 1016 of file commit_ts.c.

1017{

1019

1020

1022

1024 {

1026 int slotno;

1028

1029 memcpy(&pageno, XLogRecGetData(record), sizeof(pageno));

1030

1033

1037

1039 }

1041 {

1043

1045

1046

1047

1048

1049

1052

1054 }

1055 else

1056 elog(PANIC, "commit_ts_redo: unknown op code %u", info);

1057}

void AdvanceOldestCommitTsXid(TransactionId oldestXact)

#define COMMIT_TS_ZEROPAGE

#define COMMIT_TS_TRUNCATE

void SimpleLruTruncate(SlruCtl ctl, int64 cutoffPage)

#define XLogRecGetInfo(decoder)

#define XLogRecGetData(decoder)

#define XLogRecHasAnyBlockRefs(decoder)

References AdvanceOldestCommitTsXid(), Assert(), COMMIT_TS_TRUNCATE, COMMIT_TS_ZEROPAGE, CommitTsCtl, elog, LW_EXCLUSIVE, LWLockAcquire(), LWLockRelease(), xl_commit_ts_truncate::oldestXid, xl_commit_ts_truncate::pageno, PANIC, pg_atomic_write_u64(), SimpleLruGetBankLock(), SimpleLruTruncate(), SimpleLruWritePage(), XLogRecGetData, XLogRecGetInfo, XLogRecHasAnyBlockRefs, and ZeroCommitTsPage().

CommitTsPagePrecedes()

static bool CommitTsPagePrecedes ( int64 page1, int64 page2 ) static

CommitTsParameterChange()

void CommitTsParameterChange ( bool newvalue,
bool oldvalue
)

CommitTsShmemBuffers()

static int CommitTsShmemBuffers ( void ) static

CommitTsShmemInit()

void CommitTsShmemInit ( void )

Definition at line 530 of file commit_ts.c.

531{

532 bool found;

533

534

536 {

537 char buf[32];

538

542

543

544

545

546

547

548

552 }

554

560 false);

562

565 &found);

566

568 {

570

575 }

576 else

578}

static int CommitTsShmemBuffers(void)

static bool CommitTsPagePrecedes(int64 page1, int64 page2)

#define TIMESTAMP_NOBEGIN(j)

void SetConfigOption(const char *name, const char *value, GucContext context, GucSource source)

@ LWTRANCHE_COMMITTS_BUFFER

@ LWTRANCHE_COMMITTS_SLRU

#define InvalidRepOriginId

void * ShmemInitStruct(const char *name, Size size, bool *foundPtr)

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)

#define SlruPagePrecedesUnitTests(ctl, per_page)

References Assert(), buf, commit_timestamp_buffers, COMMIT_TS_XACTS_PER_PAGE, CommitTimestampShared::commitTsActive, CommitTsCtl, CommitTsPagePrecedes(), commitTsShared, CommitTsShmemBuffers(), CommitTimestampShared::dataLastCommit, InvalidRepOriginId, InvalidTransactionId, IsUnderPostmaster, LWTRANCHE_COMMITTS_BUFFER, LWTRANCHE_COMMITTS_SLRU, 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 )

committssyncfiletag()

int committssyncfiletag ( const FileTag * ftag,
char * path
)

CompleteCommitTsInitialization()

void CompleteCommitTsInitialization ( void )

DeactivateCommitTs()

static void DeactivateCommitTs ( void ) static

Definition at line 778 of file commit_ts.c.

779{

780

781

782

783

784

785

786

788

793

796

797

798

799

800

801

802

803

804

805

806

807

808

809

810

812

814}

bool SlruScanDirectory(SlruCtl ctl, SlruScanCallback callback, void *data)

bool SlruScanDirCbDeleteAll(SlruCtl ctl, char *filename, int64 segpage, void *data)

References CommitTimestampShared::commitTsActive, CommitTsCtl, commitTsShared, CommitTimestampShared::dataLastCommit, InvalidRepOriginId, InvalidTransactionId, LW_EXCLUSIVE, LWLockAcquire(), LWLockRelease(), TransamVariablesData::newestCommitTsXid, CommitTimestampEntry::nodeid, TransamVariablesData::oldestCommitTsXid, SlruScanDirCbDeleteAll(), SlruScanDirectory(), CommitTimestampEntry::time, TIMESTAMP_NOBEGIN, TransamVariables, and CommitTimestampShared::xidLastCommit.

Referenced by CommitTsParameterChange(), and CompleteCommitTsInitialization().

error_commit_ts_disabled()

static void error_commit_ts_disabled ( void ) static

Definition at line 381 of file commit_ts.c.

382{

384 (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),

385 errmsg("could not get commit timestamp data"),

387 errhint("Make sure the configuration parameter \"%s\" is set on the primary server.",

388 "track_commit_timestamp") :

389 errhint("Make sure the configuration parameter \"%s\" is set.",

390 "track_commit_timestamp")));

391}

int errhint(const char *fmt,...)

int errcode(int sqlerrcode)

int errmsg(const char *fmt,...)

#define ereport(elevel,...)

bool RecoveryInProgress(void)

References ereport, errcode(), errhint(), errmsg(), ERROR, and RecoveryInProgress().

Referenced by GetLatestCommitTsData(), and TransactionIdGetCommitTsData().

ExtendCommitTs()

Definition at line 842 of file commit_ts.c.

843{

846

847

848

849

850

851

854 return;

855

856

857

858

859

862 return;

863

865

867

869

870

872

874}

#define TransactionIdToCTsEntry(xid)

#define TransactionIdEquals(id1, id2)

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

Referenced by GetNewTransactionId().

GetLatestCommitTsData()

pg_last_committed_xact()

Definition at line 420 of file commit_ts.c.

421{

426 bool nulls[3];

429

430

432

434 elog(ERROR, "return type must be a row type");

435

437 {

438 memset(nulls, true, sizeof(nulls));

439 }

440 else

441 {

443 nulls[0] = false;

444

446 nulls[1] = false;

447

449 nulls[2] = false;

450 }

451

453

455}

static Datum values[MAXATTR]

TransactionId GetLatestCommitTsData(TimestampTz *ts, RepOriginId *nodeid)

#define PG_RETURN_DATUM(x)

TypeFuncClass get_call_result_type(FunctionCallInfo fcinfo, Oid *resultTypeId, TupleDesc *resultTupleDesc)

static Datum HeapTupleGetDatum(const HeapTupleData *tuple)

HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull)

static Datum TransactionIdGetDatum(TransactionId X)

static Datum ObjectIdGetDatum(Oid X)

#define TransactionIdIsNormal(xid)

static Datum TimestampTzGetDatum(TimestampTz X)

References elog, ERROR, get_call_result_type(), GetLatestCommitTsData(), heap_form_tuple(), HeapTupleGetDatum(), ObjectIdGetDatum(), PG_RETURN_DATUM, TimestampTzGetDatum(), TransactionIdGetDatum(), TransactionIdIsNormal, TYPEFUNC_COMPOSITE, and values.

pg_xact_commit_timestamp()

pg_xact_commit_timestamp_origin()

Definition at line 464 of file commit_ts.c.

465{

470 bool nulls[2];

473 bool found;

474

476

478 elog(ERROR, "return type must be a row type");

479

480 if (!found)

481 {

482 memset(nulls, true, sizeof(nulls));

483 }

484 else

485 {

487 nulls[0] = false;

488

490 nulls[1] = false;

491 }

492

494

496}

References elog, ERROR, get_call_result_type(), heap_form_tuple(), HeapTupleGetDatum(), ObjectIdGetDatum(), PG_GETARG_TRANSACTIONID, PG_RETURN_DATUM, TimestampTzGetDatum(), TransactionIdGetCommitTsData(), TYPEFUNC_COMPOSITE, and values.

SetCommitTsLimit()

SetXidCommitTsInPage()

Definition at line 222 of file commit_ts.c.

225{

227 int slotno;

228 int i;

229

231

233

235 for (i = 0; i < nsubxids; i++)

237

238 CommitTsCtl->shared->page_dirty[slotno] = true;

239

241}

static void TransactionIdSetCommitTs(TransactionId xid, TimestampTz ts, RepOriginId nodeid, int slotno)

int SimpleLruReadPage(SlruCtl ctl, int64 pageno, bool write_ok, TransactionId xid)

References CommitTsCtl, i, LW_EXCLUSIVE, LWLockAcquire(), LWLockRelease(), SimpleLruGetBankLock(), SimpleLruReadPage(), and TransactionIdSetCommitTs().

Referenced by TransactionTreeSetCommitTsData().

StartupCommitTs()

void StartupCommitTs ( void )

TransactionIdGetCommitTsData()

Definition at line 274 of file commit_ts.c.

276{

279 int slotno;

283

286 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),

287 errmsg("cannot retrieve commit timestamp for transaction %u", xid)));

289 {

290

291 *ts = 0;

292 if (nodeid)

293 *nodeid = 0;

294 return false;

295 }

296

298

299

302

303

304

305

306

308 {

310 if (nodeid)

312

314 return *ts != 0;

315 }

316

319

322

323

324

325

329 {

330 *ts = 0;

331 if (nodeid)

333 return false;

334 }

335

336

338 memcpy(&entry,

339 CommitTsCtl->shared->page_buffer[slotno] +

342

343 *ts = entry.time;

344 if (nodeid)

345 *nodeid = entry.nodeid;

346

348 return *ts != 0;

349}

#define SizeOfCommitTimestampEntry

int SimpleLruReadPage_ReadOnly(SlruCtl ctl, int64 pageno, TransactionId xid)

#define TransactionIdIsValid(xid)

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(), and pg_xact_commit_timestamp_origin().

TransactionIdSetCommitTs()

TransactionIdToCTsPage()

TransactionTreeSetCommitTsData()

Definition at line 141 of file commit_ts.c.

144{

145 int i;

148

149

150

151

152

153

154

155

156

158 return;

159

160

161

162

163

164 if (nsubxids > 0)

165 newestXact = subxids[nsubxids - 1];

166 else

167 newestXact = xid;

168

169

170

171

172

173

174

175

176 headxid = xid;

177 i = 0;

178 for (;;)

179 {

181 int j;

182

183 for (j = i; j < nsubxids; j++)

184 {

186 break;

187 }

188

189

191 pageno);

192

193

194 if (j >= nsubxids)

195 break;

196

197

198

199

200

201 headxid = subxids[j];

202 i = j + 1;

203 }

204

205

210

211

215}

static void SetXidCommitTsInPage(TransactionId xid, int nsubxids, TransactionId *subxids, TimestampTz ts, RepOriginId nodeid, int64 pageno)

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()

WriteTruncateXlogRec()

WriteZeroPageXlogRec()

static void WriteZeroPageXlogRec ( int64 pageno) static

ZeroCommitTsPage()

static int ZeroCommitTsPage ( int64 pageno, bool writeXlog ) static

CommitTsCtlData

commitTsShared

track_commit_timestamp

bool track_commit_timestamp