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

Heikki Linnakangas <hlinnaka@iki.fi>

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

Attachments

On 06/09/2024 12:52, Heikki Linnakangas wrote:
> Unless you have comments on these first two patches which just add 
> tests, I'll commit them shortly. Still processing the rest of your 
> comments...

Didn't happen as "shortly" as I thought..

My test for dead-end backends opens 20 TCP (or unix domain) connections 
to the server, in quick succession. That works fine my system, and it 
passed cirrus CI on other platforms, but on FreeBSD it failed 
repeatedly. The behavior in that scenario is apparently 
platform-dependent: it depends on the accept queue size, but what 
happens when you reach the queue size also seems to depend on the 
platform. On my Linux system, the connect() calls in the client are 
blocked, if the server is doesn't call accept() fast enough, but 
apparently you get an error on *BSD systems.

I'm not sure of the exact details, but in any case, platform-dependent 
behavior needs to be avoided in tests. So I changed the test so that it 
sends an SSLRequest packet on each connection and waits for reply (which 
is always 'N' to reject it in this test), before opening the next 
connection. This way, each connection is still left hanging, which is 
what I want in this test, but only after postmaster has successfully 
accept()ed it and forked the backend.

So here are these test patches again, with that addition.

-- 
Heikki Linnakangas
Neon (https://neon.tech)

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.