mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Prevent priority inversion in locking by checking for existing locks
before going into queue behind person with higher piority.
This commit is contained in:
@ -6,7 +6,7 @@
|
||||
# Copyright (c) 1998, Regents of the University of California
|
||||
#
|
||||
# IDENTIFICATION
|
||||
# $Header: /cvsroot/pgsql/src/Makefile.shlib,v 1.7 1999/03/14 16:02:57 momjian Exp $
|
||||
# $Header: /cvsroot/pgsql/src/Makefile.shlib,v 1.8 1999/04/30 02:04:49 momjian Exp $
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
|
||||
@ -86,14 +86,14 @@ ifeq ($(PORTNAME), bsdi)
|
||||
ifdef BSD_SHLIB
|
||||
ifeq ($(DLSUFFIX), .so)
|
||||
install-shlib-dep := install-shlib
|
||||
shlib := lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION).$(SO_MINOR_VERSION)
|
||||
shlib := lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION).$(SO_MINOR_VERSION)
|
||||
LDFLAGS_SL += -shared
|
||||
CFLAGS += $(CFLAGS_SL)
|
||||
endif
|
||||
ifeq ($(DLSUFFIX), .o)
|
||||
install-shlib-dep := install-shlib
|
||||
shlib := lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION).$(SO_MINOR_VERSION)
|
||||
LD := shlicc
|
||||
shlib := lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION).$(SO_MINOR_VERSION)
|
||||
LD := shlicc
|
||||
LDFLAGS_SL += -O -r
|
||||
CFLAGS += $(CFLAGS_SL)
|
||||
endif
|
||||
|
@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/lock.c,v 1.46 1999/03/06 21:17:44 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/lock.c,v 1.47 1999/04/30 02:04:50 momjian Exp $
|
||||
*
|
||||
* NOTES
|
||||
* Outside modules can create a lock table and acquire/release
|
||||
@ -820,13 +820,17 @@ LockResolveConflicts(LOCKMETHOD lockmethod,
|
||||
/* ------------------------
|
||||
* If someone with a greater priority is waiting for the lock,
|
||||
* do not continue and share the lock, even if we can. bjm
|
||||
* Don't do this if the process already has some locks, because
|
||||
* this could hold up other people waiting on our locks, causing
|
||||
* a priority inversion. bjm
|
||||
* ------------------------
|
||||
*/
|
||||
int myprio = LockMethodTable[lockmethod]->ctl->prio[lockmode];
|
||||
PROC_QUEUE *waitQueue = &(lock->waitProcs);
|
||||
PROC *topproc = (PROC *) MAKE_PTR(waitQueue->links.prev);
|
||||
|
||||
if (waitQueue->size && topproc->prio > myprio)
|
||||
if (SHMQueueEmpty(lockQueue) && waitQueue->size &&
|
||||
topproc->prio > myprio)
|
||||
{
|
||||
XID_PRINT("LockResolveConflicts: higher priority proc waiting",
|
||||
result);
|
||||
@ -1595,7 +1599,7 @@ DeadLockCheck(SHM_QUEUE *lockQueue, LOCK *findlock, bool skip_check)
|
||||
*
|
||||
* The lock we are waiting for is already in MyProc->lockQueue so we
|
||||
* need to skip it here. We are trying to find it in someone
|
||||
* else's lockQueue.
|
||||
* else's lockQueue. bjm
|
||||
*/
|
||||
if (lock == findlock && !skip_check)
|
||||
return true;
|
||||
@ -1625,7 +1629,7 @@ DeadLockCheck(SHM_QUEUE *lockQueue, LOCK *findlock, bool skip_check)
|
||||
*
|
||||
* Basically, the test is, "Do we both hold some lock on
|
||||
* findlock, and we are both waiting in the lock
|
||||
* queue?"
|
||||
* queue?" bjm
|
||||
*/
|
||||
|
||||
Assert(skip_check);
|
||||
@ -1672,7 +1676,7 @@ DeadLockCheck(SHM_QUEUE *lockQueue, LOCK *findlock, bool skip_check)
|
||||
* hold locks and are waiting. Now we check for
|
||||
* cases where we have two or more tables in a
|
||||
* deadlock. We do this by continuing to search
|
||||
* for someone holding a lock
|
||||
* for someone holding a lock bjm
|
||||
*/
|
||||
if (DeadLockCheck(&(proc->lockQueue), findlock, false))
|
||||
return true;
|
||||
|
@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.52 1999/03/28 20:32:26 vadim Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.53 1999/04/30 02:04:51 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.52 1999/03/28 20:32:26 vadim Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.53 1999/04/30 02:04:51 momjian Exp $
|
||||
*/
|
||||
#include <sys/time.h>
|
||||
#include <unistd.h>
|
||||
@ -516,8 +516,7 @@ ProcSleep(PROC_QUEUE *waitQueue,/* lock->waitProcs */
|
||||
* In a full queue, we would have a reader holding a lock, then a writer
|
||||
* gets the lock, then a bunch of readers, made up of readers who
|
||||
* could not share the first readlock because a writer was waiting,
|
||||
* and new readers arriving while the writer had the lock.
|
||||
*
|
||||
* and new readers arriving while the writer had the lock. bjm
|
||||
*/
|
||||
proc = (PROC *) MAKE_PTR(waitQueue->links.prev);
|
||||
|
||||
|
Reference in New Issue
Block a user