mirror of
https://github.com/postgres/postgres.git
synced 2025-04-27 22:56:53 +03:00
Refactor lock manager initialization to make it a bit less special
Split the shared and local initialization to separate functions, and follow the common naming conventions. With this, we no longer create the LockMethodLocalHash hash table in the postmaster process, which was always pointless. Reviewed-by: Andreas Karlsson Discussion: https://www.postgresql.org/message-id/c09694ff-2453-47e5-b26c-32a16cd75ce6@iki.fi
This commit is contained in:
parent
9f87da1cff
commit
fbce7dfc77
@ -116,7 +116,7 @@ CalculateShmemSize(int *num_semaphores)
|
|||||||
size = add_size(size, dsm_estimate_size());
|
size = add_size(size, dsm_estimate_size());
|
||||||
size = add_size(size, DSMRegistryShmemSize());
|
size = add_size(size, DSMRegistryShmemSize());
|
||||||
size = add_size(size, BufferShmemSize());
|
size = add_size(size, BufferShmemSize());
|
||||||
size = add_size(size, LockShmemSize());
|
size = add_size(size, LockManagerShmemSize());
|
||||||
size = add_size(size, PredicateLockShmemSize());
|
size = add_size(size, PredicateLockShmemSize());
|
||||||
size = add_size(size, ProcGlobalShmemSize());
|
size = add_size(size, ProcGlobalShmemSize());
|
||||||
size = add_size(size, XLogPrefetchShmemSize());
|
size = add_size(size, XLogPrefetchShmemSize());
|
||||||
@ -291,7 +291,7 @@ CreateOrAttachShmemStructs(void)
|
|||||||
/*
|
/*
|
||||||
* Set up lock manager
|
* Set up lock manager
|
||||||
*/
|
*/
|
||||||
InitLocks();
|
LockManagerShmemInit();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set up predicate lock manager
|
* Set up predicate lock manager
|
||||||
|
@ -377,19 +377,17 @@ static void GetSingleProcBlockerStatusData(PGPROC *blocked_proc,
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* InitLocks -- Initialize the lock manager's data structures.
|
* Initialize the lock manager's shmem data structures.
|
||||||
*
|
*
|
||||||
* This is called from CreateSharedMemoryAndSemaphores(), which see for
|
* This is called from CreateSharedMemoryAndSemaphores(), which see for more
|
||||||
* more comments. In the normal postmaster case, the shared hash tables
|
* comments. In the normal postmaster case, the shared hash tables are
|
||||||
* are created here, as well as a locallock hash table that will remain
|
* created here, and backends inherit pointers to them via fork(). In the
|
||||||
* unused and empty in the postmaster itself. Backends inherit the pointers
|
* EXEC_BACKEND case, each backend re-executes this code to obtain pointers to
|
||||||
* to the shared tables via fork(), and also inherit an image of the locallock
|
* the already existing shared hash tables. In either case, each backend must
|
||||||
* hash table, which they proceed to use. In the EXEC_BACKEND case, each
|
* also call InitLockManagerAccess() to create the locallock hash table.
|
||||||
* backend re-executes this code to obtain pointers to the already existing
|
|
||||||
* shared hash tables and to create its locallock hash table.
|
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
InitLocks(void)
|
LockManagerShmemInit(void)
|
||||||
{
|
{
|
||||||
HASHCTL info;
|
HASHCTL info;
|
||||||
long init_table_size,
|
long init_table_size,
|
||||||
@ -444,18 +442,19 @@ InitLocks(void)
|
|||||||
sizeof(FastPathStrongRelationLockData), &found);
|
sizeof(FastPathStrongRelationLockData), &found);
|
||||||
if (!found)
|
if (!found)
|
||||||
SpinLockInit(&FastPathStrongRelationLocks->mutex);
|
SpinLockInit(&FastPathStrongRelationLocks->mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialize the lock manager's backend-private data structures.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
InitLockManagerAccess(void)
|
||||||
|
{
|
||||||
/*
|
/*
|
||||||
* Allocate non-shared hash table for LOCALLOCK structs. This stores lock
|
* Allocate non-shared hash table for LOCALLOCK structs. This stores lock
|
||||||
* counts and resource owner information.
|
* counts and resource owner information.
|
||||||
*
|
|
||||||
* The non-shared table could already exist in this process (this occurs
|
|
||||||
* when the postmaster is recreating shared memory after a backend crash).
|
|
||||||
* If so, delete and recreate it. (We could simply leave it, since it
|
|
||||||
* ought to be empty in the postmaster, but for safety let's zap it.)
|
|
||||||
*/
|
*/
|
||||||
if (LockMethodLocalHash)
|
HASHCTL info;
|
||||||
hash_destroy(LockMethodLocalHash);
|
|
||||||
|
|
||||||
info.keysize = sizeof(LOCALLOCKTAG);
|
info.keysize = sizeof(LOCALLOCKTAG);
|
||||||
info.entrysize = sizeof(LOCALLOCK);
|
info.entrysize = sizeof(LOCALLOCK);
|
||||||
@ -3571,7 +3570,7 @@ PostPrepare_Locks(TransactionId xid)
|
|||||||
* Estimate shared-memory space used for lock tables
|
* Estimate shared-memory space used for lock tables
|
||||||
*/
|
*/
|
||||||
Size
|
Size
|
||||||
LockShmemSize(void)
|
LockManagerShmemSize(void)
|
||||||
{
|
{
|
||||||
Size size = 0;
|
Size size = 0;
|
||||||
long max_table_size;
|
long max_table_size;
|
||||||
|
@ -606,6 +606,9 @@ BaseInit(void)
|
|||||||
*/
|
*/
|
||||||
InitXLogInsert();
|
InitXLogInsert();
|
||||||
|
|
||||||
|
/* Initialize lock manager's local structs */
|
||||||
|
InitLockManagerAccess();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize replication slots after pgstat. The exit hook might need to
|
* Initialize replication slots after pgstat. The exit hook might need to
|
||||||
* drop ephemeral slots, which in turn triggers stats reporting.
|
* drop ephemeral slots, which in turn triggers stats reporting.
|
||||||
|
@ -544,7 +544,9 @@ typedef enum
|
|||||||
/*
|
/*
|
||||||
* function prototypes
|
* function prototypes
|
||||||
*/
|
*/
|
||||||
extern void InitLocks(void);
|
extern void LockManagerShmemInit(void);
|
||||||
|
extern Size LockManagerShmemSize(void);
|
||||||
|
extern void InitLockManagerAccess(void);
|
||||||
extern LockMethod GetLocksMethodTable(const LOCK *lock);
|
extern LockMethod GetLocksMethodTable(const LOCK *lock);
|
||||||
extern LockMethod GetLockTagsMethodTable(const LOCKTAG *locktag);
|
extern LockMethod GetLockTagsMethodTable(const LOCKTAG *locktag);
|
||||||
extern uint32 LockTagHashCode(const LOCKTAG *locktag);
|
extern uint32 LockTagHashCode(const LOCKTAG *locktag);
|
||||||
@ -584,7 +586,6 @@ extern bool LockCheckConflicts(LockMethod lockMethodTable,
|
|||||||
extern void GrantLock(LOCK *lock, PROCLOCK *proclock, LOCKMODE lockmode);
|
extern void GrantLock(LOCK *lock, PROCLOCK *proclock, LOCKMODE lockmode);
|
||||||
extern void GrantAwaitedLock(void);
|
extern void GrantAwaitedLock(void);
|
||||||
extern void RemoveFromWaitQueue(PGPROC *proc, uint32 hashcode);
|
extern void RemoveFromWaitQueue(PGPROC *proc, uint32 hashcode);
|
||||||
extern Size LockShmemSize(void);
|
|
||||||
extern LockData *GetLockStatusData(void);
|
extern LockData *GetLockStatusData(void);
|
||||||
extern BlockedProcsData *GetBlockerStatusData(int blocked_pid);
|
extern BlockedProcsData *GetBlockerStatusData(int blocked_pid);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user