Re: OOM in spgist insert
Tom Lane <tgl@sss.pgh.pa.us>
From: Tom Lane <tgl@sss.pgh.pa.us>
To: Alvaro Herrera <alvherre@alvh.no-ip.org>
Cc: Pavel Borisov <pashkin.elfe@gmail.com>,
Dilip Kumar <dilipbalaut@gmail.com>,
PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2021-05-13T16:31:52Z
Lists: pgsql-hackers
Attachments
- allow-query-cancel-in-spgdoinsert-WIP.patch (text/x-diff) patch
Alvaro Herrera <alvherre@alvh.no-ip.org> writes: > On 2021-May-13, Tom Lane wrote: >> BTW, another nasty thing I discovered while testing this is that >> the CHECK_FOR_INTERRUPTS() at line 2146 is useless, because >> we're holding a buffer lock there so InterruptHoldoffCount > 0. >> So once you get into this loop you can't even cancel the query. >> Seems like that needs a fix, too. Attached is a WIP patch for that part. Basically, if it looks like there's an interrupt pending, make spgdoinsert() fall out of its loop, so it'll release the buffer locks, and then recheck CHECK_FOR_INTERRUPTS() at a point where it can really throw the error. Now, the hole in this approach is what if ProcessInterrupts still declines to throw the error? I've made the patch make use of the existing provision to retry spgdoinsert() in case of deadlock, so that it just goes around and tries again. But that doesn't seem terribly satisfactory, because if InterruptPending remains set then we'll just have an infinite loop at that outer level. IOW, this patch can only cope with the situation where there's not any outer function holding a buffer lock (or other reason to prevent the query cancel from taking effect). Maybe that's good enough, but I'm not terribly pleased with it. > This comment made me remember a patch I've had for a while, which splits > the CHECK_FOR_INTERRUPTS() definition in two -- one of them is > INTERRUPTS_PENDING_CONDITION() which let us test the condition > separately; that allows the lock we hold to be released prior to > actually processing the interrupts. Hm. Yeah, I was feeling that this patch is unduly friendly with the innards of CHECK_FOR_INTERRUPTS(). So maybe some refactoring is called for, but I'm not quite sure what it should look like. Testing the condition separately is fine, but what about the case of ProcessInterrupts refusing to pull the trigger? regards, tom lane
Commits
-
Prevent infinite insertion loops in spgdoinsert().
- e87a0d2e0aa5 10.18 landed
- dc714c120eab 13.4 landed
- d776045eb12a 11.13 landed
- c3c35a733c77 14.0 landed
- 5015d3c35c6b 9.6.23 landed
- 4e046281fb58 12.8 landed
-
Fix query-cancel handling in spgdoinsert().
- eb7a6b922943 14.0 landed
- fe64adc93177 10.18 landed
- f4ee4082f50b 11.13 landed
- c1b72bf04515 13.4 landed
- 4c6cfcc377aa 9.6.23 landed
- 004288d3c0ac 12.8 landed
-
Refactor CHECK_FOR_INTERRUPTS() to add flexibility.
- e47f93f981cc 14.0 landed
- 8274f4517602 11.13 landed
- 63831c16275e 13.4 landed
- 567328989c19 9.6.23 landed
- 4c646b17985c 12.8 landed
- 39b8ccb08619 10.18 landed