mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-31 00:03:57 -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 | ||||
| ========================================================= | ||||
| 
 | ||||
|  | ||||
| @ -4,7 +4,7 @@ | ||||
| <Abstract> | ||||
| <Para> | ||||
| Complete installation instructions for  | ||||
| <ProductName>Postgres</ProductName> v6.4. | ||||
| <ProductName>Postgres</ProductName> v6.5. | ||||
| </Para> | ||||
| </Abstract> | ||||
| 
 | ||||
| @ -167,8 +167,8 @@ remaining steps in the installation will happen in this account. | ||||
| <Step Performance="required"> | ||||
| <Para> | ||||
| Ftp file  | ||||
| <ulink url="ftp://ftp.postgresql.org/pub/postgresql-v6.4.tar.gz"> | ||||
|  <filename>ftp://ftp.postgresql.org/pub/postgresql-v6.4.tar.gz</filename></ulink> | ||||
| <ulink url="ftp://ftp.postgresql.org/pub/postgresql-v6.5.tar.gz"> | ||||
|  <filename>ftp://ftp.postgresql.org/pub/postgresql-v6.5.tar.gz</filename></ulink> | ||||
|  from the Internet.  Store it in your home directory. | ||||
| </Para> | ||||
| </Step> | ||||
| @ -268,7 +268,7 @@ from the new distribution: | ||||
| 
 | ||||
| <ProgramListing> | ||||
| $ cd | ||||
| $ gunzip -c postgresql-v6.4.tar.gz \ | ||||
| $ gunzip -c postgresql-v6.5.tar.gz \ | ||||
|     | tar xvf - src/bin/pg_dump/pg_dumpall | ||||
| $ chmod a+x src/bin/pg_dump/pg_dumpall | ||||
| $ src/bin/pg_dump/pg_dumpall -z > db.out | ||||
| @ -411,7 +411,7 @@ $ exit | ||||
|  Unzip and untar the new source file.  Type | ||||
| <ProgramListing> | ||||
| $ cd /usr/src/pgsql | ||||
| $ gunzip -c ~/postgresql-v6.4.tar.gz | tar xvf - | ||||
| $ gunzip -c ~/postgresql-v6.5.tar.gz | tar xvf - | ||||
| </ProgramListing> | ||||
| </Para> | ||||
| </Step> | ||||
| @ -989,17 +989,7 @@ For example, | ||||
| <listitem> | ||||
| <Para> | ||||
|      For a i686/Linux-ELF platform, no tests failed since this is the | ||||
|      v6.4 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. | ||||
|      v6.5 regression testing reference platform. | ||||
| </Para> | ||||
| </listitem> | ||||
| 
 | ||||
| @ -1109,11 +1099,11 @@ VACUUM; | ||||
| <Para> | ||||
|  Clean up after yourself.  Type | ||||
| <ProgramListing> | ||||
| $ rm -rf /usr/src/pgsql_6_0 | ||||
| $ rm -rf /usr/local/pgsql_6_0 | ||||
| $ rm -rf /usr/src/pgsql_6_5 | ||||
| $ rm -rf /usr/local/pgsql_6_5 | ||||
| # Also delete old database directory tree if it is not in | ||||
| #  /usr/local/pgsql_6_0/data | ||||
| $ rm ~/postgresql-v6.2.1.tar.gz | ||||
| #  /usr/local/pgsql_6_5/data | ||||
| $ rm ~/postgresql-v6.5.tar.gz | ||||
| </ProgramListing> | ||||
| </Para> | ||||
| </Step> | ||||
| @ -1160,7 +1150,7 @@ $ lpr -l -s -r manpage.hp | ||||
| <itemizedlist> | ||||
| <listitem> | ||||
| <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> | ||||
| </listitem> | ||||
| 
 | ||||
|  | ||||
| @ -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 $
 | ||||
| #
 | ||||
| #-------------------------------------------------------------------------
 | ||||
| 
 | ||||
|  | ||||
| @ -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); | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user