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 1wHHX5-0071cG-37 for pgsql-hackers@arkaria.postgresql.org; Mon, 27 Apr 2026 08:41:36 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wHHX4-00D3Jm-38 for pgsql-hackers@arkaria.postgresql.org; Mon, 27 Apr 2026 08:41:34 +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 1wHHX4-00D3Jc-24 for pgsql-hackers@lists.postgresql.org; Mon, 27 Apr 2026 08:41:34 +0000 Received: from mail-ua1-x92e.google.com ([2607:f8b0:4864:20::92e]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wHHX2-00000003J4b-2D9P for pgsql-hackers@lists.postgresql.org; Mon, 27 Apr 2026 08:41:34 +0000 Received: by mail-ua1-x92e.google.com with SMTP id a1e0cc1a2514c-9540bb77b1aso5593682241.1 for ; Mon, 27 Apr 2026 01:41:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1777279291; cv=none; d=google.com; s=arc-20240605; b=L+GmzQW++tNlTk2p4p5AaXhrImIyRXBkBuKpJNinf2c99QreyEf8R/1luPWdZ2cEoN 0LflCiEBbu4P6pk8DhehNBB3t6x/q7tYF1R3FNAqEgsVpHWm9bRcXEWE698DuFoHcE3g LNl6KXBSBm3ORt95Z/SnPAXIagZyP28Q41ZwXDF4bjT+v0wtw/iXwdaI4/IIjjvMwRjZ AHhVYfSUy2Y+1gO1Ujv2KBVEyVCh2WZrYlVl8SQwndQ+uP4HIyeMGcOlodyx8vMqN+CN 9/33AUrwzrVSSIw3DQTcP7Sptl9uP8GbHnwVGpErLhqFPbl+3FvaJv3cry9olutivpXp mixg== 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=QD+I5dkLmoPq3Jo1/FDBH6FCk6BMp9+aL0B0VoqbyB0=; fh=NO6q7LOBWcr8IHdS0pkLEQz4ISXsg2EDjfm+FFwbj+A=; b=Ewqt5n6pmVjN/q/1wevm5zBgVIE6HAsTSwV0XzuVmByy4FYrjNk3Db0hmWG2OJXoNv hEKUwZZwtmjdaSI+CRSrTYNN9V9LsMBWydta4hk0KR/+HWqxboB7r0qo0o/s610dr51P qrqVIGoOr2PCu7Yn4A/6o176/oEUeZ5xRwIbO2rgQk7E1VSf+9m7aNS3mbLy/QScVDrH 706nni7S8aEEroXUgxCETewx4C3ExHoSeShFVYUm8J2B+uc2jPFoqAuHUU3CW0HdMvI7 OJZcGwOZsnBiGfMMDYeMMcfXRnh33pUfV1eY+Wz/xo/eL/i2vQJtJ2NZFAksvYvUX+gj q8Sg==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777279291; x=1777884091; darn=lists.postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=QD+I5dkLmoPq3Jo1/FDBH6FCk6BMp9+aL0B0VoqbyB0=; b=q+7whff7JuPXRD4/lPZmXpp8wqBqbr37lGoSWo156oCLXpud7Zppo/kb7jYb5j8AF8 0mgQwOuSHv7ADb+I64Z34l0dwB4ZbzdD2kDYYo8ZOuJsEkogW3lsgv9jB6X2CphVO/fL hE26ecrtBTHI2NFKAZYVDHua0WHjDZ0MnxJGcAv9anj53OxeJ+82QeY0HDU4lhoj8yf1 6D+luzFbiK57vuXdmahgoc2JUSnDzkJfF/Ny2zdxDI+kuyqUdsCpv6H2dnVSRz1CcSlx Fb87efCPj+xm62nlZmhNpvlMzGb8N3eCE0+k4uNZ+DkraIbQiCuHpYaQNbfV62a+atDh xJ3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777279291; x=1777884091; 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=QD+I5dkLmoPq3Jo1/FDBH6FCk6BMp9+aL0B0VoqbyB0=; b=Sa7qpqW+xBBqpgGPaB4ZjpBgy6oHGZVpQuwy3DD1Xzz2a2mg+2XNAxxZUBzpTJb3ry +7vkgbrKQV46Q4yYlA6i+lvnIT7oWUmXG1xQhBSIVHkzLPPj93EmOh7ZHIIOcwk0VxnO atAs2nBM4+hM5jKX1eESKuzaXtspLO03oSzgklfYMKXviWWGFJ8jUdmriRYc27yqRtSE TPYvgGHgfJquxS7kTDYiImh0VDX1dTGVMVrVlX7yX6G201bYITjv8ZoRc8TsK9P6jFbP y7xPLAIW/Hk3YC2TlUgl0ifVxBNOEYnczs2sd40WEEskF844A8pltz8rv+7aIjkPS3Vd m/OA== X-Gm-Message-State: AOJu0YyTDJnZiXpBeAmSKEK5PsGpvdwZl2ePrgz/uMrslZ5YdxuKw5dg QsvJK3a3D3ZO7W/1fxhimYQpjvdn9GtNpJdzM3a/G8oqmeb7FeG/8t8KdsqUwnVtBmJV8Z9RSaI lQbc+0CRYmtvr5zGP+ne6POHHFSDhbwHg/DYs X-Gm-Gg: AeBDievhWmr24ogSQJyTw1dR34Hq9FRzbEiyI8PLZY4L5+5Kkr5boT60c5cEsFT19bI U3B2IXFQvx8VJ6w5AbjF9mKeb92nxfWr/nd9mTu2P04jE7gySJT7pej6PF+TYVHBEE0KVHnZkzG tcra95bseXq1wkJQMpEMa1JlesLwtSo78FIXkPTVKbK1O+Bu4k25S8JSzYgPVz5RUuoMm7dEg+D WqyY/SVp5+f0Ak1+5sMrVG5FaFQMCcTDY6wlAflXo31K3BYndPGrx2U3AkXM8e00O7orAE3GhDK J2NzGdq8/SpGxv2QeQ== X-Received: by 2002:a05:6102:5491:b0:60a:7c2f:8ecb with SMTP id ada2fe7eead31-616f68d7579mr21994045137.15.1777279290643; Mon, 27 Apr 2026 01:41:30 -0700 (PDT) MIME-Version: 1.0 From: SATYANARAYANA NARLAPURAM Date: Mon, 27 Apr 2026 01:41:18 -0700 X-Gm-Features: AVHnY4LZeAD_RLhsyjAHEoyD1hUVaSxs2-DGBIftG8T8s80wu8c_zOz7ob7IoJs Message-ID: Subject: [Patch]: Fix excessive ProcArrayLock acquisitions with subscription max_retention_duration=0 To: PostgreSQL Hackers , Amit Kapila Content-Type: multipart/mixed; boundary="000000000000c93c9306506d145e" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000c93c9306506d145e Content-Type: multipart/alternative; boundary="000000000000c93c9206506d145c" --000000000000c93c9206506d145c Content-Type: text/plain; charset="UTF-8" Hi Hackers, When a subscription has retain_dead_tuples enabled with maxretention set to zero (unlimited retention), adjust_xid_advance_interval() caps xid_advance_interval to Min(interval, maxretention). Since maxretention is zero, this always collapses the interval to zero milliseconds. A zero makes TimestampDifferenceExceeds(last_time, now, 0) always true in get_candidate_xid(). This causes the apply worker to call GetOldestActiveTransactionId() on every single WAL message. This results in a huge number of ProcArrayLock acquisitions under moderate write load. Fix by adding a maxretention > 0 guard to the cap. When maxretention is zero , the exponential back-off in adjust_xid_advance_interval() now works correctly, growing the interval from 100 ms toward the 180 s ceiling. Measured with perf uprobe counting GetOldestActiveTransactionId calls at ~39K TPS (pgbench, 5 clients): Before fix: 25,104 calls / 5 s (~5,021/s) After fix: 31 calls / 5 s (~6/s) Thank Satya --000000000000c93c9206506d145c Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi Hackers,

When a subscription has ret= ain_dead_tuples enabled with maxretention set
to zero (unlimited retenti= on), adjust_xid_advance_interval() caps
xid_advance_interval to Min(inte= rval, maxretention).=C2=A0 Since maxretention
is zero, this always colla= pses the interval to zero milliseconds.

A zero makes=C2=A0 TimestampDifferenceExceeds(last_time, now, 0)=C2=A0 always
true i= n get_candidate_xid(). This causes the apply worker to call=C2=A0
GetOldestActiveTransactionId() on every single WAL message. This results i= n
a huge number of ProcArrayLock acquisitions under moderate write load= .

Fix by adding a maxretention > 0 guard to the cap.=C2=A0When ma= xretention is zero ,
the exponential back-off in adjust_xid_advan= ce_interval()
now works correctly, growing the interval from 100 ms towa= rd the 180 s
ceiling.

Measured with perf uprobe counting GetOldes= tActiveTransactionId calls
at ~39K TPS (pgbench, 5 clients):

=C2= =A0 Before fix: 25,104 calls / 5 s =C2=A0(~5,021/s)
=C2=A0 After fix: = =C2=A0 =C2=A0 31 calls / 5 s =C2=A0(~6/s)=C2=A0

Th= ank
Satya
--000000000000c93c9206506d145c-- --000000000000c93c9306506d145e Content-Type: application/octet-stream; name="0001-Fix-apply-worker-busy-loop-when-subscription-max_ret.patch" Content-Disposition: attachment; filename="0001-Fix-apply-worker-busy-loop-when-subscription-max_ret.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mogy57mu0 RnJvbSBkZmE4OWFiYTA2NzQyNDI4ZmU1NmEyNjNhOTIzNmI4NjJiMTRlMzRiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBTYXR5YSBOYXJsYXB1cmFtIDxzYXR5YW5hcmxhcHVyYW1AZ21h aWwuY29tPgpEYXRlOiBNb24sIDI3IEFwciAyMDI2IDA4OjE3OjQyICswMDAwClN1YmplY3Q6IFtQ QVRDSF0gRml4IGFwcGx5IHdvcmtlciBidXN5IGxvb3Agd2hlbiBzdWJzY3JpcHRpb24KIG1heF9y ZXRlbnRpb25fZHVyYXRpb24gaXMgemVybwoKV2hlbiBhIHN1YnNjcmlwdGlvbiBoYXMgcmV0YWlu X2RlYWRfdHVwbGVzIGVuYWJsZWQgd2l0aCBtYXhyZXRlbnRpb24gc2V0CnRvIHplcm8gKHVubGlt aXRlZCByZXRlbnRpb24pLCBhZGp1c3RfeGlkX2FkdmFuY2VfaW50ZXJ2YWwoKSBjYXBzCnhpZF9h ZHZhbmNlX2ludGVydmFsIHRvIE1pbihpbnRlcnZhbCwgbWF4cmV0ZW50aW9uKS4gIFNpbmNlIG1h eHJldGVudGlvbgppcyB6ZXJvLCB0aGlzIGFsd2F5cyBjb2xsYXBzZXMgdGhlIGludGVydmFsIHRv IHplcm8gbWlsbGlzZWNvbmRzLgoKQSB6ZXJvIGludGVybmFsIG1ha2VzIFRpbWVzdGFtcERpZmZl cmVuY2VFeGNlZWRzKGxhc3RfdGltZSwgbm93LCAwKQphbHdheXMgdHJ1ZSBpbiBnZXRfY2FuZGlk YXRlX3hpZCgpLiBUaGlzIGNhdXNlcyB0aGUgYXBwbHkgd29ya2VyIHRvIGNhbGwKR2V0T2xkZXN0 QWN0aXZlVHJhbnNhY3Rpb25JZCgpIG9uIGV2ZXJ5IHNpbmdsZSBXQUwgbWVzc2FnZS4gVGhpcyBy ZXN1bHRzCmluIGEgaHVnZSBudW1iZXIgb2YgUHJvY0FycmF5TG9jayBhY3F1aXNpdGlvbnMgdW5k ZXIgbW9kZXJhdGUgd3JpdGUgbG9hZC4KCkZpeCBieSBhZGRpbmcgYSBtYXhyZXRlbnRpb24gPiAw IGd1YXJkIHRvIHRoZSBjYXAuIFdoZW4gbWF4cmV0ZW50aW9uIGlzIHplcm8sCnRoZSBleHBvbmVu dGlhbCBiYWNrLW9mZiBpbiBhZGp1c3RfeGlkX2FkdmFuY2VfaW50ZXJ2YWwoKSBub3cgd29ya3MK Y29ycmVjdGx5LCBncm93aW5nIHRoZSBpbnRlcnZhbCBmcm9tIDEwMCBtcyB0b3dhcmQgdGhlIDE4 MCBzIGNlaWxpbmcuCi0tLQogc3JjL2JhY2tlbmQvcmVwbGljYXRpb24vbG9naWNhbC93b3JrZXIu YyB8IDUgKysrLS0KIDEgZmlsZSBjaGFuZ2VkLCAzIGluc2VydGlvbnMoKyksIDIgZGVsZXRpb25z KC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvcmVwbGljYXRpb24vbG9naWNhbC93b3JrZXIu YyBiL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL2xvZ2ljYWwvd29ya2VyLmMKaW5kZXggOWYyYTE2 YjEuLmRkNmZjMzhhIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9yZXBsaWNhdGlvbi9sb2dpY2Fs L3dvcmtlci5jCisrKyBiL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL2xvZ2ljYWwvd29ya2VyLmMK QEAgLTQ5OTcsOSArNDk5NywxMCBAQCBhZGp1c3RfeGlkX2FkdmFuY2VfaW50ZXJ2YWwoUmV0YWlu RGVhZFR1cGxlc0RhdGEgKnJkdF9kYXRhLCBib29sIG5ld194aWRfZm91bmQpCiAKIAkvKgogCSAq IEVuc3VyZSB0aGUgd2FpdCB0aW1lIHJlbWFpbnMgd2l0aGluIHRoZSBtYXhpbXVtIHJldGVudGlv biB0aW1lIGxpbWl0Ci0JICogd2hlbiByZXRlbnRpb24gaXMgYWN0aXZlLgorCSAqIHdoZW4gcmV0 ZW50aW9uIGlzIGFjdGl2ZS4gIFNraXAgdGhpcyBjYXAgd2hlbiBtYXhyZXRlbnRpb24gaXMgemVy by4KIAkgKi8KLQlpZiAoTXlTdWJzY3JpcHRpb24tPnJldGVudGlvbmFjdGl2ZSkKKwlpZiAoTXlT dWJzY3JpcHRpb24tPnJldGVudGlvbmFjdGl2ZSAmJiBNeVN1YnNjcmlwdGlvbi0+bWF4cmV0ZW50 aW9uID4gMCkKIAkJcmR0X2RhdGEtPnhpZF9hZHZhbmNlX2ludGVydmFsID0gTWluKHJkdF9kYXRh LT54aWRfYWR2YW5jZV9pbnRlcnZhbCwKIAkJCQkJCQkJCQkJIE15U3Vic2NyaXB0aW9uLT5tYXhy ZXRlbnRpb24pOwogfQotLSAKMi40My4wCgo= --000000000000c93c9306506d145e--