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
b4564a98
Commit
b4564a98
authored
Jan 27, 1998
by
Bruce Momjian
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Deadlock ceallnup.
(void) change for aix and hp compilers. protocol cleanup.
parent
f49d4135
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
62 additions
and
22 deletions
+62
-22
src/backend/parser/parse_func.c
src/backend/parser/parse_func.c
+3
-3
src/backend/postmaster/postmaster.c
src/backend/postmaster/postmaster.c
+2
-2
src/backend/storage/lmgr/lock.c
src/backend/storage/lmgr/lock.c
+28
-6
src/include/access/heapam.h
src/include/access/heapam.h
+3
-3
src/include/c.h
src/include/c.h
+12
-2
src/include/config.h.in
src/include/config.h.in
+0
-2
src/include/libpq/pqcomm.h
src/include/libpq/pqcomm.h
+7
-3
src/man/lock.l
src/man/lock.l
+7
-1
No files found.
src/backend/parser/parse_func.c
View file @
b4564a98
...
...
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.
8 1998/01/20 22:11:55
momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.
9 1998/01/27 15:34:39
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -728,7 +728,7 @@ func_get_detail(char *funcname,
funcname
);
elog
(
NOTICE
,
"that satisfies the given argument types. you will have to"
);
elog
(
NOTICE
,
"retype your query using explicit typecasts."
);
func_error
(
"
func_get_detail
"
,
funcname
,
nargs
,
oid_array
);
func_error
(
""
,
funcname
,
nargs
,
oid_array
);
}
else
{
...
...
@@ -758,7 +758,7 @@ func_get_detail(char *funcname,
elog
(
ERROR
,
"no such attribute or function
\"
%s
\"
"
,
funcname
);
}
func_error
(
"
func_get_detail
"
,
funcname
,
nargs
,
oid_array
);
func_error
(
""
,
funcname
,
nargs
,
oid_array
);
}
else
{
...
...
src/backend/postmaster/postmaster.c
View file @
b4564a98
...
...
@@ -10,7 +10,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.7
1 1998/01/27 03:11:46
momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.7
2 1998/01/27 15:34:43
momjian Exp $
*
* NOTES
*
...
...
@@ -473,7 +473,7 @@ pmdaemonize(void)
int
i
;
if
(
fork
())
exit
(
0
);
_
exit
(
0
);
/* GH: If there's no setsid(), we hopefully don't need silent mode.
* Until there's a better solution.
*/
...
...
src/backend/storage/lmgr/lock.c
View file @
b4564a98
...
...
@@ -7,12 +7,12 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/lock.c,v 1.2
2 1998/01/27 03:00:28
momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/lock.c,v 1.2
3 1998/01/27 15:34:49
momjian Exp $
*
* NOTES
* Outside modules can create a lock table and acquire/release
* locks. A lock table is a shared memory hash table. When
* a process tries to acquire a lock of a type that conflicts
* a process tries to acquire a lock of a type that conflict
R
s
* with existing locks, it is put to sleep using the routines
* in storage/lmgr/proc.c.
*
...
...
@@ -39,6 +39,7 @@
#include "postgres.h"
#include "miscadmin.h"
#include "storage/shmem.h"
#include "storage/sinvaladt.h"
#include "storage/spin.h"
#include "storage/proc.h"
#include "storage/lock.h"
...
...
@@ -1415,7 +1416,8 @@ LockingDisabled()
*
* This code takes a list of locks a process holds, and the lock that
* the process is sleeping on, and tries to find if any of the processes
* waiting on its locks hold the lock it is waiting for.
* waiting on its locks hold the lock it is waiting for. If no deadlock
* is found, it goes on to look at all the processes waiting on their locks.
*
* We have already locked the master lock before being called.
*/
...
...
@@ -1427,7 +1429,16 @@ DeadLockCheck(SHM_QUEUE *lockQueue, LOCK *findlock, bool skip_check)
XIDLookupEnt
*
tmp
=
NULL
;
SHMEM_OFFSET
end
=
MAKE_OFFSET
(
lockQueue
);
LOCK
*
lock
;
static
PROC
*
checked_procs
[
MaxBackendId
];
static
int
nprocs
;
if
(
skip_check
)
{
/* initialize at start of recursion */
checked_procs
[
0
]
=
MyProc
;
nprocs
=
1
;
}
if
(
SHMQueueEmpty
(
lockQueue
))
return
false
;
...
...
@@ -1457,18 +1468,29 @@ DeadLockCheck(SHM_QUEUE *lockQueue, LOCK *findlock, bool skip_check)
*/
if
(
lock
==
findlock
&&
!
skip_check
)
return
true
;
else
if
(
lock
!=
findlock
||
!
skip_check
)
/*
* No sense in looking at the wait queue of the lock we are
* looking for as it is MyProc's lock entry.
* If lock == findlock, and I got here, skip_check must be true.
*/
if
(
lock
!=
findlock
)
{
PROC_QUEUE
*
waitQueue
=
&
(
lock
->
waitProcs
);
PROC
*
proc
;
int
i
;
int
j
;
proc
=
(
PROC
*
)
MAKE_PTR
(
waitQueue
->
links
.
prev
);
for
(
i
=
0
;
i
<
waitQueue
->
size
;
i
++
)
{
/* prevent endless loops */
if
(
proc
!=
MyProc
&&
skip_check
)
for
(
j
=
0
;
j
<
nprocs
;
j
++
)
if
(
checked_procs
[
j
]
==
proc
)
break
;
if
(
j
>=
nprocs
)
{
checked_procs
[
nprocs
++
]
=
proc
;
Assert
(
nprocs
<=
MaxBackendId
);
/* If we found a deadlock, we can stop right now */
if
(
DeadLockCheck
(
&
(
proc
->
lockQueue
),
findlock
,
false
))
return
true
;
...
...
src/include/access/heapam.h
View file @
b4564a98
...
...
@@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: heapam.h,v 1.2
4 1998/01/25 05:04:21 scrappy
Exp $
* $Id: heapam.h,v 1.2
5 1998/01/27 15:35:18 momjian
Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -101,10 +101,10 @@ typedef HeapAccessStatisticsData *HeapAccessStatistics;
#define heap_getattr(tup, b, attnum, tupleDesc, isnull) \
(AssertMacro((tup) != NULL) ? \
((attnum) > (int) (tup)->t_natts) ? \
(((isnull) ? (*(isnull) = true) :
(void)
NULL), (Datum)NULL) : \
(((isnull) ? (*(isnull) = true) :
dummyret
NULL), (Datum)NULL) : \
((attnum) > 0) ? \
fastgetattr((tup), (attnum), (tupleDesc), (isnull)) : \
(((isnull) ? (*(isnull) = false) :
(void)
NULL), heap_getsysattr((tup), (b), (attnum))) : \
(((isnull) ? (*(isnull) = false) :
dummyret
NULL), heap_getsysattr((tup), (b), (attnum))) : \
(Datum)NULL)
extern
HeapAccessStatistics
heap_access_stats
;
/* in stats.c */
...
...
src/include/c.h
View file @
b4564a98
...
...
@@ -7,7 +7,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: c.h,v 1.
29 1998/01/26 01:41:49 scrappy
Exp $
* $Id: c.h,v 1.
30 1998/01/27 15:35:00 momjian
Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -181,8 +181,18 @@ typedef char *Pointer;
#endif
/* !HAVE_ANSI_CPP */
#ifndef __GNUC__
/* GNU cc */
#endif
#ifndef __GNUC__
/* GNU cc */
#define inline
/*
* dummyret is used to set return values in macros that use ?: to make
* assignments. gcc wants these to be void, other compilers like char
*/
#define dummyret char
#else
#define dummyret void
#endif
#if defined(NEED_STD_HDRS)
...
...
@@ -693,7 +703,7 @@ typedef struct Exception
*/
/* we do this so if the macro is used in an if action, it will work */
#define StrNCpy(dst,src,len) \
(strncpy((dst),(src),(len)),(len > 0) ? *((dst)+(len)-1)='\0' : (
void
)NULL,(void)(dst))
(strncpy((dst),(src),(len)),(len > 0) ? *((dst)+(len)-1)='\0' : (
dummyret
)NULL,(void)(dst))
/* Get a bit mask of the bits set in non-int32 aligned addresses */
#define INT_ALIGN_MASK (sizeof(int32) - 1)
...
...
src/include/config.h.in
View file @
b4564a98
...
...
@@ -216,8 +216,6 @@ extern void srandom(int seed);
* number of seconds.
* We don't check for deadlocks just before sleeping because a deadlock is
* a rare event, and checking is an expensive operation.
* We only detect deadlocks between two processes, not three or more, but
* these are the most common.
*/
#define DEADLOCK_CHECK_TIMER 60
...
...
src/include/libpq/pqcomm.h
View file @
b4564a98
...
...
@@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: pqcomm.h,v 1.2
0 1998/01/27 04:08:28
momjian Exp $
* $Id: pqcomm.h,v 1.2
1 1998/01/27 15:35:22
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -35,8 +35,12 @@ typedef union SockAddr {
#define UNIXSOCK_PATH(sun,port) \
(sprintf((sun).sun_path, "/tmp/.s.PGSQL.%d", (port)) + \
sizeof ((sun).sun_len) + sizeof ((sun).sun_family))
+ 1 + sizeof ((sun).sun_family))
/*
* + 1 is for BSD-specific sizeof((sun).sun_len)
* We never actually set sun_len, and I can't think of a
* platform-safe way of doing it, but the code still works. bjm
*/
/*
* These manipulate the frontend/backend protocol version number.
...
...
src/man/lock.l
View file @
b4564a98
.\" This is -*-nroff-*-
.\" XXX standard disclaimer belongs here....
.\" $Header: /cvsroot/pgsql/src/man/Attic/lock.l,v 1.
1 1998/01/23 06:01:36
momjian Exp $
.\" $Header: /cvsroot/pgsql/src/man/Attic/lock.l,v 1.
2 1998/01/27 15:35:30
momjian Exp $
.TH FETCH SQL 01/23/93 PostgreSQL PostgreSQL
.SH NAME
lock - exclusive lock a table
...
...
@@ -17,6 +17,12 @@ inside a transaction. If you don't exclusive lock the table before the
and do their own \fBupdate\fP, causing a deadlock while you both wait
for the other to release the \fBselect\fP-induced shared lock so you can
get an exclusive lock to do the \fBupdate.\fP
.PP
Another example of deadlock is where one user locks one table, and
another user locks a second table. While both keep their existing
locks, the first user tries to lock the second user's table, and the
second user tries to lock the first user's table. Both users deadlock
waiting for the tables to become available.
.SH EXAMPLES
.nf
--
...
...
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