On 05/29/2014 11:25 PM, Tom Lane wrote:
One of the annoying things about the SPGiST bug Teodor pointed out is that once you're in the infinite loop, query cancel doesn't work to get you out of it. There are a couple of CHECK_FOR_INTERRUPTS() calls in spgdoinsert() that are meant to get you out of exactly this sort of buggy-opclass situation --- but they don't help. The reason is that when we reach that point we're holding one or more buffer locks, which means the HOLD_INTERRUPTS count is positive, so ProcessInterrupts is afraid to do anything.In point of fact, we'd be happy to give up the locks and then throw the error. So I was thinking about inventing some macro or out-of-line function that went about like this: if (InterruptPending && (QueryCancelPending || ProcDiePending)) { LWLockReleaseAll(); ProcessInterrupts(); elog(ERROR, "ProcessInterrupts failed to throw an error"); } where we don't expect to reach the final elog; it's just there to make sure we don't return control after yanking locks out from under the caller.
Also checking that CritSectionCount == 0 seems like a good idea... - Heikki -- Sent via pgsql-hackers mailing list ([email protected]) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
