Re: BUG #17462: Invalid memory access in heapam_tuple_lock

Поиск
Список
Период
Сортировка
От Andres Freund
Тема Re: BUG #17462: Invalid memory access in heapam_tuple_lock
Дата
Msg-id 20220411173417.ocwjn5xrkqqjiysl@alap3.anarazel.de
обсуждение исходный текст
Ответ на Re: BUG #17462: Invalid memory access in heapam_tuple_lock  (Tom Lane <tgl@sss.pgh.pa.us>)
Ответы Re: BUG #17462: Invalid memory access in heapam_tuple_lock
Список pgsql-bugs
Hi,

On 2022-04-11 12:19:51 -0400, Tom Lane wrote:
> I wrote:
> > Reproduced here.  It's surprising that nobody noticed this before,
> > because AFAICS the bug is pretty old: it dates to somebody foolishly
> > deciding that heap_fetch didn't need its keep_buf argument, which
> > evidently happened in v12 (didn't track down the exact commit yet).
> 
> The blame falls on Andres' commit 5db6df0c0.  There is no commentary
> there justifying this change, and I judge the amount of thought that
> went into it by noting that that commit removed the argument without
> removing the header comment explaining it.

I've only just had a first coffee, so I'm a bit foggy still. There were a few
different attempts at making tuple locking fit into some form abstraction, not
making it easy to remember...


Hm. It looks like the problem only can happen when the tuple is filtered out
by the snapshot. We don't need the xmin in line 509 from the tuple, we have it
in SnapshotDirty. The problem is we need t_ctid too.

Ah. I dimly recall that for a while the patchset had a ctid in SnapshotData
too, for SnapshotDirty purposes. That might be the origin of the problem.


One way to address it in a way not requiring an API break would be to pass
SnapshotAny to heap_fetch and then do an explicit visibility check "ourselves"
in heapam_lock_tuple().

Greetings,

Andres Freund



В списке pgsql-bugs по дате отправления:

Предыдущее
От: Peter Geoghegan
Дата:
Сообщение: Re: BUG #17462: Invalid memory access in heapam_tuple_lock
Следующее
От: Tom Lane
Дата:
Сообщение: Re: BUG #17462: Invalid memory access in heapam_tuple_lock