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 1tLEKN-00DWm6-NI for pgsql-hackers@arkaria.postgresql.org; Wed, 11 Dec 2024 04:27:59 +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 1tLEKJ-00Bps7-IA for pgsql-hackers@arkaria.postgresql.org; Wed, 11 Dec 2024 04:27:56 +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 1tLEKJ-00Bpq3-7F for pgsql-hackers@lists.postgresql.org; Wed, 11 Dec 2024 04:27:56 +0000 Received: from mail-yw1-x112f.google.com ([2607:f8b0:4864:20::112f]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1tLEKH-002Bs4-7o for pgsql-hackers@lists.postgresql.org; Wed, 11 Dec 2024 04:27:55 +0000 Received: by mail-yw1-x112f.google.com with SMTP id 00721157ae682-6ef7f8d4f30so52350337b3.1 for ; Tue, 10 Dec 2024 20:27:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1733891272; x=1734496072; darn=lists.postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=r3SkCYkfRyFOqdbHc58nDDhzrhWZZ9pN0CzyF1kWCD8=; b=Zb1oNpruX/NJ829f0mc9SiOgJWq9Cm895FeCck6FcqhA/RxYgDHTXzk9OwQhwQ41Zk wBN19hZv9xrs6lSzQqqXnyA6rViHlFf65BZAR5q0dWY1AxJL5E11wFr4fBPB6iApdv/E TBNRrzeQBJIlNTApApTLhtgMPLApnVnUoDi5ro0hNE4IWE0BTFJ/Bir1dvktXISihfk4 Jau/yPx8j/hknmrb02bbPILOeWibobVWKXhCZzWV4czFs4hyRAX2AK49pums5E2gUzZA ZOUV729kj03iroDkF+2i4AL/6PtyMbtLINXyUSHtRjZEw6pmapJjd0Ki1EDe4IJkA8SR G4XA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733891272; x=1734496072; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=r3SkCYkfRyFOqdbHc58nDDhzrhWZZ9pN0CzyF1kWCD8=; b=ww7tvKi2pfFLtRptVbK/Q8pnvSfnjpcI7CZVD5K7p0YzFSo/kut7RKk6iqKHHVofnX VP6RO5M8KQQJh+S7r75X0Th8jc/MtuXLEajFJcXL5b62jp2BSFLUBqPVQwt+IHLc5/U0 +xcUy4tb3ysN90XORFdLl2f1wHEyMMrbxdGnhlN2jy35unqdjcvXX8KAm0kQHjzVlDZb ou8HEoIwXyRDRwFpQ7eYVx/bwP7Mss4PDAt/98E+SXbpa7m/pJyrpEf8J3lOclSsPwNj 5Ymc9WNJ6bxm8fW3gTwsWER9/mK72WZu6tV9wfQaGxVSI50DoVR+zwugzp7J6mcKwaoz KDfg== X-Gm-Message-State: AOJu0YzHzjPD1V4dbB44zXuA9DU0JFttshtUZRmWe84I4pVQ5+gYZsWK 3TmPT2p7nxId6T9t8AnYog4Iye9w1/FVNUvKKVKop5fFXXpMZGtbIY/K/z/bOpuDUiQIRldQPMH ajc+MxxuMD2S5hwhDUmmoRkSWA+1hfjraqZPgEg== X-Gm-Gg: ASbGncvFeIX+8iY5HkT/BNQb7G8u72V3dka9vyR4QXvzgdPYodiDVETypbf5d1vSO3A tvFmajG1o06l/4IGuBcbXr8bSLHWXntyfaBdJ X-Google-Smtp-Source: AGHT+IHF2lfxSq+VQEm8UVbjyBocup5DgsAZMZOpV+K7IcbLTHtT9oNB3hV3orVLVkCFT6dzzinVeDEAM/4Co5+KaMU= X-Received: by 2002:a05:690c:62c8:b0:6ef:6a91:4971 with SMTP id 00721157ae682-6f148051dd9mr18683067b3.36.1733891271652; Tue, 10 Dec 2024 20:27:51 -0800 (PST) MIME-Version: 1.0 From: vignesh C Date: Wed, 11 Dec 2024 09:57:38 +0530 Message-ID: Subject: Memory leak in pg_logical_slot_{get,peek}_changes To: PostgreSQL Hackers Content-Type: multipart/mixed; boundary="000000000000540e5b0628f705d5" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000540e5b0628f705d5 Content-Type: text/plain; charset="UTF-8" Hi, I'm starting a new thread for one of the issues reported by Sawada-san at [1]. This is a memory leak on CacheMemoryContext when using pgoutput via SQL APIs: /* Map must live as long as the session does. */ oldctx = MemoryContextSwitchTo(CacheMemoryContext); entry->attrmap = build_attrmap_by_name_if_req(indesc, outdesc, false); MemoryContextSwitchTo(oldctx); RelationClose(ancestor); entry->attrmap is pfree'd only when validating the RelationSyncEntry so remains even after logical decoding API calls. This issue can be reproduced with the following test: -- Create table create table t1( c1 int, c2 int, c3 int) PARTITION BY LIST (c1); create table t1_1( c2 int, c1 int, c3 int); ALTER TABLE t1 ATTACH PARTITION t1_1 FOR VALUES IN (0, 1, 2, 3); -- Create publication create publication pub1 FOR TABLE t1, t1_1 WITH (publish_via_partition_root = true); -- Create replication slot SELECT 'init' FROM pg_create_logical_replication_slot('test', 'pgoutput'); -- Run the below steps between Test start and Test end many times to see the memory usage getting increased -- Test start insert into t1 values( 1); SELECT count(*) FROM pg_logical_slot_get_binary_changes('test', NULL, NULL, 'proto_version', '4', 'publication_names', 'pub1'); -- Memory increases after each invalidation and insert SELECT * FROM pg_backend_memory_contexts where name = 'CacheMemoryContext'; -- Test end The attached patch resolves a memory leak by ensuring that the attribute map is properly freed during plugin shutdown. This process is triggered by the SQL API when the decoding context is being released. Additionally, I am conducting a review to identify and address any similar memory leaks that may exist elsewhere in the code. [1] - https://www.postgresql.org/message-id/CAD21AoDkAhQVSukOfH3_reuF-j4EU0-HxMqU3dU%2BbSTxsqT14Q%40mail.gmail.com Regards, Vignesh --000000000000540e5b0628f705d5 Content-Type: text/x-patch; charset="US-ASCII"; name="v1-0001-Fix-memory-leak-in-pgoutput-relation-attribute-ma.patch" Content-Disposition: attachment; filename="v1-0001-Fix-memory-leak-in-pgoutput-relation-attribute-ma.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m4je26ie0 RnJvbSAzNmU1YzEwMTA1ZDkzNGRhMGQ1MTQ3NGIwYWQ3YzViZDkwODdlMmFhIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBWaWduZXNoIDx2aWduZXNoMjFAZ21haWwuY29tPgpEYXRlOiBX ZWQsIDExIERlYyAyMDI0IDA4OjU3OjA2ICswNTMwClN1YmplY3Q6IFtQQVRDSCB2MV0gRml4IG1l bW9yeSBsZWFrIGluIHBnb3V0cHV0IHJlbGF0aW9uIGF0dHJpYnV0ZSBtYXAKClRoZSBwZ291dHB1 dCBtb2R1bGUgY2FjaGVzIHJlbGF0aW9uIGF0dHJpYnV0ZSBtYXAgYW5kIGZyZWVzIGl0IHVwb24K aW52YWxpZGF0aW9uLiAgSG93ZXZlciwgdGhpcyB3YXMgbm90IGdldHRpbmcgZnJlZWQgaW5jYXNl IG9mIFNRTCBmdW5jdGlvbnMgbGlrZQpwZ19sb2dpY2FsX3Nsb3Rfe2dldCxwZWVrfV9jaGFuZ2Vz KCkgd2hpY2ggd291bGQgYmxvYXQgaXRzIGNhY2hlIG1lbW9yeSB1c2FnZS4KRXZlcnkgcGdfbG9n aWNhbF9zbG90X3tnZXQscGVla31fY2hhbmdlcygpIGNhbGwgZm9yIGNoYW5nZXMgb24gcGFydGl0 aW9uIHRhYmxlCmNyZWF0ZXMgbW9yZSBibG9hdC4gVG8gYWRkcmVzcyB0aGlzLCB0aGlzIHJlbGF0 aW9uIGF0dHJpYnV0ZSBtYXAgaXMgZnJlZWQgd2hpbGUKdGhlIG91dHB1dCBwbHVnaW4gaXMgc2h1 dGRvd24uCi0tLQogc3JjL2JhY2tlbmQvcmVwbGljYXRpb24vcGdvdXRwdXQvcGdvdXRwdXQuYyB8 IDEwICsrKysrKysrKysKIDEgZmlsZSBjaGFuZ2VkLCAxMCBpbnNlcnRpb25zKCspCgpkaWZmIC0t Z2l0IGEvc3JjL2JhY2tlbmQvcmVwbGljYXRpb24vcGdvdXRwdXQvcGdvdXRwdXQuYyBiL3NyYy9i YWNrZW5kL3JlcGxpY2F0aW9uL3Bnb3V0cHV0L3Bnb3V0cHV0LmMKaW5kZXggYjUwYjNkNjJlMy4u ZjFlZjEzZDMxMyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvcmVwbGljYXRpb24vcGdvdXRwdXQv cGdvdXRwdXQuYworKysgYi9zcmMvYmFja2VuZC9yZXBsaWNhdGlvbi9wZ291dHB1dC9wZ291dHB1 dC5jCkBAIC0xNzQ3LDYgKzE3NDcsMTYgQEAgcGdvdXRwdXRfc2h1dGRvd24oTG9naWNhbERlY29k aW5nQ29udGV4dCAqY3R4KQogewogCWlmIChSZWxhdGlvblN5bmNDYWNoZSkKIAl7CisJCVJlbGF0 aW9uU3luY0VudHJ5ICplbnRyeTsKKwkJSEFTSF9TRVFfU1RBVFVTIHN0YXR1czsKKworCQloYXNo X3NlcV9pbml0KCZzdGF0dXMsIFJlbGF0aW9uU3luY0NhY2hlKTsKKwkJd2hpbGUgKChlbnRyeSA9 IChSZWxhdGlvblN5bmNFbnRyeSAqKSBoYXNoX3NlcV9zZWFyY2goJnN0YXR1cykpICE9IE5VTEwp CisJCXsKKwkJCWlmIChlbnRyeS0+YXR0cm1hcCkKKwkJCQlmcmVlX2F0dHJtYXAoZW50cnktPmF0 dHJtYXApOworCQl9CisKIAkJaGFzaF9kZXN0cm95KFJlbGF0aW9uU3luY0NhY2hlKTsKIAkJUmVs YXRpb25TeW5jQ2FjaGUgPSBOVUxMOwogCX0KLS0gCjIuNDMuMAoK --000000000000540e5b0628f705d5--