From ed3ed3de5c6bb25b1a4c9c52d92abcf03bb5c85e Mon Sep 17 00:00:00 2001 From: Marcus Pousette Date: Sat, 6 Sep 2025 13:25:59 +0200 Subject: [PATCH 1/3] Improve MemoryContext management to prevent memory exhaustion between queries --- pglite-wasm/pg_main.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/pglite-wasm/pg_main.c b/pglite-wasm/pg_main.c index 65e5d7ac01d2c..a592a5d634a50 100644 --- a/pglite-wasm/pg_main.c +++ b/pglite-wasm/pg_main.c @@ -28,7 +28,18 @@ // globals -#define MemoryContextResetAndDeleteChildren(...) +/* + * Ensure MessageContext and its children are actually cleared between + * queries. Leaving this as a no-op causes unbounded growth in + * MessageContext when large query strings or parameters are processed, + * eventually exhausting memory. + */ +#undef MemoryContextResetAndDeleteChildren +#define MemoryContextResetAndDeleteChildren(ctx) \ + do { \ + MemoryContextDeleteChildren((ctx)); \ + MemoryContextReset((ctx)); \ + } while (0) // #define SpinLockInit(...) From 788416ceb3680ad1b8ba065dc71d8f5b2801d7c3 Mon Sep 17 00:00:00 2001 From: Marcus Pousette Date: Mon, 8 Sep 2025 11:10:58 +0200 Subject: [PATCH 2/3] Use MemoryContextReset; drop legacy MemoryContextResetAndDeleteChildren macro --- pglite-wasm/interactive_one.c | 2 +- pglite-wasm/pg_main.c | 13 +++---------- pglite-wasm/pgl_mains.c | 2 +- 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/pglite-wasm/interactive_one.c b/pglite-wasm/interactive_one.c index fc3590961d5d6..124e99c5059f4 100644 --- a/pglite-wasm/interactive_one.c +++ b/pglite-wasm/interactive_one.c @@ -416,7 +416,7 @@ if (cma_rsize<0) } MemoryContextSwitchTo(MessageContext); - MemoryContextResetAndDeleteChildren(MessageContext); + MemoryContextReset(MessageContext); initStringInfo(&input_message); diff --git a/pglite-wasm/pg_main.c b/pglite-wasm/pg_main.c index a592a5d634a50..410fea024bd5e 100644 --- a/pglite-wasm/pg_main.c +++ b/pglite-wasm/pg_main.c @@ -29,17 +29,10 @@ // globals /* - * Ensure MessageContext and its children are actually cleared between - * queries. Leaving this as a no-op causes unbounded growth in - * MessageContext when large query strings or parameters are processed, - * eventually exhausting memory. + * MessageContext cleanup between queries relies on upstream semantics: + * MemoryContextReset() deletes child contexts since v9.5. + * Avoid redefining legacy MemoryContextResetAndDeleteChildren. */ -#undef MemoryContextResetAndDeleteChildren -#define MemoryContextResetAndDeleteChildren(ctx) \ - do { \ - MemoryContextDeleteChildren((ctx)); \ - MemoryContextReset((ctx)); \ - } while (0) // #define SpinLockInit(...) diff --git a/pglite-wasm/pgl_mains.c b/pglite-wasm/pgl_mains.c index 98f425a6e4116..7dc200745a4d7 100644 --- a/pglite-wasm/pgl_mains.c +++ b/pglite-wasm/pgl_mains.c @@ -45,7 +45,7 @@ interactive_file() { * query input buffer in the cleared MessageContext. */ MemoryContextSwitchTo(MessageContext); - MemoryContextResetAndDeleteChildren(MessageContext); + MemoryContextReset(MessageContext); initStringInfo(&input_message); inBuf = &input_message; From d08dc1b49454a8a738d61ff993ec5bb2b0b9007b Mon Sep 17 00:00:00 2001 From: Marcus Pousette Date: Mon, 8 Sep 2025 11:55:47 +0200 Subject: [PATCH 3/3] Cleanup: remove extraneous comment; keep MemoryContextReset only --- pglite-wasm/pg_main.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/pglite-wasm/pg_main.c b/pglite-wasm/pg_main.c index 410fea024bd5e..07c21cf1b5b24 100644 --- a/pglite-wasm/pg_main.c +++ b/pglite-wasm/pg_main.c @@ -28,12 +28,6 @@ // globals -/* - * MessageContext cleanup between queries relies on upstream semantics: - * MemoryContextReset() deletes child contexts since v9.5. - * Avoid redefining legacy MemoryContextResetAndDeleteChildren. - */ -// #define SpinLockInit(...)