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 1w3Oiy-001BDJ-0r for pgsql-hackers@arkaria.postgresql.org; Fri, 20 Mar 2026 01:32:29 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w3Oiw-003nQN-1N for pgsql-hackers@arkaria.postgresql.org; Fri, 20 Mar 2026 01:32:26 +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 1w3Oiv-003nQA-2v for pgsql-hackers@lists.postgresql.org; Fri, 20 Mar 2026 01:32:26 +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 1w3Ois-000000006MZ-2t0X for pgsql-hackers@postgresql.org; Fri, 20 Mar 2026 01:32:25 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mx2023; t=1773970341; bh=ksI9Tjfb/ix2N2FJzwuMAFXADHcyfDr10+2J9Xh5W/g=; h=Message-ID:Date:User-Agent:From:Subject:To:From; b=pBH5mdnVn1bGSDbip7N55ubMiqzm54iq6cSj7LVm4uI8QJRRtJrGlXUs1ODTlQfuN cWy8FvfYWtTVijXBx+2UTsqBW9NI6/fX85NiUGXZ47cPODndjiHBUWiVjLWB7N8bSr ThxvjHUs5qpufgIP50YKxuTUut/1inQYovfApSg94YEcoA4J4xNQpPY9nAjwh2e4yq ZKTZllaBFZOJ2o5VUuv1uzJZLYVbI0ThCy5e1ssZa23xaZ1G/XzTiTuZPCzW/Uxw2D rk9uHJMXR+JsrcuQ8idm0T2OmdZ/cV8KILgM4iWHxiy7aelN/AYvHAO26dDLn0zFh6 xwdrU0x26xNNQ== Received: from [172.30.48.98] (debian11-template.l.postgrespro.ru [192.168.2.254]) (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 34F9B5FFA8 for ; Fri, 20 Mar 2026 04:32:21 +0300 (MSK) Content-Type: multipart/mixed; boundary="------------GC08OXpKcnwp4ZBykL3oACGt" Message-ID: <596c4f1c-f966-4512-b9c9-dd8fbcaf0928@postgrespro.ru> Date: Fri, 20 Mar 2026 04:32:20 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US From: Alexey Makhmutov Subject: Two issues leading to discrepancies in FSM data on the standby server To: pgsql-hackers@postgresql.org X-KSMG-AntiPhishing: NotDetected, bases: 2026/03/20 00:54: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 2.1.0.7854, bases: 2026/03/20 00:01:00 #28304152 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. --------------GC08OXpKcnwp4ZBykL3oACGt Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit We’ve recently observed a situation with significant increase in response time for insert operations after switching to a replica server. The collected information pointed to the discrepancy in the FSM data on the replica side, which became visible to the insert sessions once autovacuum process pulled incorrect data from from leaf blocks into FSM root. The entire situation was looking like the case discussed in https://postgr.es/m/20180802172857.5skoexsilnjvgruk@alvherre.pgsql and which was supposed to be fixed by ‘ab7dbd681’ (which introduced FSM update during 'heap_xlog_visible' invocation). However in our case and synthetic tests we were able to see data blocks marked as ‘all visible’, but still having incorrect FSM records. After analyzing the code I’ve noticed that during recovery FSM data is updated in XLogRecordPageWithFreeSpace, which uses MarkBufferDirtyHint to mark FSM block as modified. However, if data checksums are enabled, then this call does nothing during recovery and is actually a no-op – basically it just exits immediately without marking block as dirty. The logic here is that as no new WAL data could not be generated during the recovery, so changes to hints in block should not mark block as dirty to avoid risk of torn pages being written. This seems logical, but it seems not aligned well with the FSM case, as its blocks could be just zeroed if checksum mismatch is detected. Currently changes to a FSM block could be lost if each change to the particular FSM block occur rarely enough to allow its eviction from the cache. To persist the change the modification need to be performed while FSM block is still kept in buffers and marked as dirty after receiving its FPI. If block was already cleaned, then the change won’t be persisted and stored FSM blocks may remain in an obsolete state. In our case the table had its 'fillfactor' parameter set below 80, so during insert bursts each FSM block on replica side was modified only during first access of FSM block since checkpoint (with FPI) and then by processing XLOG_HEAP2_VISIBLE record for data once it was marked as ‘all visible’. This gives plenty of time to cleanup buffer between these moments, so the second change was just never written to the disk. So, large number of blocks were left with incorrect data in FSM leaf blocks, which caused problem after switchover. Given that FSM is ready to handle torn page writes and XLogRecordPageWithFreeSpace is called only during the recovery there seems to be no reason to use MarkBufferDirtyHint here instead of a regular MarkBufferDirty call. The code is already trying to limit updates to the FSM (i.e. by updating it only after reaching 80% of used space for regular DML), so we probably want to ensure that these updates are actually persisted. The second noticed issue (not related to our observed problem) is related to the ‘heap_xlog_visible’ – this function uses ‘PageGetFreeSpace’ call instead of ‘PageGetHeapFreeSpace’ to get size of free space for regular heap blocks. This seems like a bug, as method 'PageGetHeapFreeSpace' is used for any other case where we need to get free space for a heap page. Usage of incorrect function could also cause incorrect data being written to the FSM on replica: if block still have free space, but already reached 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. Attached are separate patches, which tries to fixes both these problems – calling ‘MarkBufferDirty’ instead of ‘MarkBufferDirtyHint’ in the first case and replacing ‘PageGetFreeSpace’ with ‘PageGetHeapFreeSpace’ in the second case. Two synthetic test cases are also attached which simulates both these situations – ‘test_case1.zip’ to simulate the problem with lost FSM update on replica side and ‘test_case2.zip’ to simulate incorrect FSM data on standby server for blocks with large number of redirect slots. In both cases the ‘test_prepare.sh’ script could be edited to specify path to PG installation and port numbers. Then invoke ‘test_preapre.sh’ script to prepare two databases. For first case the second script ‘test_run.sh’ need to be invoked after that to show large number of blocks being visited for simple insert and for second test case state of the FSM (for single block) is just displayed at the end of ‘test_prepare.sh’. Thanks, Alexey --------------GC08OXpKcnwp4ZBykL3oACGt 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 RnJvbSAzYTUxYTRmM2E5MjBiZWQ1NjkxMGFlMzhmMWMzZjEyMDU5NjQ5YzU2IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4ZXkgTWFraG11dG92IDxhLm1ha2htdXRvdkBw b3N0Z3Jlc3Byby5ydT4KRGF0ZTogTW9uLCAxNiBNYXIgMjAyNiAxMzozMjo0NSArMDMwMApT dWJqZWN0OiBbUEFUQ0ggMS8yXSBNYXJrIG1vZGlmaWVkIEZTTSBidWZmZXIgYXMgZGlydHkg ZHVyaW5nIHJlY292ZXJ5LgpNSU1FLVZlcnNpb246IDEuMApDb250ZW50LVR5cGU6IHRleHQv cGxhaW47IGNoYXJzZXQ9VVRGLTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAoK VGhlIFhMb2dSZWNvcmRQYWdlV2l0aEZyZWVTcGFjZSBmdW5jdGlvbiB1cGRhdGVzIGZyZWVz cGFjZSBtYXAgKEZTTSkKZGF0YSB3aGlsZSByZXBsYXlpbmcgZGF0YS1sZXZlbCBXQUwgcmVj b3JkcyBkdXJpbmcgdGhlIHJlY292ZXJ5LiBJZiBGU00KYmxvY2sgaXMgdXBkYXRlZCwgdGhl biBpdCBuZWVkIHRvIGJlIG1hcmtlZCBhcyBtb2RpZmllZCBhbmQgY3VycmVudGx5CnRoaXMg dGFzayBpcyBwZXJmb3JtZWQgdXNpbmcgTWFya0J1ZmZlckRpcnR5SGludCBjYWxsIChhcyBp biBhbGwgb3RoZXIKY2FzZXMgZm9yIG1vZGlmeWluZyBvZiBGU00gZGF0YSkuIEhvd2V2ZXIs IGluIHJlY292ZXJ5IGNvbnRleHQgdGhpcwpmdW5jdGlvbiB3aWxsIGFjdHVhbGx5IGRvIG5v dGhpbmcgaWYgY2hlY2tzdW1zIGFyZSBlbmFibGVkLiBJdOKAmXMgYXNzdW1lZAp0aGF0IHBh Z2Ugc2hvdWxkIG5vdCBiZSBkaXJ0aWVkIGR1cmluZyByZWNvdmVyeSB3aGlsZSBtb2RpZnlp bmcgaGludHMgdG8KcHJvdGVjdCBmcm9tIHRvcm4gcGFnZXMgYXMgbm8gbmV3IFdBTCBkYXRh IGNvdWxkIGJlIGdlbmVyYXRlZCBhdCB0aGlzCnBvaW50IHRvIHN0b3JlIEZQSS4KClN1Y2gg bG9naWMgc2VlbXMgdG8gYmUgbm90IGZ1bGx5IGFsaWduZWQgd2l0aCB0aGUgRlNNIGNhc2Us IGFzIGl0cwpibG9ja3MgY291bGQgYmUganVzdCB6ZXJvZWQgaWYgY2hlY2tzdW0gbWlzbWF0 Y2ggaXMgZGV0ZWN0ZWQuIEN1cnJlbnRseQpjaGFuZ2VzIHRvIGEgRlNNIGJsb2NrIGNvdWxk IGJlIGxvc3QgaWYgZWFjaCBjaGFuZ2UgdG8gdGhlIHBhcnRpY3VsYXIKRlNNIGJsb2NrIG9j Y3VyIHJhcmVseSBlbm91Z2ggdG8gYWxsb3cgaXRzIGV2aWN0aW9uIGZyb20gdGhlIGNhY2hl LgpUbyBwZXJzaXN0IHRoZSBjaGFuZ2UgdGhlIG1vZGlmaWNhdGlvbiBuZWVkIHRvIGJlIHBl cmZvcm1lZCB3aGlsZSBGU00KYmxvY2sgaXMgc3RpbGwga2VwdCBpbiBidWZmZXJzIGFuZCBt YXJrZWQgYXMgZGlydHkgYWZ0ZXIgcmVjZWl2aW5nIGl0cwpGUEkuIElmIGJsb2NrIHdhcyBh bHJlYWR5IGNsZWFuZWQsIHRoZW4gdGhlIGNoYW5nZSB3b27igJl0IGJlIHBlcnNpc3RlZAph bmQgc3RvcmVkIEZTTSBibG9ja3MgbWF5IHJlbWFpbiBpbiBhbiBvYnNvbGV0ZSBzdGF0ZS4K CklmIGxhcmdlIG51bWJlciBvZiBkaXNjcmVwYW5jaWVzIGJldHdlZW4gZGF0YSBpbiBsZWFm IEZTTSBibG9ja3MgYW5kCmFjdHVhbCBkYXRhIGJsb2NrcyBpcyBhY2N1bXVsYXRlZCBvbiB0 aGUgcmVwbGljYSBzZXJ2ZXIgc2lkZSwgdGhlbiB0aGlzCmNvdWxkIGNhdXNlIHNpZ25pZmlj YW50IGRlbGF5cyBmb3IgaW5zZXJ0IG9wZXJhdGlvbnMgYWZ0ZXIgc3dpdGNob3Zlci4KU3Vj aCBpbnNlcnQgb3BlcmF0aW9uIG1heSBuZWVkIHRvIHZpc2l0IG1hbnkgZGF0YSBibG9ja3Mg bWFya2VkIGFzCmhhdmluZyBlbm91Z2ggc3BhY2UgaW4gRlNNIG9ubHkgdG8gZGlzY292ZXIg dGhhdCB0aGlzIGluZm9ybWF0aW9uIGlzCmluY29ycmVjdCBhbmQgRlNNIHJlY29yZHMgbmVl ZCB0byBiZSBmaXhlZC4gSW4gYSBoZWF2aWx5IHRyYWZmaWNrZWQKaW5zZXJ0LW9ubHkgdGFi bGUgd2l0aCBtYW55IGNvbmN1cnJlbnQgY2xpZW50cyBwZXJmb3JtaW5nIGluc2VydHMgdGhp cwpoYXMgYmVlbiBvYnNlcnZlZCB0byBjYXVzZSBzZXZlcmFsIHNlY29uZCBzdGFsbHMsIGNh dXNpbmcgdmlzaWJsZQphcHBsaWNhdGlvbiBtYWxmdW5jdGlvbi4gRGVzaXJlIHRvIGF2b2lk IHN1Y2ggY2FzZXMgd2FzIGEgcmVhc29uIGJlaGluZAp0aGUgY29tbWl0IGFiN2RiZDY4MSwg d2hpY2ggaW50cm9kdWNlZCB1cGRhdGUgb2YgRlNNIGRhdGEgZHVyaW5nIHRoZQpoZWFwX3hs b2dfdmlzaWJsZSBpbnZvY2F0aW9uLiBIb3dldmVyLCBhcyB1cGRhdGUgdG8gdGhlIEZTTSBk YXRhIG9uIHRoZQpzdGFuZGJ5IHNpZGUgY291bGQgYmUgbG9zdCBkdWUgdG8gbWlzc2luZyBk aXJ0eSBmbGFnLCBzbyB0aGVyZSBpcyBzdGlsbAphIHBvc3NpYmlsaXR5IG9mIGhpdHRpbmcg c3VjaCBzaXR1YXRpb24uIE5vdGUsIHRoYXQgaGF2aW5nIGEgemVyb2VkIEZTTQpwYWdlIGlu IHN1Y2ggY2FzZSAoYXMgcmVzdWx0IG9mIGNoZWNrc3VtIG1pc21hdGNoKSBpcyBtb3JlIHBy ZWZlcmFibGUsCmFzIHplcm8gdmFsdWUgd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBpbmRpY2F0 aW9uIG9mIGZ1bGwgZGF0YSBibG9ja3MgYW5kCmluc2VydGVyIHdpbGwgYmUganVzdCByb3V0 ZWQgdG8gdGhlIG5leHQgRlNNIGJsb2NrIG9yIHRvIHRoZSBlbmQgb2YgdGhlCnRhYmxlLgoK R2l2ZW4gdGhhdCBGU00gaXMgcmVhZHkgdG8gaGFuZGxlIHRvcm4gcGFnZSB3cml0ZXMgYW5k ClhMb2dSZWNvcmRQYWdlV2l0aEZyZWVTcGFjZSBpcyBjYWxsZWQgb25seSBkdXJpbmcgdGhl IHJlY292ZXJ5IHRoZXJlCnNlZW1zIHRvIGJlIG5vIHJlYXNvbiB0byB1c2UgTWFya0J1ZmZl ckRpcnR5SGludCBoZXJlIGluc3RlYWQgb2YgYQpyZWd1bGFyIE1hcmtCdWZmZXJEaXJ0eSBj YWxsLgotLS0KIHNyYy9iYWNrZW5kL3N0b3JhZ2UvZnJlZXNwYWNlL2ZyZWVzcGFjZS5jIHwg MiArLQogMSBmaWxlIGNoYW5nZWQsIDEgaW5zZXJ0aW9uKCspLCAxIGRlbGV0aW9uKC0pCgpk aWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9mcmVlc3BhY2UvZnJlZXNwYWNlLmMg Yi9zcmMvYmFja2VuZC9zdG9yYWdlL2ZyZWVzcGFjZS9mcmVlc3BhY2UuYwppbmRleCBiOWE4 ZjM2OGE2My4uNWM1ZDg2YmMxMDYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0b3JhZ2Uv ZnJlZXNwYWNlL2ZyZWVzcGFjZS5jCisrKyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvZnJlZXNw YWNlL2ZyZWVzcGFjZS5jCkBAIC0yMzIsNyArMjMyLDcgQEAgWExvZ1JlY29yZFBhZ2VXaXRo RnJlZVNwYWNlKFJlbEZpbGVMb2NhdG9yIHJsb2NhdG9yLCBCbG9ja051bWJlciBoZWFwQmxr LAogCQlQYWdlSW5pdChwYWdlLCBCTENLU1osIDApOwogCiAJaWYgKGZzbV9zZXRfYXZhaWwo cGFnZSwgc2xvdCwgbmV3X2NhdCkpCi0JCU1hcmtCdWZmZXJEaXJ0eUhpbnQoYnVmLCBmYWxz ZSk7CisJCU1hcmtCdWZmZXJEaXJ0eShidWYpOwogCVVubG9ja1JlbGVhc2VCdWZmZXIoYnVm KTsKIH0KIAotLSAKMi41My4wCgo= --------------GC08OXpKcnwp4ZBykL3oACGt Content-Type: text/x-patch; charset=UTF-8; name="0002-Use-PageGetHeapFreeSpace-in-heap_xlog_visible.patch" Content-Disposition: attachment; filename="0002-Use-PageGetHeapFreeSpace-in-heap_xlog_visible.patch" Content-Transfer-Encoding: base64 RnJvbSBlN2JhMTEzNDlkZmE2YzBkYzI1MDU2MmMxM2M4ZGI5MGQ1M2RjZGFiIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4ZXkgTWFraG11dG92IDxhLm1ha2htdXRvdkBw b3N0Z3Jlc3Byby5ydT4KRGF0ZTogTW9uLCAxNiBNYXIgMjAyNiAxMzozMzoxMCArMDMwMApT dWJqZWN0OiBbUEFUQ0ggMi8yXSBVc2UgUGFnZUdldEhlYXBGcmVlU3BhY2UgaW4gaGVhcF94 bG9nX3Zpc2libGUuCk1JTUUtVmVyc2lvbjogMS4wCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFp bjsgY2hhcnNldD1VVEYtOApDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CgpGcmVl IHNwYWNlIGluIHJlZ3VsYXIgaGVhcCBwYWdlcyBuZWVkIHRvIGJlIGNhbGN1bGF0ZWQgdXNp bmcKUGFnZUdldEhlYXBGcmVlU3BhY2UgcmF0aGVyIHRoYW4gUGFnZUdldEZyZWVTcGFjZS4g VGhpcyBpcyByZXF1aXJlZCB0bwp0YWtlIGludG8gYWNjb3VudCB0aGUgTWF4SGVhcFR1cGxl c1BlclBhZ2UgbGltaXQsIG90aGVyd2lzZSBwYWdlIG1heSBiZQptYXJrZWQgYXMgaGF2aW5n IGZyZWUgc3BhY2Ugd2hpbGUgaXTigJlzIGltcG9zc2libGUgdG8gYWRkIGFueSBuZXcgcm93 IHRvCml0LgotLS0KIHNyYy9iYWNrZW5kL2FjY2Vzcy9oZWFwL2hlYXBhbV94bG9nLmMgfCAy ICstCiAxIGZpbGUgY2hhbmdlZCwgMSBpbnNlcnRpb24oKyksIDEgZGVsZXRpb24oLSkKCmRp ZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvaGVhcC9oZWFwYW1feGxvZy5jIGIvc3Jj L2JhY2tlbmQvYWNjZXNzL2hlYXAvaGVhcGFtX3hsb2cuYwppbmRleCAxZGE3NzRjMTUzNi4u YzhmNWY0Zjc5ODggMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9oZWFwL2hlYXBh bV94bG9nLmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL2hlYXAvaGVhcGFtX3hsb2cuYwpA QCAtMzI2LDcgKzMyNiw3IEBAIGhlYXBfeGxvZ192aXNpYmxlKFhMb2dSZWFkZXJTdGF0ZSAq cmVjb3JkKQogCiAJaWYgKEJ1ZmZlcklzVmFsaWQoYnVmZmVyKSkKIAl7Ci0JCVNpemUJCXNw YWNlID0gUGFnZUdldEZyZWVTcGFjZShCdWZmZXJHZXRQYWdlKGJ1ZmZlcikpOworCQlTaXpl CQlzcGFjZSA9IFBhZ2VHZXRIZWFwRnJlZVNwYWNlKEJ1ZmZlckdldFBhZ2UoYnVmZmVyKSk7 CiAKIAkJVW5sb2NrUmVsZWFzZUJ1ZmZlcihidWZmZXIpOwogCi0tIAoyLjUzLjAKCg== --------------GC08OXpKcnwp4ZBykL3oACGt Content-Type: application/zip; name="test_case1.zip" Content-Disposition: attachment; filename="test_case1.zip" Content-Transfer-Encoding: base64 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 --------------GC08OXpKcnwp4ZBykL3oACGt Content-Type: application/zip; name="test_case2.zip" Content-Disposition: attachment; filename="test_case2.zip" Content-Transfer-Encoding: base64 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 SwUGAAAAAA0ADQATBAAAbg0AAAAA --------------GC08OXpKcnwp4ZBykL3oACGt--