From a3bb438c25b49ab8169167cd7d6e45279dc6f9dd Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 3 Aug 2007 20:06:50 +0000 Subject: [PATCH] Fix some sloppiness in the recent multiple-autovacuum-worker patch. It was not bothering to initialize is_autovacuum for regular backends, meaning there was a significant chance of the postmaster prematurely sending them SIGTERM during database shutdown. Also, leaving the cancel key unset for an autovac worker meant that any client could send it SIGINT, which doesn't sound especially good either. --- src/backend/postmaster/postmaster.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 59830d0bbe..db8f556cd1 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -130,7 +130,7 @@ * children we have and send them appropriate signals when necessary. * * "Special" children such as the startup, bgwriter and autovacuum launcher - * tasks are not in this list. Autovacuum worker processes are on it. + * tasks are not in this list. Autovacuum worker processes are in it. */ typedef struct bkend { @@ -2705,6 +2705,7 @@ BackendStartup(Port *port) */ bn->pid = pid; bn->cancel_key = MyCancelKey; + bn->is_autovacuum = false; DLAddHead(BackendList, DLNewElem(bn)); #ifdef EXEC_BACKEND ShmemBackendArrayAdd(bn); @@ -3925,15 +3926,22 @@ StartAutovacuumWorker(void) if (StartupPID != 0 || FatalError || Shutdown != NoShutdown) return; + /* + * Compute the cancel key that will be assigned to this session. + * We probably don't need cancel keys for autovac workers, but we'd + * better have something random in the field to prevent unfriendly + * people from sending cancels to them. + */ + MyCancelKey = PostmasterRandom(); + bn = (Backend *) malloc(sizeof(Backend)); if (bn) { bn->pid = StartAutoVacWorker(); - bn->is_autovacuum = true; - /* we don't need a cancel key */ - if (bn->pid > 0) { + bn->cancel_key = MyCancelKey; + bn->is_autovacuum = true; DLAddHead(BackendList, DLNewElem(bn)); #ifdef EXEC_BACKEND ShmemBackendArrayAdd(bn); @@ -3949,7 +3957,9 @@ StartAutovacuumWorker(void) free(bn); } else - elog(LOG, "out of memory"); + ereport(LOG, + (errcode(ERRCODE_OUT_OF_MEMORY), + errmsg("out of memory"))); /* report the failure to the launcher */ AutoVacWorkerFailed(); -- 2.39.5