mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Emit invalidations to standby for transactions without xid.
So far, when a transaction with pending invalidations, but without an
assigned xid, committed, we simply ignored those invalidation
messages. That's problematic, because those are actually sent for a
reason.
Known symptoms of this include that existing sessions on a hot-standby
replica sometimes fail to notice new concurrently built indexes and
visibility map updates.
The solution is to WAL log such invalidations in transactions without an
xid. We considered to alternatively force-assign an xid, but that'd be
problematic for vacuum, which might be run in systems with few xids.
Important: This adds a new WAL record, but as the patch has to be
back-patched, we can't bump the WAL page magic. This means that standbys
have to be updated before primaries; otherwise
"PANIC: standby_redo: unknown op code 32" errors can be encountered.
XXX:
Reported-By: Васильев Дмитрий, Masahiko Sawada
Discussion:
    CAB-SwXY6oH=9twBkXJtgR4UC1NqT-vpYAtxCseME62ADwyK5OA@mail.gmail.com
    CAD21AoDpZ6Xjg=gFrGPnSn4oTRRcwK1EBrWCq9OqOHuAcMMC=w@mail.gmail.com
			
			
This commit is contained in:
		
							
								
								
									
										5
									
								
								src/backend/utils/cache/inval.c
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								src/backend/utils/cache/inval.c
									
									
									
									
										vendored
									
									
								
							@@ -842,8 +842,9 @@ xactGetCommittedInvalidationMessages(SharedInvalidationMessage **msgs,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * ProcessCommittedInvalidationMessages is executed by xact_redo_commit()
 | 
			
		||||
 * to process invalidation messages added to commit records.
 | 
			
		||||
 * ProcessCommittedInvalidationMessages is executed by xact_redo_commit() or
 | 
			
		||||
 * standby_redo() to process invalidation messages. Currently that happens
 | 
			
		||||
 * only at end-of-xact.
 | 
			
		||||
 *
 | 
			
		||||
 * Relcache init file invalidation requires processing both
 | 
			
		||||
 * before and after we send the SI messages. See AtEOXact_Inval()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user