Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
Postgres FD Implementation
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Abuhujair Javed
Postgres FD Implementation
Commits
2584029e
Commit
2584029e
authored
Jun 30, 1998
by
Bruce Momjian
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Rename locking structure names to be clearer. Add narrative to
backend flowchart.
parent
f21fa6a7
Changes
9
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
324 additions
and
311 deletions
+324
-311
src/backend/storage/lmgr/lock.c
src/backend/storage/lmgr/lock.c
+188
-188
src/backend/storage/lmgr/multi.c
src/backend/storage/lmgr/multi.c
+44
-42
src/backend/storage/lmgr/proc.c
src/backend/storage/lmgr/proc.c
+6
-6
src/backend/storage/lmgr/single.c
src/backend/storage/lmgr/single.c
+7
-7
src/include/storage/lmgr.h
src/include/storage/lmgr.h
+3
-3
src/include/storage/lock.h
src/include/storage/lock.h
+36
-37
src/include/storage/multilev.h
src/include/storage/multilev.h
+10
-8
src/include/storage/proc.h
src/include/storage/proc.h
+2
-2
src/tools/backend/index.html
src/tools/backend/index.html
+28
-18
No files found.
src/backend/storage/lmgr/lock.c
View file @
2584029e
This diff is collapsed.
Click to expand it.
src/backend/storage/lmgr/multi.c
View file @
2584029e
...
...
@@ -12,7 +12,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/Attic/multi.c,v 1.1
8 1998/06/28 21:17:35
momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/Attic/multi.c,v 1.1
9 1998/06/30 02:33:31
momjian Exp $
*
* NOTES:
* (1) The lock.c module assumes that the caller here is doing
...
...
@@ -30,10 +30,10 @@
#include "miscadmin.h"
/* MyDatabaseId */
static
bool
MultiAcquire
(
L
ockTableId
tableId
,
LOCKTAG
*
tag
,
LOCKTYPE
locktyp
e
,
MultiAcquire
(
L
OCKMETHOD
lockmethod
,
LOCKTAG
*
tag
,
LOCKMODE
lockmod
e
,
PG_LOCK_LEVEL
level
);
static
bool
MultiRelease
(
L
ockTableId
tableId
,
LOCKTAG
*
tag
,
LOCKTYPE
locktyp
e
,
MultiRelease
(
L
OCKMETHOD
lockmethod
,
LOCKTAG
*
tag
,
LOCKMODE
lockmod
e
,
PG_LOCK_LEVEL
level
);
/*
...
...
@@ -78,25 +78,27 @@ static int MultiPrios[] = {
* Lock table identifier for this lock table. The multi-level
* lock table is ONE lock table, not three.
*/
LockTableId
MultiTableId
=
(
LockTableId
)
NULL
;
LockTableId
ShortTermTableId
=
(
LockTableId
)
NULL
;
LOCKMETHOD
MultiTableId
=
(
LOCKMETHOD
)
NULL
;
#ifdef NOT_USED
LOCKMETHOD
ShortTermTableId
=
(
LOCKMETHOD
)
NULL
;
#endif
/*
* Create the lock table described by MultiConflicts and Multiprio.
*/
L
ockTableId
L
OCKMETHOD
InitMultiLevelLocks
()
{
int
tableI
d
;
int
lockmetho
d
;
tableId
=
LockTableInit
(
"
LockTable"
,
MultiConflicts
,
MultiPrios
,
5
);
MultiTableId
=
tableI
d
;
lockmethod
=
LockMethodTableInit
(
"MultiLevel
LockTable"
,
MultiConflicts
,
MultiPrios
,
5
);
MultiTableId
=
lockmetho
d
;
if
(
!
(
MultiTableId
))
elog
(
ERROR
,
"InitMultiLocks: couldnt initialize lock table"
);
/* -----------------------
* No short term lock table for now. -Jeff 15 July 1991
*
* ShortTermTableId = LockTableRename(
tableI
d);
* ShortTermTableId = LockTableRename(
lockmetho
d);
* if (! (ShortTermTableId)) {
* elog(ERROR,"InitMultiLocks: couldnt rename lock table");
* }
...
...
@@ -111,7 +113,7 @@ InitMultiLevelLocks()
* Returns: TRUE if the lock can be set, FALSE otherwise.
*/
bool
MultiLockReln
(
LockInfo
linfo
,
LOCK
TYPE
locktyp
e
)
MultiLockReln
(
LockInfo
linfo
,
LOCK
MODE
lockmod
e
)
{
LOCKTAG
tag
;
...
...
@@ -122,7 +124,7 @@ MultiLockReln(LockInfo linfo, LOCKTYPE locktype)
MemSet
(
&
tag
,
0
,
sizeof
(
tag
));
tag
.
relId
=
linfo
->
lRelId
.
relId
;
tag
.
dbId
=
linfo
->
lRelId
.
dbId
;
return
(
MultiAcquire
(
MultiTableId
,
&
tag
,
lock
typ
e
,
RELN_LEVEL
));
return
(
MultiAcquire
(
MultiTableId
,
&
tag
,
lock
mod
e
,
RELN_LEVEL
));
}
/*
...
...
@@ -134,7 +136,7 @@ MultiLockReln(LockInfo linfo, LOCKTYPE locktype)
* at the page and relation level.
*/
bool
MultiLockTuple
(
LockInfo
linfo
,
ItemPointer
tidPtr
,
LOCK
TYPE
locktyp
e
)
MultiLockTuple
(
LockInfo
linfo
,
ItemPointer
tidPtr
,
LOCK
MODE
lockmod
e
)
{
LOCKTAG
tag
;
...
...
@@ -149,14 +151,14 @@ MultiLockTuple(LockInfo linfo, ItemPointer tidPtr, LOCKTYPE locktype)
/* not locking any valid Tuple, just the page */
tag
.
tupleId
=
*
tidPtr
;
return
(
MultiAcquire
(
MultiTableId
,
&
tag
,
lock
typ
e
,
TUPLE_LEVEL
));
return
(
MultiAcquire
(
MultiTableId
,
&
tag
,
lock
mod
e
,
TUPLE_LEVEL
));
}
/*
* same as above at page level
*/
bool
MultiLockPage
(
LockInfo
linfo
,
ItemPointer
tidPtr
,
LOCK
TYPE
locktyp
e
)
MultiLockPage
(
LockInfo
linfo
,
ItemPointer
tidPtr
,
LOCK
MODE
lockmod
e
)
{
LOCKTAG
tag
;
...
...
@@ -179,7 +181,7 @@ MultiLockPage(LockInfo linfo, ItemPointer tidPtr, LOCKTYPE locktype)
tag
.
relId
=
linfo
->
lRelId
.
relId
;
tag
.
dbId
=
linfo
->
lRelId
.
dbId
;
BlockIdCopy
(
&
(
tag
.
tupleId
.
ip_blkid
),
&
(
tidPtr
->
ip_blkid
));
return
(
MultiAcquire
(
MultiTableId
,
&
tag
,
lock
typ
e
,
PAGE_LEVEL
));
return
(
MultiAcquire
(
MultiTableId
,
&
tag
,
lock
mod
e
,
PAGE_LEVEL
));
}
/*
...
...
@@ -189,12 +191,12 @@ MultiLockPage(LockInfo linfo, ItemPointer tidPtr, LOCKTYPE locktype)
* Side Effects:
*/
static
bool
MultiAcquire
(
L
ockTableId
tableI
d
,
MultiAcquire
(
L
OCKMETHOD
lockmetho
d
,
LOCKTAG
*
tag
,
LOCK
TYPE
locktyp
e
,
LOCK
MODE
lockmod
e
,
PG_LOCK_LEVEL
level
)
{
LOCK
TYP
E
locks
[
N_LEVELS
];
LOCK
MOD
E
locks
[
N_LEVELS
];
int
i
,
status
;
LOCKTAG
xxTag
,
...
...
@@ -213,19 +215,19 @@ MultiAcquire(LockTableId tableId,
switch
(
level
)
{
case
RELN_LEVEL
:
locks
[
0
]
=
lock
typ
e
;
locks
[
0
]
=
lock
mod
e
;
locks
[
1
]
=
NO_LOCK
;
locks
[
2
]
=
NO_LOCK
;
break
;
case
PAGE_LEVEL
:
locks
[
0
]
=
lock
typ
e
+
INTENT
;
locks
[
1
]
=
lock
typ
e
;
locks
[
0
]
=
lock
mod
e
+
INTENT
;
locks
[
1
]
=
lock
mod
e
;
locks
[
2
]
=
NO_LOCK
;
break
;
case
TUPLE_LEVEL
:
locks
[
0
]
=
lock
typ
e
+
INTENT
;
locks
[
1
]
=
lock
typ
e
+
INTENT
;
locks
[
2
]
=
lock
typ
e
;
locks
[
0
]
=
lock
mod
e
+
INTENT
;
locks
[
1
]
=
lock
mod
e
+
INTENT
;
locks
[
2
]
=
lock
mod
e
;
break
;
default:
elog
(
ERROR
,
"MultiAcquire: bad lock level"
);
...
...
@@ -274,7 +276,7 @@ MultiAcquire(LockTableId tableId,
break
;
}
status
=
LockAcquire
(
tableI
d
,
tmpTag
,
locks
[
i
]);
status
=
LockAcquire
(
lockmetho
d
,
tmpTag
,
locks
[
i
]);
if
(
!
status
)
{
...
...
@@ -285,7 +287,7 @@ MultiAcquire(LockTableId tableId,
* the last level lock we successfully acquired
*/
retStatus
=
FALSE
;
MultiRelease
(
tableId
,
tag
,
locktyp
e
,
i
);
MultiRelease
(
lockmethod
,
tag
,
lockmod
e
,
i
);
/* now leave the loop. Don't try for any more locks */
break
;
}
...
...
@@ -300,7 +302,7 @@ MultiAcquire(LockTableId tableId,
*/
#ifdef NOT_USED
bool
MultiReleasePage
(
LockInfo
linfo
,
ItemPointer
tidPtr
,
LOCK
TYPE
locktyp
e
)
MultiReleasePage
(
LockInfo
linfo
,
ItemPointer
tidPtr
,
LOCK
MODE
lockmod
e
)
{
LOCKTAG
tag
;
...
...
@@ -316,7 +318,7 @@ MultiReleasePage(LockInfo linfo, ItemPointer tidPtr, LOCKTYPE locktype)
tag
.
dbId
=
linfo
->
lRelId
.
dbId
;
BlockIdCopy
(
&
(
tag
.
tupleId
.
ip_blkid
),
&
(
tidPtr
->
ip_blkid
));
return
(
MultiRelease
(
MultiTableId
,
&
tag
,
lock
typ
e
,
PAGE_LEVEL
));
return
(
MultiRelease
(
MultiTableId
,
&
tag
,
lock
mod
e
,
PAGE_LEVEL
));
}
#endif
...
...
@@ -326,7 +328,7 @@ MultiReleasePage(LockInfo linfo, ItemPointer tidPtr, LOCKTYPE locktype)
* ------------------
*/
bool
MultiReleaseReln
(
LockInfo
linfo
,
LOCK
TYPE
locktyp
e
)
MultiReleaseReln
(
LockInfo
linfo
,
LOCK
MODE
lockmod
e
)
{
LOCKTAG
tag
;
...
...
@@ -340,7 +342,7 @@ MultiReleaseReln(LockInfo linfo, LOCKTYPE locktype)
tag
.
relId
=
linfo
->
lRelId
.
relId
;
tag
.
dbId
=
linfo
->
lRelId
.
dbId
;
return
(
MultiRelease
(
MultiTableId
,
&
tag
,
lock
typ
e
,
RELN_LEVEL
));
return
(
MultiRelease
(
MultiTableId
,
&
tag
,
lock
mod
e
,
RELN_LEVEL
));
}
/*
...
...
@@ -349,12 +351,12 @@ MultiReleaseReln(LockInfo linfo, LOCKTYPE locktype)
* Returns: TRUE if successful, FALSE otherwise.
*/
static
bool
MultiRelease
(
L
ockTableId
tableI
d
,
MultiRelease
(
L
OCKMETHOD
lockmetho
d
,
LOCKTAG
*
tag
,
LOCK
TYPE
locktyp
e
,
LOCK
MODE
lockmod
e
,
PG_LOCK_LEVEL
level
)
{
LOCK
TYP
E
locks
[
N_LEVELS
];
LOCK
MOD
E
locks
[
N_LEVELS
];
int
i
,
status
;
LOCKTAG
xxTag
,
...
...
@@ -366,22 +368,22 @@ MultiRelease(LockTableId tableId,
switch
(
level
)
{
case
RELN_LEVEL
:
locks
[
0
]
=
lock
typ
e
;
locks
[
0
]
=
lock
mod
e
;
locks
[
1
]
=
NO_LOCK
;
locks
[
2
]
=
NO_LOCK
;
break
;
case
PAGE_LEVEL
:
locks
[
0
]
=
lock
typ
e
+
INTENT
;
locks
[
1
]
=
lock
typ
e
;
locks
[
0
]
=
lock
mod
e
+
INTENT
;
locks
[
1
]
=
lock
mod
e
;
locks
[
2
]
=
NO_LOCK
;
break
;
case
TUPLE_LEVEL
:
locks
[
0
]
=
lock
typ
e
+
INTENT
;
locks
[
1
]
=
lock
typ
e
+
INTENT
;
locks
[
2
]
=
lock
typ
e
;
locks
[
0
]
=
lock
mod
e
+
INTENT
;
locks
[
1
]
=
lock
mod
e
+
INTENT
;
locks
[
2
]
=
lock
mod
e
;
break
;
default:
elog
(
ERROR
,
"MultiRelease: bad lock
typ
e"
);
elog
(
ERROR
,
"MultiRelease: bad lock
mod
e"
);
}
/*
...
...
@@ -423,7 +425,7 @@ MultiRelease(LockTableId tableId,
ItemPointerCopy
(
&
tmpTag
->
tupleId
,
&
tag
->
tupleId
);
break
;
}
status
=
LockRelease
(
tableI
d
,
tmpTag
,
locks
[
i
]);
status
=
LockRelease
(
lockmetho
d
,
tmpTag
,
locks
[
i
]);
if
(
!
status
)
elog
(
ERROR
,
"MultiRelease: couldn't release after error"
);
}
...
...
src/backend/storage/lmgr/proc.c
View file @
2584029e
...
...
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.3
8 1998/06/27 15:47:46
momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.3
9 1998/06/30 02:33:32
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -46,7 +46,7 @@
* This is so that we can support more backends. (system-wide semaphore
* sets run out pretty fast.) -ay 4/95
*
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.3
8 1998/06/27 15:47:46
momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.3
9 1998/06/30 02:33:32
momjian Exp $
*/
#include <sys/time.h>
#include <unistd.h>
...
...
@@ -580,7 +580,7 @@ ProcWakeup(PROC *proc, int errType)
* released.
*/
int
ProcLockWakeup
(
PROC_QUEUE
*
queue
,
char
*
ltable
,
char
*
lock
)
ProcLockWakeup
(
PROC_QUEUE
*
queue
,
LOCKMETHOD
lockmethod
,
LOCK
*
lock
)
{
PROC
*
proc
;
int
count
;
...
...
@@ -590,8 +590,8 @@ ProcLockWakeup(PROC_QUEUE *queue, char *ltable, char *lock)
proc
=
(
PROC
*
)
MAKE_PTR
(
queue
->
links
.
prev
);
count
=
0
;
while
((
LockResolveConflicts
(
(
LOCKTAB
*
)
ltable
,
(
LOCK
*
)
lock
,
while
((
LockResolveConflicts
(
lockmethod
,
lock
,
proc
->
token
,
proc
->
xid
)
==
STATUS_OK
))
{
...
...
@@ -602,7 +602,7 @@ ProcLockWakeup(PROC_QUEUE *queue, char *ltable, char *lock)
* between the time we release the lock master (spinlock) and the
* time that the awoken process begins executing again.
*/
GrantLock
(
(
LOCK
*
)
lock
,
proc
->
token
);
GrantLock
(
lock
,
proc
->
token
);
queue
->
size
--
;
/*
...
...
src/backend/storage/lmgr/single.c
View file @
2584029e
...
...
@@ -13,7 +13,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/Attic/single.c,v 1.
6 1998/06/28 21:17:35
momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/Attic/single.c,v 1.
7 1998/06/30 02:33:32
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -32,7 +32,7 @@
* Returns: TRUE if the lock can be set, FALSE otherwise.
*/
bool
SingleLockReln
(
LockInfo
linfo
,
LOCK
TYPE
locktyp
e
,
int
action
)
SingleLockReln
(
LockInfo
linfo
,
LOCK
MODE
lockmod
e
,
int
action
)
{
LOCKTAG
tag
;
...
...
@@ -47,9 +47,9 @@ SingleLockReln(LockInfo linfo, LOCKTYPE locktype, int action)
tag
.
tupleId
.
ip_posid
=
InvalidOffsetNumber
;
if
(
action
==
UNLOCK
)
return
(
LockRelease
(
MultiTableId
,
&
tag
,
lock
typ
e
));
return
(
LockRelease
(
MultiTableId
,
&
tag
,
lock
mod
e
));
else
return
(
LockAcquire
(
MultiTableId
,
&
tag
,
lock
typ
e
));
return
(
LockAcquire
(
MultiTableId
,
&
tag
,
lock
mod
e
));
}
/*
...
...
@@ -63,7 +63,7 @@ SingleLockReln(LockInfo linfo, LOCKTYPE locktype, int action)
bool
SingleLockPage
(
LockInfo
linfo
,
ItemPointer
tidPtr
,
LOCK
TYPE
locktyp
e
,
LOCK
MODE
lockmod
e
,
int
action
)
{
LOCKTAG
tag
;
...
...
@@ -80,7 +80,7 @@ SingleLockPage(LockInfo linfo,
if
(
action
==
UNLOCK
)
return
(
LockRelease
(
MultiTableId
,
&
tag
,
lock
typ
e
));
return
(
LockRelease
(
MultiTableId
,
&
tag
,
lock
mod
e
));
else
return
(
LockAcquire
(
MultiTableId
,
&
tag
,
lock
typ
e
));
return
(
LockAcquire
(
MultiTableId
,
&
tag
,
lock
mod
e
));
}
src/include/storage/lmgr.h
View file @
2584029e
...
...
@@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: lmgr.h,v 1.1
1 1998/06/28 21:17:35
momjian Exp $
* $Id: lmgr.h,v 1.1
2 1998/06/30 02:33:32
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -72,10 +72,10 @@ extern void RelationSetWIntentLock(Relation relation);
extern
void
RelationUnsetWIntentLock
(
Relation
relation
);
/* single.c */
extern
bool
SingleLockReln
(
LockInfo
linfo
,
LOCK
TYPE
locktyp
e
,
int
action
);
extern
bool
SingleLockReln
(
LockInfo
linfo
,
LOCK
MODE
lockmod
e
,
int
action
);
extern
bool
SingleLockPage
(
LockInfo
linfo
,
ItemPointer
tidPtr
,
LOCK
TYPE
locktyp
e
,
int
action
);
LOCK
MODE
lockmod
e
,
int
action
);
/* proc.c */
extern
void
InitProcGlobal
(
IPCKey
key
);
...
...
src/include/storage/lock.h
View file @
2584029e
...
...
@@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: lock.h,v 1.1
4 1998/06/28 21:17:35
momjian Exp $
* $Id: lock.h,v 1.1
5 1998/06/30 02:33:33
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -36,26 +36,25 @@ typedef int MASK;
#define NLOCKS_PER_XACT 40
#define NLOCKENTS NLOCKS_PER_XACT*NBACKENDS
typedef
int
LOCK_TYPE
;
typedef
int
LOCKTYPE
;
typedef
int
LockTableId
;
typedef
int
LOCKMODE
;
typedef
int
LOCKMETHOD
;
/* MAX_LOCK
TYP
ES cannot be larger than the bits in MASK */
#define MAX_LOCK
TYP
ES 6
/* MAX_LOCK
MOD
ES cannot be larger than the bits in MASK */
#define MAX_LOCK
MOD
ES 6
/*
* MAX_
TABLE
S corresponds to the number of spin locks allocated in
* MAX_
LOCK_METHOD
S corresponds to the number of spin locks allocated in
* CreateSpinLocks() or the number of shared memory locations allocated
* for lock table spin locks in the case of machines with TAS instructions.
*/
#define MAX_
TABLE
S 2
#define MAX_
LOCK_METHOD
S 2
#define INVALID_TABLEID 0
/*typedef struct LOCK LOCK; */
typedef
struct
ltag
typedef
struct
LTAG
{
Oid
relId
;
Oid
dbId
;
...
...
@@ -67,31 +66,31 @@ typedef struct ltag
/* This is the control structure for a lock table. It
* lives in shared memory:
*
*
tableID
-- the handle used by the lock table's clients to
* refer to the t
able
.
*
lockmethod
-- the handle used by the lock table's clients to
* refer to the t
ype of lock table being used
.
*
* n
LockTyp
es -- number of lock types (READ,WRITE,etc) that
* n
umLockMod
es -- number of lock types (READ,WRITE,etc) that
* are defined on this lock table
*
* conflictTab -- this is an array of bitmasks showing lock
* type conflicts. conflictTab[i] is a mask with the j-th bit
* turned on if lock types i and j conflict.
*
* prio -- each lock
typ
e has a priority, so, for example, waiting
* prio -- each lock
mod
e has a priority, so, for example, waiting
* writers can be given priority over readers (to avoid
* starvation).
*
* masterlock -- synchronizes access to the table
*
*/
typedef
struct
lockctl
typedef
struct
LOCKMETHODCTL
{
L
ockTableId
tableI
d
;
int
n
LockTyp
es
;
int
conflictTab
[
MAX_LOCK
TYP
ES
];
int
prio
[
MAX_LOCK
TYP
ES
];
L
OCKMETHOD
lockmetho
d
;
int
n
umLockMod
es
;
int
conflictTab
[
MAX_LOCK
MOD
ES
];
int
prio
[
MAX_LOCK
MOD
ES
];
SPINLOCK
masterLock
;
}
LOCKCTL
;
}
LOCK
METHOD
CTL
;
/*
* lockHash -- hash table on lock Ids,
...
...
@@ -99,12 +98,12 @@ typedef struct lockctl
* multiple processes are holding the lock
* ctl - control structure described above.
*/
typedef
struct
ltable
typedef
struct
LOCKMETHODTABLE
{
HTAB
*
lockHash
;
HTAB
*
xidHash
;
LOCKCTL
*
ctl
;
}
LOCK
TAB
;
LOCK
METHOD
CTL
*
ctl
;
}
LOCK
METHODTABLE
;
/* -----------------------
* A transaction never conflicts with its own locks. Hence, if
...
...
@@ -148,7 +147,7 @@ typedef struct XIDLookupEnt
XIDTAG
tag
;
/* data */
int
holders
[
MAX_LOCK
TYP
ES
];
int
holders
[
MAX_LOCK
MOD
ES
];
int
nHolding
;
SHM_QUEUE
queue
;
}
XIDLookupEnt
;
...
...
@@ -156,7 +155,7 @@ typedef struct XIDLookupEnt
#define XID_TAGSIZE (sizeof(XIDTAG))
/* originally in procq.h */
typedef
struct
procQueue
typedef
struct
PROC_QUEUE
{
SHM_QUEUE
links
;
int
size
;
...
...
@@ -174,7 +173,7 @@ typedef struct procQueue
* lock.
* nHolding -- total locks of all types.
*/
typedef
struct
L
ock
typedef
struct
L
OCK
{
/* hash key */
LOCKTAG
tag
;
...
...
@@ -182,18 +181,18 @@ typedef struct Lock
/* data */
int
mask
;
PROC_QUEUE
waitProcs
;
int
holders
[
MAX_LOCK
TYP
ES
];
int
holders
[
MAX_LOCK
MOD
ES
];
int
nHolding
;
int
activeHolders
[
MAX_LOCK
TYP
ES
];
int
activeHolders
[
MAX_LOCK
MOD
ES
];
int
nActive
;
}
LOCK
;
#define LockGetLock_nHolders(l) l->nHolders
#define LockDecrWaitHolders(lock, lock
typ
e) \
#define LockDecrWaitHolders(lock, lock
mod
e) \
( \
lock->nHolding--, \
lock->holders[lock
typ
e]-- \
lock->holders[lock
mod
e]-- \
)
#define LockLockTable() SpinAcquire(LockMgrLock);
...
...
@@ -206,16 +205,16 @@ extern SPINLOCK LockMgrLock;
*/
extern
void
InitLocks
(
void
);
extern
void
LockDisable
(
int
status
);
extern
L
ockTableId
LockTableInit
(
char
*
tabName
,
MASK
*
conflictsP
,
int
*
prioP
,
int
n
typ
es
);
extern
bool
LockAcquire
(
L
ockTableId
tableId
,
LOCKTAG
*
lockName
,
LOCKTYPE
locktyp
e
);
extern
L
OCKMETHOD
Lock
Method
TableInit
(
char
*
tabName
,
MASK
*
conflictsP
,
int
*
prioP
,
int
n
umMod
es
);
extern
bool
LockAcquire
(
L
OCKMETHOD
lockmethod
,
LOCKTAG
*
locktag
,
LOCKMODE
lockmod
e
);
extern
int
LockResolveConflicts
(
LOCK
TAB
*
ltable
,
LOCK
*
lock
,
LOCKTYPE
locktyp
e
,
LockResolveConflicts
(
LOCK
METHOD
lockmethod
,
LOCK
*
lock
,
LOCKMODE
lockmod
e
,
TransactionId
xid
);
extern
bool
LockRelease
(
L
ockTableId
tableId
,
LOCKTAG
*
lockName
,
LOCKTYPE
locktyp
e
);
extern
void
GrantLock
(
LOCK
*
lock
,
LOCK
TYPE
locktyp
e
);
extern
bool
LockReleaseAll
(
L
ockTableId
tableI
d
,
SHM_QUEUE
*
lockQueue
);
extern
bool
LockRelease
(
L
OCKMETHOD
lockmethod
,
LOCKTAG
*
locktag
,
LOCKMODE
lockmod
e
);
extern
void
GrantLock
(
LOCK
*
lock
,
LOCK
MODE
lockmod
e
);
extern
bool
LockReleaseAll
(
L
OCKMETHOD
lockmetho
d
,
SHM_QUEUE
*
lockQueue
);
extern
int
LockShmemSize
(
void
);
extern
bool
LockingDisabled
(
void
);
extern
bool
DeadLockCheck
(
SHM_QUEUE
*
lockQueue
,
LOCK
*
findlock
,
bool
skip_check
);
...
...
src/include/storage/multilev.h
View file @
2584029e
...
...
@@ -7,7 +7,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: multilev.h,v 1.
9 1998/06/28 21:17:36
momjian Exp $
* $Id: multilev.h,v 1.
10 1998/06/30 02:33:33
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -43,16 +43,18 @@ typedef int PG_LOCK_LEVEL;
/* multi.c */
extern
LockTableId
MultiTableId
;
extern
LockTableId
ShortTermTableId
;
extern
LOCKMETHOD
MultiTableId
;
#ifdef NOT_USED
extern
LOCKMETHOD
ShortTermTableId
;
#endif
/*
* function prototypes
*/
extern
L
ockTableId
InitMultiLevelLocks
(
void
);
extern
bool
MultiLockReln
(
LockInfo
linfo
,
LOCK
TYPE
locktyp
e
);
extern
bool
MultiLockTuple
(
LockInfo
linfo
,
ItemPointer
tidPtr
,
LOCK
TYPE
locktyp
e
);
extern
bool
MultiLockPage
(
LockInfo
linfo
,
ItemPointer
tidPtr
,
LOCK
TYPE
locktyp
e
);
extern
bool
MultiReleaseReln
(
LockInfo
linfo
,
LOCK
TYPE
locktyp
e
);
extern
L
OCKMETHOD
InitMultiLevelLocks
(
void
);
extern
bool
MultiLockReln
(
LockInfo
linfo
,
LOCK
MODE
lockmod
e
);
extern
bool
MultiLockTuple
(
LockInfo
linfo
,
ItemPointer
tidPtr
,
LOCK
MODE
lockmod
e
);
extern
bool
MultiLockPage
(
LockInfo
linfo
,
ItemPointer
tidPtr
,
LOCK
MODE
lockmod
e
);
extern
bool
MultiReleaseReln
(
LockInfo
linfo
,
LOCK
MODE
lockmod
e
);
#endif
/* MULTILEV_H */
src/include/storage/proc.h
View file @
2584029e
...
...
@@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: proc.h,v 1.1
1 1998/02/26 04:43:31
momjian Exp $
* $Id: proc.h,v 1.1
2 1998/06/30 02:33:33
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -100,7 +100,7 @@ extern void ProcQueueInit(PROC_QUEUE *queue);
extern
int
ProcSleep
(
PROC_QUEUE
*
queue
,
SPINLOCK
spinlock
,
int
token
,
int
prio
,
LOCK
*
lock
);
extern
int
ProcLockWakeup
(
PROC_QUEUE
*
queue
,
char
*
ltable
,
char
*
lock
);
extern
int
ProcLockWakeup
(
PROC_QUEUE
*
queue
,
LOCKMETHOD
lockmethod
,
LOCK
*
lock
);
extern
void
ProcAddLock
(
SHM_QUEUE
*
elem
);
extern
void
ProcReleaseSpins
(
PROC
*
proc
);
extern
void
ProcFreeAllSemaphores
(
void
);
...
...
src/tools/backend/index.html
View file @
2584029e
...
...
@@ -25,13 +25,13 @@ structure, like
The query is then identified as a
<I>
Utility
</I>
function or a more
complex query. A
<I>
Utility
</I>
query is processed by a
query-specific function in
<A
HREF=
"../../backend/commands"
>
commands.
</A>
A complex query, like
<
B>
SELECT, UPDATE,
</B
>
and
<
B>
DELETE
</B
>
requires much more handling.
commands.
</A>
A complex query, like
<
CODE>
SELECT, UPDATE,
</CODE
>
and
<
CODE>
DELETE
</CODE
>
requires much more handling.
<P>
The parser takes a complex query, and creates a
<A
HREF=
"../../include/nodes/parsenodes.h"
>
Query
</A>
structure that
contains all the elements used by complex queries. Query.qual holds the
<
B>
WHERE
</B
>
clause qualification, which is filled in by
<
CODE>
WHERE
</CODE
>
clause qualification, which is filled in by
<A
HREF=
"../../backend/parser/parse_clause.c"
>
transformWhereClause().
</A>
Each table referenced in the query is represented by a
<A
HREF=
"../../include/nodes/parsenodes.h"
>
RangeTableEntry,
</A>
and they
...
...
@@ -39,19 +39,19 @@ are linked together to form the <I>range table</I> of the query, which is
generated by
<A
HREF=
"../../backend/parser/parse_clause.c"
>
makeRangeTable().
</A>
Query.rtable holds the queries range table.
<P>
Certain queries, like
<
B>
SELECT,
</B
>
return columns of data. Other
queries, like
<
B>
INSERT
</B>
and
<B>
UPDATE,
</B
>
specify the columns
Certain queries, like
<
CODE>
SELECT,
</CODE
>
return columns of data. Other
queries, like
<
CODE>
INSERT
</CODE>
and
<CODE>
UPDATE,
</CODE
>
specify the columns
modified by the query. These column references are converted to
<A
HREF=
"../../include/nodes/primnodes.h"
>
Resdom
</A>
entries, which are
linked together to make up the
<I>
target list
</I>
of the query. The
target list is stored in Query.targetList, which is generated by
<A
HREF=
"../../backend/parser/parse_target.c"
>
transformTargetList().
</A>
<P>
Other query elements, like aggregates(
<
B>
SUM()
</B>
),
<B>
GROUP BY,
</B
>
<
B>
ORDER BY
</B
>
are also stored in their own Query fields.
Other query elements, like aggregates(
<
CODE>
SUM()
</CODE>
),
<CODE>
GROUP BY,
</CODE
>
<
CODE>
ORDER BY
</CODE
>
are also stored in their own Query fields.
<P>
The next step is for the Query to be modified by any
<
B>
VIEWS
</B
>
or
<
B>
RULES
</B
>
that may apply to the query. This is performed by the
<A
The next step is for the Query to be modified by any
<
CODE>
VIEWS
</CODE
>
or
<
CODE>
RULES
</CODE
>
that may apply to the query. This is performed by the
<A
HREF=
"../../backend/rewrite"
>
rewrite
</A>
system.
<P>
The
<A
HREF=
"../../backend/optimizer"
>
optimizer
</A>
takes the Query
...
...
@@ -60,7 +60,7 @@ HREF="../..//include/nodes/plannodes.h">Plan,</A> which contains the
operations to be performed to execute the query. The
<A
HREF=
"../../backend/optimizer/path"
>
path
</A>
module determines the best
table join order and join type of each table in the RangeTable, using
Query.qual(
<
B>
WHERE
</B
>
clause) to consider optimal index usage.
Query.qual(
<
CODE>
WHERE
</CODE
>
clause) to consider optimal index usage.
<P>
The Plan is then passed to the
<A
HREF=
"../../backend/executor"
>
executor
</A>
for execution, and the result
...
...
@@ -81,15 +81,25 @@ data/index buffer cache block
<LI>
Shared Buf Lookup Table - lookup of buffer cache block address using
table name and block number(
<A
HREF=
"../../include/storage/buf_internals.h"
>
BufferTag
</A>
)
<LI><A
HREF=
"../../include/storage/lock.h"
>
LockTable (ctl)
</A>
- lock table
structure, specifiying table, lock types, and backends holding or
waiting on lock
<LI>
LockTable (lock hash) - lookup of LockTable structures using relation,
database object ids
<LI>
LockTable (xid hash) - lookup of LockTable structures using
transaction id, LockTable address
<LI>
MultiLevelLockTable (ctl) -
<A
HREF=
"../../include/storage/lock.h"
>
LOCKCTL
</A>
control structure for
each locking method. Currently, only multi-level locking is used.
<LI>
MultiLevelLockTable (lock hash) - the
<A
HREF=
"../../include/storage/lock.h"
>
LOCK
</A>
structure, looked up using
relation, database object ids(
<A
HREF=
"../../include/storage/lock.h"
>
LOCKTAG)
</A>
. The lock table structure contains the
lock modes(read, write) and circular linked list of backends (
<A
HREF=
"../../include/storage/proc.h"
>
PROC
</A>
structure pointers) waiting
on the lock.
<LI>
MultiLevelLockTable (xid hash) - lookup of LOCK structure address
using transaction id, LOCK address. It is used to quickly check if the
current transaction already has any locks on a table, rather than having
to search through all the held locks. It also stores the modes
(read/write) of the locks held by the current transaction. The returned
<A
HREF=
"../../include/storage/lock.h"
>
XIDLookupEnt
</A>
structure also
contains a pointer to the backend's PROC.lockQueue.
<LI><A
HREF=
"../../include/storage/proc.h"
>
Proc Header
</A>
- information
about each backend, including locks held/waiting,
indexed by process id
about each backend, including locks held/waiting, indexed by process id
</UL>
Each data structure is created by calling
<A
HREF=
"../../backend/storage/ipc/shmem.c"
>
ShmemInitStruct(),
</A>
and
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment