Hi, In my dev system(Ubuntu) when the postmaster is killed with SIGKILL, SIGPWR is being sent to its child processes (backends/any other bg process). If a child process is waiting with pg_usleep, it looks like it is not detecting the postmaster's death and it doesn't exit immediately but stays forever until it gets killed explicitly. For this experiment, I did 2 things to simulate the scenario i.e. a backend waiting in pg_usleep and killing the postmaster. 1) I wrote a wait function that uses pg_usleep and called it in a backend. This backend doesn't exit on postmaster death. 2) I set PostAuthDelay to 100 seconds and started the postmaster. Then, the "auotvacuum launcher" process still stays around (as it has pg_usleep in its main function), even after postmaster death.
Questions: 1) Is it really harmful to use pg_usleep in a postmaster child process as it doesn't let the child process detect postmaster death? 2) Can pg_usleep() always detect signals? I see the caution in the pg_usleep function definition in pgsleep.c, saying the signal handling is platform dependent. We have code blocks like below in the code. Do we actually process interrupts before going to sleep with pg_usleep()? while/for loop { ...... ...... CHECK_FOR_INTERRUPTS(); pg_usleep(); } and if (PostAuthDelay) pg_usleep(); 3) Is it intentional to use pg_usleep in some places in the code? If yes, what are they? At least, I see one place where it's intentional in the wait_pid function which is used while running the regression tests. 4) Are there any places where we need to replace pg_usleep with WaitLatch/equivalent of pg_sleep to detect the postmaster death properly? Correct me if I'm missing something or if my observation/understanding of the pg_usleep() is wrong. With Regards, Bharath Rupireddy. EnterpriseDB: http://www.enterprisedb.com