Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1l7h9a-0001rN-8k for pgsql-hackers@arkaria.postgresql.org; Thu, 04 Feb 2021 16:06:46 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1l7h9Y-0007y3-Dd for pgsql-hackers@arkaria.postgresql.org; Thu, 04 Feb 2021 16:06:44 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1l7h9Y-0007xw-31 for pgsql-hackers@lists.postgresql.org; Thu, 04 Feb 2021 16:06:44 +0000 Received: from mail-pj1-x102b.google.com ([2607:f8b0:4864:20::102b]) by magus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1l7h9Q-00089T-Mj for pgsql-hackers@lists.postgresql.org; Thu, 04 Feb 2021 16:06:43 +0000 Received: by mail-pj1-x102b.google.com with SMTP id g15so2062337pjd.2 for ; Thu, 04 Feb 2021 08:06:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to; bh=Meqo8dIAwgxidfy7vH2Mtf/JqBqqifT5a8hIpA/kATw=; b=AWwRIOnsmlNg4BwhzmnIwssekq9mC1X7vLwgw2ZGW/IcaayCEJGql54asl+Vh24vza up8mYWr47VFHYU4eTpT9Bra1wyxicBY7ch6O/iwCH96viPpNL5xLnuf5eeVqMaCHEF4q Rzzde4R0HBC441S/EjsMXysSUa8MV9EY6aKkF01uioK0m+rw3NYGXufXfEzjdvIv1ABO gVqTA7h8FCJEHcx9yqQ+TPb5qW4FMukl3amc1izVvz0QyfZ/SIueZBM7WLrjbMP4kmWo 8bhins6LZxZ+E/nB76ZnbHH9YINLXPckB4gy4nB2kaZTM0QhKNo2k+TaAITL8IGML/kR wzGw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=Meqo8dIAwgxidfy7vH2Mtf/JqBqqifT5a8hIpA/kATw=; b=ie1wxlYjJOx0PSSg0XjeJgiBPXZnivpVRTzISu7w1NxWyg8AgZUtAVjQ6VPwACgo3+ svlLAC2H5eEhaTJcG8FvNiLElzonlyzExmJH/9WVt8fgJKpTZnYUxSBLGiwIIt0YuYy5 IFGAl+GrZY5Ux+uQ3aXKYj3UE7Gg49aZznYUrFxAzOxsiX7FsbOlS4xLs2N2amMHO09E pT6w1Zav46+vOqYW/JvSVGYnTvnTpuwlzfXDfxIC/bNIODT8ZngzaP5rRs/fDb5/8Cs4 5Txuzpb1pCNn6j+cLlWkjR2TBqnyUID13QxLezhkj2oULdqtIwjjkPHorzu1bVSN2NTH ohnQ== X-Gm-Message-State: AOAM533NnrwTAuTxzbFcjdwfOQ/QgvA+CEobsd5A5DRgKe0fPDGUpLvb PgKnGClTg8jDa5mzO4UnPOY= X-Google-Smtp-Source: ABdhPJzt74ARoSciNHCGXahe4ABD2kd+SuEX/tDbcJeyND0lUzn9NY6jLgFSudvmxXgu6BOr/nCjZg== X-Received: by 2002:a17:90a:39cd:: with SMTP id k13mr168601pjf.185.1612454794325; Thu, 04 Feb 2021 08:06:34 -0800 (PST) Received: from nol (36-228-90-1.dynamic-ip.hinet.net. [36.228.90.1]) by smtp.gmail.com with ESMTPSA id 124sm6595082pfc.196.2021.02.04.08.06.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Feb 2021 08:06:31 -0800 (PST) Date: Fri, 5 Feb 2021 00:06:24 +0800 From: Julien Rouhaud To: Mahendra Singh Thalor Cc: Alvaro Herrera , PostgreSQL Hackers Subject: Re: Faulty HEAP_XMAX_LOCK_ONLY & HEAP_KEYS_UPDATED hintbit combination Message-ID: <20210204160624.GA22612@nol> References: <20210124061758.GA11756@nol> <20210201170048.GA22366@alvherre.pgsql> <20210202042133.GA72239@nol> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="+HP7ph2BbKc20aGI" Content-Disposition: inline In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk --+HP7ph2BbKc20aGI Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Thu, Feb 04, 2021 at 08:34:13PM +0530, Mahendra Singh Thalor wrote: > On Tue, 2 Feb 2021 at 09:51, Julien Rouhaud 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! --+HP7ph2BbKc20aGI Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="v2-0001-Allow-HEAP_XMAX_LOCK_ONLY-and-HEAP_KEYS_UPDATED-c.patch" From d74c216d8817659237f26baec789c6b79d337296 Mon Sep 17 00:00:00 2001 From: Julien Rouhaud 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.pl index 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.c index 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.tuplock index 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.c index 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 --+HP7ph2BbKc20aGI--