> On Apr 9, 2026, at 18:59, Andrew Dunstan <[email protected]> wrote:
> 
> 
> On 2026-04-08 We 1:01 PM, Andres Freund wrote:
>> Hi,
>> 
>> Attached is a very rough first draft for how I think this needs to look like.
>> 
>> Basically, SIGNAL_INFO always will pass both the signal number and extended
>> information along to the signal handler. The extended information is a
>> postgres specific struct. If the platform can't provide the extended
>> information, the values are instead set to some default value indicating that
>> the information is not known.
>> 
>> With that die() (and also StatementCancelHandler, ...) can just set whatever
>> globals it wants, without pqsignal.c needing to know about it.
>> 
>> It also allows us to extend the amount of information in the future. E.g. I'd
>> like to log the reason for a segfault (could e.g. be an OOM kill or an 
>> umapped
>> region) to stderr.
>> 
>> The annoying thing about it is needing to change nearly all the existing
>> references to SIG_IGN/SIG_DFL, to avoid warnings due to mismatched types.
> 
> I agree that's annoying. The only way around it I found was via some casting 
> to/from void* that I suspect you would find a cure worse than the disease.
> I reworked your patch slightly. This version fixes the translatability issue 
> you raised earlier, makes the TAP test from the original commit more robust, 
> and  tries to resolve your XXX issue by moving the assignment of 
> ProcDieSenderPid/Uid inside the "if (!proc_exit_inprogress)" block.
> 
> cheers
> 
> andrew
> 
> 
> 
> --
> Andrew Dunstan
> EDB: https://www.enterprisedb.com
> 
> <0001-Rework-signal-sender-errdetail-to-pass-info-via-hand.patch>

I reviewed this version. Besides the compile warning and uid 0 issues, I got a 
few more comments, so I try to put them all together as below.

1 - compile warnings
As talked in an earlier email, this eliminates the compile warnings for me:
```
chaol@ChaodeMacBook-Air postgresql % git diff
diff --git a/src/include/port.h b/src/include/port.h
index 7db476d7b01..c029878c6be 100644
--- a/src/include/port.h
+++ b/src/include/port.h
@@ -547,8 +547,8 @@ extern int  pg_mkdir_p(char *path, int omode);
#define pqsignal pqsignal_be
#endif

-#define PG_SIG_DFL (pqsigfunc) SIG_DFL
-#define PG_SIG_IGN (pqsigfunc) SIG_IGN
+#define PG_SIG_DFL (pqsigfunc) (pg_funcptr_t) SIG_DFL
+#define PG_SIG_IGN (pqsigfunc) (pg_funcptr_t) SIG_IGN
typedef void (*pqsigfunc) (SIGNAL_ARGS);
extern void pqsignal(int signo, pqsigfunc func);
```

2 - uid 0 problem
```
+typedef struct pg_signal_info
+{
+       pid_t           pid;                    /* pid of sending process or 0 
if unknown */
+       uid_t           uid;                    /* uid of sending process or 0 
if unknown */
+} pg_signal_info;
```

I think we can mention that “uid” is only meaningful when pid is set.

3 Also for the struct pg_signal_info. As the struct name is generic in order to 
hold some more fields in the future, does it make sense to rename “pid” to 
“sender_pid” and “uid” to “sender_pid” to reflect their actual meanings? I am 
thinking that, some other pid/uid might be added to this struct in the future.

4
```
-#ifndef SIGNAL_ARGS
-#define SIGNAL_ARGS  int postgres_signal_arg
-#endif
+/*
+ * The following is used as the arg list for signal handlers. These days we
+ * use the same argument to all signal handlers and hide the difference
+ * between platforms in wrapper functions.
+ *
+ * SIGNAL_ARGS just exists separately from the pqsignal() definition for
+ * historical reasons.
+ */
+#define SIGNAL_ARGS  int postgres_signal_arg, pg_signal_info *pg_siginfo
```

Given we now define new PG_SIG_IGN and PG_SIG_DFL, does it make sense to rename 
SIGNAL_ARGS to PG_SIGNAL_ARGS?

5
```
+       pg_info.uid = 0;
```

If you take comment 2, then when unavailable, we can just don’t assign anything 
to pg_info.uid. Or "(uid_t)-1", maybe.

6
```
+#define SIGNAL_ARGS  int postgres_signal_arg, pg_signal_info *pg_siginfo
```

Maybe pg_siginfo can be const.

7
```
+                                                errdetail("The transaction has 
already committed locally, but might not have been replicated to the standby. 
Signal sent by PID %d, UID %d.”,
```

Per https://www.postgresql.org/docs/current/error-style-guide.html, for hint 
and detail messages, “Put two spaces after the period if another sentence 
follows”.

Best regards,
--
Chao Li (Evan)
HighGo Software Co., Ltd.
https://www.highgo.com/






Reply via email to