Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Fix double shared memory allocation.
authorTeodor Sigaev <teodor@sigaev.ru>
Fri, 21 Jul 2017 10:31:49 +0000 (13:31 +0300)
committerTeodor Sigaev <teodor@sigaev.ru>
Fri, 21 Jul 2017 10:31:49 +0000 (13:31 +0300)
SLRU buffer lwlocks are allocated twice by oversight in commit
fe702a7b3f9f2bc5bf6d173166d7d55226af82c8 where that locks were moved to
separate tranche. The bug doesn't have user-visible effects except small
overspending of shared memory.

Backpatch to 9.6 where it was introduced.

Alexander Korotkov with small editorization by me.

src/backend/access/transam/slru.c

index bbae5847f2d5dab6d533c921de1aafd1134fc9cb..ee111ca539145493f48c2b3d4a848c63a61856f3 100644 (file)
@@ -204,15 +204,16 @@ SimpleLruInit(SlruCtl ctl, const char *name, int nslots, int nlsns,
        shared->page_lru_count = (int *) (ptr + offset);
        offset += MAXALIGN(nslots * sizeof(int));
 
+       /* Initialize LWLocks */
+       shared->buffer_locks = (LWLockPadded *) (ptr + offset);
+       offset += MAXALIGN(nslots * sizeof(LWLockPadded));
+
        if (nlsns > 0)
        {
            shared->group_lsn = (XLogRecPtr *) (ptr + offset);
            offset += MAXALIGN(nslots * nlsns * sizeof(XLogRecPtr));
        }
 
-       /* Initialize LWLocks */
-       shared->buffer_locks = (LWLockPadded *) ShmemAlloc(sizeof(LWLockPadded) * nslots);
-
        Assert(strlen(name) + 1 < SLRU_MAX_NAME_LENGTH);
        strlcpy(shared->lwlock_tranche_name, name, SLRU_MAX_NAME_LENGTH);
        shared->lwlock_tranche_id = tranche_id;
@@ -232,6 +233,9 @@ SimpleLruInit(SlruCtl ctl, const char *name, int nslots, int nlsns,
            shared->page_lru_count[slotno] = 0;
            ptr += BLCKSZ;
        }
+
+       /* Should fit to estimated shmem size */
+       Assert(ptr - (char *) shared  <= SimpleLruShmemSize(nslots, nlsns));
    }
    else
        Assert(found);