Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commita60c9e3

Browse files
author
Hiroshi Inoue
committed
fix the TODO
* Allow PQrequestCancel() to terminate when in waiting-for-lock stateChanges are limited to BACKEND,however.
1 parent320d3e0 commita60c9e3

File tree

3 files changed

+49
-14
lines changed

3 files changed

+49
-14
lines changed

‎src/backend/storage/lmgr/proc.c

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.67 2000/01/26 05:57:02 momjian Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.68 2000/02/21 02:42:36 inoue Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -47,7 +47,7 @@
4747
*This is so that we can support more backends. (system-wide semaphore
4848
*sets run out pretty fast.) -ay 4/95
4949
*
50-
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.67 2000/01/26 05:57:02 momjian Exp $
50+
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.68 2000/02/21 02:42:36 inoue Exp $
5151
*/
5252
#include<sys/time.h>
5353
#include<unistd.h>
@@ -312,6 +312,34 @@ InitProcess(IPCKey key)
312312
on_shmem_exit(ProcKill, (caddr_t)MyProcPid);
313313
}
314314

315+
/* -----------------------
316+
* get off the wait queue
317+
* -----------------------
318+
*/
319+
staticvoid
320+
GetOffWaitqueue(PROC*proc)
321+
{
322+
LockLockTable();
323+
if (proc->links.next!=INVALID_OFFSET)
324+
{
325+
intlockmode=proc->token;
326+
Assert(proc->waitLock->waitProcs.size>0);
327+
SHMQueueDelete(&(proc->links));
328+
--proc->waitLock->waitProcs.size;
329+
Assert(proc->waitLock->nHolding>0);
330+
Assert(proc->waitLock->nHolding>proc->waitLock->nActive);
331+
--proc->waitLock->nHolding;
332+
Assert(proc->waitLock->holders[lockmode]>0);
333+
--proc->waitLock->holders[lockmode];
334+
if (proc->waitLock->activeHolders[lockmode]==
335+
proc->waitLock->holders[lockmode])
336+
proc->waitLock->waitMask &= ~(1 <<lockmode);
337+
}
338+
SHMQueueElemInit(&(proc->links));
339+
UnlockLockTable();
340+
341+
return;
342+
}
315343
/*
316344
* ProcReleaseLocks() -- release all locks associated with this process
317345
*
@@ -322,6 +350,7 @@ ProcReleaseLocks()
322350
if (!MyProc)
323351
return;
324352
LockReleaseAll(1,&MyProc->lockQueue);
353+
GetOffWaitqueue(MyProc);
325354
}
326355

327356
/*
@@ -405,15 +434,7 @@ ProcKill(int exitStatus, int pid)
405434
* get off the wait queue
406435
* ----------------
407436
*/
408-
LockLockTable();
409-
if (proc->links.next!=INVALID_OFFSET)
410-
{
411-
Assert(proc->waitLock->waitProcs.size>0);
412-
SHMQueueDelete(&(proc->links));
413-
--proc->waitLock->waitProcs.size;
414-
}
415-
SHMQueueElemInit(&(proc->links));
416-
UnlockLockTable();
437+
GetOffWaitqueue(proc);
417438

418439
return;
419440
}
@@ -569,6 +590,7 @@ ins:;
569590
timeval.it_value.tv_sec= \
570591
(DeadlockCheckTimer ?DeadlockCheckTimer :DEADLOCK_CHECK_TIMER);
571592

593+
SetLockWaiting(true);
572594
do
573595
{
574596
MyProc->errType=NO_ERROR;/* reset flag after deadlock check */
@@ -588,6 +610,7 @@ ins:;
588610
IpcExclusiveLock);
589611
}while (MyProc->errType==STATUS_NOT_FOUND);/* sleep after deadlock
590612
* check */
613+
SetLockWaiting(false);
591614

592615
/* ---------------
593616
* We were awoken before a timeout - now disable the timer

‎src/backend/tcop/postgres.c

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.144 2000/02/20 04:26:35tgl Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.145 2000/02/21 02:42:35inoue Exp $
1212
*
1313
* NOTES
1414
* this is the "main" module of the postgres backend and
@@ -810,11 +810,21 @@ FloatExceptionHandler(SIGNAL_ARGS)
810810
}
811811

812812

813+
staticboollockWaiting= false;
814+
voidSetLockWaiting(boolwaiting)
815+
{
816+
lockWaiting=waiting;
817+
}
813818
/* signal handler for query cancel signal from postmaster */
814819
staticvoid
815820
QueryCancelHandler(SIGNAL_ARGS)
816821
{
817822
QueryCancel= true;
823+
if (lockWaiting)
824+
{
825+
lockWaiting= false;
826+
elog(ERROR,"Query Cancel requested while waiting lock");
827+
}
818828
}
819829

820830
void
@@ -1503,7 +1513,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
15031513
if (!IsUnderPostmaster)
15041514
{
15051515
puts("\nPOSTGRES backend interactive interface ");
1506-
puts("$Revision: 1.144 $ $Date: 2000/02/20 04:26:35 $\n");
1516+
puts("$Revision: 1.145 $ $Date: 2000/02/21 02:42:35 $\n");
15071517
}
15081518

15091519
/*
@@ -1573,6 +1583,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
15731583
firstchar=ReadCommand(parser_input);
15741584

15751585
QueryCancel= false;/* forget any earlier CANCEL signal */
1586+
lockWaiting= false;
15761587

15771588
/* ----------------
15781589
* (4) disable async.c's signal handler.

‎src/include/miscadmin.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
1313
* Portions Copyright (c) 1994, Regents of the University of California
1414
*
15-
* $Id: miscadmin.h,v 1.51 2000/02/18 09:29:06 inoue Exp $
15+
* $Id: miscadmin.h,v 1.52 2000/02/21 02:42:37 inoue Exp $
1616
*
1717
* NOTES
1818
* some of the information in this file will be moved to
@@ -214,6 +214,7 @@ extern ProcessingMode Mode;
214214
externvoidIgnoreSystemIndexes(boolmode);
215215
externboolIsIgnoringSystemIndexes(void);
216216
externboolIsCacheInitialized(void);
217+
externvoidSetLockWaiting(bool);
217218

218219
/*
219220
* "postmaster.pid" is a file containing postmaster's pid, being

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp