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 1vtUjH-00BAvV-0X for pgsql-hackers@arkaria.postgresql.org; Fri, 20 Feb 2026 17:55:51 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vtUjG-008lsD-0I for pgsql-hackers@arkaria.postgresql.org; Fri, 20 Feb 2026 17:55:50 +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 1vtUjF-008ls5-2K for pgsql-hackers@lists.postgresql.org; Fri, 20 Feb 2026 17:55:49 +0000 Received: from mail-yw1-x112b.google.com ([2607:f8b0:4864:20::112b]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vtUjC-00000000PxW-3iF8 for pgsql-hackers@postgresql.org; Fri, 20 Feb 2026 17:55:49 +0000 Received: by mail-yw1-x112b.google.com with SMTP id 00721157ae682-79801df2524so22236107b3.0 for ; Fri, 20 Feb 2026 09:55:47 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1771610146; cv=none; d=google.com; s=arc-20240605; b=JfdOn8GoD6zftBkApEmFuUr9lDrZJsZXdrZNlr2+a4dnArsYBHbDicwTrSOaNKztzD JxIEZgWGrAzW58VmICx5x3dLfE2wYMVs1s35wOb8ax9MxrgJx3THfP9QBctvH+umrSli vnLFgGSiTHdTPiUNA3NdYZ9d7mi1KJKqye8q9S6/mJhXwFhO+XH6+lg6ZY5VV1OSej56 FjZ1+Mb2I1HOXWJyxcbaf6kIcFgx5SF4MrJcO13yk+TNF7sOgFYv+UVuygH/ySXsMyUV yAuAVNqBxwM//5thG/y6j9JvPb6no2Jn/BHDdpYGkHjMyjNcC7kCaKzcoasB8+Ldp3eV sxwA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=hcDawflxuC0QmgaVgsd1S4WPbaL8JfUJSCqYNJ6xULs=; fh=waPnKahtqrjL6e5lDHONXgAYWW+1/EnTYqDmUsP0vmM=; b=ZtVnUAkkK15Bve5q5nLJ/1w/Ygzeb6wGLE8pkyanfVw+ZLWSfozifxiXKZvpczxw7B 7TCZA/hn38yUzW4+frorFuOPySDSYINALK8LXAdhxGrGct91NzQCNScnVvd6Lx5dqk4l u3+6ZIlS74DbmUATmd5Yl1KDSsxHMb6IMQWQ2cBhJF57lOoR34+t66TW7dzk3IjsQSo/ qKAiFf1+ZbLO8m+jDQ8DWB57eDo4mMiPvbicWn7ordMuccVgK4m2tjKoclUhyN4BQloU qISVMicGWjHoG436HBi/Lg2WeJKaFJbul6GML8MHpYk2NQuiVlVsDJD2tYKP12UEJ/+l mQIw==; darn=postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=datadoghq.com; s=google; t=1771610146; x=1772214946; darn=postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=hcDawflxuC0QmgaVgsd1S4WPbaL8JfUJSCqYNJ6xULs=; b=FVjuf4hwzpqB7SUR32QbfiwKuSBngTJNEsIhNyF0Xb0zVT+Xdzpzs1ByA0BceacVOv OCzcEMc2dpp5/JO4ka83KJsB/csDehZUL9iA+8avSViPEsTP0Mrhugku0aN1h1rnPCJQ dzhF8isZGczz7NcwpxYAI9v65n2pmc+/S26eU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771610146; x=1772214946; h=to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=hcDawflxuC0QmgaVgsd1S4WPbaL8JfUJSCqYNJ6xULs=; b=ArgcClzoJOm06qsaaVK7v+G4w2nx8XxJgzZLH/NFXock25sTPtYui+cWKx9afeGiD6 6QA/fnRBnvF7bk+LyBfdW6YQXhQOmki/VQh/quLDnyBaair0EhZhbflNKdlpGQpK3e1r tqfMNxfYEqCU8/2qMBUu8+ClBzEPC12YeDnVrJDU/X2QkMJDFMHGbyq2RcPxoWfStymY TOTwv21fwI8k+pWdInJvbSQK12DQZhtFsaDWwqUiAnEa6hyxo0Qx9Yt27URtI9AY2iUm dMZVdNG1PfPX2guRuT8UbXTBJVtafDByKPTpM15/ECy05aqXVvDa5GvQeFVh2ZfKjGBu yuUQ== X-Gm-Message-State: AOJu0YyR4y8aBOz1yIN59SIuE8JoX7Pv+QGSgfCKbGlzZnzkYicKeMzo wc9uqgXTnzEvOGsxzPNwYSbwoGK1AOgJq8b3SlVuqA/JU5VGptcz6v9TJU2LXN+wiEt2fBlBQ9B nWU+cxhBWGIuA0VEVrKs+bcf5Rtw1SwKnW41iX4PCTTne9STCH+fTw1JlaQ== X-Gm-Gg: AZuq6aKNtJzQ1qHbMc/s0GZIPlDFAmsT4q0MUrbRnPhn/ZAK6gnviutk0fJquE0gd2G 9ClcrlT71xBdO1iARbo7/6D6ZcZRHGXOY4jkrWMnCgJeM6yp5oFnsbk+zpabr0/1MenFCwADBkV nOB52Phh9hBZaDLEWe9cZDH3w2gUb8ULYrpqmVZN3IRkBeqUgS02+mqduJwCh8lL446PjCpT1+E A1GLklMat8eL5VlOmOM/d0Xvi1z2fsz/R78YkhjIPE+6Ki+h4R1hMQX15zxNlOnSbLQZYjyuiCh fRbPrHBbkT2WDHglTHZv0P5mqITVp5X5efNazHuHYhoIr2VAlZI= X-Received: by 2002:a05:690c:81:b0:796:3df7:9b96 with SMTP id 00721157ae682-798291856e4mr8199237b3.55.1771610145023; Fri, 20 Feb 2026 09:55:45 -0800 (PST) MIME-Version: 1.0 From: Anthonin Bonnefoy Date: Fri, 20 Feb 2026 18:55:33 +0100 X-Gm-Features: AaiRm53Db7izXYwOakLqCXY-99u_VrSqKMmwCcclUROJgLwAVH5TQLNR-GSqHaQ Message-ID: Subject: Shutdown indefinitely stuck due to unflushed FPI_FOR_HINT record To: PostgreSQL Hackers Content-Type: multipart/mixed; boundary="00000000000060ade5064b4521f1" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000060ade5064b4521f1 Content-Type: text/plain; charset="UTF-8" Hi, Shutdown may be indefinitely stuck under the following circumstances: - Data checksum is enabled (needed to generate FPI_FOR_HINT record) - A logical replication walsender is running - A select in an explicit ongoing transaction pruned a heap page and logged a FPI_FOR_HINT record. This record is likely going to be a contrecord and start a new page. Starting the shutdown will kill this ongoing transaction. Since the transaction doesn't have an allocated xid, the FPI_FOR_HINT record will be left unflushed. When the checkpointer calls ShutdownXLOG(), all walsenders will be notified to stop. However, the logical replication walsender will be stuck in an infinite loop, trying to read this unflushed record and never reaching the stop state, blocking the whole shutdown sequence. This can be reproduced with the following script (this assumes `pgbench -i` was run to create pgbench_accounts and a running logical replication walsender): TRUNCATE pgbench_accounts; -- Completely fill the first heap page INSERT INTO pgbench_accounts SELECT *, *, *, '' FROM generate_series(0, 62); -- This should tag the page's metadata as full BEGIN; UPDATE pgbench_accounts SET bid=4 where aid=1; ROLLBACK; -- Force checkpoint so next change will be a FPW CHECKPOINT; -- Open an explicit transaction BEGIN; -- Select will do an opportunistic pruning, find nothing to prune but will still unset the page full flag, writing a FPI_FOR_HINT SELECT ctid, * FROM pgbench_accounts WHERE aid=2; Then shutdown the database with 'pg_ctl stop' with the transaction left opened. The shutdown will be stuck and the logical replication walsender will be stuck at 100% CPU. I've managed to reproduce this issue on 14 and the current HEAD. The attached (tentative) patch fixes the issue by flushing all records before signaling walsenders to stop. At that point, all backends should have been killed, so flushing leftover records felt like a correct approach. Regards, Anthonin Bonnefoy --00000000000060ade5064b4521f1 Content-Type: application/octet-stream; name="v1-0001-Fix-stuck-shutdown-due-to-unflushed-records.patch" Content-Disposition: attachment; filename="v1-0001-Fix-stuck-shutdown-due-to-unflushed-records.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mlv6tg3r0 RnJvbSBmNjJiNmI0NTU5NGI0ZDU4ZmZlNzM5Y2E0MmVjZDNhY2E2NjA1YzRjIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbnRob25pbiBCb25uZWZveSA8YW50aG9uaW4uYm9ubmVmb3lA ZGF0YWRvZ2hxLmNvbT4KRGF0ZTogRnJpLCAyMCBGZWIgMjAyNiAxODoxNToxMiArMDEwMApTdWJq ZWN0OiBGaXggc3R1Y2sgc2h1dGRvd24gZHVlIHRvIHVuZmx1c2hlZCByZWNvcmRzCgpTaHV0ZG93 biBzZXF1ZW5jZSBtYXkgYmUgc3R1Y2sgaW5kZWZpbml0ZWx5IHVuZGVyIHRoZSBmb2xsb3dpbmcK Y2lyY3Vtc3RhbmNlczoKLSBEYXRhIGNoZWNrc3VtcyBpcyBlbmFibGVkCi0gQSBsb2dpY2FsIHJl cGxpY2F0aW9uIHdhbHNlbmRlciBpcyBydW5uaW5nCi0gQSBzZWxlY3QgaW4gYW4gZXhwbGljaXQg b25nb2luZyB0cmFuc2FjdGlvbiBwcnVuZWQgYSBoZWFwIHBhZ2UgYW5kCiAgbG9nZ2VkIGEgRlBJ X0ZPUl9ISU5UIHJlY29yZC4gVGhpcyByZWNvcmQgaXMgbGlrZWx5IGdvaW5nIHRvIGJlIGEKICBj b250cmVjb3JkIGFuZCBzdGFydCBhIG5ldyBwYWdlLgoKU3RhcnRpbmcgdGhlIHNodXRkb3duIHdp bGwga2lsbCB0aGlzIG9uZ29pbmcgdHJhbnNhY3Rpb24uIFNpbmNlIHRoZQp0cmFuc2FjdGlvbiBk b2Vzbid0IGhhdmUgYW4gYWxsb2NhdGVkIHhpZCwgdGhlIEZQSV9GT1JfSElOVCByZWNvcmQgd2ls bApiZSBsZWZ0IHVuZmx1c2hlZC4KCldoZW4gdGhlIGNoZWNrcG9pbnRlciBzdGFydHMgU2h1dGRv d25YTE9HKCksIGFsbCB3YWxzZW5kZXJzIHdpbGwgYmUKbm90aWZpZWQgdG8gc3RvcC4gSG93ZXZl ciwgdGhlIGxvZ2ljYWwgcmVwbGljYXRpb24gd2Fsc2VuZGVyIHdpbGwgYmUKc3R1Y2sgaW4gYW4g aW5maW5pdGUgbG9vcCwgdHJ5aW5nIHRvIHJlYWQgdGhpcyB1bmZsdXNoZWQgcmVjb3JkLCBuZXZl cgpyZWFjaGluZyB0aGUgc3RvcCBzdGF0ZSBhbmQgYmxvY2tpbmcgdGhlIHdob2xlIHNodXRkb3du IHNlcXVlbmNlLgoKVGhpcyBwYXRjaCBmaXhlcyB0aGUgaXNzdWUgYnkgZmx1c2hpbmcgYWxsIHJl Y29yZHMgYmVmb3JlIHNpZ25hbGluZwp3YWxzZW5kZXJzIHRvIHN0b3AuCi0tLQogc3JjL2JhY2tl bmQvYWNjZXNzL3RyYW5zYW0veGxvZy5jIHwgMTEgKysrKysrKysrKysKIDEgZmlsZSBjaGFuZ2Vk LCAxMSBpbnNlcnRpb25zKCspCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5z YW0veGxvZy5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZy5jCmluZGV4IDEzZWM2 MjI1Yjg1Li5hYTQ5MDE3NmFhZiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5z YW0veGxvZy5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2cuYwpAQCAtNjcy Nyw2ICs2NzI3LDggQEAgR2V0TGFzdFNlZ1N3aXRjaERhdGEoWExvZ1JlY1B0ciAqbGFzdFN3aXRj aExTTikKIHZvaWQKIFNodXRkb3duWExPRyhpbnQgY29kZSwgRGF0dW0gYXJnKQogeworCVhMb2dS ZWNQdHIJV3JpdGVScXN0UHRyOworCiAJLyoKIAkgKiBXZSBzaG91bGQgaGF2ZSBhbiBhdXggcHJv Y2VzcyByZXNvdXJjZSBvd25lciB0byB1c2UsIGFuZCB3ZSBzaG91bGQgbm90CiAJICogYmUgaW4g YSB0cmFuc2FjdGlvbiB0aGF0J3MgaW5zdGFsbGVkIHNvbWUgb3RoZXIgcmVzb3duZXIuCkBAIC02 NzQwLDYgKzY3NDIsMTUgQEAgU2h1dGRvd25YTE9HKGludCBjb2RlLCBEYXR1bSBhcmcpCiAJZXJl cG9ydChJc1Bvc3RtYXN0ZXJFbnZpcm9ubWVudCA/IExPRyA6IE5PVElDRSwKIAkJCShlcnJtc2co InNodXR0aW5nIGRvd24iKSkpOwogCisJLyoKKwkgKiBXZSBtYXkgaGF2ZSB1bmZsdXNoZWQgcmVj b3JkcywgbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgZmx1c2hlZCBiZWZvcmUKKwkgKiBzdG9wcGlu ZyB0aGUgd2Fsc2VuZGVycy4KKwkgKi8KKwlTcGluTG9ja0FjcXVpcmUoJlhMb2dDdGwtPmluZm9f bGNrKTsKKwlXcml0ZVJxc3RQdHIgPSBYTG9nQ3RsLT5Mb2d3cnRScXN0LldyaXRlOworCVNwaW5M b2NrUmVsZWFzZSgmWExvZ0N0bC0+aW5mb19sY2spOworCVhMb2dGbHVzaChXcml0ZVJxc3RQdHIp OworCiAJLyoKIAkgKiBTaWduYWwgd2Fsc2VuZGVycyB0byBtb3ZlIHRvIHN0b3BwaW5nIHN0YXRl LgogCSAqLwotLSAKMi41Mi4wCgo= --00000000000060ade5064b4521f1--