From: | Alexander Korotkov <a(dot)korotkov(at)postgrespro(dot)ru> |
---|---|
To: | sivasubr(at)amazon(dot)com |
Cc: | pgsql-hackers <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Re: Bug in gin insert redo code path during re-compression of empty gin data leaf pages |
Date: | 2018-07-19 11:43:19 |
Message-ID: | CAPpHfds627C9L-qSOBMqg3-L7Diha5vuaOFSRNE2J5XF3wwsDA@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
Hi!
On Wed, Jul 18, 2018 at 11:59 AM Alexander Korotkov <
a(dot)korotkov(at)postgrespro(dot)ru> wrote:
> On Wed, Jul 18, 2018 at 1:40 AM R, Siva <sivasubr(at)amazon(dot)com> wrote:
>
>> We came across an issue during replay of a gin insert record on a pre-9.4
>> uncompressed data leaf page that does not have any items in it. The engine
>> version where the replay is done is 9.6.3. The redo logic attempts to
>> compress the existing page items before trying to insert new items from
>> the WAL record[1]. In this particular case, we noticed that if the data
>> leaf page does not have any items in it (see below on how such a page can
>> be present), the compression should not be attempted as the algorithm
>> expects the page to have at least one item [2]. This will lead to incorrect
>> data size set on the page and also makes the assertion that expects npacked
>> and nuncompressed to be equal, false [3].
>>
>> In Postgres 9.3, when the gin posting tree is vacuumed, the pages that
>> are in the leftmost and rightmost branches are not deleted [4]. These empty
>> pages can be part of the database after upgrading to 9.6.3. We verified
>> this by doing the following test:
>>
>
> Thank you for reporting this bug. At the first glance it seems that your
> proposed fix is correct. I'll review it in more details and commit.
>
I've managed to reproduce assertion failure while upgrading from 9.3 to
master. The steps to reproduction are following.
1. On 9.3 run following.
* create table t as (select array[1] as a from generate_series(1,2000));
* create index t_idx on t using gin(a) with (fastupdate= off);
* delete from t;
* vacuum t;
2. pg_upgrade from 9.3 to master
3. On upgraded master set full_page_writes = off and run it
4. On master run following
* insert into t (select array[1] as a from generate_series(1,2000));
5. kill postmaster with -9
2018-07-19 14:30:11.437 MSK [57946] CONTEXT: WAL redo at 0/7000190 for
Gin/INSERT: isdata: T isleaf: T 1 segments: 0 (replace)
TRAP: FailedAssertion("!(npacked == nuncompressed)", File: "ginxlog.c",
Line: 161)
After applying your patch, I still have following assertion failure.
2018-07-19 14:40:34.449 MSK [60372] LOG: redo starts at 0/7000140
TRAP: FailedAssertion("!(a_action == 2)", File: "ginxlog.c", Line: 262)
So, the issue is still persists. I'm going to investigate this bug more
and come up with updated patch.
------
Alexander Korotkov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company
From | Date | Subject | |
---|---|---|---|
Next Message | Thomas Munro | 2018-07-19 11:51:46 | Re: [HACKERS] PATCH: Keep one postmaster monitoring pipe per process |
Previous Message | Andrey Borodin | 2018-07-19 11:42:06 | Re: GiST VACUUM |