mirror of
https://github.com/postgres/postgres.git
synced 2025-06-02 00:01:40 -04: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:
parent
7d62e9c719
commit
52f1b2f3b6
7
HISTORY
7
HISTORY
@ -1,3 +1,10 @@
|
|||||||
|
PostgreSQL 6.5 Fri Apr 23 17:40:19 EDT 1999
|
||||||
|
=========================================================
|
||||||
|
|
||||||
|
A dump/restore is required.
|
||||||
|
|
||||||
|
PLACE HOLDER
|
||||||
|
|
||||||
PostgreSQL 6.4.2 Sat Jan 2 11:04:05 EST 1999
|
PostgreSQL 6.4.2 Sat Jan 2 11:04:05 EST 1999
|
||||||
=========================================================
|
=========================================================
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
<Abstract>
|
<Abstract>
|
||||||
<Para>
|
<Para>
|
||||||
Complete installation instructions for
|
Complete installation instructions for
|
||||||
<ProductName>Postgres</ProductName> v6.4.
|
<ProductName>Postgres</ProductName> v6.5.
|
||||||
</Para>
|
</Para>
|
||||||
</Abstract>
|
</Abstract>
|
||||||
|
|
||||||
@ -167,8 +167,8 @@ remaining steps in the installation will happen in this account.
|
|||||||
<Step Performance="required">
|
<Step Performance="required">
|
||||||
<Para>
|
<Para>
|
||||||
Ftp file
|
Ftp file
|
||||||
<ulink url="ftp://ftp.postgresql.org/pub/postgresql-v6.4.tar.gz">
|
<ulink url="ftp://ftp.postgresql.org/pub/postgresql-v6.5.tar.gz">
|
||||||
<filename>ftp://ftp.postgresql.org/pub/postgresql-v6.4.tar.gz</filename></ulink>
|
<filename>ftp://ftp.postgresql.org/pub/postgresql-v6.5.tar.gz</filename></ulink>
|
||||||
from the Internet. Store it in your home directory.
|
from the Internet. Store it in your home directory.
|
||||||
</Para>
|
</Para>
|
||||||
</Step>
|
</Step>
|
||||||
@ -268,7 +268,7 @@ from the new distribution:
|
|||||||
|
|
||||||
<ProgramListing>
|
<ProgramListing>
|
||||||
$ cd
|
$ cd
|
||||||
$ gunzip -c postgresql-v6.4.tar.gz \
|
$ gunzip -c postgresql-v6.5.tar.gz \
|
||||||
| tar xvf - src/bin/pg_dump/pg_dumpall
|
| tar xvf - src/bin/pg_dump/pg_dumpall
|
||||||
$ chmod a+x src/bin/pg_dump/pg_dumpall
|
$ chmod a+x src/bin/pg_dump/pg_dumpall
|
||||||
$ src/bin/pg_dump/pg_dumpall -z > db.out
|
$ src/bin/pg_dump/pg_dumpall -z > db.out
|
||||||
@ -411,7 +411,7 @@ $ exit
|
|||||||
Unzip and untar the new source file. Type
|
Unzip and untar the new source file. Type
|
||||||
<ProgramListing>
|
<ProgramListing>
|
||||||
$ cd /usr/src/pgsql
|
$ cd /usr/src/pgsql
|
||||||
$ gunzip -c ~/postgresql-v6.4.tar.gz | tar xvf -
|
$ gunzip -c ~/postgresql-v6.5.tar.gz | tar xvf -
|
||||||
</ProgramListing>
|
</ProgramListing>
|
||||||
</Para>
|
</Para>
|
||||||
</Step>
|
</Step>
|
||||||
@ -989,17 +989,7 @@ For example,
|
|||||||
<listitem>
|
<listitem>
|
||||||
<Para>
|
<Para>
|
||||||
For a i686/Linux-ELF platform, no tests failed since this is the
|
For a i686/Linux-ELF platform, no tests failed since this is the
|
||||||
v6.4 regression testing reference platform.
|
v6.5 regression testing reference platform.
|
||||||
</Para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<Para>
|
|
||||||
For the SPARC/Linux-ELF platform, using the 970525 beta version of
|
|
||||||
<ProductName>Postgres</ProductName> v6.2 the following tests "failed":
|
|
||||||
float8 and geometry "failed" due to minor precision differences in
|
|
||||||
floating point numbers. select_views produces massively different output,
|
|
||||||
but the differences are due to minor floating point differences.
|
|
||||||
</Para>
|
</Para>
|
||||||
</listitem>
|
</listitem>
|
||||||
|
|
||||||
@ -1109,11 +1099,11 @@ VACUUM;
|
|||||||
<Para>
|
<Para>
|
||||||
Clean up after yourself. Type
|
Clean up after yourself. Type
|
||||||
<ProgramListing>
|
<ProgramListing>
|
||||||
$ rm -rf /usr/src/pgsql_6_0
|
$ rm -rf /usr/src/pgsql_6_5
|
||||||
$ rm -rf /usr/local/pgsql_6_0
|
$ rm -rf /usr/local/pgsql_6_5
|
||||||
# Also delete old database directory tree if it is not in
|
# Also delete old database directory tree if it is not in
|
||||||
# /usr/local/pgsql_6_0/data
|
# /usr/local/pgsql_6_5/data
|
||||||
$ rm ~/postgresql-v6.2.1.tar.gz
|
$ rm ~/postgresql-v6.5.tar.gz
|
||||||
</ProgramListing>
|
</ProgramListing>
|
||||||
</Para>
|
</Para>
|
||||||
</Step>
|
</Step>
|
||||||
@ -1160,7 +1150,7 @@ $ lpr -l -s -r manpage.hp
|
|||||||
<itemizedlist>
|
<itemizedlist>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>
|
<para>
|
||||||
The version of <ProductName>Postgres</ProductName> (v6.4, 6.3.2, beta 981014, etc.).
|
The version of <ProductName>Postgres</ProductName> (v6.5, 6.4.2, beta 981014, etc.).
|
||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
# Copyright (c) 1998, Regents of the University of California
|
# Copyright (c) 1998, Regents of the University of California
|
||||||
#
|
#
|
||||||
# IDENTIFICATION
|
# 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 $
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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
|
* NOTES
|
||||||
* Outside modules can create a lock table and acquire/release
|
* 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,
|
* If someone with a greater priority is waiting for the lock,
|
||||||
* do not continue and share the lock, even if we can. bjm
|
* 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];
|
int myprio = LockMethodTable[lockmethod]->ctl->prio[lockmode];
|
||||||
PROC_QUEUE *waitQueue = &(lock->waitProcs);
|
PROC_QUEUE *waitQueue = &(lock->waitProcs);
|
||||||
PROC *topproc = (PROC *) MAKE_PTR(waitQueue->links.prev);
|
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",
|
XID_PRINT("LockResolveConflicts: higher priority proc waiting",
|
||||||
result);
|
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
|
* 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
|
* 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)
|
if (lock == findlock && !skip_check)
|
||||||
return true;
|
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
|
* Basically, the test is, "Do we both hold some lock on
|
||||||
* findlock, and we are both waiting in the lock
|
* findlock, and we are both waiting in the lock
|
||||||
* queue?"
|
* queue?" bjm
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Assert(skip_check);
|
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
|
* hold locks and are waiting. Now we check for
|
||||||
* cases where we have two or more tables in a
|
* cases where we have two or more tables in a
|
||||||
* deadlock. We do this by continuing to search
|
* 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))
|
if (DeadLockCheck(&(proc->lockQueue), findlock, false))
|
||||||
return true;
|
return true;
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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
|
* This is so that we can support more backends. (system-wide semaphore
|
||||||
* sets run out pretty fast.) -ay 4/95
|
* 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 <sys/time.h>
|
||||||
#include <unistd.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
|
* 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
|
* gets the lock, then a bunch of readers, made up of readers who
|
||||||
* could not share the first readlock because a writer was waiting,
|
* 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);
|
proc = (PROC *) MAKE_PTR(waitQueue->links.prev);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user