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 1w2Y0m-000O7S-04 for pgsql-hackers@arkaria.postgresql.org; Tue, 17 Mar 2026 17:15:20 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w2Y0k-003SX5-1E for pgsql-hackers@arkaria.postgresql.org; Tue, 17 Mar 2026 17:15:18 +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 1w2Y0k-003SWw-00 for pgsql-hackers@lists.postgresql.org; Tue, 17 Mar 2026 17:15:18 +0000 Received: from meesny.iki.fi ([2001:67c:2b0:1c1::201]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1w2Y0h-00000000dkY-12Ma for pgsql-hackers@postgresql.org; Tue, 17 Mar 2026 17:15:17 +0000 Received: from [10.0.2.15] (unknown [130.41.208.2]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: hlinnaka) by meesny.iki.fi (Postfix) with ESMTPSA id 4fZz9Y3V44zyTB; Tue, 17 Mar 2026 19:15:13 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=meesny; t=1773767713; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type; bh=0lZ/MNDSM3IeVFiTemdF7dTedcp64DGMSQdNOurrwls=; b=gatKPf64JZhWY/o3gP59NtI5FCA3OhvBa2iXlKls9l6BGWshk3BIRuYlK5pPylOrkNXj4Q r3lh0S4NlfsNf27Y841Ma5RhvuEzWuBqR9fv68aZAAKrbJg2JFQDWvoftUiebdUCw+d7bS 44spSN13yvLRavwYJpS6LMRi5/1cd3E= ARC-Seal: i=1; a=rsa-sha256; d=iki.fi; s=meesny; cv=none; t=1773767713; b=ZDWG6uwzNKg7oLpjnxWwhZLtloFXM/XipDiWdQcA2j5tEEVJyyaMOzkZJFSoP8SN5PPSst pY/7wz0xeFMiGLIxWnq9GzLEtOg7ucXaqJTq6P0cnFjtLuLUaZ2FxdBg/j5E22Slfw8eRm o2G4DsLDFFz3W3pYfU3wTw+Dae31O4U= ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=hlinnaka smtp.mailfrom=hlinnaka@iki.fi ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=meesny; t=1773767713; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type; bh=0lZ/MNDSM3IeVFiTemdF7dTedcp64DGMSQdNOurrwls=; b=S3hc/GyFyLbLmJ6CC8dNAIA5CYQXfNupBg2xJPUtkDEcGODYBoaKsWQ2SjJlRUGmOmg2e/ 1HBmQlByNwwUZqXBrA3e9fnNfb4I71NRPjlwdpwOLfgP1Zeq/qOjnkMpk4X0AoE0gYWJiP XT5MV2iGDB12VcmiRQ3ozCoHC+4RsNY= Content-Type: multipart/mixed; boundary="------------CF0zxvZyH38a5Xxko2FPtpPt" Message-ID: Date: Tue, 17 Mar 2026 19:15:10 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US To: Andres Freund , "pgsql-hackers@postgresql.org" From: Heikki Linnakangas Subject: Assertion failure in hash_kill_items() Cc: Alexander Kuzmenkov 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. --------------CF0zxvZyH38a5Xxko2FPtpPt Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit I bumped into an assertion failure, while playing with variants of the test case that Alexander Kuzmenkov wrote to exercise hash index page cleanup [1]. This is master-only, related to the recent changes in how buffers are marked dirty. CREATE TABLE hash_cleanup_heap(keycol INT); CREATE INDEX hash_cleanup_index on hash_cleanup_heap USING HASH (keycol); BEGIN; INSERT INTO hash_cleanup_heap SELECT 1 FROM generate_series(1, 500) as i; ROLLBACK; SET enable_seqscan = off; SET enable_bitmapscan = off; SELECT count(*) FROM hash_cleanup_heap WHERE keycol = 1; TRAP: failed Assert("BufferIsValid(buffer)"), File: "../src/backend/storage/buffer/bufmgr.c", Line: 509, PID: 1275145 postgres: heikki postgres [local] SELECT(ExceptionalCondition+0x84) [0xaaaaecab8650] postgres: heikki postgres [local] SELECT(+0x20498b4) [0xaaaaec4698b4] postgres: heikki postgres [local] SELECT(+0x205db78) [0xaaaaec47db78] postgres: heikki postgres [local] SELECT(BufferBeginSetHintBits+0x44) [0xaaaaec47df58] postgres: heikki postgres [local] SELECT(_hash_kill_items+0xa8c) [0xaaaaeb6a51c8] postgres: heikki postgres [local] SELECT(_hash_next+0x2a8) [0xaaaaeb69d780] postgres: heikki postgres [local] SELECT(hashgettuple+0x5a4) [0xaaaaeb682920] postgres: heikki postgres [local] SELECT(index_getnext_tid+0x4b4) [0xaaaaeb73322c] postgres: heikki postgres [local] SELECT(index_getnext_slot+0x90) [0xaaaaeb733ebc] postgres: heikki postgres [local] SELECT(+0x19507d8) [0xaaaaebd707d8] postgres: heikki postgres [local] SELECT(+0x189a47c) [0xaaaaebcba47c] postgres: heikki postgres [local] SELECT(+0x189a588) [0xaaaaebcba588] postgres: heikki postgres [local] SELECT(ExecScan+0x18c) [0xaaaaebcbab24] postgres: heikki postgres [local] SELECT(+0x1953a00) [0xaaaaebd73a00] postgres: heikki postgres [local] SELECT(+0x188bf9c) [0xaaaaebcabf9c] postgres: heikki postgres [local] SELECT(+0x18cb754) [0xaaaaebceb754] postgres: heikki postgres [local] SELECT(+0x18ccd70) [0xaaaaebcecd70] postgres: heikki postgres [local] SELECT(+0x18dae40) [0xaaaaebcfae40] postgres: heikki postgres [local] SELECT(+0x18d98d8) [0xaaaaebcf98d8] postgres: heikki postgres [local] SELECT(+0x188bf9c) [0xaaaaebcabf9c] postgres: heikki postgres [local] SELECT(+0x1858814) [0xaaaaebc78814] postgres: heikki postgres [local] SELECT(+0x1863318) [0xaaaaebc83318] postgres: heikki postgres [local] SELECT(standard_ExecutorRun+0x594) [0xaaaaebc7a034] The first attached patch fixes it. It's pretty straightforward: the function was using so->currPos.buf, but that's only valid if the page was already pinned on entry to the function. It should be using the local 'buf' variable instead. The second patch simplifies the condition in the 'unlock_page' part. This isn't new, and isn't needed to fix the bug, it just caught my eye while looking at this. I don't understand why the condition was the way it was, checking just 'havePin' seems sufficient and more correct to me. Am I missing something? [1] https://www.postgresql.org/message-id/CALzhyqxrc1ZHYmf5V8NE%2ByMboqVg7xZrQM7K2c7VS0p1v8z42w%40mail.gmail.com - Heikki --------------CF0zxvZyH38a5Xxko2FPtpPt Content-Type: text/x-patch; charset=UTF-8; name="0001-fix-crash-on-killing-items-on-hash-overflow-pages.patch" Content-Disposition: attachment; filename*0="0001-fix-crash-on-killing-items-on-hash-overflow-pages.patch" Content-Transfer-Encoding: base64 RnJvbSBkZTQzM2U0MDkyZTMzZTQ5YTVmMDFjNzFkNWFiNmIzNDMyMDE2N2NkIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBIZWlra2kgTGlubmFrYW5nYXMgPGhlaWtraS5saW5u YWthbmdhc0Bpa2kuZmk+CkRhdGU6IFR1ZSwgMTcgTWFyIDIwMjYgMTk6MDY6MDQgKzAyMDAK U3ViamVjdDogW1BBVENIIDEvMl0gZml4IGNyYXNoIG9uIGtpbGxpbmcgaXRlbXMgb24gaGFz aCBvdmVyZmxvdyBwYWdlcwoKLS0tCiBzcmMvYmFja2VuZC9hY2Nlc3MvaGFzaC9oYXNodXRp bC5jIHwgNCArKy0tCiAxIGZpbGUgY2hhbmdlZCwgMiBpbnNlcnRpb25zKCspLCAyIGRlbGV0 aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9oYXNoL2hhc2h1dGls LmMgYi9zcmMvYmFja2VuZC9hY2Nlc3MvaGFzaC9oYXNodXRpbC5jCmluZGV4IDNlMTYxMTlk MDI3Li4wODFhZGJjODhhNiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL2hhc2gv aGFzaHV0aWwuYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvaGFzaC9oYXNodXRpbC5jCkBA IC02MDAsNyArNjAwLDcgQEAgX2hhc2hfa2lsbF9pdGVtcyhJbmRleFNjYW5EZXNjIHNjYW4p CiAJCQkJCSAqIHVwZGF0ZSB0aGUgcGFnZSB3aGlsZSBqdXN0IGhvbGRpbmcgYSBzaGFyZSBs b2NrLiBJZiB3ZQogCQkJCQkgKiBhcmUgbm90IGFsbG93ZWQsIHRoZXJlJ3Mgbm8gcG9pbnQg Y29udGludWluZy4KIAkJCQkJICovCi0JCQkJCWlmICghQnVmZmVyQmVnaW5TZXRIaW50Qml0 cyhzby0+Y3VyclBvcy5idWYpKQorCQkJCQlpZiAoIUJ1ZmZlckJlZ2luU2V0SGludEJpdHMo YnVmKSkKIAkJCQkJCWdvdG8gdW5sb2NrX3BhZ2U7CiAJCQkJfQogCkBAIC02MjEsNyArNjIx LDcgQEAgX2hhc2hfa2lsbF9pdGVtcyhJbmRleFNjYW5EZXNjIHNjYW4pCiAJaWYgKGtpbGxl ZHNvbWV0aGluZykKIAl7CiAJCW9wYXF1ZS0+aGFzaG9fZmxhZyB8PSBMSF9QQUdFX0hBU19E RUFEX1RVUExFUzsKLQkJQnVmZmVyRmluaXNoU2V0SGludEJpdHMoc28tPmN1cnJQb3MuYnVm LCB0cnVlLCB0cnVlKTsKKwkJQnVmZmVyRmluaXNoU2V0SGludEJpdHMoYnVmLCB0cnVlLCB0 cnVlKTsKIAl9CiAKIHVubG9ja19wYWdlOgotLSAKMi40Ny4zCgo= --------------CF0zxvZyH38a5Xxko2FPtpPt Content-Type: text/x-patch; charset=UTF-8; name="0002-simplify-the-condition-in-unlock_page.patch" Content-Disposition: attachment; filename="0002-simplify-the-condition-in-unlock_page.patch" Content-Transfer-Encoding: base64 RnJvbSA4ZTdlM2Y2ZTYzYzkyZGI4YTdkODEzOWVjNjBjMGZkZWU5ODgzMGFjIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBIZWlra2kgTGlubmFrYW5nYXMgPGhlaWtraS5saW5u YWthbmdhc0Bpa2kuZmk+CkRhdGU6IFR1ZSwgMTcgTWFyIDIwMjYgMTk6MDg6MjEgKzAyMDAK U3ViamVjdDogW1BBVENIIDIvMl0gc2ltcGxpZnkgdGhlIGNvbmRpdGlvbiBpbiAndW5sb2Nr X3BhZ2UnCgotLS0KIHNyYy9iYWNrZW5kL2FjY2Vzcy9oYXNoL2hhc2h1dGlsLmMgfCAzICst LQogMSBmaWxlIGNoYW5nZWQsIDEgaW5zZXJ0aW9uKCspLCAyIGRlbGV0aW9ucygtKQoKZGlm ZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9oYXNoL2hhc2h1dGlsLmMgYi9zcmMvYmFj a2VuZC9hY2Nlc3MvaGFzaC9oYXNodXRpbC5jCmluZGV4IDA4MWFkYmM4OGE2Li4xZDFiMDVm ODc2YSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL2hhc2gvaGFzaHV0aWwuYwor KysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvaGFzaC9oYXNodXRpbC5jCkBAIC02MjUsOCArNjI1 LDcgQEAgX2hhc2hfa2lsbF9pdGVtcyhJbmRleFNjYW5EZXNjIHNjYW4pCiAJfQogCiB1bmxv Y2tfcGFnZToKLQlpZiAoc28tPmhhc2hzb19idWNrZXRfYnVmID09IHNvLT5jdXJyUG9zLmJ1 ZiB8fAotCQloYXZlUGluKQorCWlmIChoYXZlUGluKQogCQlMb2NrQnVmZmVyKHNvLT5jdXJy UG9zLmJ1ZiwgQlVGRkVSX0xPQ0tfVU5MT0NLKTsKIAllbHNlCiAJCV9oYXNoX3JlbGJ1Zihy ZWwsIGJ1Zik7Ci0tIAoyLjQ3LjMKCg== --------------CF0zxvZyH38a5Xxko2FPtpPt--