mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Fix instance of elog() called while holding a spinlock
This broke the project rule to not call any complex code while a
spinlock is held.  Issue introduced by b89e151.
Discussion: https://postgr.es/m/20200602.161518.1399689010416646074.horikyota.ntt@gmail.com
Backpatch-through: 9.5
			
			
This commit is contained in:
		@@ -974,6 +974,7 @@ LogicalIncreaseRestartDecodingForSlot(XLogRecPtr current_lsn, XLogRecPtr restart
 | 
				
			|||||||
	{
 | 
						{
 | 
				
			||||||
		slot->candidate_restart_valid = current_lsn;
 | 
							slot->candidate_restart_valid = current_lsn;
 | 
				
			||||||
		slot->candidate_restart_lsn = restart_lsn;
 | 
							slot->candidate_restart_lsn = restart_lsn;
 | 
				
			||||||
 | 
							SpinLockRelease(&slot->mutex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		elog(DEBUG1, "got new restart lsn %X/%X at %X/%X",
 | 
							elog(DEBUG1, "got new restart lsn %X/%X at %X/%X",
 | 
				
			||||||
			 (uint32) (restart_lsn >> 32), (uint32) restart_lsn,
 | 
								 (uint32) (restart_lsn >> 32), (uint32) restart_lsn,
 | 
				
			||||||
@@ -981,18 +982,25 @@ LogicalIncreaseRestartDecodingForSlot(XLogRecPtr current_lsn, XLogRecPtr restart
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
							XLogRecPtr	candidate_restart_lsn;
 | 
				
			||||||
 | 
							XLogRecPtr	candidate_restart_valid;
 | 
				
			||||||
 | 
							XLogRecPtr	confirmed_flush;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							candidate_restart_lsn = slot->candidate_restart_lsn;
 | 
				
			||||||
 | 
							candidate_restart_valid = slot->candidate_restart_valid;
 | 
				
			||||||
 | 
							confirmed_flush = slot->data.confirmed_flush;
 | 
				
			||||||
 | 
							SpinLockRelease(&slot->mutex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		elog(DEBUG1, "failed to increase restart lsn: proposed %X/%X, after %X/%X, current candidate %X/%X, current after %X/%X, flushed up to %X/%X",
 | 
							elog(DEBUG1, "failed to increase restart lsn: proposed %X/%X, after %X/%X, current candidate %X/%X, current after %X/%X, flushed up to %X/%X",
 | 
				
			||||||
			 (uint32) (restart_lsn >> 32), (uint32) restart_lsn,
 | 
								 (uint32) (restart_lsn >> 32), (uint32) restart_lsn,
 | 
				
			||||||
			 (uint32) (current_lsn >> 32), (uint32) current_lsn,
 | 
								 (uint32) (current_lsn >> 32), (uint32) current_lsn,
 | 
				
			||||||
			 (uint32) (slot->candidate_restart_lsn >> 32),
 | 
								 (uint32) (candidate_restart_lsn >> 32),
 | 
				
			||||||
			 (uint32) slot->candidate_restart_lsn,
 | 
								 (uint32) candidate_restart_lsn,
 | 
				
			||||||
			 (uint32) (slot->candidate_restart_valid >> 32),
 | 
								 (uint32) (candidate_restart_valid >> 32),
 | 
				
			||||||
			 (uint32) slot->candidate_restart_valid,
 | 
								 (uint32) candidate_restart_valid,
 | 
				
			||||||
			 (uint32) (slot->data.confirmed_flush >> 32),
 | 
								 (uint32) (confirmed_flush >> 32),
 | 
				
			||||||
			 (uint32) slot->data.confirmed_flush
 | 
								 (uint32) confirmed_flush);
 | 
				
			||||||
			);
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	SpinLockRelease(&slot->mutex);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* candidates are already valid with the current flush position, apply */
 | 
						/* candidates are already valid with the current flush position, apply */
 | 
				
			||||||
	if (updated_lsn)
 | 
						if (updated_lsn)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user