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 1wVYb4-0022mh-32 for pgsql-hackers@arkaria.postgresql.org; Fri, 05 Jun 2026 17:44:43 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wVYb3-00DVdx-2a for pgsql-hackers@arkaria.postgresql.org; Fri, 05 Jun 2026 17:44:41 +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 1wVYb3-00DVdo-1b for pgsql-hackers@lists.postgresql.org; Fri, 05 Jun 2026 17:44:41 +0000 Received: from mail-dy1-x1331.google.com ([2607:f8b0:4864:20::1331]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wVYb1-00000001So7-2PrC for pgsql-hackers@lists.postgresql.org; Fri, 05 Jun 2026 17:44:41 +0000 Received: by mail-dy1-x1331.google.com with SMTP id 5a478bee46e88-30759632453so1630165eec.1 for ; Fri, 05 Jun 2026 10:44:39 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1780681477; cv=none; d=google.com; s=arc-20240605; b=fHqY1QEsUXEbSWuYq8evnCtPYNekcfM1SJEEvTy+ySv8tPdolT5Mt3QcWwGWxC+FXq VmqAdkKSLqXLCMVbvIXmGce9bXmFUGze66t3trOqSizvBb3bzIPupCj9V973Xi4t9FXg DtSm6rIo+CH/eFIwTpSWrZG5qW6I+qChxRfGPftMrFRV2nJRvOwxXuN/9xxCI9pR429b XWAmbS7pByFN3SZoDGuFaVN47sR1bWCdzrIKzPrijvSJOLyHSTA42Pyc8AC2koOKqSOP F/ZcfJS7Ztw8p105UX61B6/A9VwoBkld8TISsn7trU74Q0Pu5B914tKKZfNBVjYa3Smc ukYw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:mime-version:dkim-signature; bh=hXbAN6C1kf77O0/tfQDFg0t0ZrnBNMdvDWMmXZU1RrE=; fh=sC8VvsBoc7XywGeT9NhyyE4rFaXTZzIQK0Sl12OWS6M=; b=OJIuhioDgN9hPtorhyduisEWFXjRiyM1MKcitlHtDdSPB4n+R7lEZWNcDGKEBxxipG 3eIhNEmbwb36X8fQAyJ5fvKHGl1b1Q7O8G6+8oP6qarBNakZjSBlZghCAf/gNzFt0fvO uwQm2IeO4LCxmg4lCChodWyTCTHGHYOKzs2f3MP2slWFLaRfR+PJjXFs+F6lFILxr8nr GI609hX8ZA0amZDsNdkO9KaM38z7iZNtrBuHwO+tHYv3MMvNchAEBVGcxinJq1H1RSau OHMdmsJAKBaa4k+CdpUaqm3bR7WTyqK3laGAxKXG3HNGoWUF1/ElaeRYdRgOLBxk5W/t 0ZfQ==; 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=1780681477; x=1781286277; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=hXbAN6C1kf77O0/tfQDFg0t0ZrnBNMdvDWMmXZU1RrE=; b=gtUQUE+Y7mVsBuZvzeMzHshSCFdtDjehF+HIOyseDMaIwQwvYWAB/gErVaAUSiV518 tMMsAKBSWF1Q5PaLIlTH5sNHIAZXAr1LbcNDFAYkY8odVz3bta9f1hP4P4CIxeM4jaWJ MsXkeqb4MhcPg2Tb/5LJzrw27yz2GnhLxg3ckE4S2dfSFhRcC5VUNH2QLrdvjZz6oH1E lP4oBusUwe9gm7xkRY4izWLOR3kkCoR6Yz1uVPlF86/QOhamZNCTGZ3n7GF78lX6YhbR y2Lg7NeZolfrBI5vGKaeaqlKA5IZhNhyXI79vBcXvkkuqkDGI0+gcYkmk09xu5fePPLj n/Ew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780681477; x=1781286277; h=cc: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=hXbAN6C1kf77O0/tfQDFg0t0ZrnBNMdvDWMmXZU1RrE=; b=V/4f2N/f19itmWyY3oh2Q+CtBoNsTY+5hfYuQ3bpzLO5LMgevIWAAXu0jgWrvQrXVI t4Ty6wjRSbCF2TkEgaQ8C7B1yesJtXNVEkc+TmvoJK5KIlntxETIvzoEzIzoQt6BN88P hJ7SlarFBm2Kzo8T5G7vFf0Qf1QYntiHTjIrtFDuVI2pg8FeK+Lgemwd7nIdi4gNaNZS RSCkejQab064H3IKNt+haqsjGoe/aAx3odyY9O25d8ePPELRGGqxbfuXz51IefxkKOiZ ElPNq9XLC+MdcNNbem4hkNYbqreT7KU3ZNRbAjT5b6UC5DQ3w3+tohGrUruKjnBTIJ8f XtsA== X-Gm-Message-State: AOJu0YxisUMRUNxenHnc83XpR9PwT4qvlcaaIiRNYGufdqaDoy7Zv+ou zJANzJUpyCov24qyVszxvwwqJZ8r/yIOlr2TxU+mgapkHqjO6v0yiDs0dknXDFbbS9QzyBWOuP0 cn3yyyBM6i7fRaIMRVJtUn4WkGP5Xvhw18pddhtM= X-Gm-Gg: Acq92OFl+hB7DIQo7CMZOmws50LxvD2t7eLE6i0K9JKcW1E78fDK9EeksrxrNdlSW6v FJtDyrW5ij5djA/by/eMcYhRSHV4Qw/DvVUKw2v62NBhjaS1Wk5cL5Kc0WuYFNOQwK+OSy44x8N heEb/5NV/asWmFUZ2HObpbKiMqagg62gNVtFS6ZiYU8jTnFiN5Q5IlluqiZRL07cOZeqQglMXcp 4BeO23pOuaV/lh78MbCYF7uETvm03mHK2L3wfa3VE0Cu7q2eP9/c+yRbwB+pmFQarM6JysrQuqX gsiLrLowwtYo5xNKfyJ0CtGmlvJdU6L84QkyFBjweqcjm1wJvZvn X-Received: by 2002:a05:7300:5729:b0:2fc:9ae6:e5a8 with SMTP id 5a478bee46e88-3077b17fcb7mr2392224eec.20.1780681477309; Fri, 05 Jun 2026 10:44:37 -0700 (PDT) MIME-Version: 1.0 From: Baji Shaik Date: Fri, 5 Jun 2026 12:44:24 -0500 X-Gm-Features: AVVi8CdNDmaNZepLpM3ateR9_79h030UmKER_33t85qPR-nkWq4AgF4X8HWJ9S4 Message-ID: Subject: [PATCH] Fix memory leak in pgstat_progress_parallel_incr_param() To: pgsql-hackers@lists.postgresql.org Cc: bertranddrouvot.pg@gmail.com Content-Type: multipart/mixed; boundary="000000000000ea501a06538536b3" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000ea501a06538536b3 Content-Type: multipart/alternative; boundary="000000000000ea501906538536b1" --000000000000ea501906538536b1 Content-Type: text/plain; charset="UTF-8" Hi, While running parallel vacuum with track_cost_delay_timing=on, I noticed memory in the parallel worker process keeps growing proportionally to vacuum runtime, and is never reclaimed until the worker exits. I think pgstat_progress_parallel_incr_param() (backend_progress.c) leaks memory on every call from a parallel worker. The suspected block: static StringInfoData progress_message; initStringInfo(&progress_message); /* palloc -> A */ pq_beginmessage(&progress_message, PqMsg_Progress); /* pq_beginmessage internally calls initStringInfo again -> palloc -> B, A is orphaned */ pq_sendint32(&progress_message, index); pq_sendint64(&progress_message, incr); pq_endmessage(&progress_message); /* pfree(B), A leaked */ So one palloc(~1 kB) leaks per call, into the per-worker context. This is an oversight of f1889729dd3 ("Add new parallel message type to progress reporting"); track_cost_delay_timing just makes it more visible. With that GUC enabled, a long-running parallel vacuum leaks megabytes per worker (~232 MB observed in a 43-min vacuum at default settings on a 15M-row, 30-index workload). The proposed fix is in the attached patch which does a one-time init of the static buffer, then pq_beginmessage_reuse() / pq_endmessage_reuse() so the buffer is allocated once and reused. All 245 regression tests pass. Thanks, Baji Shaik. --000000000000ea501906538536b1 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi,

While running parallel vacuum with track_cost_d= elay_timing=3Don, I
noticed memory in the parallel worker process keeps = growing
proportionally to vacuum runtime, and is never reclaimed until t= he
worker exits.

I think pgstat_progress_parallel_incr_param() (b= ackend_progress.c)
leaks memory on every call from a parallel worker.
The suspected block:

=C2=A0 =C2=A0 static StringInfoData progre= ss_message;
=C2=A0 =C2=A0 initStringInfo(&progress_message); =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* palloc -> A =C2=A0 */=
=C2=A0 =C2=A0 pq_beginmessage(&progress_message, PqMsg_Progress);=C2=A0 =C2=A0 /* pq_beginmessage internally calls initStringInfo again -&= gt;
=C2=A0 =C2=A0 =C2=A0 =C2=A0palloc -> B, A is orphaned =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 */
=C2=A0 =C2=A0 pq_sen= dint32(&progress_message, index);
=C2=A0 =C2=A0 pq_sendint64(&pr= ogress_message, incr);
=C2=A0 =C2=A0 pq_endmessage(&progress_message= ); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* pfree(B), A l= eaked */

So one palloc(~1 kB) leaks per call, into the per-worker co= ntext.

This is an oversight of f1889729dd3 ("Add new parallel m= essage type
to progress reporting"); track_cost_delay_timing just m= akes it more
visible.=C2=A0 With that GUC enabled, a long-running parall= el vacuum leaks
megabytes per worker (~232 MB observed in a 43-min vacuu= m at default
settings on a 15M-row, 30-index workload).

The propo= sed fix is in the attached patch which does a one-time init of the staticbuffer, then pq_beginmessage_reuse() / pq_endmessage_reuse() so the
bu= ffer is allocated once and reused.

All 245 regression tests pass.
Thanks,
Baji Shaik.
--000000000000ea501906538536b1-- --000000000000ea501a06538536b3 Content-Type: application/octet-stream; name="0001-Fix-memory-leak-in-pgstat_progress_parallel_incr_par.patch" Content-Disposition: attachment; filename="0001-Fix-memory-leak-in-pgstat_progress_parallel_incr_par.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mq17pufi0 RnJvbSA1OTA3MTJiNGZlYTM4MWE4MmNmYWE5YWExN2JiZTBmMDdjYTBjMTZhIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBCYWppIFNoYWlrIDxiYWppLnBnZGV2QGdtYWlsLmNvbT4KRGF0 ZTogRnJpLCA1IEp1biAyMDI2IDEyOjQwOjE4IC0wNTAwClN1YmplY3Q6IFtQQVRDSF0gRml4IG1l bW9yeSBsZWFrIGluIHBnc3RhdF9wcm9ncmVzc19wYXJhbGxlbF9pbmNyX3BhcmFtKCkKCldoZW4g Y2FsbGVkIGZyb20gYSBwYXJhbGxlbCB3b3JrZXIsIHBnc3RhdF9wcm9ncmVzc19wYXJhbGxlbF9p bmNyX3BhcmFtKCkKY2FsbHMgaW5pdFN0cmluZ0luZm8oKSBvbiBhIHN0YXRpYyBTdHJpbmdJbmZv RGF0YSBhbmQgdGhlbiBpbW1lZGlhdGVseQpjYWxscyBwcV9iZWdpbm1lc3NhZ2UoKSwgd2hpY2gg Y2FsbHMgaW5pdFN0cmluZ0luZm8oKSBhZ2Fpbi4gIFRoZSBzZWNvbmQKY2FsbCBvdmVyd3JpdGVz IGJ1Zi0+ZGF0YSB3aXRoIGEgZnJlc2hseSBwYWxsb2MnZCBidWZmZXIsIG9ycGhhbmluZyB0aGUK Zmlyc3Qgb25lLiAgcHFfZW5kbWVzc2FnZSgpIHRoZW4gZnJlZXMgb25seSB0aGUgc2Vjb25kIGJ1 ZmZlciwgc28gZWFjaApjYWxsIGxlYWtzIH4xIGtCIGludG8gdGhlIHBlci13b3JrZXIgbWVtb3J5 IGNvbnRleHQuCgpUaGUgbGVhayBpcyBuZWdsaWdpYmxlIGJ5IGRlZmF1bHQsIGJ1dCB3aXRoIHRy YWNrX2Nvc3RfZGVsYXlfdGltaW5nCmVuYWJsZWQgdGhlIHBhcmFsbGVsIGNvc3QtZGVsYXkgcmVw b3J0aW5nIHBhdGggZmlyZXMgb25jZSBwZXIgc2Vjb25kIHBlcgp3b3JrZXIsIHNvIGEgbG9uZy1y dW5uaW5nIHBhcmFsbGVsIHZhY3V1bSBsZWFrcyBtZWdhYnl0ZXMgcGVyIHdvcmtlci4KCkZpeCBi eSBpbml0aWFsaXppbmcgdGhlIHN0YXRpYyBidWZmZXIgb25jZSBwZXIgcHJvY2VzcyBhbmQgdXNp bmcKcHFfYmVnaW5tZXNzYWdlX3JldXNlKCkvcHFfZW5kbWVzc2FnZV9yZXVzZSgpLCBzbyB0aGUg YnVmZmVyIGlzIGFsbG9jYXRlZApvbmNlIGFuZCByZXVzZWQuCgpUaGlzIGlzIGFuIG92ZXJzaWdo dCBvZiBmMTg4OTcyOWRkMyAoIkFkZCBuZXcgcGFyYWxsZWwgbWVzc2FnZSB0eXBlIHRvCnByb2dy ZXNzIHJlcG9ydGluZyIpOyB0cmFja19jb3N0X2RlbGF5X3RpbWluZyBqdXN0IG1ha2VzIGl0IG1v cmUgdmlzaWJsZS4KCkF1dGhvcjogQmFqaSBTaGFpayA8YmFqaS5wZ2RldkBnbWFpbC5jb20+Ci0t LQogc3JjL2JhY2tlbmQvdXRpbHMvYWN0aXZpdHkvYmFja2VuZF9wcm9ncmVzcy5jIHwgMjAgKysr KysrKysrKysrKystLS0tLQogMSBmaWxlIGNoYW5nZWQsIDE1IGluc2VydGlvbnMoKyksIDUgZGVs ZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWN0aXZpdHkvYmFja2Vu ZF9wcm9ncmVzcy5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWN0aXZpdHkvYmFja2VuZF9wcm9ncmVz cy5jCmluZGV4IGIwMzU5NzcxZGU1Li4wNDgzNzQxYTgwZSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tl bmQvdXRpbHMvYWN0aXZpdHkvYmFja2VuZF9wcm9ncmVzcy5jCisrKyBiL3NyYy9iYWNrZW5kL3V0 aWxzL2FjdGl2aXR5L2JhY2tlbmRfcHJvZ3Jlc3MuYwpAQCAtOTksMTMgKzk5LDIzIEBAIHBnc3Rh dF9wcm9ncmVzc19wYXJhbGxlbF9pbmNyX3BhcmFtKGludCBpbmRleCwgaW50NjQgaW5jcikKIAlp ZiAoSXNQYXJhbGxlbFdvcmtlcigpKQogCXsKIAkJc3RhdGljIFN0cmluZ0luZm9EYXRhIHByb2dy ZXNzX21lc3NhZ2U7Ci0KLQkJaW5pdFN0cmluZ0luZm8oJnByb2dyZXNzX21lc3NhZ2UpOwotCi0J CXBxX2JlZ2lubWVzc2FnZSgmcHJvZ3Jlc3NfbWVzc2FnZSwgUHFNc2dfUHJvZ3Jlc3MpOworCQlz dGF0aWMgYm9vbCBwcm9ncmVzc19tZXNzYWdlX2luaXRpYWxpemVkID0gZmFsc2U7CisKKwkJLyoK KwkJICogSW5pdGlhbGl6ZSB0aGUgbWVzc2FnZSBidWZmZXIgb25jZSBwZXIgcHJvY2VzczsgcHFf YmVnaW5tZXNzYWdlX3JldXNlKCkKKwkJICogYW5kIHBxX2VuZG1lc3NhZ2VfcmV1c2UoKSByZXNl dCBhbmQgcmV1c2UgaXQgb24gZWFjaCBjYWxsIHRvIGF2b2lkCisJCSAqIHBhbGxvYyBvdmVyaGVh ZC4KKwkJICovCisJCWlmICghcHJvZ3Jlc3NfbWVzc2FnZV9pbml0aWFsaXplZCkKKwkJeworCQkJ aW5pdFN0cmluZ0luZm8oJnByb2dyZXNzX21lc3NhZ2UpOworCQkJcHJvZ3Jlc3NfbWVzc2FnZV9p bml0aWFsaXplZCA9IHRydWU7CisJCX0KKworCQlwcV9iZWdpbm1lc3NhZ2VfcmV1c2UoJnByb2dy ZXNzX21lc3NhZ2UsIFBxTXNnX1Byb2dyZXNzKTsKIAkJcHFfc2VuZGludDMyKCZwcm9ncmVzc19t ZXNzYWdlLCBpbmRleCk7CiAJCXBxX3NlbmRpbnQ2NCgmcHJvZ3Jlc3NfbWVzc2FnZSwgaW5jcik7 Ci0JCXBxX2VuZG1lc3NhZ2UoJnByb2dyZXNzX21lc3NhZ2UpOworCQlwcV9lbmRtZXNzYWdlX3Jl dXNlKCZwcm9ncmVzc19tZXNzYWdlKTsKIAl9CiAJZWxzZQogCQlwZ3N0YXRfcHJvZ3Jlc3NfaW5j cl9wYXJhbShpbmRleCwgaW5jcik7Ci0tIAoyLjUwLjEgKEFwcGxlIEdpdC0xNTUpCgo= --000000000000ea501a06538536b3--