Hiroshi Inoue <[EMAIL PROTECTED]> writes:
> [ backtrace snipped ]

Hmm, this is definitely not operating as intended: LockWaitCancel is
getting interrupted, because ProcessInterrupts may be called when it's
trying to acquire the lockmanager spinlock, and ProcessInterrupts will
see the ProcDiePending flag already set.  I think the correct fix (or
at least part of it) is in postgres.c's die():

        /*
         * If it's safe to interrupt, and we're waiting for input or a lock,
         * service the interrupt immediately
         */
        if (ImmediateInterruptOK && InterruptHoldoffCount == 0 &&
            CritSectionCount == 0)
        {
+           /* bump holdoff count to make ProcessInterrupts() a no-op */
+           /* until we are done getting ready for it */
+           InterruptHoldoffCount++;
            DisableNotifyInterrupt();
            /* Make sure HandleDeadLock won't run while shutting down... */
            LockWaitCancel();
+           InterruptHoldoffCount--;
            ProcessInterrupts();
        }

QueryCancelHandler probably needs similar additions.

I suspect you will find that these crashes occur during the window just
after the semop() call in IpcSemaphoreLock() --- see the comment
beginning at line 399 of ipc.c.  You could probably make the crash
easier to reproduce by inserting a delay there, if you want to test
more.

                        regards, tom lane

---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to [EMAIL PROTECTED] so that your
message can get through to the mailing list cleanly

Reply via email to