From: Julien Rouhaud <rjuju123@gmail.com>
To: Mahendra Singh Thalor <mahi6run@gmail.com>
Cc: Alvaro Herrera <alvherre@alvh.no-ip.org>
Cc: PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Subject: Re: Faulty HEAP_XMAX_LOCK_ONLY & HEAP_KEYS_UPDATED hintbit combination
Date: Fri, 5 Feb 2021 00:06:24 +0800
Message-ID: <20210204160624.GA22612@nol> (raw)
In-Reply-To: <CAKYtNArKa-ZFTmUy+yUdw5Hs+BuhWr+FuXUXbK4=k0FNDZhfzQ@mail.gmail.com>
References: <20210124061758.GA11756@nol>
<20210201170048.GA22366@alvherre.pgsql>
<20210202042133.GA72239@nol>
<CAKYtNArKa-ZFTmUy+yUdw5Hs+BuhWr+FuXUXbK4=k0FNDZhfzQ@mail.gmail.com>
On Thu, Feb 04, 2021 at 08:34:13PM +0530, Mahendra Singh Thalor wrote:
> On Tue, 2 Feb 2021 at 09:51, Julien Rouhaud <rjuju123@gmail.com> wrote:
> >
> > On Mon, Feb 01, 2021 at 02:00:48PM -0300, Alvaro Herrera wrote:
> > > So I think that I misspoke earlier in this thread when I said this is a
> > > bug, and that the right fix here is to remove the Assert() and change
> > > amcheck to match.
> >
> > I'm attaching a patch to do so.
>
> Thanks Julien for the patch.
>
> Patch looks good to me and it is fixing the problem. I think we can
> register in CF.
Thanks for looking at it! I just created an entry for the next commitfest.
> >
> > Changing the name may be overkill, but claryfing the hint bit usage in
> > README.tuplock would definitely be useful, especially since the combination
> > isn't always produced. How about adding something like:
> >
> > HEAP_KEYS_UPDATED
> > This bit lives in t_infomask2. If set, indicates that the XMAX updated
> > this tuple and changed the key values, or it deleted the tuple.
> > + It can also be set in combination of HEAP_XMAX_LOCK_ONLY.
> > It's set regardless of whether the XMAX is a TransactionId or a MultiXactId.
> Make sense. Please can you update this?
Sure, done in attached v2!
Attachments:v2-0001-Allow-HEAP_XMAX_LOCK_ONLY-and-HEAP_KEYS_UPDATED-c.patch (text/plain, 4.3K) download
From d74c216d8817659237f26baec789c6b79d337296 Mon Sep 17 00:00:00 2001
From: Julien Rouhaud <julien.rouhaud@free.fr>
Date: Fri, 22 Jan 2021 00:06:34 +0800
Subject: [PATCH v2] Allow HEAP_XMAX_LOCK_ONLY and HEAP_KEYS_UPDATED
combination.
This combination of hint bits was previously detected as a form of corruption,
but it can be obtained with some mix of SELECT ... FOR UPDATE and UPDATE
queries.
Discussion: https://postgr.es/m/20210124061758.GA11756@nol
---
contrib/amcheck/t/001_verify_heapam.pl | 14 +++++++++++++-
contrib/amcheck/verify_heapam.c | 7 -------
src/backend/access/heap/README.tuplock | 5 +++--
src/backend/access/heap/hio.c | 8 +++-----
4 files changed, 19 insertions(+), 15 deletions(-)
diff --git a/contrib/amcheck/t/001_verify_heapam.pl b/contrib/amcheck/t/001_verify_heapam.plindex a2f65b826d..6050feb712 100644--- a/contrib/amcheck/t/001_verify_heapam.pl+++ b/contrib/amcheck/t/001_verify_heapam.pl@@ -4,7 +4,7 @@ use warnings;
use PostgresNode;
use TestLib;
-use Test::More tests => 79;+use Test::More tests => 80;
my ($node, $result);
@@ -47,6 +47,9 @@ detects_heap_corruption(
#
fresh_test_table('test');
$node->safe_psql('postgres', q(VACUUM (FREEZE, DISABLE_PAGE_SKIPPING) test));
+detects_no_corruption(+ "verify_heapam('test')",+ "all-frozen not corrupted table");
corrupt_first_page('test');
detects_heap_corruption("verify_heapam('test')",
"all-frozen corrupted table");
@@ -92,6 +95,15 @@ sub fresh_test_table
ALTER TABLE $relname ALTER b SET STORAGE external;
INSERT INTO $relname (a, b)
(SELECT gs, repeat('b',gs*10) FROM generate_series(1,1000) gs);
+ BEGIN;+ SAVEPOINT s1;+ SELECT 1 FROM $relname WHERE a = 42 FOR UPDATE;+ UPDATE $relname SET b = b WHERE a = 42;+ RELEASE s1;+ SAVEPOINT s1;+ SELECT 1 FROM $relname WHERE a = 42 FOR UPDATE;+ UPDATE $relname SET b = b WHERE a = 42;+ COMMIT;
));
}
diff --git a/contrib/amcheck/verify_heapam.c b/contrib/amcheck/verify_heapam.cindex 88ab32490c..49f5ca0ef2 100644--- a/contrib/amcheck/verify_heapam.c+++ b/contrib/amcheck/verify_heapam.c@@ -608,13 +608,6 @@ check_tuple_header_and_visibilty(HeapTupleHeader tuphdr, HeapCheckContext *ctx)
ctx->tuphdr->t_hoff, ctx->lp_len));
header_garbled = true;
}
- if ((ctx->tuphdr->t_infomask & HEAP_XMAX_LOCK_ONLY) &&- (ctx->tuphdr->t_infomask2 & HEAP_KEYS_UPDATED))- {- report_corruption(ctx,- pstrdup("tuple is marked as only locked, but also claims key columns were updated"));- header_garbled = true;- }
if ((ctx->tuphdr->t_infomask & HEAP_XMAX_COMMITTED) &&
(ctx->tuphdr->t_infomask & HEAP_XMAX_IS_MULTI))
diff --git a/src/backend/access/heap/README.tuplock b/src/backend/access/heap/README.tuplockindex d03ddf6cdc..6d357565a8 100644--- a/src/backend/access/heap/README.tuplock+++ b/src/backend/access/heap/README.tuplock@@ -147,8 +147,9 @@ The following infomask bits are applicable:
- HEAP_KEYS_UPDATED
This bit lives in t_infomask2. If set, indicates that the XMAX updated
- this tuple and changed the key values, or it deleted the tuple.- It's set regardless of whether the XMAX is a TransactionId or a MultiXactId.+ this tuple and changed the key values, or it deleted the tuple. It can also+ be set in combination of HEAP_XMAX_LOCK_ONLY. It's set regardless of whether+ the XMAX is a TransactionId or a MultiXactId.
We currently never set the HEAP_XMAX_COMMITTED when the HEAP_XMAX_IS_MULTI bit
is set.
diff --git a/src/backend/access/heap/hio.c b/src/backend/access/heap/hio.cindex fb7ad0bab4..75223c9bea 100644--- a/src/backend/access/heap/hio.c+++ b/src/backend/access/heap/hio.c@@ -49,12 +49,10 @@ RelationPutHeapTuple(Relation relation,
/*
* Do not allow tuples with invalid combinations of hint bits to be placed
- * on a page. These combinations are detected as corruption by the- * contrib/amcheck logic, so if you disable one or both of these- * assertions, make corresponding changes there.+ * on a page. This combination is detected as corruption by the+ * contrib/amcheck logic, so if you disable this assertion, make+ * corresponding changes there.
*/
- Assert(!((tuple->t_data->t_infomask & HEAP_XMAX_LOCK_ONLY) &&- (tuple->t_data->t_infomask2 & HEAP_KEYS_UPDATED)));
Assert(!((tuple->t_data->t_infomask & HEAP_XMAX_COMMITTED) &&
(tuple->t_data->t_infomask & HEAP_XMAX_IS_MULTI)));
--
2.20.1
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-hackers@postgresql.org
Cc: rjuju123@gmail.com, mahi6run@gmail.com, alvherre@alvh.no-ip.org, pgsql-hackers@lists.postgresql.org
Subject: Re: Faulty HEAP_XMAX_LOCK_ONLY & HEAP_KEYS_UPDATED hintbit combination
In-Reply-To: <20210204160624.GA22612@nol>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox