Re: Fix brin_form_tuple to properly detoast data

Поиск
Список
Период
Сортировка
От Tomas Vondra
Тема Re: Fix brin_form_tuple to properly detoast data
Дата
Msg-id 69ede68a-01ea-7c2c-4985-39c7efb6e8ce@2ndquadrant.com
обсуждение исходный текст
Ответ на Fix brin_form_tuple to properly detoast data  (Tomas Vondra <tomas.vondra@2ndquadrant.com>)
Ответы Re: Fix brin_form_tuple to properly detoast data
Список pgsql-hackers
On 11/4/20 2:05 AM, Tomas Vondra wrote:
> Hi,
> 
> As pointed out in [1], BRIN is not properly handling toasted data, which
> may easily lead to index tuples referencing TOAST-ed values. Which is
> clearly wrong - it's trivial to trigger failues after a DELETE.
> 
> Attached is a patch that aims to fix this - AFAIK the brin_form_tuple
> was simply missing the TOAST_INDEX_HACK stuff from index_form_tuple,
> which ensures the data is detoasted and (possibly) re-compressed. The
> code is mostly the same, with some BRIN-specific tweaks (looking at
> oi_typecache instead of the index descriptor, etc.).
> 
> I also attach a simple SQL script that I used to trigger the issue. This
> needs to be turned into a regression test, I'll work on that tomorrow.
> 

OK, so here's an improved version of the fix - aside from the code (same 
as in v1), there are two patches with regression tests. Ultimately those 
should be merged with the fix, but this way it's possible to apply the 
regression tests to trigger the issue.

The first test is fairly trivial - it simply builds index on toasted 
data and then shows how an insert and select fail. There's a caveat, 
that this requires a DELETE + VACUUM, and the VACUUM actually has to 
cleanup the rows. So there must be no concurrent transactions that might 
need the rows, which is unlikely in regression tests. So this requires 
waiting for all running transactions to finish - I did that by building 
an index concurrently. It's a bit strange, but it's better than any 
other solution I could think of (timeout or some custom wait for xacts).

The second test is a bit redundant - it merely checks that both CREATE 
INDEX and INSERT INTO fail the same way when the index tuple gets too 
large. Before the fix there were some inconsistencies - the CREATE INDEX 
succeeded because it used TOASTed data. So ultimately this tests the 
same thing, but from a different perspective.


regards


-- 
Tomas Vondra                  http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Вложения

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

Предыдущее
От: Tomas Vondra
Дата:
Сообщение: Re: Use of "long" in incremental sort code
Следующее
От: Melanie Plageman
Дата:
Сообщение: Re: Parallel Full Hash Join