Re: [BUG] pg9.4.10 Logical decoding did not get the correct oldtuplelen

From: Andres Freund <andres(at)anarazel(dot)de>
To: Michael Paquier <michael(dot)paquier(at)gmail(dot)com>
Cc: anderson <anderson2013(at)qq(dot)com>, pgsql-bugs <pgsql-bugs(at)postgresql(dot)org>
Subject: Re: [BUG] pg9.4.10 Logical decoding did not get the correct oldtuplelen
Date: 2017-01-05 14:48:20
Message-ID: 20170105144819.f6i5o64vfvy4bn5i@alap3.anarazel.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

On 2017-01-05 13:09:28 +0900, Michael Paquier wrote:
> On Sun, Jan 1, 2017 at 9:06 AM, Michael Paquier
> <michael(dot)paquier(at)gmail(dot)com> wrote:
> > OK, I can see the problem. And I can see as well that things have been
> > tackled in this area with 9.5 thanks to commit 2c03216d...
>
> (Adding Andres in CC for some input on the matter)

Thanks.

> Looking at that... As HeapTupleData->t_len is uint32, it is really an
> oversight in the 9.4 WAL logging machinery that xl_heap_header_len
> uses uint16.

Not generally, no. For new tuples and such it's perfectly fine - they
can't be bigger than MaxHeapTupleSize. It's just for the old-tuple where
(for FULL), we inline toasted columns.

> If xl_heap_update->flags still had a bit free, we could
> have for example use XLOG_HEAP_CONTAINS_OLD_TUPLE to track the
> existing short version of xl_heap_header_len and add a new bit for a
> "long" version where a version of xl_heap_header_len including uint32
> as t_len is read. This would preserve replay from doing stupid things
> for existing 9.4 deployments and allow new records to work fully. But
> there are no bits free here. As well as there are no bits for
> XLOG_HEAP[1|2]. Andres, perhaps you have an idea?

> Looking at this code, It is worth noting that
> XLOG_HEAP_CONTAINS_OLD_TUPLE and XLOG_HEAP_CONTAINS_OLD_KEY are always
> used just for XLOG_HEAP_CONTAINS_OLD, so we could merge them and have
> a single flag to do the whole thing, the parent's replica identity
> value being here to track if a full version of the old tuple is logged
> or not.

That sounds like a bad idea to me. But I don't have one a lot better,
and as you say the knowledge is currently not required. If both bits
are set it's a 32bit len, otherwise 16. Yay.

Andres

In response to

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message andrew 2017-01-05 15:21:56 BUG #14487: malformed empty array from array_fill
Previous Message Michael Paquier 2017-01-05 04:09:28 Re: [BUG] pg9.4.10 Logical decoding did not get the correct oldtuplelen