diff options
Diffstat (limited to 'src/include')
-rw-r--r-- | src/include/catalog/pg_proc.h | 2 | ||||
-rw-r--r-- | src/include/storage/lock.h | 27 | ||||
-rw-r--r-- | src/include/storage/proc.h | 21 |
3 files changed, 39 insertions, 11 deletions
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h index cc436e34edd..96f43fe0b1f 100644 --- a/src/include/catalog/pg_proc.h +++ b/src/include/catalog/pg_proc.h @@ -2811,7 +2811,7 @@ DATA(insert OID = 2078 ( set_config PGNSP PGUID 12 1 0 0 0 f f f f f v 3 0 25 DESCR("SET X as a function"); DATA(insert OID = 2084 ( pg_show_all_settings PGNSP PGUID 12 1 1000 0 0 f f f t t s 0 0 2249 "" "{25,25,25,25,25,25,25,25,25,25,25,1009,25,25,25,23}" "{o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o}" "{name,setting,unit,category,short_desc,extra_desc,context,vartype,source,min_val,max_val,enumvals,boot_val,reset_val,sourcefile,sourceline}" _null_ show_all_settings _null_ _null_ _null_ )); DESCR("SHOW ALL as a function"); -DATA(insert OID = 1371 ( pg_lock_status PGNSP PGUID 12 1 1000 0 0 f f f t t v 0 0 2249 "" "{25,26,26,23,21,25,28,26,26,21,25,23,25,16}" "{o,o,o,o,o,o,o,o,o,o,o,o,o,o}" "{locktype,database,relation,page,tuple,virtualxid,transactionid,classid,objid,objsubid,virtualtransaction,pid,mode,granted}" _null_ pg_lock_status _null_ _null_ _null_ )); +DATA(insert OID = 1371 ( pg_lock_status PGNSP PGUID 12 1 1000 0 0 f f f t t v 0 0 2249 "" "{25,26,26,23,21,25,28,26,26,21,25,23,25,16,16}" "{o,o,o,o,o,o,o,o,o,o,o,o,o,o,o}" "{locktype,database,relation,page,tuple,virtualxid,transactionid,classid,objid,objsubid,virtualtransaction,pid,mode,granted,fastpath}" _null_ pg_lock_status _null_ _null_ _null_ )); DESCR("view system lock information"); DATA(insert OID = 1065 ( pg_prepared_xact PGNSP PGUID 12 1 1000 0 0 f f f t t v 0 0 2249 "" "{28,25,1184,26,26}" "{o,o,o,o,o}" "{transaction,gid,prepared,ownerid,dbid}" _null_ pg_prepared_xact _null_ _null_ _null_ )); DESCR("view two-phase transactions"); diff --git a/src/include/storage/lock.h b/src/include/storage/lock.h index 7ec961f4430..21b77f30599 100644 --- a/src/include/storage/lock.h +++ b/src/include/storage/lock.h @@ -412,6 +412,7 @@ typedef struct LOCALLOCK int64 nLocks; /* total number of times lock is held */ int numLockOwners; /* # of relevant ResourceOwners */ int maxLockOwners; /* allocated size of array */ + bool holdsStrongLockCount; /* did we bump FastPathStrongLocks? */ LOCALLOCKOWNER *lockOwners; /* dynamically resizable array */ } LOCALLOCK; @@ -419,19 +420,25 @@ typedef struct LOCALLOCK /* - * This struct holds information passed from lmgr internals to the lock - * listing user-level functions (in lockfuncs.c). For each PROCLOCK in - * the system, copies of the PROCLOCK object and associated PGPROC and - * LOCK objects are stored. Note there will often be multiple copies - * of the same PGPROC or LOCK --- to detect whether two are the same, - * compare the PROCLOCK tag fields. + * These structures hold information passed from lmgr internals to the lock + * listing user-level functions (in lockfuncs.c). */ + +typedef struct LockInstanceData +{ + LOCKTAG locktag; /* locked object */ + LOCKMASK holdMask; /* locks held by this PGPROC */ + LOCKMODE waitLockMode; /* lock awaited by this PGPROC, if any */ + BackendId backend; /* backend ID of this PGPROC */ + LocalTransactionId lxid; /* local transaction ID of this PGPROC */ + int pid; /* pid of this PGPROC */ + bool fastpath; /* taken via fastpath? */ +} LockInstanceData; + typedef struct LockData { - int nelements; /* The length of each of the arrays */ - PROCLOCK *proclocks; - PGPROC *procs; - LOCK *locks; + int nelements; /* The length of the array */ + LockInstanceData *locks; } LockData; diff --git a/src/include/storage/proc.h b/src/include/storage/proc.h index 4819cb81108..09ac3cf967b 100644 --- a/src/include/storage/proc.h +++ b/src/include/storage/proc.h @@ -51,6 +51,14 @@ struct XidCache #define PROC_VACUUM_STATE_MASK (0x0E) /* + * We allow a small number of "weak" relation locks (AccesShareLock, + * RowShareLock, RowExclusiveLock) to be recorded in the PGPROC structure + * rather than the main lock table. This eases contention on the lock + * manager LWLocks. See storage/lmgr/README for additional details. + */ +#define FP_LOCK_SLOTS_PER_BACKEND 16 + +/* * Each backend has a PGPROC struct in shared memory. There is also a list of * currently-unused PGPROC structs that will be reallocated to new backends. * @@ -137,6 +145,13 @@ struct PGPROC SHM_QUEUE myProcLocks[NUM_LOCK_PARTITIONS]; struct XidCache subxids; /* cache for subtransaction XIDs */ + + /* Per-backend LWLock. Protects fields below. */ + LWLockId backendLock; /* protects the fields below */ + + /* Lock manager data, recording fast-path locks taken by this backend. */ + uint64 fpLockBits; /* lock modes held for each fast-path slot */ + Oid fpRelId[FP_LOCK_SLOTS_PER_BACKEND]; /* slots for rel oids */ }; /* NOTE: "typedef struct PGPROC PGPROC" appears in storage/lock.h. */ @@ -150,6 +165,10 @@ extern PGDLLIMPORT PGPROC *MyProc; */ typedef struct PROC_HDR { + /* Array of PGPROC structures (not including dummies for prepared txns) */ + PGPROC *allProcs; + /* Length of allProcs array */ + uint32 allProcCount; /* Head of list of free PGPROC structures */ PGPROC *freeProcs; /* Head of list of autovacuum's free PGPROC structures */ @@ -163,6 +182,8 @@ typedef struct PROC_HDR int startupBufferPinWaitBufId; } PROC_HDR; +extern PROC_HDR *ProcGlobal; + /* * We set aside some extra PGPROC structures for auxiliary processes, * ie things that aren't full-fledged backends but need shmem access. |