Tweak pg_promote() to report failures on kill() or postmaster failures
authorMichael Paquier
Mon, 28 Aug 2023 23:45:04 +0000 (08:45 +0900)
committerMichael Paquier
Mon, 28 Aug 2023 23:45:04 +0000 (08:45 +0900)
Since its introduction in 10074651e335, pg_promote() has been returning
a false status in three cases:
- SIGUSR1 not sent to the postmaster process.
- Postmaster death during standby promotion.
- Standby not promoted within the specified wait time.

An application calling this function will have a hard time understanding
what a false state returned actually means.

Per discussion, this switches the two first states to fail rather than
return a "false" status, making the second case more consistent with the
existing CHECK_FOR_INTERRUPTS in the wait loop.  False is only returned
when the promotion is not completed within the specified time (60s by
default).

Author: Ashutosh Sharma
Reviewed-by: Fujii Masao, Laurenz Albe, Michael Paquier
Discussion: https://postgr.es/m/CAE9k0P=QTrwptL0t4J0fuBRDDjgsT-0PVKd-ikd96i1hyL7Bcg@mail.gmail.com

src/backend/access/transam/xlogfuncs.c

index 5044ff064329b48e244e3072cc2f82cf38bad045..45a70668b1cce4fd8e901978adcf4f81b4d372ee 100644 (file)
@@ -711,10 +711,10 @@ pg_promote(PG_FUNCTION_ARGS)
    /* signal the postmaster */
    if (kill(PostmasterPid, SIGUSR1) != 0)
    {
-       ereport(WARNING,
-               (errmsg("failed to send signal to postmaster: %m")));
        (void) unlink(PROMOTE_SIGNAL_FILE);
-       PG_RETURN_BOOL(false);
+       ereport(ERROR,
+               (errcode(ERRCODE_SYSTEM_ERROR),
+                errmsg("failed to send signal to postmaster: %m")));
    }
 
    /* return immediately if waiting was not requested */
@@ -744,7 +744,10 @@ pg_promote(PG_FUNCTION_ARGS)
         * necessity for manual cleanup of all postmaster children.
         */
        if (rc & WL_POSTMASTER_DEATH)
-           PG_RETURN_BOOL(false);
+           ereport(FATAL,
+                   (errcode(ERRCODE_ADMIN_SHUTDOWN),
+                    errmsg("terminating connection due to unexpected postmaster exit"),
+                    errcontext("while waiting on promotion")));
    }
 
    ereport(WARNING,