6262#define CLOG_XACTS_PER_PAGE (BLCKSZ * CLOG_XACTS_PER_BYTE)
6363#define CLOG_XACT_BITMASK ((1 << CLOG_BITS_PER_XACT) - 1)
6464
65- #define TransactionIdToPage (xid ) ((xid) / (TransactionId) CLOG_XACTS_PER_PAGE)
65+
66+ /*
67+ * Although we return an int64 the actual value can't currently exceed
68+ * 0xFFFFFFFF/CLOG_XACTS_PER_PAGE.
69+ */
70+ static inline int64
71+ TransactionIdToPage (TransactionId xid )
72+ {
73+ return xid / (int64 ) CLOG_XACTS_PER_PAGE ;
74+ }
75+
6676#define TransactionIdToPgIndex (xid ) ((xid) % (TransactionId) CLOG_XACTS_PER_PAGE)
6777#define TransactionIdToByte (xid ) (TransactionIdToPgIndex(xid) / CLOG_XACTS_PER_BYTE)
6878#define TransactionIdToBIndex (xid ) ((xid) % (TransactionId) CLOG_XACTS_PER_BYTE)
@@ -89,24 +99,24 @@ static SlruCtlData XactCtlData;
8999#define XactCtl (&XactCtlData)
90100
91101
92- static int ZeroCLOGPage (int pageno , bool writeXlog );
93- static bool CLOGPagePrecedes (int page1 , int page2 );
94- static void WriteZeroPageXlogRec (int pageno );
95- static void WriteTruncateXlogRec (int pageno , TransactionId oldestXact ,
102+ static int ZeroCLOGPage (int64 pageno , bool writeXlog );
103+ static bool CLOGPagePrecedes (int64 page1 , int64 page2 );
104+ static void WriteZeroPageXlogRec (int64 pageno );
105+ static void WriteTruncateXlogRec (int64 pageno , TransactionId oldestXact ,
96106 Oid oldestXactDb );
97107static void TransactionIdSetPageStatus (TransactionId xid , int nsubxids ,
98108 TransactionId * subxids , XidStatus status ,
99- XLogRecPtr lsn , int pageno ,
109+ XLogRecPtr lsn , int64 pageno ,
100110 bool all_xact_same_page );
101111static void TransactionIdSetStatusBit (TransactionId xid , XidStatus status ,
102112 XLogRecPtr lsn , int slotno );
103113static void set_status_by_pages (int nsubxids , TransactionId * subxids ,
104114 XidStatus status , XLogRecPtr lsn );
105115static bool TransactionGroupUpdateXidStatus (TransactionId xid ,
106- XidStatus status , XLogRecPtr lsn , int pageno );
116+ XidStatus status , XLogRecPtr lsn , int64 pageno );
107117static void TransactionIdSetPageStatusInternal (TransactionId xid , int nsubxids ,
108118 TransactionId * subxids , XidStatus status ,
109- XLogRecPtr lsn , int pageno );
119+ XLogRecPtr lsn , int64 pageno );
110120
111121
112122/*
162172TransactionIdSetTreeStatus (TransactionId xid , int nsubxids ,
163173 TransactionId * subxids , XidStatus status , XLogRecPtr lsn )
164174{
165- int pageno = TransactionIdToPage (xid ); /* get page of parent */
175+ int64 pageno = TransactionIdToPage (xid ); /* get page of parent */
166176 int i ;
167177
168178 Assert (status == TRANSACTION_STATUS_COMMITTED ||
@@ -236,7 +246,7 @@ static void
236246set_status_by_pages (int nsubxids , TransactionId * subxids ,
237247 XidStatus status , XLogRecPtr lsn )
238248{
239- int pageno = TransactionIdToPage (subxids [0 ]);
249+ int64 pageno = TransactionIdToPage (subxids [0 ]);
240250 int offset = 0 ;
241251 int i = 0 ;
242252
@@ -245,7 +255,7 @@ set_status_by_pages(int nsubxids, TransactionId *subxids,
245255 while (i < nsubxids )
246256 {
247257 int num_on_page = 0 ;
248- int nextpageno ;
258+ int64 nextpageno ;
249259
250260 do
251261 {
@@ -271,7 +281,7 @@ set_status_by_pages(int nsubxids, TransactionId *subxids,
271281static void
272282TransactionIdSetPageStatus (TransactionId xid , int nsubxids ,
273283 TransactionId * subxids , XidStatus status ,
274- XLogRecPtr lsn , int pageno ,
284+ XLogRecPtr lsn , int64 pageno ,
275285 bool all_xact_same_page )
276286{
277287 /* Can't use group update when PGPROC overflows. */
@@ -337,7 +347,7 @@ TransactionIdSetPageStatus(TransactionId xid, int nsubxids,
337347static void
338348TransactionIdSetPageStatusInternal (TransactionId xid , int nsubxids ,
339349 TransactionId * subxids , XidStatus status ,
340- XLogRecPtr lsn , int pageno )
350+ XLogRecPtr lsn , int64 pageno )
341351{
342352 int slotno ;
343353 int i ;
@@ -411,7 +421,7 @@ TransactionIdSetPageStatusInternal(TransactionId xid, int nsubxids,
411421 */
412422static bool
413423TransactionGroupUpdateXidStatus (TransactionId xid , XidStatus status ,
414- XLogRecPtr lsn , int pageno )
424+ XLogRecPtr lsn , int64 pageno )
415425{
416426 volatile PROC_HDR * procglobal = ProcGlobal ;
417427 PGPROC * proc = MyProc ;
@@ -637,7 +647,7 @@ TransactionIdSetStatusBit(TransactionId xid, XidStatus status, XLogRecPtr lsn, i
637647XidStatus
638648TransactionIdGetStatus (TransactionId xid , XLogRecPtr * lsn )
639649{
640- int pageno = TransactionIdToPage (xid );
650+ int64 pageno = TransactionIdToPage (xid );
641651 int byteno = TransactionIdToByte (xid );
642652 int bshift = TransactionIdToBIndex (xid ) * CLOG_BITS_PER_XACT ;
643653 int slotno ;
@@ -697,7 +707,7 @@ CLOGShmemInit(void)
697707 XactCtl -> PagePrecedes = CLOGPagePrecedes ;
698708 SimpleLruInit (XactCtl , "Xact" , CLOGShmemBuffers (), CLOG_LSNS_PER_PAGE ,
699709 XactSLRULock , "pg_xact" , LWTRANCHE_XACT_BUFFER ,
700- SYNC_HANDLER_CLOG );
710+ SYNC_HANDLER_CLOG , false );
701711 SlruPagePrecedesUnitTests (XactCtl , CLOG_XACTS_PER_PAGE );
702712}
703713
@@ -734,7 +744,7 @@ BootStrapCLOG(void)
734744 * Control lock must be held at entry, and will be held at exit.
735745 */
736746static int
737- ZeroCLOGPage (int pageno , bool writeXlog )
747+ ZeroCLOGPage (int64 pageno , bool writeXlog )
738748{
739749 int slotno ;
740750
754764StartupCLOG (void )
755765{
756766 TransactionId xid = XidFromFullTransactionId (ShmemVariableCache -> nextXid );
757- int pageno = TransactionIdToPage (xid );
767+ int64 pageno = TransactionIdToPage (xid );
758768
759769 LWLockAcquire (XactSLRULock , LW_EXCLUSIVE );
760770
773783TrimCLOG (void )
774784{
775785 TransactionId xid = XidFromFullTransactionId (ShmemVariableCache -> nextXid );
776- int pageno = TransactionIdToPage (xid );
786+ int64 pageno = TransactionIdToPage (xid );
777787
778788 LWLockAcquire (XactSLRULock , LW_EXCLUSIVE );
779789
@@ -838,7 +848,7 @@ CheckPointCLOG(void)
838848void
839849ExtendCLOG (TransactionId newestXact )
840850{
841- int pageno ;
851+ int64 pageno ;
842852
843853 /*
844854 * No work except at first XID of a page. But beware: just after
@@ -877,7 +887,7 @@ ExtendCLOG(TransactionId newestXact)
877887void
878888TruncateCLOG (TransactionId oldestXact , Oid oldestxid_datoid )
879889{
880- int cutoffPage ;
890+ int64 cutoffPage ;
881891
882892 /*
883893 * The cutoff point is the start of the segment containing oldestXact. We
@@ -930,7 +940,7 @@ TruncateCLOG(TransactionId oldestXact, Oid oldestxid_datoid)
930940 * don't optimize that edge case.
931941 */
932942static bool
933- CLOGPagePrecedes (int page1 , int page2 )
943+ CLOGPagePrecedes (int64 page1 , int64 page2 )
934944{
935945 TransactionId xid1 ;
936946 TransactionId xid2 ;
@@ -949,10 +959,10 @@ CLOGPagePrecedes(int page1, int page2)
949959 * Write a ZEROPAGE xlog record
950960 */
951961static void
952- WriteZeroPageXlogRec (int pageno )
962+ WriteZeroPageXlogRec (int64 pageno )
953963{
954964 XLogBeginInsert ();
955- XLogRegisterData ((char * ) (& pageno ), sizeof (int ));
965+ XLogRegisterData ((char * ) (& pageno ), sizeof (pageno ));
956966 (void ) XLogInsert (RM_CLOG_ID , CLOG_ZEROPAGE );
957967}
958968
@@ -963,7 +973,7 @@ WriteZeroPageXlogRec(int pageno)
963973 * in TruncateCLOG().
964974 */
965975static void
966- WriteTruncateXlogRec (int pageno , TransactionId oldestXact , Oid oldestXactDb )
976+ WriteTruncateXlogRec (int64 pageno , TransactionId oldestXact , Oid oldestXactDb )
967977{
968978 XLogRecPtr recptr ;
969979 xl_clog_truncate xlrec ;
@@ -991,10 +1001,10 @@ clog_redo(XLogReaderState *record)
9911001
9921002 if (info == CLOG_ZEROPAGE )
9931003 {
994- int pageno ;
1004+ int64 pageno ;
9951005 int slotno ;
9961006
997- memcpy (& pageno , XLogRecGetData (record ), sizeof (int ));
1007+ memcpy (& pageno , XLogRecGetData (record ), sizeof (pageno ));
9981008
9991009 LWLockAcquire (XactSLRULock , LW_EXCLUSIVE );
10001010
0 commit comments