mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Fix leak with SMgrRelations in startup process
The startup process does not process shared invalidation messages, only
sending them, and never calls AtEOXact_SMgr() which clean up any
unpinned SMgrRelations.  Hence, it is never able to free SMgrRelations
on a periodic basis, bloating its hashtable over time.
Like the checkpointer and the bgwriter, this commit takes a conservative
approach by freeing periodically SMgrRelations when replaying a
checkpoint record, either online or shutdown, so as the startup process
has a way to perform a periodic cleanup.
Issue caused by 21d9c3ee4e, so backpatch down to v17.
Author: Jingtang Zhang <mrdrivingduck@gmail.com>
Reviewed-by: Yuhang Qiu <iamqyh@gmail.com>
Discussion: https://postgr.es/m/28C687D4-F335-417E-B06C-6612A0BD5A10@gmail.com
Backpatch-through: 17
			
			
This commit is contained in:
		@@ -8374,6 +8374,14 @@ xlog_redo(XLogReaderState *record)
 | 
			
		||||
							checkPoint.ThisTimeLineID, replayTLI)));
 | 
			
		||||
 | 
			
		||||
		RecoveryRestartPoint(&checkPoint, record);
 | 
			
		||||
 | 
			
		||||
		/*
 | 
			
		||||
		 * After replaying a checkpoint record, free all smgr objects.
 | 
			
		||||
		 * Otherwise we would never do so for dropped relations, as the
 | 
			
		||||
		 * startup does not process shared invalidation messages or call
 | 
			
		||||
		 * AtEOXact_SMgr().
 | 
			
		||||
		 */
 | 
			
		||||
		smgrdestroyall();
 | 
			
		||||
	}
 | 
			
		||||
	else if (info == XLOG_CHECKPOINT_ONLINE)
 | 
			
		||||
	{
 | 
			
		||||
@@ -8432,6 +8440,14 @@ xlog_redo(XLogReaderState *record)
 | 
			
		||||
							checkPoint.ThisTimeLineID, replayTLI)));
 | 
			
		||||
 | 
			
		||||
		RecoveryRestartPoint(&checkPoint, record);
 | 
			
		||||
 | 
			
		||||
		/*
 | 
			
		||||
		 * After replaying a checkpoint record, free all smgr objects.
 | 
			
		||||
		 * Otherwise we would never do so for dropped relations, as the
 | 
			
		||||
		 * startup does not process shared invalidation messages or call
 | 
			
		||||
		 * AtEOXact_SMgr().
 | 
			
		||||
		 */
 | 
			
		||||
		smgrdestroyall();
 | 
			
		||||
	}
 | 
			
		||||
	else if (info == XLOG_OVERWRITE_CONTRECORD)
 | 
			
		||||
	{
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user