Use more consistently int64 for page numbers in SLRU-related code
authorMichael Paquier <michael@paquier.xyz>
Tue, 23 Jul 2024 08:59:05 +0000 (17:59 +0900)
committerMichael Paquier <michael@paquier.xyz>
Tue, 23 Jul 2024 08:59:05 +0000 (17:59 +0900)
clog.c, async.c and predicate.c included some SLRU page numbers still
handled as 4-byte integers, while int64 should be used for this purpose.

These holes have been introduced in 4ed8f0913bfd, that has introduced
the use of 8-byte integers for SLRU page numbers, still forgot about the
code paths updated by this commit.

Reported-by: Noah Misch
Author: Aleksander Alekseev, Michael Paquier
Discussion: https://postgr.es/m/20240626002747.dc.nmisch@google.com
Backpatch-through: 17

src/backend/access/transam/clog.c
src/backend/commands/async.c
src/backend/storage/lmgr/predicate.c

index 44c253246b9c452fc4bba4b9db65b6ec525fc242..e6f79320e9425bcefcf0165150662c3697bd3858 100644 (file)
@@ -445,7 +445,7 @@ TransactionGroupUpdateXidStatus(TransactionId xid, XidStatus status,
        PGPROC     *proc = MyProc;
        uint32          nextidx;
        uint32          wakeidx;
-       int                     prevpageno;
+       int64           prevpageno;
        LWLock     *prevlock = NULL;
 
        /* We should definitely have an XID whose status needs to be updated. */
@@ -577,7 +577,7 @@ TransactionGroupUpdateXidStatus(TransactionId xid, XidStatus status,
        while (nextidx != INVALID_PROC_NUMBER)
        {
                PGPROC     *nextproc = &ProcGlobal->allProcs[nextidx];
-               int                     thispageno = nextproc->clogGroupMemberPage;
+               int64           thispageno = nextproc->clogGroupMemberPage;
 
                /*
                 * If the page to update belongs to a different bank than the previous
index ab4c72762d84be58fef1a8fc0f87269188df767e..8ed503e1c1bd9e07c15a3a812764fbdd87bff73e 100644 (file)
@@ -283,7 +283,7 @@ typedef struct AsyncQueueControl
        QueuePosition head;                     /* head points to the next free location */
        QueuePosition tail;                     /* tail must be <= the queue position of every
                                                                 * listening backend */
-       int                     stopPage;               /* oldest unrecycled page; must be <=
+       int64           stopPage;               /* oldest unrecycled page; must be <=
                                                                 * tail.page */
        ProcNumber      firstListener;  /* id of first listener, or
                                                                 * INVALID_PROC_NUMBER */
@@ -1271,9 +1271,9 @@ asyncQueueUnregister(void)
 static bool
 asyncQueueIsFull(void)
 {
-       int                     headPage = QUEUE_POS_PAGE(QUEUE_HEAD);
-       int                     tailPage = QUEUE_POS_PAGE(QUEUE_TAIL);
-       int                     occupied = headPage - tailPage;
+       int64           headPage = QUEUE_POS_PAGE(QUEUE_HEAD);
+       int64           tailPage = QUEUE_POS_PAGE(QUEUE_TAIL);
+       int64           occupied = headPage - tailPage;
 
        return occupied >= max_notify_queue_pages;
 }
@@ -1505,9 +1505,9 @@ pg_notification_queue_usage(PG_FUNCTION_ARGS)
 static double
 asyncQueueUsage(void)
 {
-       int                     headPage = QUEUE_POS_PAGE(QUEUE_HEAD);
-       int                     tailPage = QUEUE_POS_PAGE(QUEUE_TAIL);
-       int                     occupied = headPage - tailPage;
+       int64           headPage = QUEUE_POS_PAGE(QUEUE_HEAD);
+       int64           tailPage = QUEUE_POS_PAGE(QUEUE_TAIL);
+       int64           occupied = headPage - tailPage;
 
        if (occupied == 0)
                return (double) 0;              /* fast exit for common case */
@@ -1932,7 +1932,7 @@ asyncQueueReadAllNotifications(void)
 
                do
                {
-                       int                     curpage = QUEUE_POS_PAGE(pos);
+                       int64           curpage = QUEUE_POS_PAGE(pos);
                        int                     curoffset = QUEUE_POS_OFFSET(pos);
                        int                     slotno;
                        int                     copysize;
@@ -2108,9 +2108,9 @@ static void
 asyncQueueAdvanceTail(void)
 {
        QueuePosition min;
-       int                     oldtailpage;
-       int                     newtailpage;
-       int                     boundary;
+       int64           oldtailpage;
+       int64           newtailpage;
+       int64           boundary;
 
        /* Restrict task to one backend per cluster; see SimpleLruTruncate(). */
        LWLockAcquire(NotifyQueueTailLock, LW_EXCLUSIVE);
index 93841654db339fe471ea4eb2b03b38e3ce2e2e9b..b455b78f9f70607b53b33f4ced58528c46a97f3c 100644 (file)
@@ -344,7 +344,7 @@ static SlruCtlData SerialSlruCtlData;
 
 typedef struct SerialControlData
 {
-       int                     headPage;               /* newest initialized page */
+       int64           headPage;               /* newest initialized page */
        TransactionId headXid;          /* newest valid Xid in the SLRU */
        TransactionId tailXid;          /* oldest xmin we might be interested in */
 }                      SerialControlData;
@@ -1035,7 +1035,7 @@ SerialSetActiveSerXmin(TransactionId xid)
 void
 CheckPointPredicate(void)
 {
-       int                     truncateCutoffPage;
+       int64           truncateCutoffPage;
 
        LWLockAcquire(SerialControlLock, LW_EXCLUSIVE);
 
@@ -1048,7 +1048,7 @@ CheckPointPredicate(void)
 
        if (TransactionIdIsValid(serialControl->tailXid))
        {
-               int                     tailPage;
+               int64           tailPage;
 
                tailPage = SerialPage(serialControl->tailXid);