Re: Refactoring postmaster's code to cleanup after child exit

Andres Freund <andres@anarazel.de>

From: Andres Freund <andres@anarazel.de>
To: Heikki Linnakangas <hlinnaka@iki.fi>
Cc: Thomas Munro <thomas.munro@gmail.com>, "pgsql-hackers@postgresql.org" <pgsql-hackers@postgresql.org>
Date: 2024-09-10T17:53:08Z
Lists: pgsql-hackers
Hi,

On 2024-08-12 12:55:00 +0300, Heikki Linnakangas wrote:
> @@ -2864,6 +2777,8 @@ PostmasterStateMachine(void)
>  	 */
>  	if (pmState == PM_STOP_BACKENDS)
>  	{
> +		uint32		targetMask;
> +
>  		/*
>  		 * Forget any pending requests for background workers, since we're no
>  		 * longer willing to launch any new workers.  (If additional requests
> @@ -2871,29 +2786,27 @@ PostmasterStateMachine(void)
>  		 */
>  		ForgetUnstartedBackgroundWorkers();
>  
> -		/* Signal all backend children except walsenders and dead-end backends */
> -		SignalSomeChildren(SIGTERM,
> -						   BACKEND_TYPE_ALL & ~(1 << B_WAL_SENDER | 1 << B_DEAD_END_BACKEND));
> +		/* Signal all backend children except walsenders */
> +		/* dead-end children are not signalled yet */
> +		targetMask = (1 << B_BACKEND);
> +		targetMask |= (1 << B_BG_WORKER);
> +
>  		/* and the autovac launcher too */
> -		if (AutoVacPID != 0)
> -			signal_child(AutoVacPID, SIGTERM);
> +		targetMask |= (1 << B_AUTOVAC_LAUNCHER);
>  		/* and the bgwriter too */
> -		if (BgWriterPID != 0)
> -			signal_child(BgWriterPID, SIGTERM);
> +		targetMask |= (1 << B_BG_WRITER);
>  		/* and the walwriter too */
> -		if (WalWriterPID != 0)
> -			signal_child(WalWriterPID, SIGTERM);
> +		targetMask |= (1 << B_WAL_WRITER);
>  		/* If we're in recovery, also stop startup and walreceiver procs */
> -		if (StartupPID != 0)
> -			signal_child(StartupPID, SIGTERM);
> -		if (WalReceiverPID != 0)
> -			signal_child(WalReceiverPID, SIGTERM);
> -		if (WalSummarizerPID != 0)
> -			signal_child(WalSummarizerPID, SIGTERM);
> -		if (SlotSyncWorkerPID != 0)
> -			signal_child(SlotSyncWorkerPID, SIGTERM);
> +		targetMask |= (1 << B_STARTUP);
> +		targetMask |= (1 << B_WAL_RECEIVER);
> +
> +		targetMask |= (1 << B_WAL_SUMMARIZER);
> +		targetMask |= (1 << B_SLOTSYNC_WORKER);
>  		/* checkpointer, archiver, stats, and syslogger may continue for now */
>  
> +		SignalSomeChildren(SIGTERM, targetMask);
> +
>  		/* Now transition to PM_WAIT_BACKENDS state to wait for them to die */
>  		pmState = PM_WAIT_BACKENDS;
>  	}

I think this might now omit shutting down at least autovac workers, which
afaict previously were included.

Greetings,

Andres Freund



Commits

Same data as JSON: GET /api/v1/messages/:b64id/commits the thread's linked commits as JSON, with link sources. API reference →
  1. Fix test name and username used in failed connection attempts

  2. tests: Don't fail due to high default timeout in postmaster/003_start_stop

  3. tests: Fix race condition in postmaster/002_connection_limits

  4. Pass MyPMChildSlot as an explicit argument to child process

  5. Assign a child slot to every postmaster child process

  6. Kill dead-end children when there's nothing else left

  7. Replace postmaster.c's own backend type codes with BackendType

  8. Use an shmem_exit callback to remove backend from PMChildFlags on exit

  9. Add test for dead-end backends

  10. Add test for connection limits

  11. Fix garbled process name on backend crash

  12. Consolidate postmaster code to launch background processes

  13. Fix comment on processes being kept over a restart

  14. Refactor code to handle death of a backend or bgworker in postmaster

  15. Make BackgroundWorkerList doubly-linked

  16. Minor refactoring of assign_backendlist_entry()

  17. Fix outdated comment; all running bgworkers are in BackendList

  18. Allow building with MSVC and Strawberry perl

  19. Fix rare failure in LDAP tests.

  20. Allow notifications to bgworkers without database connections.