mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Suppress log spam from multiple reports of SIGQUIT shutdown.
When the postmaster sends SIGQUIT to its children, there's no real
need for all the children to log that fact; the postmaster already
made a log entry about it, so adding perhaps dozens or hundreds of
child-process log entries adds nothing of value.  So, let's introduce
a new ereport level to specify "WARNING, but never send to log" and
use that for these messages.
Such a change wouldn't have been desirable before commit 7e784d1dc,
because if someone manually SIGQUIT's a backend, we *do* want to log
that.  But now we can tell the difference between a signal that was
issued by the postmaster and one that was not with reasonable
certainty.
While we're here, also clear error_context_stack before ereport'ing,
to prevent error callbacks from being invoked in the signal-handler
context.  This should reduce the odds of getting hung up while trying
to notify the client.
Per a suggestion from Andres Freund.
Discussion: https://postgr.es/m/20201225230331.hru3u6obyy6j53tk@alap3.anarazel.de
			
			
This commit is contained in:
		@@ -202,6 +202,11 @@ is_log_level_output(int elevel, int log_min_level)
 | 
			
		||||
		if (log_min_level == LOG || log_min_level <= ERROR)
 | 
			
		||||
			return true;
 | 
			
		||||
	}
 | 
			
		||||
	else if (elevel == WARNING_CLIENT_ONLY)
 | 
			
		||||
	{
 | 
			
		||||
		/* never sent to log, regardless of log_min_level */
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
	else if (log_min_level == LOG)
 | 
			
		||||
	{
 | 
			
		||||
		/* elevel != LOG */
 | 
			
		||||
@@ -453,7 +458,7 @@ errstart(int elevel, const char *domain)
 | 
			
		||||
	/* Select default errcode based on elevel */
 | 
			
		||||
	if (elevel >= ERROR)
 | 
			
		||||
		edata->sqlerrcode = ERRCODE_INTERNAL_ERROR;
 | 
			
		||||
	else if (elevel == WARNING)
 | 
			
		||||
	else if (elevel >= WARNING)
 | 
			
		||||
		edata->sqlerrcode = ERRCODE_WARNING;
 | 
			
		||||
	else
 | 
			
		||||
		edata->sqlerrcode = ERRCODE_SUCCESSFUL_COMPLETION;
 | 
			
		||||
@@ -2152,6 +2157,7 @@ write_eventlog(int level, const char *line, int len)
 | 
			
		||||
			eventlevel = EVENTLOG_INFORMATION_TYPE;
 | 
			
		||||
			break;
 | 
			
		||||
		case WARNING:
 | 
			
		||||
		case WARNING_CLIENT_ONLY:
 | 
			
		||||
			eventlevel = EVENTLOG_WARNING_TYPE;
 | 
			
		||||
			break;
 | 
			
		||||
		case ERROR:
 | 
			
		||||
@@ -3109,6 +3115,7 @@ send_message_to_server_log(ErrorData *edata)
 | 
			
		||||
				break;
 | 
			
		||||
			case NOTICE:
 | 
			
		||||
			case WARNING:
 | 
			
		||||
			case WARNING_CLIENT_ONLY:
 | 
			
		||||
				syslog_level = LOG_NOTICE;
 | 
			
		||||
				break;
 | 
			
		||||
			case ERROR:
 | 
			
		||||
@@ -3484,6 +3491,7 @@ error_severity(int elevel)
 | 
			
		||||
			prefix = gettext_noop("NOTICE");
 | 
			
		||||
			break;
 | 
			
		||||
		case WARNING:
 | 
			
		||||
		case WARNING_CLIENT_ONLY:
 | 
			
		||||
			prefix = gettext_noop("WARNING");
 | 
			
		||||
			break;
 | 
			
		||||
		case ERROR:
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user