]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Don't ask for bug reports about pthread_is_threaded_np() != 0.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 23 Jan 2025 19:23:04 +0000 (14:23 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 23 Jan 2025 19:23:34 +0000 (14:23 -0500)
We thought that this condition was unreachable in ExitPostmaster,
but actually it's possible if you have both a misconfigured locale
setting and some other mistake that causes PostmasterMain to bail
out before reaching its own check of pthread_is_threaded_np().

Given the lack of other reports, let's not ask for bug reports if
this occurs; instead just give the same hint as in PostmasterMain.

Bug: #18783
Reported-by: anani191181515@gmail.com
Author: Tom Lane <tgl@sss.pgh.pa.us>
Reviewed-by: Noah Misch <noah@leadboat.com>
Discussion: https://postgr.es/m/18783-d1873b95a59b9103@postgresql.org
Discussion: https://postgr.es/m/206317.1737656533@sss.pgh.pa.us
Backpatch-through: 13

src/backend/postmaster/postmaster.c

index e0210d091e48484be0bd69e34bd2a8fdcdc4b605..0b13e76568e24a49074e9bc64e1b58a182267d29 100644 (file)
@@ -1442,6 +1442,8 @@ PostmasterMain(int argc, char *argv[])
         * calls fork() without an immediate exec(), both of which have undefined
         * behavior in a multithreaded program.  A multithreaded postmaster is the
         * normal case on Windows, which offers neither fork() nor sigprocmask().
+        * Currently, macOS is the only platform having pthread_is_threaded_np(),
+        * so we need not worry whether this HINT is appropriate elsewhere.
         */
        if (pthread_is_threaded_np() != 0)
                ereport(FATAL,
@@ -5098,15 +5100,16 @@ ExitPostmaster(int status)
 
        /*
         * There is no known cause for a postmaster to become multithreaded after
-        * startup.  Recheck to account for the possibility of unknown causes.
+        * startup.  However, we might reach here via an error exit before
+        * reaching the test in PostmasterMain, so provide the same hint as there.
         * This message uses LOG level, because an unclean shutdown at this point
         * would usually not look much different from a clean shutdown.
         */
        if (pthread_is_threaded_np() != 0)
                ereport(LOG,
-                               (errcode(ERRCODE_INTERNAL_ERROR),
-                                errmsg_internal("postmaster became multithreaded"),
-                                errdetail("Please report this to <%s>.", PACKAGE_BUGREPORT)));
+                               (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
+                                errmsg("postmaster became multithreaded"),
+                                errhint("Set the LC_ALL environment variable to a valid locale.")));
 #endif
 
        /* should cleanup shared memory and kill all backends */