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 1w0MfZ-001qW4-0K for pgsql-hackers@arkaria.postgresql.org; Wed, 11 Mar 2026 16:44:25 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w0MfX-00ABod-1X for pgsql-hackers@arkaria.postgresql.org; Wed, 11 Mar 2026 16:44:23 +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 1w0MfX-00ABoV-0O for pgsql-hackers@lists.postgresql.org; Wed, 11 Mar 2026 16:44:23 +0000 Received: from mail-ed1-x536.google.com ([2a00:1450:4864:20::536]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w0MfV-00000002AEu-1BL0 for pgsql-hackers@postgresql.org; Wed, 11 Mar 2026 16:44:23 +0000 Received: by mail-ed1-x536.google.com with SMTP id 4fb4d7f45d1cf-661169cd6d8so11748a12.1 for ; Wed, 11 Mar 2026 09:44:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1773247460; cv=none; d=google.com; s=arc-20240605; b=hms4N0QJkB94Xx9VkwT4wC4Uvab5MOT3CtUP1/bFaJGJf46Qx87Mk0HHnJJ1dbWVzT C1iuuwgBAbA/nulSJt/t7lXKAvdnMvo1+2katoOb8xeuPmsXaAxSMlWJM7FK7UsyPkR0 FCopoOzyHu4JjbQphEBOEkUyuFaH7mFhjbhDS+1ZOLBgI/syh62/vvw9hmfBCB1xKmWO MgHdB6J0tJxWfuDxvPxCEmYmqluTd4c0NMFbCzJZjVeEfnz94oWB5NW+rrQjKlx2vz3G nm1gpgChTGTD50BI9AFZMSJpEt0lEr0tUJWJJz7p7uIWwI+Um9OdSSeXjSwBvyUaEmRZ 8BDg== 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=rDhJDKSOtVVmXIukOJmsMJzTqxuyh9VL8dXyPfjRTSU=; fh=RfrkJab44jNT7RraF/sJO97r9/nkUL0AAgzmC7PBS2w=; b=kJe8nsZX3jgCsGQ4a7VoYeCQiBLHaBDrL5zaoXP2YaGcAihoqO+1ik+ZwSOYHsDaQO ZQ7IOCohD/9OuJIXuSExhAr9eAnfw3y9sZYcTNIbhCi9QTuGby+Z5bEDe0rKLnBWMOEs /UdkIU8ddER8H3E0AGuXqOxBbz4IhqDPCB0HVq16ahiqnRNCeJfPtEDXGVilDjgNK9SR i5WH/Q7o7ZRylCU8LvFPCDeUIOxqiCLKnB38cOjw/XPxJb3kj67H44Ue0CL1Ndpwc/0I rJUl+iOsu3jgEbKzHb7HEFUcEyQS+ySRWpskgZybG+xnod5GLzS5CSz3CEslUtT5/qeF ihYQ==; darn=postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1773247460; x=1773852260; darn=postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=rDhJDKSOtVVmXIukOJmsMJzTqxuyh9VL8dXyPfjRTSU=; b=sdK7ZoknGvhYAWh4SmO2MzyTfJVGfW9IQFbEiFkzlKcMVHtEkmO0jS5v17/PWG+nPv IYCEPNi94b/vrGfAGjL6AFq+rlgjuJb4SHJ//Ycw2m0FHdZYx6Bh3KwOppOpXEwEr+sl +4G878/wEtAcPgUt21mGVUTm8ocNZ2ePQ37/y9vecOl/CBTGlNAVpMU0YsHJ9buC00gM ITErd+PzcnqkU0Sn602TYlwYzlL0hAOF/JXPLzX/ah73UkmwBpD+ok3ZVeLGxra+qU1V 65FBz/L7CdPhOmixRL8EJ8ZtxGssf8TZhbOoRcGZnJ2cLk/LwjUkE1tFHtwd17qwru6s UZZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773247460; x=1773852260; 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=rDhJDKSOtVVmXIukOJmsMJzTqxuyh9VL8dXyPfjRTSU=; b=pRPDzTznHiN+JXrsEgwfY3H7dqVYgk4LwrXPZBUqQXfd3yHYwqjrQe3GvlriErVlJn MJJ2KmmDB++BzEC6F590427EpqN6JwWqffklsuAV/InqpspOp3uWuFgPzlASir6pLsji xcA4dyoDjXgk/hI0OWjyFbLDKhN1IyWn1LwMwpi5FotxX6WbswuZsO/WwYeCP3DdWC7L 49cFJRiW1zcj0Ht1DPzxSH5F5tfEw9jutyQ5EgbPl2V/IojCznBxMieuVXjUP/fe7ZGC 2cYw0cTmUaJkaZw7eMz2PJSlsRGpOrOMdJ0Gc3JHRA3M8XhO2lBHVcNuR4doI4tAy+T8 2beA== X-Gm-Message-State: AOJu0Yx6DEAhEf1dT+Sh5hw1BH7SIJsbvCzQb4fjtceTFMTtrSXRU7CU 8xGK5y8PmfKih68e01jltnYn7xg1OICL3rdCwU9f5GJ5CubiP2YnCUOLCyZ6ffLRQtZCRrXawa1 COW56vzp7fxfFElLS+1novSlZP4EHgwsiaQtqNq5yiL1zdO0X77WFUMZPStI= X-Gm-Gg: ATEYQzyofPC/ZEv4TcxMmOHo47l1FgjH1l99jVMXQL7jq3a888sVRBcUjTKLjHoSL1B ivlodtAQl/ymtGLw+onbfqY/ETlro/xy9MIxtfphHLoaUQEIpJRgeWB7aG+v/OUV4t5drDxa6Yt nUdIF5qRFQJJc2J7SdMvrHf1swfeBUWjoG6SSbCUB2OIg2vn6CWRMyvpW9OyIBFGY5qfMX9BQx0 g50EJp/DeQfnLiwokApR7den3wYVRJPr3iP9XVf3v5mL5ynhdiuc1gMI1Kw1gLr+X+LZ5P083x/ REv2QalGV+RHITHpYNHtQn6QbdcFG4u4hGTjLw== X-Received: by 2002:a05:6402:8d8:b0:662:706d:3a13 with SMTP id 4fb4d7f45d1cf-66314d4ac95mr38641a12.17.1773247459499; Wed, 11 Mar 2026 09:44:19 -0700 (PDT) MIME-Version: 1.0 From: Robert Pang Date: Wed, 11 Mar 2026 09:44:07 -0700 X-Gm-Features: AaiRm525hxldYpN-4Ocwjl0u23jeYSupnnFyBCyK-Pu56wH3-hIeE_f5WKZPQ-4 Message-ID: Subject: [PATCH] Fix premature timeout in pg_promote() caused by signal interruptions To: pgsql-hackers Content-Type: multipart/mixed; boundary="000000000000ed0bed064cc25853" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000ed0bed064cc25853 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi all, We have observed an issue where pg_promote() returns false and issues a timeout warning prematurely, even if the standby server is successfully promoted later within the specified timeout period. Problem Description The current implementation of pg_promote() calculates a fixed number of loop iterations based on the timeout value, assuming each loop waits exactly 100 ms for the backend latch. However, if the backend receives an unrelated signal (e.g., from client_connection_check_interval), it wakes up early. These repeated, unrelated wakeups cause the loop counter to deplete much faster than intended, leading to a premature timeout. Reproduction Set up a standby server while modifying pg_promote not to write the promote file to block the promotion. And by setting client_connection_check_interval =3D 1, we can consistently trigger a premature timeout. In the example below, a 10-second timeout expires in roughly 107 ms: postgres=3D# set client_connection_check_interval=3D1; SET postgres=3D# \timing Timing is on. postgres=3D# select pg_promote(true, 10); WARNING: server did not promote within 10 seconds =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=90 =E2=94=82 pg_promote =E2=94=82 =E2=94=9C=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=A4 =E2=94=82 f =E2=94=82 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=98 (1 row) Time: 107.783 ms Proposed Fix The attached patch modifies the logic to loop based on the actual elapsed time rather than a fixed number of iterations. This ensures that pg_promote() respects the specified timeout regardless of how many times the backend latch is signaled. After applying the patch, the timeout behaves as expected: postgres=3D# set client_connection_check_interval=3D1; SET postgres=3D# \timing Timing is on. postgres=3D# select pg_promote(true, 10); WARNING: server did not promote within 10 seconds =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=90 =E2=94=82 pg_promote =E2=94=82 =E2=94=9C=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=A4 =E2=94=82 f =E2=94=82 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=98 (1 row) Time: 10000.865 ms (00:10.001) We would like to submit this patch for the community's consideration. Best regards Robert Pang Google --000000000000ed0bed064cc25853 Content-Type: application/x-patch; name="0001-Fix-premature-timeout-in-pg_promote-caused-by-signal.patch" Content-Disposition: attachment; filename="0001-Fix-premature-timeout-in-pg_promote-caused-by-signal.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mmm9ilbh0 RnJvbSAyMDc1YWVjZGNjNmE3MGZlYTFiMzNjOWU5MDg3OGU5MGMyYTYxNjEyIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBSb2JlcnQgUGFuZyA8cm9iZXJ0cGFuZ0Bnb29nbGUuY29tPgpE YXRlOiBUdWUsIDEwIE1hciAyMDI2IDIxOjExOjQ5IC0wNzAwClN1YmplY3Q6IFtQQVRDSF0gRml4 IHByZW1hdHVyZSB0aW1lb3V0IGluIHBnX3Byb21vdGUoKSBjYXVzZWQgYnkgc2lnbmFsCiBpbnRl cnJ1cHRpb25zCgpQcmV2aW91c2x5LCBwZ19wcm9tb3RlKCkgbG9vcGVkIGEgZml4ZWQgbnVtYmVy IG9mIHRpbWVzIGNhbGN1bGF0ZWQgZnJvbSB0aGUKc3BlY2lmaWVkIHRpbWVvdXQgYW5kIHdhaXRl ZCAxMDAgbXMgb24gdGhlIGJhY2tlbmQgbGF0Y2ggcGVyIGl0ZXJhdGlvbiBmb3IKc3RhbmRieSBw cm9tb3Rpb24uIEhvd2V2ZXIsIHVucmVsYXRlZCBzaWduYWxzIHRvIHRoZSBiYWNrZW5kIGNvdWxk IHNldCB0aGUKbGF0Y2ggYW5kIHdha2UgdXAgdGhlIGJhY2tlbmQgZWFybHksIHJlc3VsdGluZyBp biBhIHdhaXQgdGltZSBzaWduaWZpY2FudGx5CnNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHRp bWVvdXQgaWYgdGhlIHNpZ25hbHMgaGFwcGVuZWQgZnJlcXVlbnRseS4KClRoaXMgY29tbWl0IHJl ZmluZXMgdGhlIGxvZ2ljIHRvIHRyYWNrIGFjdHVhbCBlbGFwc2VkIHRpbWUuIEJ5IGxvb3Bpbmcg dW50aWwgdGhlCnJlcXVlc3RlZCBkdXJhdGlvbiBoYXMgdHJ1bHkgcGFzc2VkLCBwZ19wcm9tb3Rl KCkgbm93IGVuc3VyZXMgdGhhdCB0aGUgd2FpdCBkb2VzCm5vdCBlbmQgcHJlbWF0dXJlbHkgZHVl IHRvIHNpZ25hbHMuCgpBdXRob3I6IFJvYmVydCBQYW5nCi0tLQogc3JjL2JhY2tlbmQvYWNjZXNz L3RyYW5zYW0veGxvZ2Z1bmNzLmMgfCA4ICsrKystLS0tCiAxIGZpbGUgY2hhbmdlZCwgNCBpbnNl cnRpb25zKCspLCA0IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vz cy90cmFuc2FtL3hsb2dmdW5jcy5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZ2Z1 bmNzLmMKaW5kZXggZWNiM2M4YzA4MjAuLjYxMzdhZjJkMzVlIDEwMDY0NAotLS0gYS9zcmMvYmFj a2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9nZnVuY3MuYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3Mv dHJhbnNhbS94bG9nZnVuY3MuYwpAQCAtNjkwLDcgKzY5MCw3IEBAIHBnX3Byb21vdGUoUEdfRlVO Q1RJT05fQVJHUykKIAlib29sCQl3YWl0ID0gUEdfR0VUQVJHX0JPT0woMCk7CiAJaW50CQkJd2Fp dF9zZWNvbmRzID0gUEdfR0VUQVJHX0lOVDMyKDEpOwogCUZJTEUJICAgKnByb21vdGVfZmlsZTsK LQlpbnQJCQlpOworCVRpbWVzdGFtcFR6CWVuZF90aW1lOwogCiAJaWYgKCFSZWNvdmVyeUluUHJv Z3Jlc3MoKSkKIAkJZXJlcG9ydChFUlJPUiwKQEAgLTczMSw4ICs3MzEsOCBAQCBwZ19wcm9tb3Rl KFBHX0ZVTkNUSU9OX0FSR1MpCiAJCVBHX1JFVFVSTl9CT09MKHRydWUpOwogCiAJLyogd2FpdCBm b3IgdGhlIGFtb3VudCBvZiB0aW1lIHdhbnRlZCB1bnRpbCBwcm9tb3Rpb24gKi8KLSNkZWZpbmUg V0FJVFNfUEVSX1NFQ09ORCAxMAotCWZvciAoaSA9IDA7IGkgPCBXQUlUU19QRVJfU0VDT05EICog d2FpdF9zZWNvbmRzOyBpKyspCisJZW5kX3RpbWUgPSBHZXRDdXJyZW50VGltZXN0YW1wKCkgKyB3 YWl0X3NlY29uZHMgKiAxMDAwMDAwTDsKKwl3aGlsZSAoR2V0Q3VycmVudFRpbWVzdGFtcCgpIDwg ZW5kX3RpbWUpCiAJewogCQlpbnQJCQlyYzsKIApAQCAtNzQ1LDcgKzc0NSw3IEBAIHBnX3Byb21v dGUoUEdfRlVOQ1RJT05fQVJHUykKIAogCQlyYyA9IFdhaXRMYXRjaChNeUxhdGNoLAogCQkJCQkg ICBXTF9MQVRDSF9TRVQgfCBXTF9USU1FT1VUIHwgV0xfUE9TVE1BU1RFUl9ERUFUSCwKLQkJCQkJ ICAgMTAwMEwgLyBXQUlUU19QRVJfU0VDT05ELAorCQkJCQkgICAxMDBMLAogCQkJCQkgICBXQUlU X0VWRU5UX1BST01PVEUpOwogCiAJCS8qCi0tIAoyLjUzLjAuNDczLmc0YTc5NThjYTE0LWdvb2cK Cg== --000000000000ed0bed064cc25853--