summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHiroshi Inoue2000-02-22 09:55:26 +0000
committerHiroshi Inoue2000-02-22 09:55:26 +0000
commit5525297465185198d7a5db9273d5fab9e8a3faf1 (patch)
tree3935c7620c0b6b9d5146c528ad4a36130181812c
parent167dce89123a60a9a12a002148ba8c2ffd45d3da (diff)
Change cancel while waiting-for-lock stuff.
-rw-r--r--src/backend/storage/lmgr/lock.c3
-rw-r--r--src/backend/storage/lmgr/proc.c33
-rw-r--r--src/backend/tcop/postgres.c18
-rw-r--r--src/include/miscadmin.h4
-rw-r--r--src/include/storage/proc.h3
5 files changed, 37 insertions, 24 deletions
diff --git a/src/backend/storage/lmgr/lock.c b/src/backend/storage/lmgr/lock.c
index 63896a95006..bc9a6afc9a5 100644
--- a/src/backend/storage/lmgr/lock.c
+++ b/src/backend/storage/lmgr/lock.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/lock.c,v 1.65 2000/01/26 05:57:01 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/lock.c,v 1.66 2000/02/22 09:55:20 inoue Exp $
*
* NOTES
* Outside modules can create a lock table and acquire/release
@@ -1743,6 +1743,7 @@ DeadLockCheck(void *proc, LOCK *findlock)
MyProc->xid,
NULL) == STATUS_OK)
{
+ SetWaitingForLock(false);
GrantLock(MyProc->waitLock, MyProc->token);
(MyProc->waitLock->waitProcs.size)--;
ProcWakeup(MyProc, NO_ERROR);
diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c
index dafab7ebfd3..4e377d6498c 100644
--- a/src/backend/storage/lmgr/proc.c
+++ b/src/backend/storage/lmgr/proc.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.68 2000/02/21 02:42:36 inoue Exp $
+ * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.69 2000/02/22 09:55:20 inoue Exp $
*
*-------------------------------------------------------------------------
*/
@@ -47,7 +47,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.68 2000/02/21 02:42:36 inoue Exp $
+ * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.69 2000/02/22 09:55:20 inoue Exp $
*/
#include <sys/time.h>
#include <unistd.h>
@@ -74,6 +74,7 @@
void HandleDeadLock(SIGNAL_ARGS);
static void ProcFreeAllSemaphores(void);
+static bool GetOffWaitqueue(PROC *);
#define DeadlockCheckTimer pg_options[OPT_DEADLOCKTIMEOUT]
@@ -316,9 +317,10 @@ InitProcess(IPCKey key)
* get off the wait queue
* -----------------------
*/
-static void
+static bool
GetOffWaitqueue(PROC *proc)
{
+ bool getoffed = false;
LockLockTable();
if (proc->links.next != INVALID_OFFSET)
{
@@ -334,11 +336,12 @@ GetOffWaitqueue(PROC *proc)
if (proc->waitLock->activeHolders[lockmode] ==
proc->waitLock->holders[lockmode])
proc->waitLock->waitMask &= ~(1 << lockmode);
+ getoffed = true;
}
SHMQueueElemInit(&(proc->links));
UnlockLockTable();
- return;
+ return getoffed;
}
/*
* ProcReleaseLocks() -- release all locks associated with this process
@@ -478,6 +481,23 @@ ProcQueueInit(PROC_QUEUE *queue)
}
+static bool lockWaiting = false;
+void SetWaitingForLock(bool waiting)
+{
+ lockWaiting = waiting;
+}
+void LockWaitCancel(void)
+{
+ struct itimerval timeval, dummy;
+
+ if (!lockWaiting) return;
+ lockWaiting = false;
+ /* Deadlock timer off */
+ MemSet(&timeval, 0, sizeof(struct itimerval));
+ setitimer(ITIMER_REAL, &timeval, &dummy);
+ if (GetOffWaitqueue(MyProc))
+ elog(ERROR, "Query cancel requested while waiting lock");
+}
/*
* ProcSleep -- put a process to sleep
@@ -590,7 +610,7 @@ ins:;
timeval.it_value.tv_sec = \
(DeadlockCheckTimer ? DeadlockCheckTimer : DEADLOCK_CHECK_TIMER);
- SetLockWaiting(true);
+ lockWaiting = true;
do
{
MyProc->errType = NO_ERROR; /* reset flag after deadlock check */
@@ -610,7 +630,7 @@ ins:;
IpcExclusiveLock);
} while (MyProc->errType == STATUS_NOT_FOUND); /* sleep after deadlock
* check */
- SetLockWaiting(false);
+ lockWaiting = false;
/* ---------------
* We were awoken before a timeout - now disable the timer
@@ -824,6 +844,7 @@ HandleDeadLock(SIGNAL_ARGS)
* ------------------------
*/
Assert(mywaitlock->waitProcs.size > 0);
+ lockWaiting = false;
--mywaitlock->waitProcs.size;
SHMQueueDelete(&(MyProc->links));
SHMQueueElemInit(&(MyProc->links));
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 71087295313..0ad38686070 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.145 2000/02/21 02:42:35 inoue Exp $
+ * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.146 2000/02/22 09:55:18 inoue Exp $
*
* NOTES
* this is the "main" module of the postgres backend and
@@ -809,22 +809,12 @@ FloatExceptionHandler(SIGNAL_ARGS)
" or was a divide by zero");
}
-
-static bool lockWaiting = false;
-void SetLockWaiting(bool waiting)
-{
- lockWaiting = waiting;
-}
/* signal handler for query cancel signal from postmaster */
static void
QueryCancelHandler(SIGNAL_ARGS)
{
QueryCancel = true;
- if (lockWaiting)
- {
- lockWaiting = false;
- elog(ERROR, "Query Cancel requested while waiting lock");
- }
+ LockWaitCancel();
}
void
@@ -1513,7 +1503,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
if (!IsUnderPostmaster)
{
puts("\nPOSTGRES backend interactive interface ");
- puts("$Revision: 1.145 $ $Date: 2000/02/21 02:42:35 $\n");
+ puts("$Revision: 1.146 $ $Date: 2000/02/22 09:55:18 $\n");
}
/*
@@ -1573,6 +1563,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
* ----------------
*/
QueryCancel = false; /* forget any earlier CANCEL signal */
+ SetWaitingForLock(false);
EnableNotifyInterrupt();
@@ -1583,7 +1574,6 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
firstchar = ReadCommand(parser_input);
QueryCancel = false; /* forget any earlier CANCEL signal */
- lockWaiting = false;
/* ----------------
* (4) disable async.c's signal handler.
diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h
index c80e7608333..4b9e0034545 100644
--- a/src/include/miscadmin.h
+++ b/src/include/miscadmin.h
@@ -12,7 +12,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: miscadmin.h,v 1.52 2000/02/21 02:42:37 inoue Exp $
+ * $Id: miscadmin.h,v 1.53 2000/02/22 09:55:20 inoue Exp $
*
* NOTES
* some of the information in this file will be moved to
@@ -214,7 +214,7 @@ extern ProcessingMode Mode;
extern void IgnoreSystemIndexes(bool mode);
extern bool IsIgnoringSystemIndexes(void);
extern bool IsCacheInitialized(void);
-extern void SetLockWaiting(bool);
+extern void SetWaitingForLock(bool);
/*
* "postmaster.pid" is a file containing postmaster's pid, being
diff --git a/src/include/storage/proc.h b/src/include/storage/proc.h
index 59098912d67..23e657c7918 100644
--- a/src/include/storage/proc.h
+++ b/src/include/storage/proc.h
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: proc.h,v 1.28 2000/01/26 05:58:33 momjian Exp $
+ * $Id: proc.h,v 1.29 2000/02/22 09:55:26 inoue Exp $
*
*-------------------------------------------------------------------------
*/
@@ -130,5 +130,6 @@ extern int ProcLockWakeup(PROC_QUEUE *queue, LOCKMETHOD lockmethod,
LOCK *lock);
extern void ProcAddLock(SHM_QUEUE *elem);
extern void ProcReleaseSpins(PROC *proc);
+extern void LockWaitCancel(void);
#endif /* PROC_H */