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 ,
96106Oid oldestXactDb );
97107static void TransactionIdSetPageStatus (TransactionId xid ,int nsubxids ,
98108TransactionId * subxids ,XidStatus status ,
99- XLogRecPtr lsn ,int pageno ,
109+ XLogRecPtr lsn ,int64 pageno ,
100110bool all_xact_same_page );
101111static void TransactionIdSetStatusBit (TransactionId xid ,XidStatus status ,
102112XLogRecPtr lsn ,int slotno );
103113static void set_status_by_pages (int nsubxids ,TransactionId * subxids ,
104114XidStatus 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 ,
108118TransactionId * subxids ,XidStatus status ,
109- XLogRecPtr lsn ,int pageno );
119+ XLogRecPtr lsn ,int64 pageno );
110120
111121
112122/*
162172TransactionIdSetTreeStatus (TransactionId xid ,int nsubxids ,
163173TransactionId * subxids ,XidStatus status ,XLogRecPtr lsn )
164174{
165- int pageno = TransactionIdToPage (xid );/* get page of parent */
175+ int64 pageno = TransactionIdToPage (xid );/* get page of parent */
166176int i ;
167177
168178Assert (status == TRANSACTION_STATUS_COMMITTED ||
@@ -236,7 +246,7 @@ static void
236246set_status_by_pages (int nsubxids ,TransactionId * subxids ,
237247XidStatus status ,XLogRecPtr lsn )
238248{
239- int pageno = TransactionIdToPage (subxids [0 ]);
249+ int64 pageno = TransactionIdToPage (subxids [0 ]);
240250int offset = 0 ;
241251int i = 0 ;
242252
@@ -245,7 +255,7 @@ set_status_by_pages(int nsubxids, TransactionId *subxids,
245255while (i < nsubxids )
246256{
247257int num_on_page = 0 ;
248- int nextpageno ;
258+ int64 nextpageno ;
249259
250260do
251261{
@@ -271,7 +281,7 @@ set_status_by_pages(int nsubxids, TransactionId *subxids,
271281static void
272282TransactionIdSetPageStatus (TransactionId xid ,int nsubxids ,
273283TransactionId * subxids ,XidStatus status ,
274- XLogRecPtr lsn ,int pageno ,
284+ XLogRecPtr lsn ,int64 pageno ,
275285bool 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 ,
339349TransactionId * subxids ,XidStatus status ,
340- XLogRecPtr lsn ,int pageno )
350+ XLogRecPtr lsn ,int64 pageno )
341351{
342352int slotno ;
343353int 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{
416426volatile PROC_HDR * procglobal = ProcGlobal ;
417427PGPROC * 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 );
641651int byteno = TransactionIdToByte (xid );
642652int bshift = TransactionIdToBIndex (xid )* CLOG_BITS_PER_XACT ;
643653int slotno ;
@@ -697,7 +707,7 @@ CLOGShmemInit(void)
697707XactCtl -> PagePrecedes = CLOGPagePrecedes ;
698708SimpleLruInit (XactCtl ,"Xact" ,CLOGShmemBuffers (),CLOG_LSNS_PER_PAGE ,
699709XactSLRULock ,"pg_xact" ,LWTRANCHE_XACT_BUFFER ,
700- SYNC_HANDLER_CLOG );
710+ SYNC_HANDLER_CLOG , false );
701711SlruPagePrecedesUnitTests (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{
739749int slotno ;
740750
754764StartupCLOG (void )
755765{
756766TransactionId xid = XidFromFullTransactionId (ShmemVariableCache -> nextXid );
757- int pageno = TransactionIdToPage (xid );
767+ int64 pageno = TransactionIdToPage (xid );
758768
759769LWLockAcquire (XactSLRULock ,LW_EXCLUSIVE );
760770
773783TrimCLOG (void )
774784{
775785TransactionId xid = XidFromFullTransactionId (ShmemVariableCache -> nextXid );
776- int pageno = TransactionIdToPage (xid );
786+ int64 pageno = TransactionIdToPage (xid );
777787
778788LWLockAcquire (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{
935945TransactionId xid1 ;
936946TransactionId 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{
954964XLogBeginInsert ();
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{
968978XLogRecPtr recptr ;
969979xl_clog_truncate xlrec ;
@@ -991,10 +1001,10 @@ clog_redo(XLogReaderState *record)
9911001
9921002if (info == CLOG_ZEROPAGE )
9931003{
994- int pageno ;
1004+ int64 pageno ;
9951005int slotno ;
9961006
997- memcpy (& pageno ,XLogRecGetData (record ),sizeof (int ));
1007+ memcpy (& pageno ,XLogRecGetData (record ),sizeof (pageno ));
9981008
9991009LWLockAcquire (XactSLRULock ,LW_EXCLUSIVE );
10001010