Remove remnants of ImmediateInterruptOK handling.
authorAndres Freund <andres@anarazel.de>
Tue, 3 Feb 2015 22:25:47 +0000 (23:25 +0100)
committerAndres Freund <andres@anarazel.de>
Tue, 3 Feb 2015 22:25:47 +0000 (23:25 +0100)
Now that nothing sets ImmediateInterruptOK to true anymore, we can
remove all the supporting code.

Reviewed-By: Heikki Linnakangas
src/backend/storage/ipc/ipc.c
src/backend/tcop/postgres.c
src/backend/utils/error/elog.c
src/backend/utils/init/globals.c
src/backend/utils/misc/timeout.c
src/include/miscadmin.h
src/test/modules/test_shm_mq/worker.c

index f0f7939300558ce2299352b67c8ec182edf7bc38..6bc0b0633f13a2a87d75d3f8a5c55b1a57bc0c3f 100644 (file)
@@ -165,8 +165,6 @@ proc_exit_prepare(int code)
        InterruptPending = false;
        ProcDiePending = false;
        QueryCancelPending = false;
-       /* And let's just make *sure* we're not interrupted ... */
-       ImmediateInterruptOK = false;
        InterruptHoldoffCount = 1;
        CritSectionCount = 0;
 
index 63573046a9e2b06aec284a6e55e6765716bdf460..f2a426d792a4e588a6bc16f4cfde41eb821925cd 100644 (file)
@@ -2648,13 +2648,6 @@ die(SIGNAL_ARGS)
        {
                InterruptPending = true;
                ProcDiePending = true;
-
-               /*
-                * If we're waiting for input or a lock so that it's safe to
-                * interrupt, service the interrupt immediately
-                */
-               if (ImmediateInterruptOK)
-                       ProcessInterrupts();
        }
 
        /* If we're still here, waken anything waiting on the process latch */
@@ -2688,13 +2681,6 @@ StatementCancelHandler(SIGNAL_ARGS)
        {
                InterruptPending = true;
                QueryCancelPending = true;
-
-               /*
-                * If we're waiting for input or a lock so that it's safe to
-                * interrupt, service the interrupt immediately
-                */
-               if (ImmediateInterruptOK)
-                       ProcessInterrupts();
        }
 
        /* If we're still here, waken anything waiting on the process latch */
@@ -2835,13 +2821,6 @@ RecoveryConflictInterrupt(ProcSignalReason reason)
                 */
                if (reason == PROCSIG_RECOVERY_CONFLICT_DATABASE)
                        RecoveryConflictRetryable = false;
-
-               /*
-                * If we're waiting for input or a lock so that it's safe to
-                * interrupt, service the interrupt immediately.
-                */
-               if (ImmediateInterruptOK)
-                       ProcessInterrupts();
        }
 
        /*
@@ -2875,7 +2854,6 @@ ProcessInterrupts(void)
        {
                ProcDiePending = false;
                QueryCancelPending = false;             /* ProcDie trumps QueryCancel */
-               ImmediateInterruptOK = false;   /* not idle anymore */
                LockErrorCleanup();
                /* As in quickdie, don't risk sending to client during auth */
                if (ClientAuthInProgress && whereToSendOutput == DestRemote)
@@ -2914,7 +2892,6 @@ ProcessInterrupts(void)
        if (ClientConnectionLost)
        {
                QueryCancelPending = false;             /* lost connection trumps QueryCancel */
-               ImmediateInterruptOK = false;   /* not idle anymore */
                LockErrorCleanup();
                /* don't send to client, we already know the connection to be dead. */
                whereToSendOutput = DestNone;
@@ -2932,7 +2909,6 @@ ProcessInterrupts(void)
        if (RecoveryConflictPending && DoingCommandRead)
        {
                QueryCancelPending = false;                     /* this trumps QueryCancel */
-               ImmediateInterruptOK = false;           /* not idle anymore */
                RecoveryConflictPending = false;
                LockErrorCleanup();
                pgstat_report_recovery_conflict(RecoveryConflictReason);
@@ -2970,7 +2946,6 @@ ProcessInterrupts(void)
                 */
                if (get_timeout_indicator(LOCK_TIMEOUT, true))
                {
-                       ImmediateInterruptOK = false;           /* not idle anymore */
                        (void) get_timeout_indicator(STATEMENT_TIMEOUT, true);
                        LockErrorCleanup();
                        ereport(ERROR,
@@ -2979,7 +2954,6 @@ ProcessInterrupts(void)
                }
                if (get_timeout_indicator(STATEMENT_TIMEOUT, true))
                {
-                       ImmediateInterruptOK = false;           /* not idle anymore */
                        LockErrorCleanup();
                        ereport(ERROR,
                                        (errcode(ERRCODE_QUERY_CANCELED),
@@ -2987,7 +2961,6 @@ ProcessInterrupts(void)
                }
                if (IsAutoVacuumWorkerProcess())
                {
-                       ImmediateInterruptOK = false;           /* not idle anymore */
                        LockErrorCleanup();
                        ereport(ERROR,
                                        (errcode(ERRCODE_QUERY_CANCELED),
@@ -2995,7 +2968,6 @@ ProcessInterrupts(void)
                }
                if (RecoveryConflictPending)
                {
-                       ImmediateInterruptOK = false;           /* not idle anymore */
                        RecoveryConflictPending = false;
                        LockErrorCleanup();
                        pgstat_report_recovery_conflict(RecoveryConflictReason);
@@ -3012,7 +2984,6 @@ ProcessInterrupts(void)
                 */
                if (!DoingCommandRead)
                {
-                       ImmediateInterruptOK = false;           /* not idle anymore */
                        LockErrorCleanup();
                        ereport(ERROR,
                                        (errcode(ERRCODE_QUERY_CANCELED),
index 0f7aa1993a4fed9f6100eae51f596b1287fefa34..4e0cc30f1cc1ac77a1d03056fb9ad48e88a57627 100644 (file)
@@ -412,7 +412,6 @@ errfinish(int dummy,...)
 {
        ErrorData  *edata = &errordata[errordata_stack_depth];
        int                     elevel;
-       bool            save_ImmediateInterruptOK;
        MemoryContext oldcontext;
        ErrorContextCallback *econtext;
 
@@ -420,18 +419,6 @@ errfinish(int dummy,...)
        CHECK_STACK_DEPTH();
        elevel = edata->elevel;
 
-       /*
-        * Ensure we can't get interrupted while performing error reporting.  This
-        * is needed to prevent recursive entry to functions like syslog(), which
-        * may not be re-entrant.
-        *
-        * Note: other places that save-and-clear ImmediateInterruptOK also do
-        * HOLD_INTERRUPTS(), but that should not be necessary here since we don't
-        * call anything that could turn on ImmediateInterruptOK.
-        */
-       save_ImmediateInterruptOK = ImmediateInterruptOK;
-       ImmediateInterruptOK = false;
-
        /*
         * Do processing in ErrorContext, which we hope has enough reserved space
         * to report an error.
@@ -463,10 +450,6 @@ errfinish(int dummy,...)
                 * itself be inside a holdoff section.  If necessary, such a handler
                 * could save and restore InterruptHoldoffCount for itself, but this
                 * should make life easier for most.)
-                *
-                * Note that we intentionally don't restore ImmediateInterruptOK here,
-                * even if it was set at entry.  We definitely don't want that on
-                * while doing error cleanup.
                 */
                InterruptHoldoffCount = 0;
                QueryCancelHoldoffCount = 0;
@@ -573,15 +556,9 @@ errfinish(int dummy,...)
        }
 
        /*
-        * We reach here if elevel <= WARNING.  OK to return to caller, so restore
-        * caller's setting of ImmediateInterruptOK.
-        */
-       ImmediateInterruptOK = save_ImmediateInterruptOK;
-
-       /*
-        * But check for cancel/die interrupt first --- this is so that the user
-        * can stop a query emitting tons of notice or warning messages, even if
-        * it's in a loop that otherwise fails to check for interrupts.
+        * Check for cancel/die interrupt first --- this is so that the user can
+        * stop a query emitting tons of notice or warning messages, even if it's
+        * in a loop that otherwise fails to check for interrupts.
         */
        CHECK_FOR_INTERRUPTS();
 }
index 8cf2ead392591e3f0cbad5de474ce514efb975a0..23e594e584113bf469e2a299ee2117de9c41dc54 100644 (file)
@@ -30,7 +30,6 @@ volatile bool InterruptPending = false;
 volatile bool QueryCancelPending = false;
 volatile bool ProcDiePending = false;
 volatile bool ClientConnectionLost = false;
-volatile bool ImmediateInterruptOK = false;
 volatile uint32 InterruptHoldoffCount = 0;
 volatile uint32 QueryCancelHoldoffCount = 0;
 volatile uint32 CritSectionCount = 0;
index ce4bc13ec3b7151499e7a708e2df083d7905862f..a7ec665f6c5a68daf6aba3782316270a8863a4f9 100644 (file)
@@ -259,27 +259,12 @@ static void
 handle_sig_alarm(SIGNAL_ARGS)
 {
        int                     save_errno = errno;
-       bool            save_ImmediateInterruptOK = ImmediateInterruptOK;
 
        /*
-        * We may be executing while ImmediateInterruptOK is true (e.g., when
-        * mainline is waiting for a lock).  If SIGINT or similar arrives while
-        * this code is running, we'd lose control and perhaps leave our data
-        * structures in an inconsistent state.  Disable immediate interrupts, and
-        * just to be real sure, bump the holdoff counter as well.  (The reason
-        * for this belt-and-suspenders-too approach is to make sure that nothing
-        * bad happens if a timeout handler calls code that manipulates
-        * ImmediateInterruptOK.)
-        *
-        * Note: it's possible for a SIGINT to interrupt handle_sig_alarm before
-        * we manage to do this; the net effect would be as if the SIGALRM event
-        * had been silently lost.  Therefore error recovery must include some
-        * action that will allow any lost interrupt to be rescheduled.  Disabling
-        * some or all timeouts is sufficient, or if that's not appropriate,
-        * reschedule_timeouts() can be called.  Also, the signal blocking hazard
-        * described below applies here too.
+        * Bump the holdoff counter, to make sure nothing we call will process
+        * interrupts directly. No timeout handler should do that, but these
+        * failures are hard to debug, so better be sure.
         */
-       ImmediateInterruptOK = false;
        HOLD_INTERRUPTS();
 
        /*
@@ -332,24 +317,7 @@ handle_sig_alarm(SIGNAL_ARGS)
                }
        }
 
-       /*
-        * Re-allow query cancel, and then try to service any cancel request that
-        * arrived meanwhile (this might in particular include a cancel request
-        * fired by one of the timeout handlers).  Since we are in a signal
-        * handler, we mustn't call ProcessInterrupts unless ImmediateInterruptOK
-        * is set; if it isn't, the cancel will happen at the next mainline
-        * CHECK_FOR_INTERRUPTS.
-        *
-        * Note: a longjmp from here is safe so far as our own data structures are
-        * concerned; but on platforms that block a signal before calling the
-        * handler and then un-block it on return, longjmping out of the signal
-        * handler leaves SIGALRM still blocked.  Error cleanup is responsible for
-        * unblocking any blocked signals.
-        */
        RESUME_INTERRUPTS();
-       ImmediateInterruptOK = save_ImmediateInterruptOK;
-       if (save_ImmediateInterruptOK)
-               CHECK_FOR_INTERRUPTS();
 
        errno = save_errno;
 }
index c9a46aa4e6a3c958784b387248211e73fae7af81..eacfccbcba725ce81f0efe56d4ff5b670b44cd3b 100644 (file)
@@ -84,7 +84,6 @@ extern PGDLLIMPORT volatile bool ProcDiePending;
 extern volatile bool ClientConnectionLost;
 
 /* these are marked volatile because they are examined by signal handlers: */
-extern PGDLLIMPORT volatile bool ImmediateInterruptOK;
 extern PGDLLIMPORT volatile uint32 InterruptHoldoffCount;
 extern PGDLLIMPORT volatile uint32 QueryCancelHoldoffCount;
 extern PGDLLIMPORT volatile uint32 CritSectionCount;
index a9d9e0e25525a881c318270d1007c5308a496574..691a56831ba18a0367c17043e6f064892e4f3973 100644 (file)
@@ -60,13 +60,9 @@ test_shm_mq_main(Datum main_arg)
         *
         * We want CHECK_FOR_INTERRUPTS() to kill off this worker process just as
         * it would a normal user backend.  To make that happen, we establish a
-        * signal handler that is a stripped-down version of die().  We don't have
-        * any equivalent of the backend's command-read loop, where interrupts can
-        * be processed immediately, so make sure ImmediateInterruptOK is turned
-        * off.
+        * signal handler that is a stripped-down version of die().
         */
        pqsignal(SIGTERM, handle_sigterm);
-       ImmediateInterruptOK = false;
        BackgroundWorkerUnblockSignals();
 
        /*