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.94.2) (envelope-from ) id 1uHvYi-00CSTV-VA for pgsql-bugs@arkaria.postgresql.org; Thu, 22 May 2025 02:21:25 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1uHvYg-00Dt2t-J3 for pgsql-bugs@arkaria.postgresql.org; Thu, 22 May 2025 02:21:22 +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.94.2) (envelope-from ) id 1uHvYg-00Dt2k-2k for pgsql-bugs@lists.postgresql.org; Thu, 22 May 2025 02:21:22 +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.96) (envelope-from ) id 1uHvYc-000Epg-2Q for pgsql-bugs@lists.postgresql.org; Thu, 22 May 2025 02:21:21 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mx2023; t=1747880477; bh=9v2NxOfG/C165GNoyVlfQugtStognzRvuJP6NDKEmlw=; h=Message-ID:Date:User-Agent:To:From:Subject:From; b=pPogEU7zib37aLdHaieQONfs475x1La1vGhF06xsXDMN4HOXkns9NVzJjZwvkT+eH csMQugmFVR3qYrsZagmtTUHz4fngF4cS20YxqRLjjVeN4ixeJuI4kmAgsLZ0vE9EhX B35UlrChUFDi9UmDUHS+HlMtrpOg3EB04TIAt7kQkEaSj/g7Q+41X4qLVMvx8GNMF1 W3PXuEm+wQTu/ECKOVODyGOtyGuVGiJB9YpReHYkOibh41tSn3Z+BpvZhC53DHjKXk gvzAd0xmx/yJuEESbso+VWySy/8KWVrZ3M+kzo9Rq0rW4xJfHCJYnW7W/sK366S1Qz bRmI+J750126w== Received: from [172.30.48.82] (unknown [93.174.131.138]) (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 57B2B60902 for ; Thu, 22 May 2025 05:21:17 +0300 (MSK) Content-Type: multipart/mixed; boundary="------------q6fRpIDRX8POOqCAZjIoh60C" Message-ID: <52138028-7246-421c-9161-4fa108b88070@postgrespro.ru> Date: Thu, 22 May 2025 05:19:56 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US To: pgsql-bugs@lists.postgresql.org From: Alexey Makhmutov Subject: Standby server with cascade logical replication could not be properly stopped under load 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: 2025/05/22 01:21:00 #27803965 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. --------------q6fRpIDRX8POOqCAZjIoh60C Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Assuming following configuration with three connected servers A->B->C: A (primary), B (physical standby) and C (logical replica connected to B). If server A is under load and B is applying incoming WAL records while also streaming data via logical replication to C, then attempt to stop server B in 'fast' mode may by unsuccessful. In this case server will remain in PM_SHUTDOWN state indefinitely with all 'walsender' processes running in an infinite busy loop (consuming a CPU core each). To get server out of this state it's required either to either stop B using 'immediate' mode or stop server C (which will cause 'walsender' processes on server B to exit). This issue is reproducible on latest 'master', as well as on current PG 16/17 branches. Attached is a test scenario to reproduce the issue: 'test_scenario.zip'. This archive contains shell scripts to create the required environment (all three serves) and then to execute required steps to get server into incorrect state. First, edit the 'test_env.sh' file and specify path to PG binaries in PG_PATH variable and optionally set of ports used by test instances in 'pg_port' array. Then execute the 'test_prepare.sh' script, which will create, configure and start all three PG instances. Servers then could be started and stopped using corresponding start and stop scripts. To reproduce the issue, ensure that all three servers are running and execute the 'test_execute.sh' script. This script starts 'pgbench' instance in background for 30 seconds to create load on server A, waits for 20 seconds and then try to stop the B instance using default 'fast' mode. Expected behavior is normal shutdown for B, while observed behavior is different: shutdown attempt fails and each remaining 'walsender' process consumes entire CPU core. To get out of this state one could use 'stop-C.sh' script to stop the server C, as it will complete shutdown process of B instance as well. My understanding is that this issue seems to be caused by the logic in 'GetStandbyFlushRecPtr' function, which returns current flush point for received WAL data. This position is used in 'XLogSendLogical' to calculate whether current walsender is in 'caught up' state (i.e. whether we send all the available data to downstream instance). During shutdown walsenders are allowed to continue their work until they are in 'caught up' state, while 'postmaster' is waiting for their completion. Currently 'GetStandbyFlushRecPtr' returns position of last stored record, rather than last applied record. This is correct for physical replication as we can send data to downstream instance without applying it to local system. However, for logical replication this seems to be incorrect, as we could not decode data until it's applied on current instance. So, if current stored WAL position differs from applied position while server is being stopped, then 'WalSndLoop'/'XLogSendLogical'/'XLogReadRecord' methods will spin in a busy loop, waiting for applied position to advance. The recovery process is already stopped at this moment, so this will be an infinite loop. Probably either 'GetStandbyFlushRecPtr' or 'WalSndLoop'/'XLogSendLogical' logic need to be adjusted to take into consideration such case with  logical replication. Attached is also a patch, which aims to fix this issue: 0001-Use-only-replayed-position-as-target-flush-point-for.patch. It tries to to modify behavior of 'GetStandbyFlushRecPtr' function to ensure that it returns only applied position for logical replication. This function could be also invoked from slot synchronization routines and in this case it retains current behavior by returning last stored position. Thanks, Alexey --------------q6fRpIDRX8POOqCAZjIoh60C Content-Type: application/zip; name="test_scenario.zip" Content-Disposition: attachment; filename="test_scenario.zip" Content-Transfer-Encoding: base64 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 AABqEAAAAAA= --------------q6fRpIDRX8POOqCAZjIoh60C Content-Type: text/x-patch; charset=UTF-8; name="0001-Use-only-replayed-position-as-target-flush-point-for.patch" Content-Disposition: attachment; filename*0="0001-Use-only-replayed-position-as-target-flush-point-for.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSA2OThiMTMwMDVlNmZiODU3NDFiNzU4ZDlmOGIxNDA2NWY2Mzk0MDkyIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4ZXkgTWFraG11dG92IDxhLm1ha2htdXRvdkBw b3N0Z3Jlc3Byby5ydT4KRGF0ZTogVGh1LCAyMiBNYXkgMjAyNSAwNDowMjo1MCArMDMwMApT dWJqZWN0OiBbUEFUQ0hdIFVzZSBvbmx5IHJlcGxheWVkIHBvc2l0aW9uIGFzIHRhcmdldCBm bHVzaCBwb2ludCBmb3IgbG9naWNhbAogcmVwbGljYXRpb24KCkZvciBwaHlzaWNhbCB3YWxz ZW5kZXIgdGhlIEdldFN0YW5kYnlGbHVzaFJlY1B0ciBmdW5jdGlvbiByZXR1cm5zIHBvc2l0 aW9uCm9mIHRoZSBsYXRlc3Qgc3RvcmVkIFdBTCByZWNvcmQsIGFzIHdlIGNhbiBzdHJlYW0g ZGF0YSB0byBkb3duc3RyZWFtIGluc3RhbmNlCndpdGhvdXQgd2FpdGluZyBmb3IgaXQgYmVp bmcgbG9jYWxseSBhcHBsaWVkLiBIb3dldmVyLCBmb3IgbG9naWNhbCByZXBsaWNhdGlvbgp3 ZSBjYW4gc2VudCBkYXRhIHRvIGRvd25zdHJlYW0gY2xpZW50IG9ubHkgdXAgdG8gdGhlIGxv Y2FsbHkgYXBwbGllZCBwb3NpdGlvbi4KVGhpcyBkaXN0aW5jdGlvbiBpcyBpbXBvcnRhbnQg d2hlbiB3ZSBkZWNpZGUgd2hldGhlciB3YWxzZW5kZXIgaGFzIHNlbnQgYWxsIHRoZQphdmFp bGFibGUgZGF0YSB0byBjbGllbnQgKCdjYXVnaHQgdXAnKS4gRHVyaW5nIHRoZSBzaHV0ZG93 biBwcm9jZXNzIHdhbHNlbmRlcgpiYWNrZW5kcyBhcmUgYWxsb3dlZCB0byB3b3JrIHVudGls IHRoZXkgcmVhY2ggdGhlICdjYXVnaHQgdXAnIHN0YXRlLCB3aGlsZQpyZWNvdmVyeSBwcm9j ZXNzIGlzIGFscmVhZHkgZGVhY3RpdmF0ZWQsIHNvIHRoZSBhcHBsaWVkIHBvc2l0aW9uIHdv bid0IGJlCm1vdmluZy4gSW4gdGhpcyBjYXNlIHdhbHNlbmRlciBmb3IgbG9naWNhbCByZXBs aWNhdGlvbiBzaG91bGQgd29yayBvbmx5IHVudGlsCml0IGNhdWdodCB1cCB3aXRoIHRoZSBs YXRlc3QgYXBwbGllZCByZWNvcmQsIG90aGVyd2lzZSBpdCB3aWxsIHN0dWNrIGluIHRoZQpp bmZpbml0ZSBsb29wIGFuZCBpbmhpYml0IGluc3RhbmNlIHNodXRkb3duLgotLS0KIHNyYy9i YWNrZW5kL3JlcGxpY2F0aW9uL3dhbHNlbmRlci5jIHwgMzEgKysrKysrKysrKysrKysrKy0t LS0tLS0tLS0tLS0KIDEgZmlsZSBjaGFuZ2VkLCAxNyBpbnNlcnRpb25zKCspLCAxNCBkZWxl dGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9yZXBsaWNhdGlvbi93YWxzZW5k ZXIuYyBiL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL3dhbHNlbmRlci5jCmluZGV4IDlmYThi ZWI2MTAzLi5lZGU5ODVkYTIxNiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvcmVwbGljYXRp b24vd2Fsc2VuZGVyLmMKKysrIGIvc3JjL2JhY2tlbmQvcmVwbGljYXRpb24vd2Fsc2VuZGVy LmMKQEAgLTM1MzIsMjkgKzM1MzIsMzIgQEAgV2FsU25kRG9uZShXYWxTbmRTZW5kRGF0YUNh bGxiYWNrIHNlbmRfZGF0YSkKIFhMb2dSZWNQdHIKIEdldFN0YW5kYnlGbHVzaFJlY1B0cihU aW1lTGluZUlEICp0bGkpCiB7Ci0JWExvZ1JlY1B0cglyZXBsYXlQdHI7CiAJVGltZUxpbmVJ RAlyZXBsYXlUTEk7Ci0JWExvZ1JlY1B0cglyZWNlaXZlUHRyOwotCVRpbWVMaW5lSUQJcmVj ZWl2ZVRMSTsKIAlYTG9nUmVjUHRyCXJlc3VsdDsKIAogCUFzc2VydChhbV9jYXNjYWRpbmdf d2Fsc2VuZGVyIHx8IElzU3luY2luZ1JlcGxpY2F0aW9uU2xvdHMoKSk7CiAKLQkvKgotCSAq IFdlIGNhbiBzYWZlbHkgc2VuZCB3aGF0J3MgYWxyZWFkeSBiZWVuIHJlcGxheWVkLiBBbHNv LCBpZiB3YWxyZWNlaXZlcgotCSAqIGlzIHN0cmVhbWluZyBXQUwgZnJvbSB0aGUgc2FtZSB0 aW1lbGluZSwgd2UgY2FuIHNlbmQgYW55dGhpbmcgdGhhdCBpdAotCSAqIGhhcyBzdHJlYW1l ZCwgYnV0IGhhc24ndCBiZWVuIHJlcGxheWVkIHlldC4KLQkgKi8KLQotCXJlY2VpdmVQdHIg PSBHZXRXYWxSY3ZGbHVzaFJlY1B0cihOVUxMLCAmcmVjZWl2ZVRMSSk7Ci0JcmVwbGF5UHRy ID0gR2V0WExvZ1JlcGxheVJlY1B0cigmcmVwbGF5VExJKTsKKwlyZXN1bHQgPSBHZXRYTG9n UmVwbGF5UmVjUHRyKCZyZXBsYXlUTEkpOwogCiAJaWYgKHRsaSkKIAkJKnRsaSA9IHJlcGxh eVRMSTsKIAotCXJlc3VsdCA9IHJlcGxheVB0cjsKLQlpZiAocmVjZWl2ZVRMSSA9PSByZXBs YXlUTEkgJiYgcmVjZWl2ZVB0ciA+IHJlcGxheVB0cikKLQkJcmVzdWx0ID0gcmVjZWl2ZVB0 cjsKKwkvKgorCSAqIFdlIGNhbiBzYWZlbHkgc2VuZCB3aGF0J3MgYWxyZWFkeSBiZWVuIHJl cGxheWVkLiBBbHNvLCBmb3IgcGh5c2ljYWwKKwkgKiByZXBsaWNhdGlvbiBpZiB3YWxyZWNl aXZlciBpcyBzdHJlYW1pbmcgV0FMIGZyb20gdGhlIHNhbWUgdGltZWxpbmUsIHdlCisJICog Y2FuIHNlbmQgYW55dGhpbmcgdGhhdCBpdCBoYXMgc3RyZWFtZWQsIGJ1dCBoYXNuJ3QgYmVl biByZXBsYXllZCB5ZXQuCisJICogSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBz bG90IHN5bmNocm9uaXphdGlvbiAoTXlXYWxTbmQgaXMgTlVMTAorCSAqIGluIHRoaXMgY2Fz ZSksIHRoZW4gd2Ugc2hvdWxkIGZvbGxvdyBwaHlzaWNhbCByZXBsaWNhdGlvbiBhcHByb2Fj aCBhcworCSAqIHdlbGwgdG8gYmUgY29uc2lzdGVudCB3aXRoIHN5bmNocm9uaXplZF9zdGFu ZGJ5X3Nsb3RzIGV4cGVjdGF0aW9ucy4KKwkgKi8KKwlpZiAoIU15V2FsU25kIHx8IE15V2Fs U25kLT5raW5kID09IFJFUExJQ0FUSU9OX0tJTkRfUEhZU0lDQUwpCisJeworCQlUaW1lTGlu ZUlECXJlY2VpdmVUTEk7CisJCVhMb2dSZWNQdHIJcmVjZWl2ZVB0ciA9IEdldFdhbFJjdkZs dXNoUmVjUHRyKE5VTEwsICZyZWNlaXZlVExJKTsKKworCQlpZiAocmVjZWl2ZVRMSSA9PSBy ZXBsYXlUTEkgJiYgcmVjZWl2ZVB0ciA+IHJlc3VsdCkKKwkJCXJlc3VsdCA9IHJlY2VpdmVQ dHI7CisJfQogCiAJcmV0dXJuIHJlc3VsdDsKIH0KLS0gCjIuNDkuMAoK --------------q6fRpIDRX8POOqCAZjIoh60C--