mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-04 00:02:52 -05:00 
			
		
		
		
	Remove belt-and-suspenders guards against buffer pin leaks.
Forcibly releasing all leftover buffer pins should be unnecessary now that we have a robust ResourceOwner mechanism, and it significantly increases the cost of process shutdown. Instead, in an assert-enabled build, assert that no pins are held; in a non-assert-enabled build, do nothing.
This commit is contained in:
		
							parent
							
								
									58dfb07b5d
								
							
						
					
					
						commit
						c2281ac87c
					
				@ -1659,31 +1659,26 @@ InitBufferPoolBackend(void)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Ensure we have released all shared-buffer locks and pins during backend exit
 | 
			
		||||
 * During backend exit, ensure that we released all shared-buffer locks and
 | 
			
		||||
 * assert that we have no remaining pins.
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
AtProcExit_Buffers(int code, Datum arg)
 | 
			
		||||
{
 | 
			
		||||
	int			i;
 | 
			
		||||
 | 
			
		||||
	AbortBufferIO();
 | 
			
		||||
	UnlockBuffers();
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < NBuffers; i++)
 | 
			
		||||
#ifdef USE_ASSERT_CHECKING
 | 
			
		||||
	if (assert_enabled)
 | 
			
		||||
	{
 | 
			
		||||
		if (PrivateRefCount[i] != 0)
 | 
			
		||||
		{
 | 
			
		||||
			volatile BufferDesc *buf = &(BufferDescriptors[i]);
 | 
			
		||||
		int			i;
 | 
			
		||||
 | 
			
		||||
			/*
 | 
			
		||||
			 * We don't worry about updating ResourceOwner; if we even got
 | 
			
		||||
			 * here, it suggests that ResourceOwners are messed up.
 | 
			
		||||
			 */
 | 
			
		||||
			PrivateRefCount[i] = 1;		/* make sure we release shared pin */
 | 
			
		||||
			UnpinBuffer(buf, false);
 | 
			
		||||
		for (i = 0; i < NBuffers; i++)
 | 
			
		||||
		{
 | 
			
		||||
			Assert(PrivateRefCount[i] == 0);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	/* localbuf.c needs a chance too */
 | 
			
		||||
	AtProcExit_LocalBuffers();
 | 
			
		||||
 | 
			
		||||
@ -468,14 +468,23 @@ AtEOXact_LocalBuffers(bool isCommit)
 | 
			
		||||
/*
 | 
			
		||||
 * AtProcExit_LocalBuffers - ensure we have dropped pins during backend exit.
 | 
			
		||||
 *
 | 
			
		||||
 * This is just like AtProcExit_Buffers, but for local buffers.  We have
 | 
			
		||||
 * to drop pins to ensure that any attempt to drop temp files doesn't
 | 
			
		||||
 * fail in DropRelFileNodeBuffers.
 | 
			
		||||
 * This is just like AtProcExit_Buffers, but for local buffers.  We shouldn't
 | 
			
		||||
 * be holding any remaining pins; if we are, and assertions aren't enabled,
 | 
			
		||||
 * we'll fail later in DropRelFileNodeBuffers while trying to drop the temp
 | 
			
		||||
 * rels.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
AtProcExit_LocalBuffers(void)
 | 
			
		||||
{
 | 
			
		||||
	/* just zero the refcounts ... */
 | 
			
		||||
	if (LocalRefCount)
 | 
			
		||||
		MemSet(LocalRefCount, 0, NLocBuffer * sizeof(*LocalRefCount));
 | 
			
		||||
#ifdef USE_ASSERT_CHECKING
 | 
			
		||||
	if (assert_enabled && LocalRefCount)
 | 
			
		||||
	{
 | 
			
		||||
		int			i;
 | 
			
		||||
 | 
			
		||||
		for (i = 0; i < NLocBuffer; i++)
 | 
			
		||||
		{
 | 
			
		||||
			Assert(LocalRefCount[i] == 0);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user