mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-31 00:03:57 -04:00 
			
		
		
		
	Fix pg_buffercache to release buffer partition locks in reverse order,
and add a note about why. This is not tremendously important right now, probably, but it will get more urgent if NUM_BUFFER_PARTITIONS is increased as much as proposed.
This commit is contained in:
		
							parent
							
								
									82b3684672
								
							
						
					
					
						commit
						2a275e6d3c
					
				| @ -3,7 +3,7 @@ | |||||||
|  * pg_buffercache_pages.c |  * pg_buffercache_pages.c | ||||||
|  *	  display some contents of the buffer cache |  *	  display some contents of the buffer cache | ||||||
|  * |  * | ||||||
|  *	  $PostgreSQL: pgsql/contrib/pg_buffercache/pg_buffercache_pages.c,v 1.12 2007/04/07 16:09:14 momjian Exp $ |  *	  $PostgreSQL: pgsql/contrib/pg_buffercache/pg_buffercache_pages.c,v 1.13 2007/07/16 21:20:36 tgl Exp $ | ||||||
|  *------------------------------------------------------------------------- |  *------------------------------------------------------------------------- | ||||||
|  */ |  */ | ||||||
| #include "postgres.h" | #include "postgres.h" | ||||||
| @ -110,7 +110,8 @@ pg_buffercache_pages(PG_FUNCTION_ARGS) | |||||||
| 		/*
 | 		/*
 | ||||||
| 		 * To get a consistent picture of the buffer state, we must lock all | 		 * To get a consistent picture of the buffer state, we must lock all | ||||||
| 		 * partitions of the buffer map.  Needless to say, this is horrible | 		 * partitions of the buffer map.  Needless to say, this is horrible | ||||||
| 		 * for concurrency... | 		 * for concurrency.  Must grab locks in increasing order to avoid | ||||||
|  | 		 * possible deadlocks. | ||||||
| 		 */ | 		 */ | ||||||
| 		for (i = 0; i < NUM_BUFFER_PARTITIONS; i++) | 		for (i = 0; i < NUM_BUFFER_PARTITIONS; i++) | ||||||
| 			LWLockAcquire(FirstBufMappingLock + i, LW_SHARED); | 			LWLockAcquire(FirstBufMappingLock + i, LW_SHARED); | ||||||
| @ -145,8 +146,14 @@ pg_buffercache_pages(PG_FUNCTION_ARGS) | |||||||
| 			UnlockBufHdr(bufHdr); | 			UnlockBufHdr(bufHdr); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		/* Release Buffer map. */ | 		/*
 | ||||||
| 		for (i = 0; i < NUM_BUFFER_PARTITIONS; i++) | 		 * And release locks.  We do this in reverse order for two reasons: | ||||||
|  | 		 * (1) Anyone else who needs more than one of the locks will be trying | ||||||
|  | 		 * to lock them in increasing order; we don't want to release the other | ||||||
|  | 		 * process until it can get all the locks it needs. | ||||||
|  | 		 * (2) This avoids O(N^2) behavior inside LWLockRelease. | ||||||
|  | 		 */ | ||||||
|  | 		for (i = NUM_BUFFER_PARTITIONS; --i >= 0;) | ||||||
| 			LWLockRelease(FirstBufMappingLock + i); | 			LWLockRelease(FirstBufMappingLock + i); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user