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 1w9ku3-001iWm-0F for pgsql-hackers@arkaria.postgresql.org; Mon, 06 Apr 2026 14:26: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 1w9ku1-00990K-0E for pgsql-hackers@arkaria.postgresql.org; Mon, 06 Apr 2026 14:26:09 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w9ku0-00990B-1X for pgsql-hackers@lists.postgresql.org; Mon, 06 Apr 2026 14:26:09 +0000 Received: from mail.postgrespro.ru ([93.174.132.70]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1w9ktx-00000000rgT-0Zdb for pgsql-hackers@postgresql.org; Mon, 06 Apr 2026 14:26:07 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mx2023; t=1775485561; bh=Wo8ypFKSj4ZO7DtQ/U6WqGM8PhurOVhY5G0PLWgXZrg=; h=Message-ID:Date:User-Agent:From:Subject:To:Cc:References: In-Reply-To:From; b=Pk2ScpUoxRTRZRvCiDRcvsnQN1es/4zQvibwhKbbnbRXTbfwF7IeruPqAU1SNGcPn z/GJMsNfZ3YZhC07SYJD6OkrAs4g/X8UrivNY73zIBf98lb2Dv7KgA4n4SpNBAEJ1+ kzJHczWMO5KX8QZZn2Tis7kZmicNjTonXVuTVIVG5vM71b3g5PNPR3D6tQ6tibKvvI cBtw/KyqJDpfx9/BNIyDNWsJotZYo6Jasbhiqga8+wvbD/a0OvdmKuq57vokOBFexP LFES1jS05R5DIgN3/EeEaCntbyYCEJDvNi7Q2tYHfhnk0vz/4ADzaKgSvPJMwqzHnO lhUlc9e21fqgA== 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 49CB15FFF5; Mon, 6 Apr 2026 17:26:01 +0300 (MSK) Content-Type: multipart/mixed; boundary="------------JUJXWWHkZ6rND0akDdJcxLvk" Message-ID: <60b79f39-69e5-4c73-a708-6ef1fd5e7980@postgrespro.ru> Date: Mon, 6 Apr 2026 17:26:01 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird From: Alexey Makhmutov Subject: Re: Two issues leading to discrepancies in FSM data on the standby server To: Andrey Borodin Cc: pgsql-hackers@postgresql.org References: <596c4f1c-f966-4512-b9c9-dd8fbcaf0928@postgrespro.ru> <6A6138F4-8D6F-463D-9ECC-38C0881308FE@yandex-team.ru> Content-Language: en-US In-Reply-To: <6A6138F4-8D6F-463D-9ECC-38C0881308FE@yandex-team.ru> X-KSMG-AntiPhishing: NotDetected X-KSMG-AntiSpam-Interceptor-Info: not scanned X-KSMG-AntiSpam-Status: not scanned, disabled by settings X-KSMG-AntiVirus: Kaspersky Secure Mail Gateway, version 2.1.0.7854, bases: 2026/04/06 10:19:00 #28376530 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. --------------JUJXWWHkZ6rND0akDdJcxLvk Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hi Andrey! Thank you for the attention to this patch! > Originally in e981653 was used MarkBufferDirty() but 96ef3b8 flipped to MarkBufferDirtyHint(). > Neither of these commits provided a comment on why this version was chosen. I think if we fix it we must comment things. I think that reason of change in 96ef3b8 (changing of 'MarkBufferDirty' to 'MarkBufferDirtyHint') may be described in the next commit (9df56f6), during the README update: > New WAL records cannot be written during recovery, so hint bits set during recovery must not dirty the page if the buffer is not already dirty, when checksums are enabled. Systems in Hot-Standby mode may benefit from hint bits being set, but with checksums enabled, a page cannot be dirtied after setting a hint bit (due to the torn page risk). So, it must wait for full-page images containing the hint bit updates to arrive from the master. So, it seems logical, that any changes to the data not protected by the WAL (which includes VM and FSM as well) should use MarkBufferDirtyHint, which does not set dirty flag during recovery. However, as FSM blocks could be just zeroed in case of checksums mismatch, so I think it's perfectly fine to use regular MarkBufferDirty here. I've updated the first patch by adding the comment with explanation of the reason for using MarkBufferDirty instead of MarkBufferDirtyHint here. As for the second issue and the patch - it seems to be resolved in the current master by a881cc9, which removed the entire 'heap_xlog_visible' method, as all-visibility information is now sent with the XLOG_HEAP2_PRUNE_VACUUM_CLEANUP message and its handler already uses PageGetHeapFreeSpace. The problem is still relevant for the pre-19 versions, so I will probably move it to the separate thread in bugs. Thanks, Alexey --------------JUJXWWHkZ6rND0akDdJcxLvk Content-Type: text/x-patch; charset=UTF-8; name="0001-Mark-modified-FSM-buffer-as-dirty-during-recovery.patch" Content-Disposition: attachment; filename*0="0001-Mark-modified-FSM-buffer-as-dirty-during-recovery.patch" Content-Transfer-Encoding: base64 RnJvbSAyMDVlMDUwYjg3ODcwNDUwMDg0YTU1YjRmNDI2MjllZjI3NjY4NDQ0IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4ZXkgTWFraG11dG92IDxhLm1ha2htdXRvdkBw b3N0Z3Jlc3Byby5ydT4KRGF0ZTogTW9uLCAxNiBNYXIgMjAyNiAxMzozMjo0NSArMDMwMApT dWJqZWN0OiBbUEFUQ0hdIE1hcmsgbW9kaWZpZWQgRlNNIGJ1ZmZlciBhcyBkaXJ0eSBkdXJp bmcgcmVjb3ZlcnkuCk1JTUUtVmVyc2lvbjogMS4wCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFp bjsgY2hhcnNldD1VVEYtOApDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CgpUaGUg WExvZ1JlY29yZFBhZ2VXaXRoRnJlZVNwYWNlIGZ1bmN0aW9uIHVwZGF0ZXMgZnJlZXNwYWNl IG1hcCAoRlNNKQpkYXRhIHdoaWxlIHJlcGxheWluZyBkYXRhLWxldmVsIFdBTCByZWNvcmRz IGR1cmluZyB0aGUgcmVjb3ZlcnkuIElmIEZTTQpibG9jayBpcyB1cGRhdGVkLCB0aGVuIGl0 IG5lZWQgdG8gYmUgbWFya2VkIGFzIG1vZGlmaWVkIGFuZCBjdXJyZW50bHkKdGhpcyB0YXNr IGlzIHBlcmZvcm1lZCB1c2luZyBNYXJrQnVmZmVyRGlydHlIaW50IGNhbGwgKGFzIGluIGFs bCBvdGhlcgpjYXNlcyBmb3IgbW9kaWZ5aW5nIG9mIEZTTSBkYXRhKS4gSG93ZXZlciwgaW4g cmVjb3ZlcnkgY29udGV4dCB0aGlzCmZ1bmN0aW9uIHdpbGwgYWN0dWFsbHkgZG8gbm90aGlu ZyBpZiBjaGVja3N1bXMgYXJlIGVuYWJsZWQuIEl04oCZcyBhc3N1bWVkCnRoYXQgcGFnZSBz aG91bGQgbm90IGJlIGRpcnRpZWQgZHVyaW5nIHJlY292ZXJ5IHdoaWxlIG1vZGlmeWluZyBo aW50cyB0bwpwcm90ZWN0IGZyb20gdG9ybiBwYWdlcyBhcyBubyBuZXcgV0FMIGRhdGEgY291 bGQgYmUgZ2VuZXJhdGVkIGF0IHRoaXMKcG9pbnQgdG8gc3RvcmUgRlBJLgoKU3VjaCBsb2dp YyBzZWVtcyB0byBiZSBub3QgZnVsbHkgYWxpZ25lZCB3aXRoIHRoZSBGU00gY2FzZSwgYXMg aXRzCmJsb2NrcyBjb3VsZCBiZSBqdXN0IHplcm9lZCBpZiBjaGVja3N1bSBtaXNtYXRjaCBp cyBkZXRlY3RlZC4gQ3VycmVudGx5CmNoYW5nZXMgdG8gYSBGU00gYmxvY2sgY291bGQgYmUg bG9zdCBpZiBlYWNoIGNoYW5nZSB0byB0aGUgcGFydGljdWxhcgpGU00gYmxvY2sgb2NjdXJz IHJhcmVseSBlbm91Z2ggdG8gYWxsb3cgaXRzIGV2aWN0aW9uIGZyb20gdGhlIGNhY2hlLgpU byBwZXJzaXN0IHRoZSBjaGFuZ2UgdGhlIG1vZGlmaWNhdGlvbiBuZWVkIHRvIGJlIHBlcmZv cm1lZCB3aGlsZSBGU00KYmxvY2sgaXMgc3RpbGwga2VwdCBpbiBidWZmZXJzIGFuZCBtYXJr ZWQgYXMgZGlydHkgYWZ0ZXIgcmVjZWl2aW5nIGl0cwpGUEkuIElmIGJsb2NrIHdhcyBhbHJl YWR5IGNsZWFuZWQsIHRoZW4gdGhlIGNoYW5nZSB3b27igJl0IGJlIHBlcnNpc3RlZCwKc28g c3RvcmVkIEZTTSBibG9ja3MgbWF5IHJlbWFpbiBpbiBhbiBvYnNvbGV0ZSBzdGF0ZS4KCklm IGxhcmdlIG51bWJlciBvZiBkaXNjcmVwYW5jaWVzIGJldHdlZW4gdGhlIGRhdGEgaW4gbGVh ZiBGU00gYmxvY2tzIGFuZAphY3R1YWwgZGF0YSBibG9ja3MgaXMgYWNjdW11bGF0ZWQgb24g dGhlIHJlcGxpY2Egc2VydmVyIHNpZGUsIHRoZW4gdGhpcwpjb3VsZCBjYXVzZSBzaWduaWZp Y2FudCBkZWxheXMgZm9yIGluc2VydCBvcGVyYXRpb25zIGFmdGVyIHN3aXRjaG92ZXIuClN1 Y2ggaW5zZXJ0IG9wZXJhdGlvbiBtYXkgbmVlZCB0byB2aXNpdCBtYW55IGRhdGEgYmxvY2tz IG1hcmtlZCBhcwpoYXZpbmcgZW5vdWdoIHNwYWNlIGluIEZTTSBvbmx5IHRvIGRpc2NvdmVy IHRoYXQgdGhpcyBpbmZvcm1hdGlvbiBpcwppbmNvcnJlY3QgYW5kIEZTTSByZWNvcmRzIG5l ZWQgdG8gYmUgZml4ZWQuIEluIGEgaGVhdmlseSB0cmFmZmlja2VkCmluc2VydC1vbmx5IHRh YmxlIHdpdGggbWFueSBjb25jdXJyZW50IGNsaWVudHMgcGVyZm9ybWluZyBpbnNlcnRzIHRo aXMKaGFzIGJlZW4gb2JzZXJ2ZWQgdG8gY2F1c2Ugc2V2ZXJhbCBzZWNvbmQgc3RhbGxzLCBj YXVzaW5nIHZpc2libGUKYXBwbGljYXRpb24gbWFsZnVuY3Rpb24uIFRoZSBkZXNpcmUgdG8g YXZvaWQgc3VjaCBjYXNlcyB3YXMgdGhlIHJlYXNvbgpiZWhpbmQgdGhlIGNvbW1pdCBhYjdk YmQ2ODEsIHdoaWNoIGludHJvZHVjZWQgYW4gdXBkYXRlIG9mIEZTTSBkYXRhCmR1cmluZyB0 aGUgaGVhcF94bG9nX3Zpc2libGUgaW52b2NhdGlvbi4gSG93ZXZlciwgYW4gdXBkYXRlIHRv IHRoZSBGU00KZGF0YSBvbiB0aGUgc3RhbmRieSBzaWRlIGNvdWxkIGJlIGxvc3QgZHVlIHRv IG1pc3NpbmcgJ2RpcnR5JyBmbGFnLCBzbwp0aGVyZSBpcyBzdGlsbCBhIHBvc3NpYmlsaXR5 IHRoYXQgYSBsYXJnZSBudW1iZXIgb2YgRlNNIHJlY29yZHMgd2lsbApjb250YWluIGluY29y cmVjdCBkYXRhLiBOb3RlLCB0aGF0IGhhdmluZyBhIHplcm9lZCBGU00gcGFnZSBpbiBzdWNo IGNhc2UKKGFzIHJlc3VsdCBvZiBjaGVja3N1bSBtaXNtYXRjaCkgaXMgbW9yZSBwcmVmZXJh YmxlLCBhcyB6ZXJvIHZhbHVlIHdpbGwKYmUgaW50ZXJwcmV0ZWQgYXMgaW5kaWNhdGlvbiBv ZiBmdWxsIGRhdGEgYmxvY2tzIGFuZCBpbnNlcnRlciB3aWxsIGJlCmp1c3Qgcm91dGVkIHRv IHRoZSBuZXh0IEZTTSBibG9jayBvciB0byB0aGUgZW5kIG9mIHRoZSB0YWJsZS4KCkdpdmVu IHRoYXQgRlNNIGlzIHJlYWR5IHRvIGhhbmRsZSB0b3JuIHBhZ2Ugd3JpdGVzIGFuZApYTG9n UmVjb3JkUGFnZVdpdGhGcmVlU3BhY2UgaXMgY2FsbGVkIG9ubHkgZHVyaW5nIHRoZSByZWNv dmVyeSwgdGhlcmUKc2VlbXMgdG8gYmUgbm8gcmVhc29uIHRvIHVzZSBNYXJrQnVmZmVyRGly dHlIaW50IGhlcmUgaW5zdGVhZCBvZiBhCnJlZ3VsYXIgTWFya0J1ZmZlckRpcnR5IGNhbGwu Ci0tLQogc3JjL2JhY2tlbmQvc3RvcmFnZS9mcmVlc3BhY2UvZnJlZXNwYWNlLmMgfCAxMiAr KysrKysrKysrKy0KIDEgZmlsZSBjaGFuZ2VkLCAxMSBpbnNlcnRpb25zKCspLCAxIGRlbGV0 aW9uKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9mcmVlc3BhY2UvZnJl ZXNwYWNlLmMgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2ZyZWVzcGFjZS9mcmVlc3BhY2UuYwpp bmRleCA0MGQ2N2E5NjE3OC4uMTYzMWJjNzk4NzIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5k L3N0b3JhZ2UvZnJlZXNwYWNlL2ZyZWVzcGFjZS5jCisrKyBiL3NyYy9iYWNrZW5kL3N0b3Jh Z2UvZnJlZXNwYWNlL2ZyZWVzcGFjZS5jCkBAIC0yMzEsOCArMjMxLDE4IEBAIFhMb2dSZWNv cmRQYWdlV2l0aEZyZWVTcGFjZShSZWxGaWxlTG9jYXRvciBybG9jYXRvciwgQmxvY2tOdW1i ZXIgaGVhcEJsaywKIAlpZiAoUGFnZUlzTmV3KHBhZ2UpKQogCQlQYWdlSW5pdChwYWdlLCBC TENLU1osIDApOwogCisJLyoKKwkgKiBDaGFuZ2VzIHRvIEZTTSBhcmUgdXN1YWxseSBtYXJr ZWQgYXMgY2hhbmdlZCB1c2luZyBNYXJrQnVmZmVyRGlydHlIaW50LAorCSAqIGhvd2V2ZXIg ZHVyaW5nIHJlY292ZXJ5IGl0IGRvZXMgbm90aGluZyBpZiBjaGVja3N1bXMgYXJlIGVuYWJs ZWQuIEl0IGlzCisJICogYXNzdW1lZCB0aGF0IHBhZ2Ugc2hvdWxkIG5vdCBiZSBkaXJ0aWVk IGR1cmluZyByZWNvdmVyeSB3aGlsZSBtb2RpZnlpbmcKKwkgKiBoaW50cyB0byBwcm90ZWN0 IGZyb20gdG9ybiBwYWdlcyBhcyBubyBuZXcgV0FMIGRhdGEgY291bGQgYmUgZ2VuZXJhdGVk CisJICogYXQgdGhpcyBwb2ludCB0byBzdG9yZSBGUEkuIFRoaXMgaXMgbm90IHJlbGV2YW50 IGZvciB0aGUgRlNNIGNhc2UsIGFzCisJICogaXRzIGJsb2NrcyBhcmUganVzdCB6ZXJvZWQg aW4gY2FzZSBvZiBjaGVja3N1bSBtaXNtYXRjaC4gU28sIHdlIG5lZWQgdG8KKwkgKiB1c2Ug cmVndWxhciBNYXJrQnVmZmVyRGlydHkgaGVyZSB0byBhY3R1YWxseSBtYXJrIEZTTSBibG9j ayBhcyBtb2RpZmllZAorCSAqIGR1cmluZyB0aGUgcmVjb3ZlcnksIG90aGVyd2lzZSBjaGFu Z2VzIHRvIHRoZSBGU00gbWF5IGJlIGp1c3QgbG9zdC4KKwkgKi8KIAlpZiAoZnNtX3NldF9h dmFpbChwYWdlLCBzbG90LCBuZXdfY2F0KSkKLQkJTWFya0J1ZmZlckRpcnR5SGludChidWYs IGZhbHNlKTsKKwkJTWFya0J1ZmZlckRpcnR5KGJ1Zik7CiAJVW5sb2NrUmVsZWFzZUJ1ZmZl cihidWYpOwogfQogCi0tIAoyLjUzLjAKCg== --------------JUJXWWHkZ6rND0akDdJcxLvk--