Re: BUG #17255: Server crashes in index_delete_sort_cmp() due to race condition with vacuum
От | Andres Freund |
---|---|
Тема | Re: BUG #17255: Server crashes in index_delete_sort_cmp() due to race condition with vacuum |
Дата | |
Msg-id | 20211111005703.3alukwc33cn3uiu5@alap3.anarazel.de обсуждение исходный текст |
Ответ на | Re: BUG #17255: Server crashes in index_delete_sort_cmp() due to race condition with vacuum (Peter Geoghegan <pg@bowt.ie>) |
Ответы |
Re: BUG #17255: Server crashes in index_delete_sort_cmp() due to race condition with vacuum
|
Список | pgsql-bugs |
Hi, On 2021-11-10 14:18:01 -0800, Peter Geoghegan wrote: > On Wed, Nov 10, 2021 at 11:20 AM Andres Freund <andres@anarazel.de> wrote: > > I hit a crash once in 13 with a slightly evolved version of the test (many > > connections creating / dropping the partitions as in the original scenario, > > using :client_id to target different tables). It's possible that my > > instrumentation was the cause of that. Unfortunately it took quite a few hours > > to hit the problem in 13... > > Have you thought about the case where a transaction does a HOT update > of the same row twice, and then aborts? Yes. I don't think it's problematic right now, because the redirect would, I think, in all cases have to point to the chain element before those tuples, because the preceding value would just have to be DELETE_IN_PROGRESS, which we we don't follow in heap_prune_chain(). > I'm asking because I notice that the fragile "We need this primarily > to handle aborted HOT updates" precheck for > HeapTupleHeaderIsHeapOnly() doesn't just check if the heap-only tuple > is DEAD before deciding to mark it LP_UNUSED. It also checks > HeapTupleHeaderIsHotUpdated() against the target tuple -- that's > another condition of the tuple being marked unused. Of course, whether > or not a given tuple is considered HeapTupleHeaderIsHotUpdated() can > change from true to false when an updater concurrently aborts. Could > that have race conditions? I wondered about that too, but I couldn't *quite* come up with a problematic scenario, because I don't think any of the cases that can change HeapTupleHeaderIsHotUpdated() would have allowed to set the redirect to a subsequent chain element. > In other words: what if the aforementioned "aborted HOT updates" > precheck code doesn't deal with a DEAD tuple, imagining that it's not > a relevant tuple, while at the same time the later HOT-chain-chasing > code *also* doesn't get to the tuple? What if they each assume that > the other will/has taken care of it, due to a race? Then we'd just end up not pruning the tuple, I think. Which should be fine, as it could only happen for fairly new tuples. Greetings, Andres Freund
В списке pgsql-bugs по дате отправления: