60 #define CLOG_BITS_PER_XACT 2 61 #define CLOG_XACTS_PER_BYTE 4 62 #define CLOG_XACTS_PER_PAGE (BLCKSZ * CLOG_XACTS_PER_BYTE) 63 #define CLOG_XACT_BITMASK ((1 << CLOG_BITS_PER_XACT) - 1) 65 #define TransactionIdToPage(xid) ((xid) / (TransactionId) CLOG_XACTS_PER_PAGE) 66 #define TransactionIdToPgIndex(xid) ((xid) % (TransactionId) CLOG_XACTS_PER_PAGE) 67 #define TransactionIdToByte(xid) (TransactionIdToPgIndex(xid) / CLOG_XACTS_PER_BYTE) 68 #define TransactionIdToBIndex(xid) ((xid) % (TransactionId) CLOG_XACTS_PER_BYTE) 71 #define CLOG_XACTS_PER_LSN_GROUP 32 72 #define CLOG_LSNS_PER_PAGE (CLOG_XACTS_PER_PAGE / CLOG_XACTS_PER_LSN_GROUP) 74 #define GetLSNIndex(slotno, xid) ((slotno) * CLOG_LSNS_PER_PAGE + \ 75 ((xid) % (TransactionId) CLOG_XACTS_PER_PAGE) / CLOG_XACTS_PER_LSN_GROUP) 82 #define THRESHOLD_SUBTRANS_CLOG_OPT 5 89 #define XactCtl (&XactCtlData) 100 bool all_xact_same_page);
177 for (i = 0; i < nsubxids; i++)
196 int nsubxids_on_first_page =
i;
210 subxids + nsubxids_on_first_page,
226 subxids + nsubxids_on_first_page,
255 if (nextpageno != pageno)
259 }
while (i < nsubxids);
262 num_on_page, subxids + offset,
263 status, lsn, pageno,
false);
277 bool all_xact_same_page)
281 "group clog threshold less than PGPROC cached subxids");
297 if (all_xact_same_page && xid ==
MyProc->
xid &&
376 for (i = 0; i < nsubxids; i++)
390 for (i = 0; i < nsubxids; i++)
396 XactCtl->shared->page_dirty[slotno] =
true;
491 while (extraWaits-- > 0)
573 byteptr =
XactCtl->shared->page_buffer[slotno] + byteno;
598 byteval |= (status << bshift);
613 if (
XactCtl->shared->group_lsn[lsnindex] < lsn)
614 XactCtl->shared->group_lsn[lsnindex] = lsn;
647 byteptr =
XactCtl->shared->page_buffer[slotno] + byteno;
652 *lsn =
XactCtl->shared->group_lsn[lsnindex];
760 XactCtl->shared->latest_page_number = pageno;
796 byteptr =
XactCtl->shared->page_buffer[slotno] + byteno;
799 *byteptr &= (1 << bshift) - 1;
801 MemSet(byteptr + 1, 0, BLCKSZ - byteno - 1);
803 XactCtl->shared->page_dirty[slotno] =
true;
820 TRACE_POSTGRESQL_CLOG_CHECKPOINT_START(
true);
822 TRACE_POSTGRESQL_CLOG_CHECKPOINT_DONE(
true);
1014 elog(
PANIC,
"clog_redo: unknown op code %u", info);
#define TransactionIdToBIndex(xid)
#define CLOG_XACT_BITMASK
#define CLOG_XACTS_PER_PAGE
#define TransactionIdToPage(xid)
XidStatus clogGroupMemberXidStatus
bool LWLockHeldByMeInMode(LWLock *l, LWLockMode mode)
static void WriteZeroPageXlogRec(int pageno)
void TruncateCLOG(TransactionId oldestXact, Oid oldestxid_datoid)
#define TransactionIdEquals(id1, id2)
int SlruSyncFileTag(SlruCtl ctl, const FileTag *ftag, char *path)
#define TRANSACTION_STATUS_COMMITTED
#define GetLSNIndex(slotno, xid)
void PGSemaphoreUnlock(PGSemaphore sema)
void clog_redo(XLogReaderState *record)
static bool TransactionGroupUpdateXidStatus(TransactionId xid, XidStatus status, XLogRecPtr lsn, int pageno)
XLogRecPtr clogGroupMemberLsn
static bool pg_atomic_compare_exchange_u32(volatile pg_atomic_uint32 *ptr, uint32 *expected, uint32 newval)
static void TransactionIdSetStatusBit(TransactionId xid, XidStatus status, XLogRecPtr lsn, int slotno)
void SimpleLruTruncate(SlruCtl ctl, int cutoffPage)
void ExtendCLOG(TransactionId newestXact)
#define TransactionIdToPgIndex(xid)
#define MemSet(start, val, len)
pg_atomic_uint32 clogGroupNext
FullTransactionId nextXid
Size SimpleLruShmemSize(int nslots, int nlsns)
void SimpleLruInit(SlruCtl ctl, const char *name, int nslots, int nlsns, LWLock *ctllock, const char *subdir, int tranche_id, SyncRequestHandler sync_handler)
void XLogFlush(XLogRecPtr record)
XidCacheStatus subxidStatus
#define XidFromFullTransactionId(x)
void LWLockRelease(LWLock *lock)
static uint32 pg_atomic_exchange_u32(volatile pg_atomic_uint32 *ptr, uint32 newval)
#define CLOG_LSNS_PER_PAGE
#define StaticAssertStmt(condition, errmessage)
void AdvanceOldestClogXid(TransactionId oldest_datfrozenxid)
void TransactionIdSetTreeStatus(TransactionId xid, int nsubxids, TransactionId *subxids, XidStatus status, XLogRecPtr lsn)
#define XLogRecGetData(decoder)
static void WriteTruncateXlogRec(int pageno, TransactionId oldestXact, Oid oldestXactDb)
#define FirstNormalTransactionId
int SimpleLruReadPage(SlruCtl ctl, int pageno, bool write_ok, TransactionId xid)
#define TRANSACTION_STATUS_ABORTED
#define THRESHOLD_SUBTRANS_CLOG_OPT
static bool CLOGPagePrecedes(int page1, int page2)
bool LWLockConditionalAcquire(LWLock *lock, LWLockMode mode)
VariableCache ShmemVariableCache
Size CLOGShmemBuffers(void)
void SimpleLruWriteAll(SlruCtl ctl, bool allow_redirtied)
#define TRANSACTION_STATUS_SUB_COMMITTED
#define InvalidTransactionId
TransactionId clogGroupMemberXid
#define CLOG_BITS_PER_XACT
int clogsyncfiletag(const FileTag *ftag, char *path)
static SlruCtlData XactCtlData
void SimpleLruWritePage(SlruCtl ctl, int slotno)
static void pgstat_report_wait_end(void)
void CheckPointCLOG(void)
#define XLogRecGetInfo(decoder)
bool TransactionIdPrecedes(TransactionId id1, TransactionId id2)
#define XLogRecPtrIsInvalid(r)
void XLogRegisterData(char *data, int len)
XLogRecPtr XLogInsert(RmgrId rmid, uint8 info)
bool SlruScanDirCbReportPresence(SlruCtl ctl, char *filename, int segpage, void *data)
int SimpleLruReadPage_ReadOnly(SlruCtl ctl, int pageno, TransactionId xid)
static void set_status_by_pages(int nsubxids, TransactionId *subxids, XidStatus status, XLogRecPtr lsn)
#define PGPROC_MAX_CACHED_SUBXIDS
TransactionId xids[PGPROC_MAX_CACHED_SUBXIDS]
#define Assert(condition)
bool SlruScanDirectory(SlruCtl ctl, SlruScanCallback callback, void *data)
static void pgstat_report_wait_start(uint32 wait_event_info)
static void TransactionIdSetPageStatus(TransactionId xid, int nsubxids, TransactionId *subxids, XidStatus status, XLogRecPtr lsn, int pageno, bool all_xact_same_page)
bool LWLockAcquire(LWLock *lock, LWLockMode mode)
void PGSemaphoreLock(PGSemaphore sema)
XidStatus TransactionIdGetStatus(TransactionId xid, XLogRecPtr *lsn)
pg_atomic_uint32 clogGroupFirst
#define TransactionIdToByte(xid)
static int ZeroCLOGPage(int pageno, bool writeXlog)
#define pg_write_barrier()
#define SlruPagePrecedesUnitTests(ctl, per_page)
static void TransactionIdSetPageStatusInternal(TransactionId xid, int nsubxids, TransactionId *subxids, XidStatus status, XLogRecPtr lsn, int pageno)
#define XLogRecHasAnyBlockRefs(decoder)
#define TransactionIdIsValid(xid)
static void pg_atomic_write_u32(volatile pg_atomic_uint32 *ptr, uint32 val)
static void static void status(const char *fmt,...) pg_attribute_printf(1
void XLogBeginInsert(void)
int SimpleLruZeroPage(SlruCtl ctl, int pageno)
#define TRANSACTION_STATUS_IN_PROGRESS
static uint32 pg_atomic_read_u32(volatile pg_atomic_uint32 *ptr)