Use more consistently int64 for page numbers in SLRU-related code
authorMichael Paquier <[email protected]>
Tue, 23 Jul 2024 08:59:05 +0000 (17:59 +0900)
committerMichael Paquier <[email protected]>
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[email protected]
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);