Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Gpdb
提交
2584029e
G
Gpdb
项目概览
Greenplum
/
Gpdb
通知
7
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
Gpdb
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
2584029e
编写于
6月 30, 1998
作者:
B
Bruce Momjian
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Rename locking structure names to be clearer. Add narrative to
backend flowchart.
上级
f21fa6a7
变更
9
展开全部
隐藏空白更改
内联
并排
Showing
9 changed file
with
324 addition
and
311 deletion
+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
未找到文件。
src/backend/storage/lmgr/lock.c
浏览文件 @
2584029e
此差异已折叠。
点击以展开。
src/backend/storage/lmgr/multi.c
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录