From: Mike Palmiotto Date: Tue, 10 Mar 2020 23:33:39 +0000 Subject: [PATCH v2 04/12] Add AutoVacuumWorkerType to subprocess struct --- src/backend/postmaster/autovacuum.c | 69 +---------------------------- src/backend/postmaster/postmaster.c | 17 +------ src/backend/postmaster/subprocess.c | 7 +++ src/include/postmaster/autovacuum.h | 4 +- src/include/postmaster/subprocess.h | 1 + 5 files changed, 13 insertions(+), 85 deletions(-) diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index d0fdb7e5ee..ba19a9c5d2 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -83,7 +83,6 @@ #include "nodes/makefuncs.h" #include "pgstat.h" #include "postmaster/autovacuum.h" -#include "postmaster/fork_process.h" #include "postmaster/interrupt.h" #include "postmaster/postmaster.h" #include "storage/bufmgr.h" @@ -303,11 +302,6 @@ static WorkerInfo MyWorkerInfo = NULL; /* PID of launcher, valid only in worker while shutting down */ int AutovacuumLauncherPid = 0; -#ifdef EXEC_BACKEND -static pid_t avworker_forkexec(void); -#endif -NON_EXEC_STATIC void AutoVacWorkerMain(int argc, char *argv[]) pg_attribute_noreturn(); - static Oid do_start_worker(void); static void HandleAutoVacLauncherInterrupts(void); static void AutoVacLauncherShutdown(void) pg_attribute_noreturn(); @@ -1364,27 +1358,6 @@ avl_sigusr2_handler(SIGNAL_ARGS) ********************************************************************/ #ifdef EXEC_BACKEND -/* - * forkexec routines for the autovacuum worker. - * - * Format up the arglist, then fork and exec. - */ -static pid_t -avworker_forkexec(void) -{ - char *av[10]; - int ac = 0; - - av[ac++] = "postgres"; - av[ac++] = "--forkavworker"; - av[ac++] = NULL; /* filled in by postmaster_forkexec */ - av[ac] = NULL; - - Assert(ac < lengthof(av)); - - return postmaster_forkexec(ac, av); -} - /* * We need this set from the outside, before InitProcess is called */ @@ -1395,50 +1368,10 @@ AutovacuumWorkerIAm(void) } #endif -/* - * Main entry point for autovacuum worker process. - * - * This code is heavily based on pgarch.c, q.v. - */ -int -StartAutoVacWorker(void) -{ - pid_t worker_pid; - -#ifdef EXEC_BACKEND - switch ((worker_pid = avworker_forkexec())) -#else - switch ((worker_pid = fork_process())) -#endif - { - case -1: - ereport(LOG, - (errmsg("could not fork autovacuum worker process: %m"))); - return 0; - -#ifndef EXEC_BACKEND - case 0: - /* in postmaster child ... */ - InitPostmasterChild(); - - /* Close the postmaster's sockets */ - ClosePostmasterPorts(false); - - AutoVacWorkerMain(0, NULL); - break; -#endif - default: - return (int) worker_pid; - } - - /* shouldn't get here */ - return 0; -} - /* * AutoVacWorkerMain */ -NON_EXEC_STATIC void +void AutoVacWorkerMain(int argc, char *argv[]) { sigjmp_buf local_sigjmp_buf; diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 2251303589..21bbbf8194 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -5041,19 +5041,6 @@ SubPostmasterMain(int argc, char *argv[]) /* And run the backend */ BackendRun(&port); /* does not return */ } - if (strcmp(argv[1], "--forkavworker") == 0) - { - /* Restore basic shared memory pointers */ - InitShmemAccess(UsedShmemSegAddr); - - /* Need a PGPROC to run CreateSharedMemoryAndSemaphores */ - InitProcess(); - - /* Attach process to shared data structures */ - CreateSharedMemoryAndSemaphores(); - - AutoVacWorkerMain(argc - 2, argv + 2); /* does not return */ - } if (strncmp(argv[1], "--forkbgworker=", 15) == 0) { int shmem_slot; @@ -5573,7 +5560,7 @@ StartAutovacuumWorker(void) bn->child_slot = MyPMChildSlot = AssignPostmasterChildSlot(); bn->bgworker_notify = false; - bn->pid = StartAutoVacWorker(); + bn->pid = StartSubprocess(AutoVacuumWorkerType); if (bn->pid > 0) { bn->bkend_type = BACKEND_TYPE_AUTOVAC; @@ -5587,7 +5574,7 @@ StartAutovacuumWorker(void) /* * fork failed, fall through to report -- actual error message was - * logged by StartAutoVacWorker + * logged by StartSubprocess */ (void) ReleasePostmasterChildSlot(bn->child_slot); free(bn); diff --git a/src/backend/postmaster/subprocess.c b/src/backend/postmaster/subprocess.c index 9aa60cc93e..0fbd067310 100644 --- a/src/backend/postmaster/subprocess.c +++ b/src/backend/postmaster/subprocess.c @@ -79,6 +79,13 @@ static PgSubprocess process_types[] = { .needs_aux_proc = false, .entrypoint = AutoVacLauncherMain, .fork_failure = NULL + }, + { + .name = "avworker", + .desc = "autovacuum worker", + .needs_aux_proc = false, + .entrypoint = AutoVacWorkerMain, + .fork_failure = NULL } }; diff --git a/src/include/postmaster/autovacuum.h b/src/include/postmaster/autovacuum.h index 08050cd81c..51546fd4c9 100644 --- a/src/include/postmaster/autovacuum.h +++ b/src/include/postmaster/autovacuum.h @@ -58,7 +58,8 @@ extern void autovac_init(void); extern int StartAutoVacLauncher(void); extern int StartAutoVacWorker(void); -extern void AutoVacLauncherMain(int argc, char *argv[]); +extern void AutoVacLauncherMain(int argc, char *argv[]) pg_attribute_noreturn(); +extern void AutoVacWorkerMain(int argc, char *argv[]) pg_attribute_noreturn(); /* called from postmaster when a worker could not be forked */ extern void AutoVacWorkerFailed(void); @@ -67,7 +68,6 @@ extern void AutoVacWorkerFailed(void); extern void AutoVacuumUpdateDelay(void); #ifdef EXEC_BACKEND -extern void AutoVacWorkerMain(int argc, char *argv[]) pg_attribute_noreturn(); extern void AutovacuumWorkerIAm(void); extern void AutovacuumLauncherIAm(void); #endif diff --git a/src/include/postmaster/subprocess.h b/src/include/postmaster/subprocess.h index 9e3c743333..e11c24cc62 100644 --- a/src/include/postmaster/subprocess.h +++ b/src/include/postmaster/subprocess.h @@ -24,6 +24,7 @@ typedef enum WalWriterType, WalReceiverType, /* end of Auxiliary Process Forks */ AutoVacuumLauncherType, + AutoVacuumWorkerType, NUMSUBPROCESSTYPES /* Must be last! */ } SubprocessType; -- 2.17.0 --FcSpk3Icpd/Pbul4 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0005-Add-PgstatCollectorType-to-subprocess-struct.patch"