Re: Remove pthread_is_threaded_np() checks in postmaster

From: "Tristan Partin" <tristan(at)neon(dot)tech>
To: "Tristan Partin" <tristan(at)neon(dot)tech>, "Andres Freund" <andres(at)anarazel(dot)de>
Cc: "pgsql-hackers" <pgsql-hackers(at)postgresql(dot)org>, "Alexander Bayandin" <alexander(at)neon(dot)tech>
Subject: Re: Remove pthread_is_threaded_np() checks in postmaster
Date: 2024-01-23 21:50:11
Message-ID: CYMF1TSN6CWG.17UM5FMXUDURU@neon.tech
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Tue Jan 23, 2024 at 2:10 PM CST, Tristan Partin wrote:
> On Tue Jan 23, 2024 at 1:47 PM CST, Andres Freund wrote:
> > Hi,
> > On 2024-01-23 13:20:15 -0600, Tristan Partin wrote:
> > > These checks are not effective for what they are trying to prevent. A recent
> > > commit[0] in libcurl when used on macOS has been tripping the
> > > pthread_is_threaded_np() check in postmaster.c for shared_preload_libraries
> > > entries which use libcurl (like Neon). Under the hood, libcurl calls
> > > SCDynamicStoreCopyProxies[1], which apparently causes the check to fail.
> >
> > Maybe I'm missing something, but isn't that indicating the exact opposite,
> > namely that the check is precisely doing what it's intended?
>
> The logic in the original commit seems sound:
>
> > On Darwin, detect and report a multithreaded postmaster.
> >
> > Darwin --enable-nls builds use a substitute setlocale() that may start a
> > thread. Buildfarm member orangutan experienced BackendList corruption
> > on account of different postmaster threads executing signal handlers
> > simultaneously. Furthermore, a multithreaded postmaster risks undefined
> > behavior from sigprocmask() and fork(). Emit LOG messages about the
> > problem and its workaround. Back-patch to 9.0 (all supported versions).
>
> Some reading from signal(7):
>
> > A process-directed signal may be delivered to any one of the threads
> > that does not currently have the signal blocked. If more than one of
> > the threads has the signal unblocked, then the kernel chooses an
> > arbitrary thread to which to deliver the signal.
>
> So it sounds like the commit is trying to protect from the last
> sentence.
>
> And then forks only copy from their parent thread...

What is keeping us from using pthread_sigmask(3) instead of
sigprocmask(2)? If an extension can guarantee that threads that get
launched by it don't interact with anything Postgres-related, would that
be enough to protect from any fork(2) related issues? In the OP example,
is there any harm in the thread that libcurl inadvertantly launches from
a Postgres perspective?

--
Tristan Partin
Neon (https://neon.tech)

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Vladimir Churyukin 2024-01-23 21:51:04 Re: Multiple startup messages over the same connection
Previous Message Dave Cramer 2024-01-23 21:13:05 Re: [PATCH] Add native windows on arm64 support