Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w5EyZ-0032yM-2b for pgsql-hackers@arkaria.postgresql.org; Wed, 25 Mar 2026 03:32:11 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w5EyY-00BOzR-0v for pgsql-hackers@arkaria.postgresql.org; Wed, 25 Mar 2026 03:32:10 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w5EyX-00BOzJ-3A for pgsql-hackers@lists.postgresql.org; Wed, 25 Mar 2026 03:32:10 +0000 Received: from mail-dl1-x1234.google.com ([2607:f8b0:4864:20::1234]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w5EyV-00000000zk0-3Srr for pgsql-hackers@lists.postgresql.org; Wed, 25 Mar 2026 03:32:10 +0000 Received: by mail-dl1-x1234.google.com with SMTP id a92af1059eb24-12a80c36350so3593994c88.1 for ; Tue, 24 Mar 2026 20:32:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774409526; x=1775014326; darn=lists.postgresql.org; h=in-reply-to:from:content-language:references:to:subject:user-agent :mime-version:date:message-id:from:to:cc:subject:date:message-id :reply-to; bh=g2wlGzrhzf61G0/7GKe78MmYs9ewCaF7HkA5lPhzQgI=; b=PNAddFvJi1bKz02esuPqCbBW7DhRh98YLNqkeYuP+DmTWvl5tL2D2VbPy3uccPPlLK du/+Dp61+S7vkiyUO3EPGKtmrLJMWO42fdfzqB5JP1IHChR5vnFLYK0fBEz/lkT7e83i +gLCEz28nUs41PMpRkg0+8+/moU9XYoDVz4zfg3G+RZb40E7npPgwdevX8Ek7+2l8lU/ z9sguD7SgLTtvav/lJy1CoQBi3R5Q2tPM7zyA2gPom1Lc/RaQIDocSeD7T9nZfFVrn5b KXJz+6Wf0O9KW9KZfKpjAbE92MAGdkA41kg4/VpkTjzyU/hCYg4RhDHpA1/yRqOYsybF MCHg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774409526; x=1775014326; h=in-reply-to:from:content-language:references:to:subject:user-agent :mime-version:date:message-id:x-gm-gg:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=g2wlGzrhzf61G0/7GKe78MmYs9ewCaF7HkA5lPhzQgI=; b=YP39bkYzzhkeyuK5547YdwBLuJjpp06f8P7av4kvDZWS8lWWrbakYO75sdjw2KT5Ke ihmT2cEHrXXBhnBcosttgo53mGkl2TmMWBVbYPqxzO7ZE7iiIIaAgwPD/mJgaTu2gRcs Tpkv3miTrRIO02xTeFR8soOasQtHY9tg2XlnWCC1uSuPM/mjnpPnlsvgEypzG8X+5xVK fhXJmw8cnFyiIdZ0koHmBnxyPdRirnmCcdMutVwGMrERIVGwNsM5mCxrj7/Tw6OUS6Wj z/uVCrcV5xBL0x5CgfVWGrP0YMZDgtOvSzHZ38AmUzjYgqIy1B2D/W/DsTW3eTuD0DBb IjLw== X-Gm-Message-State: AOJu0YwN/eMOh8akI99kq4OXGKNl/trDPw3UKI0elyEFrHthA4SZLt/z ZYY86kMwHKJNeWTeth4R6AKAgww+/UhTwToFFFJiaCjExBBzAanx2rlaDVcJjzaX X-Gm-Gg: ATEYQzwN9sJj8f0IOHUai8yrQJgZGjlINid7jzy672sxmcTDdNng+yI2OHx+ISMNwXI oLYuhR+dF8aCBpCVhKxNGQ8GhlRynFYipXshs3RzZiJTtlwkkFvVc0+4f1+UQ+AzMsLLRAwrBby 58ZDm5L7gCndiebWGT4soN4y5PAZtbO+DNH3LE293r8Au/Jeimy56bYHFBcvoZ055FYWDhuMx1S u3ewYv3nIJIkxiL9XKb0L652Te94pTAHNYaPu8kiTCrHZyAEfzC+6IkEOU8HfyJzpQetuYrbOC7 0xX0r5DdXcR6M3QwU6A3IksHYbQ5QMC9yCQRbw6dA76ZMrewsdKO5EniAqNtZdMNgm0iDACZKX1 HUp0ToFXXia73ekuJLcLfND8YNeto3oHvsWPi0Gjk0KD50SVn7GpDyA/ZoMimlUEt0LtGRiEL+g hhYxHU2yeplCObd7ZM9pkNSAB45w== X-Received: by 2002:a05:7022:ec1:b0:128:ba6e:f887 with SMTP id a92af1059eb24-12a96f25752mr863597c88.38.1774409525564; Tue, 24 Mar 2026 20:32:05 -0700 (PDT) Received: from [198.18.0.1] ([154.21.86.149]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2c10b35116bsm20573303eec.30.2026.03.24.20.32.03 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 24 Mar 2026 20:32:04 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------nwAIAsOfW0zPfNOYsruN0eSU" Message-ID: Date: Wed, 25 Mar 2026 11:32:01 +0800 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: amcheck: add index-all-keys-match verification for B-Tree To: pgsql-hackers@lists.postgresql.org References: <432626F9-65DF-4F0D-B345-26CFC3E2CFAC@yandex-team.ru> <9A5AEB25-5E58-4657-9064-7D4F8D50A77D@yandex-team.ru> <35809064-01A3-4449-B393-0F71D4C18F7D@yandex-team.ru> Content-Language: en-US From: Wenbo Lin In-Reply-To: <35809064-01A3-4449-B393-0F71D4C18F7D@yandex-team.ru> List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------nwAIAsOfW0zPfNOYsruN0eSU Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Hi Andrey I've been reviewing the patch and ran some concurrent tests against it. I found an issue with false positive corruption reports under concurrent VACUUM. + slot = table_slot_create(state->heaprel, NULL); + found = table_tuple_fetch_row_version(state->heaprel, tid, + SnapshotAny, slot); + if (!found) + { + ExecDropSingleTupleTableSlot(slot); + ereport(ERROR, bt_verify_index_tuple_points_to_heap uses SnapshotAny with table_tuple_fetch_row_version to distinguish "tuple doesn't exist" from "tuple exists but is dead". However, bt_index_check only holds AccessShareLock which compatible with VACUUM's ShareUpdateExclusiveLock. A concurrent VACUUM Phase 1 can prune heap pages(ItemIdSetDead) between Bloom filter probe and the heap lookup. Causing table_tuple_fetch_row_version to return false for a legal dead-but-now-pruned tuple and a false positive corruption report. The table_tuple_satisfies_snapshot check does not help, it only runs when the fetch succeeds(LP_NORMAL). Once VACUUM sets LP_DEAD, heapam_fetch sees !ItemIdIsNormal(lp) and returns false before any snapshot checks. The reproduce should be: DELETE all rows form a big table, then launch VACUUM and bt_index_check concurrently. A POC test script attached. --------------nwAIAsOfW0zPfNOYsruN0eSU Content-Type: text/x-perl-script; charset=UTF-8; name="008_poc_false_positive.pl" Content-Disposition: attachment; filename="008_poc_false_positive.pl" Content-Transfer-Encoding: base64 CiMgUE9DOiBpbmRleGFsbGtleXNtYXRjaCBmYWxzZSBwb3NpdGl2ZSB1bmRlciBjb25jdXJy ZW50IFZBQ1VVTQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzIEZBVEFMID0+ICdhbGwnOwp1 c2UgUG9zdGdyZVNRTDo6VGVzdDo6Q2x1c3RlcjsKdXNlIFBvc3RncmVTUUw6OlRlc3Q6OlV0 aWxzOwp1c2UgVGVzdDo6TW9yZTsKdXNlIElQQzo6UnVuICgpOwoKbXkgJG5vZGUgPSBQb3N0 Z3JlU1FMOjpUZXN0OjpDbHVzdGVyLT5uZXcoJ3JhY2UnKTsKJG5vZGUtPmluaXQ7CiRub2Rl LT5hcHBlbmRfY29uZigncG9zdGdyZXNxbC5jb25mJywgcXsKYXV0b3ZhY3V1bSA9IG9mZgpz aGFyZWRfYnVmZmVycyA9IDMyTUIKfSk7CiRub2RlLT5zdGFydDsKCiRub2RlLT5zYWZlX3Bz cWwoJ3Bvc3RncmVzJywgJ0NSRUFURSBFWFRFTlNJT04gYW1jaGVjaycpOwoKbXkgJHBvcnQg PSAkbm9kZS0+cG9ydDsKbXkgJGhvc3QgPSAkbm9kZS0+aG9zdDsKCiMgMU0gcm93cyB4IH4y MzAgYnl0ZXMgPT4gfjMwSyBoZWFwIHBhZ2VzID0+IFZBQ1VVTSBQaGFzZSAxIHRha2VzIHJl YWwgdGltZQokbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsIHF7CiAgICBDUkVBVEUgVEFC TEUgcmFjZShpZCBpbnQsIHBhZCB0ZXh0KTsKICAgIElOU0VSVCBJTlRPIHJhY2UgU0VMRUNU IGksIHJlcGVhdCgneCcsIDIwMCkKICAgICAgICBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAx MDAwMDAwKSBpOwogICAgQ1JFQVRFIElOREVYIHJhY2VfaWR4IE9OIHJhY2UoaWQpOwogICAg QU5BTFlaRSByYWNlOwp9KTsKCm15ICRmYWxzZV9wb3NpdGl2ZSA9IDA7Cgpmb3IgbXkgJGF0 dGVtcHQgKDEuLjgpCnsKICAgICMgRGVsZXRlIGFsbCByb3dzLiBBZnRlciBjb21taXQsIHR1 cGxlcyBhcmUgTFBfTk9STUFMIHdpdGggeG1heCBzZXQuCiAgICAkbm9kZS0+c2FmZV9wc3Fs KCdwb3N0Z3JlcycsICdERUxFVEUgRlJPTSByYWNlJyk7CgogICAgIyBTdGFydCBib3RoIFZB Q1VVTSBhbmQgYnRfaW5kZXhfY2hlY2sKICAgIG15ICgkdl9vdXQsICR2X2VyciwgJGNfb3V0 LCAkY19lcnIpID0gKCcnLCAnJywgJycsICcnKTsKCiAgICBteSAkdmFjdXVtX2ggPSBJUEM6 OlJ1bjo6c3RhcnQoCiAgICAgICAgWydwc3FsJywgJy1YJywgJy1oJywgJGhvc3QsICctcCcs ICRwb3J0LAogICAgICAgICAnLWQnLCAncG9zdGdyZXMnLCAnLWMnLCAnVkFDVVVNIHJhY2Un XSwKICAgICAgICBcbXkgJHZfaW4sIFwkdl9vdXQsIFwkdl9lcnIpOwoKICAgIG15ICRjaGVj a19oID0gSVBDOjpSdW46OnN0YXJ0KAogICAgICAgIFsncHNxbCcsICctWCcsICctaCcsICRo b3N0LCAnLXAnLCAkcG9ydCwKICAgICAgICAgJy1kJywgJ3Bvc3RncmVzJywgJy1jJywKICAg ICAgICAgIlNFTEVDVCBidF9pbmRleF9jaGVjaygncmFjZV9pZHgnLCBmYWxzZSwgZmFsc2Us IHRydWUpIl0sCiAgICAgICAgXG15ICRjX2luLCBcJGNfb3V0LCBcJGNfZXJyKTsKCiAgICAk Y2hlY2tfaC0+ZmluaXNoOwogICAgJHZhY3V1bV9oLT5maW5pc2g7CgogICAgaWYgKCRjX2Vy ciA9fiAvcG9pbnRzIHRvIG5vbi1leGlzdGVudCBoZWFwIHR1cGxlLykKICAgIHsKICAgICAg ICAkZmFsc2VfcG9zaXRpdmUgPSAxOwogICAgICAgIGRpYWcoIlJhY2UgdHJpZ2dlcmVkIG9u IGF0dGVtcHQgJGF0dGVtcHQiKTsKICAgICAgICBsYXN0OwogICAgfQoKICAgIGRpYWcoIkF0 dGVtcHQgJGF0dGVtcHQ6IG5vIHJhY2UgKGNoZWNrX2Vycj0nJGNfZXJyJykiKTsKCiAgICAj IFJlc3RvcmUgZGF0YSBmb3IgbmV4dCByb3VuZAogICAgJG5vZGUtPnNhZmVfcHNxbCgncG9z dGdyZXMnLCBxewogICAgICAgIFRSVU5DQVRFIHJhY2U7CiAgICAgICAgSU5TRVJUIElOVE8g cmFjZSBTRUxFQ1QgaSwgcmVwZWF0KCd4JywgMjAwKQogICAgICAgICAgICBGUk9NIGdlbmVy YXRlX3NlcmllcygxLCAxMDAwMDAwKSBpOwogICAgICAgIFJFSU5ERVggSU5ERVggcmFjZV9p ZHg7CiAgICB9KTsKfQoKb2soJGZhbHNlX3Bvc2l0aXZlLAogICAnRkFMU0UgUE9TSVRJVkU6 IGluZGV4YWxsa2V5c21hdGNoIHJlcG9ydHMgY29ycnVwdGlvbiBkdXJpbmcgY29uY3VycmVu dCBWQUNVVU0nKTsKCiRub2RlLT5zdG9wOwpkb25lX3Rlc3RpbmcoKTsK --------------nwAIAsOfW0zPfNOYsruN0eSU--