From c00e0f64278bc35745cb0bb11e95eb5349ba50c6 Mon Sep 17 00:00:00 2001 From: David Rowley Date: Fri, 10 Feb 2023 15:10:06 +1300 Subject: [PATCH v6 3/3] Use a slab context type for storage of LOCALLOCKOWNERs --- src/backend/storage/lmgr/lock.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/backend/storage/lmgr/lock.c b/src/backend/storage/lmgr/lock.c index 1033d57b88..803a5bb482 100644 --- a/src/backend/storage/lmgr/lock.c +++ b/src/backend/storage/lmgr/lock.c @@ -281,6 +281,8 @@ static HTAB *LockMethodLockHash; static HTAB *LockMethodProcLockHash; static HTAB *LockMethodLocalHash; +/* A memory context for storing LOCALLOCKOWNER structs */ +MemoryContext LocalLockOwnerContext; /* private state for error cleanup */ static LOCALLOCK *StrongLockInProgress; @@ -483,6 +485,17 @@ InitLocks(void) /* Initialize each element of the session_locks array */ for (int i = 0; i < lengthof(LockMethods); i++) dlist_init(&session_locks[i]); + + /* + * Create a slab context for storing LOCALLOCKOWNERs. Slab seems like a + * good context type for this as it will manage fragmentation better than + * aset.c contexts and it will free() excess memory rather than maintain + * excessively long freelists after a large surge in locking requirements. + */ + LocalLockOwnerContext = SlabContextCreate(TopMemoryContext, + "LOCALLOCKOWNER context", + SLAB_DEFAULT_BLOCK_SIZE, + sizeof(LOCALLOCKOWNER)); } @@ -1688,7 +1701,7 @@ GrantLockLocal(LOCALLOCK *locallock, ResourceOwner owner) return; } } - locallockowner = MemoryContextAlloc(TopMemoryContext, sizeof(LOCALLOCKOWNER)); + locallockowner = MemoryContextAlloc(LocalLockOwnerContext, sizeof(LOCALLOCKOWNER)); locallockowner->owner = owner; locallockowner->nLocks = 1; locallockowner->locallock = locallock; -- 2.37.2