mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Fix bug in clean shutdown of walsender that pg_receiving is connecting to.
On clean shutdown, walsender waits for all WAL to be replicated to a standby, and exits. It determined whether that replication had been completed by checking whether its sent location had been equal to a standby's flush location. Unfortunately this condition never becomes true when the standby such as pg_receivexlog which always returns an invalid flush location is connecting to walsender, and then walsender waits forever. This commit changes walsender so that it just checks a standby's write location if a flush location is invalid. Back-patch to 9.1 where enough infrastructure for this exists.
This commit is contained in:
		@@ -775,9 +775,20 @@ WalSndLoop(void)
 | 
				
			|||||||
			 */
 | 
								 */
 | 
				
			||||||
			if (walsender_ready_to_stop)
 | 
								if (walsender_ready_to_stop)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
 | 
									XLogRecPtr	replicatedPtr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				/* ... let's just be real sure we're caught up ... */
 | 
									/* ... let's just be real sure we're caught up ... */
 | 
				
			||||||
				XLogSend(output_message, &caughtup);
 | 
									XLogSend(output_message, &caughtup);
 | 
				
			||||||
				if (caughtup && XLByteEQ(sentPtr, MyWalSnd->flush) &&
 | 
					
 | 
				
			||||||
 | 
									/*
 | 
				
			||||||
 | 
									 * Check a write location to see whether all the WAL have
 | 
				
			||||||
 | 
									 * successfully been replicated if this walsender is connecting
 | 
				
			||||||
 | 
									 * to a standby such as pg_receivexlog which always returns
 | 
				
			||||||
 | 
									 * an invalid flush location. Otherwise, check a flush location.
 | 
				
			||||||
 | 
									 */
 | 
				
			||||||
 | 
									replicatedPtr = XLogRecPtrIsInvalid(MyWalSnd->flush) ?
 | 
				
			||||||
 | 
										MyWalSnd->write : MyWalSnd->flush;
 | 
				
			||||||
 | 
									if (caughtup && XLByteEQ(sentPtr, replicatedPtr) &&
 | 
				
			||||||
					!pq_is_send_pending())
 | 
										!pq_is_send_pending())
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					walsender_shutdown_requested = true;
 | 
										walsender_shutdown_requested = true;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user