Re: Refactoring backend fork+exec code
Heikki Linnakangas <hlinnaka@iki.fi>
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Avoid 0-length memcpy to NULL with EXEC_BACKEND
- 95219c020c3c 17.0 landed
- f3412a61f3f9 18.0 landed
-
Tighten check for --forkchild argument when spawning child process
- 1906b1e0ad96 17.0 landed
- a06e8f84a1ac 18.0 landed
-
Add missing PGDLLIMPORT markings
- 768ceeeaa127 17.0 cited
-
Remove assertions that some compiler say are tautological
- d63d486d6c39 17.0 landed
-
Move code for backend startup to separate file
- 05c3980e7f47 17.0 landed
-
Refactor postmaster child process launching
- aafc05de1bf5 17.0 landed
-
Move some functions from postmaster.c to a new source file
- f1baed18bc3d 17.0 landed
-
Split registration of Win32 deadchild callback to separate function
- 14cddee9cce3 17.0 landed
-
Improve log messages referring to background worker processes
- a3f349c61292 17.0 landed
-
Move initialization of the Port struct to the child process
- 4945e4ed4a72 17.0 landed
-
Pass CAC as an argument to the backend process
- d162c3a73bf1 17.0 landed
-
Set socket options in child process after forking
- 73f7fb2a4c44 17.0 landed
-
Fix references to renamed function in comments
- ef4cfdce0ef8 17.0 landed
-
Use MyBackendType in more places to check what process this is
- 393b5599e517 17.0 landed
-
Remove MyAuxProcType, use MyBackendType instead
- 067701f57758 17.0 landed
-
Replace BackendIds with 0-based ProcNumbers
- 024c52111757 17.0 landed
-
Redefine backend ID to be an index into the proc array
- ab355e3a88de 17.0 landed
-
Remove superfluous 'pgprocno' field from PGPROC
- 28f3915b73f7 17.0 landed
-
Fix incorrect comment on how BackendStatusArray is indexed
- 28215a32b515 14.11 landed
- 90ccc9bf90a9 15.6 landed
- 4cf9ef670e4c 16.2 landed
- 2b53a462cff0 17.0 landed
-
Refactor how InitProcess is called
- fd5e8b440dfd 17.0 landed
-
Pass BackgroundWorker entry in the parameter file in EXEC_BACKEND mode
- 388491f1e5e6 17.0 landed
-
Refactor CreateSharedMemoryAndSemaphores
- 69d903367cde 17.0 landed
-
Silence Valgrind complaint with EXEC_BACKEND
- b19890d49d12 17.0 landed
-
Adjust obsolete comment explaining set_stack_base().
- cf84755575d1 16.2 landed
- 3b51265ee307 17.0 landed
-
Print lwlock stats also for aux processes, when built with LWLOCK_STATS
- f93133a250c6 17.0 landed
-
Move canAcceptConnections check from ProcessStartupPacket to caller.
- 16671ba6e717 17.0 landed
-
Fix crash on syslogger startup
- 5da0a622e889 17.0 landed
-
Refactor ListenSocket array.
- e29c46439511 17.0 landed
-
Use FD_CLOEXEC on ListenSockets
- b0bea38705b2 17.0 landed
-
Don't leak descriptors into subprograms.
- 1da569ca1f1f 16.0 cited
-
Use WaitEventSet API for postmaster's event loop.
- 7389aad63666 16.0 cited
-
Rearrange postmaster's startup sequence for better syslogger results.
- 9a86f03b4e8c 13.0 cited
-
Fix and enhance the assertion of no palloc's in a critical section.
- 1c6821be31f9 9.5.0 cited
Attachments
- v9-0001-Remove-superfluous-pgprocno-field-from-PGPROC.patch (text/x-patch) patch v9-0001
- v9-0002-Redefine-backend-ID-to-be-an-index-into-the-proc-.patch (text/x-patch) patch v9-0002
- v9-0003-Remove-MyAuxProcType-use-MyBackendType-instead.patch (text/x-patch) patch v9-0003
- v9-0004-Use-MyBackendType-in-more-places-to-check-what-pr.patch (text/x-patch) patch v9-0004
On 30/01/2024 02:08, Heikki Linnakangas wrote: > On 29/01/2024 17:54, reid.thompson@crunchydata.com wrote: >> On Thu, 2024-01-25 at 01:51 +0200, Heikki Linnakangas wrote: >>> >>> And here we go. BackendID is now a 1-based index directly into the >>> PGPROC array. >> >> Would it be worthwhile to also note in this comment FIRST_AUX_PROC's >> and IsAuxProcess()'s dependency on B_ARCHIVER and it's location in the >> enum table? > > Yeah, that might be in order. Although looking closer, it's only used in > IsAuxProcess, which is only used in one sanity check in > AuxProcessMain(). And even that gets refactored away by the later > patches in this thread. So on second thoughts, I'll just remove it > altogether. > > I spent some more time on the 'lastBackend' optimization in sinvaladt.c. > I realized that it became very useless with these patches, because aux > processes are allocated pgprocno's after all the slots for regular > backends. There are always aux processes running, so lastBackend would > always have a value close to the max anyway. I replaced that with a > dense 'pgprocnos' array that keeps track of the exact slots that are in > use. I'm not 100% sure this is worth the effort; does any real world > workload send shared invalidations so frequently that this matters? In > any case, this should avoid the regression if such a workload exists. > > New patch set attached. I think these are ready to be committed, but > would appreciate a final review. contrib/amcheck 003_cic_2pc.pl test failures revealed a bug that required some reworking: In a PGPROC entry for a prepared xact, the PGPROC's backendID needs to be the original backend's ID, because the prepared xact is holding the lock on the original virtual transaction id. When a transaction's ownership is moved from the original backend's PGPROC entry to the prepared xact PGPROC entry, the backendID needs to be copied over. My patch removed the field altogether, so it was not copied over, which made it look like it the original VXID lock was released at prepare. I fixed that by adding back the backendID field. For regular backends, it's always equal to pgprocno + 1, but for prepared xacts, it's the original backend's ID. To make that less confusing, I moved the backendID and lxid fields together under a 'vxid' struct. The two fields together form the virtual transaction ID, and that's the only context where the 'backendID' field should now be looked at. I also squashed the 'lastBackend' changes in sinvaladt.c to the main patch. -- Heikki Linnakangas Neon (https://neon.tech)