]> granicus.if.org Git - postgresql/commitdiff
Fix double shared memory allocation.
authorTeodor Sigaev <teodor@sigaev.ru>
Fri, 21 Jul 2017 10:31:20 +0000 (13:31 +0300)
committerTeodor Sigaev <teodor@sigaev.ru>
Fri, 21 Jul 2017 10:31:20 +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 93ec653dd6047bfa20d0d69dc010a5ece3735a21..d037c369a72db239d20e78a7e88a26e745084292 100644 (file)
@@ -205,15 +205,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;
@@ -230,6 +231,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);