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 1wFxPd-005k6v-2V for pgsql-hackers@arkaria.postgresql.org; Thu, 23 Apr 2026 17:00:26 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wFxPc-002X37-18 for pgsql-hackers@arkaria.postgresql.org; Thu, 23 Apr 2026 17:00:24 +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 1wFxPb-002X2y-2g for pgsql-hackers@lists.postgresql.org; Thu, 23 Apr 2026 17:00:24 +0000 Received: from mail.postgrespro.ru ([93.174.132.70]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1wFxPY-00000002gW5-3hny for pgsql-hackers@lists.postgresql.org; Thu, 23 Apr 2026 17:00:23 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mx2023; t=1776963619; bh=Rnh2axuqaRt1ZcY2lnkMOWJrU7nxhUxpN0zBQeaOt2g=; h=Message-ID:Date:User-Agent:From:Subject:To:Cc:From; b=ihHBbqXxMJmzP6a1DErDmRtlDhsJpLLbW/TQMp1LIP+2jRogvLYa8xhikSRTXan8t yPPdBGLSI/+eCIDB/sQEDQCAwxX1vt4ADFRKXkLpwJs/GgX88TJv+SrYYWY2tnJxia qsGxLfzSsfkfUJicZtDsBtAl6Mvz9e8Cme7BWifnuIFXvNAwKVqn9Mw88GDWCLkSCF eiTzuw1OUEbf3z8LGlj2bP/GvP7UA+RzIp+7WAZ5XJ5Eo+els6i2HgTekjlp7A2cWS M7QLswuMIOZ2/US7JvL/14mmkNicVmLjema2zp98Onxa0kbd02PxWqZp8bjqEvczca JvGc9CIUc7KuA== Received: from [10.3.16.29] (broadband-188-255-38-164.ip.moscow.rt.ru [188.255.38.164]) (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) (Client did not present a certificate) (Authenticated sender: a.makhmutov@postgrespro.ru) by mail.postgrespro.ru (Postfix/465) with ESMTPSA id BA1AA5FF8A; Thu, 23 Apr 2026 20:00:18 +0300 (MSK) Content-Type: multipart/mixed; boundary="------------2PaENFGCRYdzvBAdNs6LAIni" Message-ID: <66c011a7-2f26-4ab9-a5b0-1afcb8523367@postgrespro.ru> Date: Thu, 23 Apr 2026 20:00:18 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US From: Alexey Makhmutov Subject: [Patch][Bug] Incorrect usage of PageGetFreeSpace instead of PageGetHeapFreeSpace in heap_xlog_visible To: PostgreSQL Hackers Cc: Andrey Borodin , Melanie Plageman , Alexander Korotkov X-KSMG-AntiPhishing: NotDetected, bases: 2026/04/23 12:17:00 X-KSMG-AntiSpam-Interceptor-Info: not scanned X-KSMG-AntiSpam-Status: not scanned, disabled by settings X-KSMG-AntiVirus: Kaspersky Secure Mail Gateway, version 3.0.0.9059, bases: 2026/04/23 16:43:00 #28432888 X-KSMG-AntiVirus-Status: NotDetected, skipped X-KSMG-LinksScanning: not scanned, disabled by settings X-KSMG-Message-Action: skipped X-KSMG-Rule-ID: 1 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. --------------2PaENFGCRYdzvBAdNs6LAIni Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit This is a spin-off from the thread https://www.postgresql.org/message-id/flat/596c4f1c-f966-4512-b9c9-dd8fbcaf0928%40postgrespro.ru to cover the second issue discussed in it. This issue is not more relevant for PG19, but is still present in previous versions. In issues seems to be just a small overlook in the ab7dbd6, which used 'PageGetFreeSpace' in 'heap_xlog_visible' function to calculate available space in page block instead of 'PageGetHeapFreeSpace'. The difference between these functions is that ‘PageGetHeapFreeSpace’ additionally checks that there is a space in line pointers section (i.e. checks that MaxHeapTuplesPerPage is not exceeded). If MaxHeapTuplesPerfPage items are already used on the page, then free space for this block need to be reported as 0, as no new tuple could be added to the page. Such case could be observed if page has large number of redirect slots created as result of HOT cleanups. Basically, every code working with heap pages should use ‘PageGetHeapFreeSpace’ rather than ‘PageGetFreeSpace’ and function ‘heap_xlog_visible’ is the only place in the code where ‘PageGetFreeSpace’ is used for heap pages. Usage of incorrect function could cause incorrect data being written to the FSM on replica: if block still have free space, but has already reached the MaxHeapTuplesPerPage limit, then it should be marked as unavailable for new rows in FSM, otherwise inserter will need to check and update its FSM data as well. This issue was already fixed in PG 19 as result of a881cc9, but is still present in previous versions. I think that situation with difference between results of these two functions is rarely observed, but it seems logical to just call the correct function in all cases. A patch is attached which could be applied on PG 14-17 to fix the issue (just replacing PageGetFreeSpace with PageGetHeapFreeSpace). For PG 18 the function was moved to the heapam_xlog.c instead of heapam.c, so patch may need a small adjustment (version attached to the previous thread could be used in this case). A small synthetic test case (test_case2.zip) is also attached. It could simulate a situation leading to the incorrect FSM data on the replica side. The archive contains script ‘test_prepare.sh’, which could be edited to specify path to PG installation and port numbers. Invocation of this script under the 'postgres' OS user creates two databases (master and replica), performs inserts and updates using the 'insert_hot1.sql' script to create block with large number of HOT updates chains and then checks state of the FSM data for the table on both the master and replica server. Without the fix script shows full block (0 free space) on master and partially filled block (~1150 bytes of free space) on replica. With the fix both master and replica correctly shows 0 free space in the block. To stop and cleanup created servers './test_prepare.sh --cleanup' command could be used. Thanks, Alexey --------------2PaENFGCRYdzvBAdNs6LAIni Content-Type: text/x-patch; charset=UTF-8; name="0001-Use-PageGetHeapFreeSpace-in-heap_xlog_visible.patch" Content-Disposition: attachment; filename="0001-Use-PageGetHeapFreeSpace-in-heap_xlog_visible.patch" Content-Transfer-Encoding: base64 RnJvbSAyZDUzNmM0ODUxZmNjZjZlYjRkOGNmMTJkMTU4NjQxNDMyZmEzODAwIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4ZXkgTWFraG11dG92IDxhLm1ha2htdXRvdkBw b3N0Z3Jlc3Byby5ydT4KRGF0ZTogVGh1LCAyMyBBcHIgMjAyNiAxNzo1NDoyMCArMDMwMApT dWJqZWN0OiBbUEFUQ0hdIFVzZSBQYWdlR2V0SGVhcEZyZWVTcGFjZSBpbiBoZWFwX3hsb2df dmlzaWJsZS4KTUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBj aGFyc2V0PVVURi04CkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKCkZyZWUgc3Bh Y2UgaW4gcmVndWxhciBoZWFwIHBhZ2VzIG5lZWQgdG8gYmUgY2FsY3VsYXRlZCB1c2luZwpQ YWdlR2V0SGVhcEZyZWVTcGFjZSByYXRoZXIgdGhhbiBQYWdlR2V0RnJlZVNwYWNlLiBUaGlz IGlzIHJlcXVpcmVkIHRvCnRha2UgaW50byBhY2NvdW50IHRoZSBNYXhIZWFwVHVwbGVzUGVy UGFnZSBsaW1pdCwgb3RoZXJ3aXNlIHBhZ2UgbWF5IGJlCm1hcmtlZCBhcyBoYXZpbmcgZnJl ZSBzcGFjZSB3aGlsZSBpdOKAmXMgaW1wb3NzaWJsZSB0byBhZGQgYW55IG5ldyByb3cgdG8K aXQuCi0tLQogc3JjL2JhY2tlbmQvYWNjZXNzL2hlYXAvaGVhcGFtLmMgfCAyICstCiAxIGZp bGUgY2hhbmdlZCwgMSBpbnNlcnRpb24oKyksIDEgZGVsZXRpb24oLSkKCmRpZmYgLS1naXQg YS9zcmMvYmFja2VuZC9hY2Nlc3MvaGVhcC9oZWFwYW0uYyBiL3NyYy9iYWNrZW5kL2FjY2Vz cy9oZWFwL2hlYXBhbS5jCmluZGV4IGEyYzI3NDVkMTQ4Li4xOTczOTM5MGJkOSAxMDA2NDQK LS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL2hlYXAvaGVhcGFtLmMKKysrIGIvc3JjL2JhY2tl bmQvYWNjZXNzL2hlYXAvaGVhcGFtLmMKQEAgLTkyMzIsNyArOTIzMiw3IEBAIGhlYXBfeGxv Z192aXNpYmxlKFhMb2dSZWFkZXJTdGF0ZSAqcmVjb3JkKQogCiAJaWYgKEJ1ZmZlcklzVmFs aWQoYnVmZmVyKSkKIAl7Ci0JCVNpemUJCXNwYWNlID0gUGFnZUdldEZyZWVTcGFjZShCdWZm ZXJHZXRQYWdlKGJ1ZmZlcikpOworCQlTaXplCQlzcGFjZSA9IFBhZ2VHZXRIZWFwRnJlZVNw YWNlKEJ1ZmZlckdldFBhZ2UoYnVmZmVyKSk7CiAKIAkJVW5sb2NrUmVsZWFzZUJ1ZmZlcihi dWZmZXIpOwogCi0tIAoyLjU0LjAKCg== --------------2PaENFGCRYdzvBAdNs6LAIni Content-Type: application/zip; name="test_case2.zip" Content-Disposition: attachment; filename="test_case2.zip" Content-Transfer-Encoding: base64 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 SwUGAAAAAA0ADQATBAAAbg0AAAAA --------------2PaENFGCRYdzvBAdNs6LAIni--