Re: [bug] Logical Decoding of relation rewrite with toast does not reset toast_hash

From: "Drouvot, Bertrand" <bdrouvot(at)amazon(dot)com>
To: Amit Kapila <amit(dot)kapila16(at)gmail(dot)com>
Cc: PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>, "Schneider (AWS), Jeremy" <schnjere(at)amazon(dot)com>
Subject: Re: [bug] Logical Decoding of relation rewrite with toast does not reset toast_hash
Date: 2021-08-18 07:56:42
Message-ID: 26920c50-6ace-adf3-25cb-2dfb7df9a5be@amazon.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi,

On 8/13/21 11:17 AM, Amit Kapila wrote:
> On Fri, Aug 13, 2021 at 11:47 AM Drouvot, Bertrand <bdrouvot(at)amazon(dot)com> wrote:
>> On 8/12/21 1:00 PM, Amit Kapila wrote:
>>>> - sets "relwrewrite" for the toast.
>>>>
>>> --- a/src/backend/commands/tablecmds.c
>>> +++ b/src/backend/commands/tablecmds.c
>>> @@ -3861,6 +3861,10 @@ RenameRelationInternal(Oid myrelid, const char
>>> *newrelname, bool is_internal, bo
>>> */
>>> namestrcpy(&(relform->relname), newrelname);
>>>
>>> + /* reset relrewrite for toast */
>>> + if (relform->relkind == RELKIND_TOASTVALUE)
>>> + relform->relrewrite = InvalidOid;
>>> +
>>>
>>> I find this change quite ad-hoc. I think this API is quite generic to
>>> make such a change. I see two ways for this (a) pass a new bool flag
>>> (reset_toast_rewrite) in this API and then make this change, (b) in
>>> the specific place where we need this, change relrewrite separately
>>> via a new API.
>>>
>>> I would prefer (b) in the ideal case, but I understand it would be an
>>> additional cost, so maybe (a) is also okay. What do you people think?
>> I would prefer a) because:
>>
>> - b) would need to update the exact same tuple one more time (means
>> doing more or less the same work: open relation, search for the tuple,
>> update the tuple...)
>>
>> - a) would still give the ability for someone reading the code to
>> understand where the relrewrite reset is needed (as opposed to the way
>> the patch is currently written)
>>
>> - finish_heap_swap() with swap_toast_by_content set to false, is the
>> only place where we currently need to reset explicitly relrewrite (so
>> that we would have the new API produced by b) being called only at that
>> place).
>>
>> - That means that b) would be only for code readability but at the price
>> of extra cost.
>>
> Anybody else would like to weigh in? I think it is good if few others
> also share their opinion as we need to backpatch this bug-fix.

I had a second thoughts on it and now think option b) is better.

It would make the code clearer by using a new API and the extra cost of
it (mainly search again for the pg_class tuple and update it) should be ok.

Please find patch version V3 making use of a new API.

Thanks

Bertrand

Attachment Content-Type Size
v3-0001-toast-rewrite.patch text/plain 9.1 KB

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Denis Hirn 2021-08-18 08:28:06 Re: [PATCH] Allow multiple recursive self-references
Previous Message houzj.fnst@fujitsu.com 2021-08-18 07:19:07 RE: Skipping logical replication transactions on subscriber side