aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/transam
diff options
context:
space:
mode:
authorTeodor Sigaev <teodor@sigaev.ru>2017-07-21 13:31:20 +0300
committerTeodor Sigaev <teodor@sigaev.ru>2017-07-21 13:31:20 +0300
commit7e1fb4c59e4ac86de2640d0f3453fde270ec1ff8 (patch)
treedd181bdafe0d786d316c2edc7daa2dcb40dbc281 /src/backend/access/transam
parent68f785fd522bca9372cce965ac10cbd8c239c076 (diff)
downloadpostgresql-7e1fb4c59e4ac86de2640d0f3453fde270ec1ff8.tar.gz
postgresql-7e1fb4c59e4ac86de2640d0f3453fde270ec1ff8.zip
Fix double shared memory allocation.
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.
Diffstat (limited to 'src/backend/access/transam')
-rw-r--r--src/backend/access/transam/slru.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/backend/access/transam/slru.c b/src/backend/access/transam/slru.c
index 93ec653dd60..d037c369a72 100644
--- a/src/backend/access/transam/slru.c
+++ b/src/backend/access/transam/slru.c
@@ -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);