Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tK8Fa-0074Fv-A6 for pgsql-hackers@arkaria.postgresql.org; Sun, 08 Dec 2024 03:46:30 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1tK8FW-000fip-RD for pgsql-hackers@arkaria.postgresql.org; Sun, 08 Dec 2024 03:46:28 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tK8FW-000fif-7k for pgsql-hackers@lists.postgresql.org; Sun, 08 Dec 2024 03:46:27 +0000 Received: from mail-pl1-x631.google.com ([2607:f8b0:4864:20::631]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1tK8FP-001bIw-85 for pgsql-hackers@postgresql.org; Sun, 08 Dec 2024 03:46:25 +0000 Received: by mail-pl1-x631.google.com with SMTP id d9443c01a7336-21644e6140cso735055ad.1 for ; Sat, 07 Dec 2024 19:46:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=leadboat.com; s=google; t=1733629577; x=1734234377; darn=postgresql.org; h=user-agent:content-disposition:mime-version:message-id:subject:cc :to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=cL8DnwbJNTU23jQsSX3LIogBdePgVuLGyo9tUsEOG/8=; b=F65SW2V6HqPo7kkK43rA4+L7iF9YAkGSNGIPeHyuRyGQizLYcEdgJoe1l5b32LFf9K gLaWlsaIVXdBhPn80r18PVlF/bOmWEi9MAnl88XzBAAG0oaE0ZW3QX2YsHDEpJen0VSw 58DwvoCIClsqQeWhDtyZTZYGzgisen7krHoow= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733629577; x=1734234377; h=user-agent:content-disposition:mime-version:message-id:subject:cc :to:from:date:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=cL8DnwbJNTU23jQsSX3LIogBdePgVuLGyo9tUsEOG/8=; b=HIXV7otdr8raPO1RQFFb7cWJH2v4FASEVMlKPnRobnaRQ/09htu/ICLCgxEFuuWM6d sZidcNk3kM9ae/Tn9sj/XpK85Lx696EgcOMGAqGb4u8ai7UrXTcwjaFEmlmBrMCHAxN0 CToKg56UcDIXXM0106DZ7V/MBF8qOitrKx0Es5p9xHYtPXL9cJpdR2bsbjm9M78sfQBW omjsxnHyvk5u9SL1c8LBhOI994kxPqnhN8I7ZQRIlJKxMVrnMnLkSHyxNQi5efZd5I3j /L6qHuL5YNyVAuPANd6lcojQj156V1jJbT8OniwMFqmwn4P6SEH4frep1jfPCVY0bKuc lzMw== X-Gm-Message-State: AOJu0Yyk+KchbWV6epp5Q0pfzn1dBMsxr9LN0L7oc6ZQeU2Oa9wZFsnc MbqdJBfbYtUILjgrUFWZGYrOUTOrso514qMy3jJ09Vj/w/7E6GsqQcH46d6B0G5wGvnqtRdqk9Q = X-Gm-Gg: ASbGnctMdm2/o4OsT2EMYOWGbaHoAoJHqRJ48CziEOcLzXcVHHDNT2RG/7KOqwvp7KT 1S4hb6iuyWnj0EVPVqGdWFnBipy7QdmGgOWe95btfOrx/3lxX3xRfMFqhRruCgjaB75hgqpYvyo 7UDmHavj+OGSW8LC02P9Y3S7dpF8D/O30ozLS7JDqADS9A5mkLhWo+yv31TMMIh8MN4tfghvbea efeTKu154A4Lxov5oepZM5BqhgFZo4ng1Ku3HnrCA2e X-Google-Smtp-Source: AGHT+IE8wEoTxtVY2U4B5pH6uThr3b3zrB6gAFM8K4SsADwem90uKKpViHSaejJL0G6y9mcJkLE4aQ== X-Received: by 2002:a17:902:d0d3:b0:215:b190:de6 with SMTP id d9443c01a7336-21614d5461fmr98489515ad.3.1733629577220; Sat, 07 Dec 2024 19:46:17 -0800 (PST) Received: from google.com ([2600:1702:a20:5750::48]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-215f8e3eff7sm50223855ad.14.2024.12.07.19.46.16 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sat, 07 Dec 2024 19:46:16 -0800 (PST) Date: Sat, 7 Dec 2024 19:46:14 -0800 From: Noah Misch To: pgsql-hackers@postgresql.org Cc: nathandbossart@gmail.com Subject: Fix early elog(FATAL) Message-ID: <20241208034614.45.nmisch@google.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="rDBHi9GJqjyeXEPS" Content-Disposition: inline User-Agent: Mutt/2.2.12 (2023-09-09) List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --rDBHi9GJqjyeXEPS Content-Type: text/plain; charset=us-ascii Content-Disposition: inline main() says: /* * Fire up essential subsystems: error and memory management * * Code after this point is allowed to use elog/ereport, though * localization of messages may not work right away, and messages won't go * anywhere but stderr until GUC settings get loaded. */ MemoryContextInit(); However, appending elog(ERROR, "whoops") breaks like: $ initdb -D discard_me FATAL: whoops PANIC: proc_exit() called in child process no data was returned by command ""/home/nm/sw/nopath/pghead/bin/postgres" -V" child process was terminated by signal 6: Aborted So does the ereport(FATAL) in ClosePostmasterPorts(). The "called in child process" check (added in commit 97550c0 of 2023-10) reads MyProcPid, which we set later. Three ways to fix this: 1. Call InitProcessGlobals() earlier. This could also reduce the total call sites from 3 to 2 (main() and post-fork). 2. Move MyProcPid init out of InitProcessGlobals(), to main() and post-fork. This has less to go wrong in back branches. While probably irrelevant, this avoids calling pg_prng_strong_seed() in processes that will exit after help() or GucInfoMain(). 3. Revert 97550c0, as commit 3b00fdb anticipated. I don't think the choice matters much, so here is (2). --rDBHi9GJqjyeXEPS Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="early-elog-v1.patch" Author: Noah Misch Commit: Noah Misch Fix elog(FATAL) before PostmasterMain() or just after fork(). Since commit 97550c0711972a9856b5db751539bbaf2f88884c, these failed with "PANIC: proc_exit() called in child process" due to uninitialized or stale MyProcPid. That was reachable if close() failed in ClosePostmasterPorts() or setlocale(category, "C") failed, both unlikely. Back-patch to v13 (all supported versions). Reviewed by FIXME. Discussion: https://postgr.es/m/FIXME diff --git a/src/backend/main/main.c b/src/backend/main/main.c index 3acb46b..e286810 100644 --- a/src/backend/main/main.c +++ b/src/backend/main/main.c @@ -109,6 +109,7 @@ main(int argc, char *argv[]) * localization of messages may not work right away, and messages won't go * anywhere but stderr until GUC settings get loaded. */ + MyProcPid = getpid(); MemoryContextInit(); /* diff --git a/src/backend/postmaster/fork_process.c b/src/backend/postmaster/fork_process.c index 5e42a74..b3010e3 100644 --- a/src/backend/postmaster/fork_process.c +++ b/src/backend/postmaster/fork_process.c @@ -19,6 +19,7 @@ #include #include "libpq/pqsignal.h" +#include "miscadmin.h" #include "postmaster/fork_process.h" #ifndef WIN32 @@ -66,6 +67,7 @@ fork_process(void) if (result == 0) { /* fork succeeded, in child */ + MyProcPid = getpid(); #ifdef LINUX_PROFILE setitimer(ITIMER_PROF, &prof_itimer, NULL); #endif diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index ce00f40..f0f9c66 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -1899,14 +1899,13 @@ ClosePostmasterPorts(bool am_syslogger) /* - * InitProcessGlobals -- set MyProcPid, MyStartTime[stamp], random seeds + * InitProcessGlobals -- set MyStartTime[stamp], random seeds * * Called early in the postmaster and every backend. */ void InitProcessGlobals(void) { - MyProcPid = getpid(); MyStartTimestamp = GetCurrentTimestamp(); MyStartTime = timestamptz_to_time_t(MyStartTimestamp); diff --git a/src/port/pqsignal.c b/src/port/pqsignal.c index 6ca2d4e..bdaa9f1 100644 --- a/src/port/pqsignal.c +++ b/src/port/pqsignal.c @@ -74,8 +74,7 @@ static volatile pqsigfunc pqsignal_handlers[PG_NSIG]; /* * Except when called with SIG_IGN or SIG_DFL, pqsignal() sets up this function * as the handler for all signals. This wrapper handler function checks that - * it is called within a process that the server knows about (i.e., any process - * that has called InitProcessGlobals(), such as a client backend), and not a + * it is called within a process that knew to maintain MyProcPid, and not a * child process forked by system(3), etc. This check ensures that such child * processes do not modify shared memory, which is often detrimental. If the * check succeeds, the function originally provided to pqsignal() is called. --rDBHi9GJqjyeXEPS--