v1-0001-Fix-memory-leak-in-_gin_parallel_merge.patch

application/octet-stream

Filename: v1-0001-Fix-memory-leak-in-_gin_parallel_merge.patch
Type: application/octet-stream
Part: 0
Message: Re: Parallel CREATE INDEX for GIN indexes

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: format-patch
Series: patch v1-0001
Subject: Fix memory leak in _gin_parallel_merge
File+
src/backend/access/gin/gininsert.c 7 0
From 09614c5dc09e9f05e8aa157c029cf87de9cd4b72 Mon Sep 17 00:00:00 2001
From: Vinod Sridharan <vsridh90@gmail.com>
Date: Thu, 17 Apr 2025 13:51:41 -0700
Subject: [PATCH v1] Fix memory leak in _gin_parallel_merge

---
 src/backend/access/gin/gininsert.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/src/backend/access/gin/gininsert.c b/src/backend/access/gin/gininsert.c
index cfab93ec30c..05a1aea51c1 100644
--- a/src/backend/access/gin/gininsert.c
+++ b/src/backend/access/gin/gininsert.c
@@ -1616,6 +1616,7 @@ _gin_parallel_merge(GinBuildState *state)
 	Size		tuplen;
 	double		reltuples = 0;
 	GinBuffer  *buffer;
+	MemoryContext oldCtx;
 
 	/* GIN tuples from workers, merged by leader */
 	double		numtuples = 0;
@@ -1685,9 +1686,12 @@ _gin_parallel_merge(GinBuildState *state)
 			 */
 			AssertCheckItemPointers(buffer);
 
+			oldCtx = MemoryContextSwitchTo(state->tmpCtx);
 			ginEntryInsert(&state->ginstate,
 						   buffer->attnum, buffer->key, buffer->category,
 						   buffer->items, buffer->nitems, &state->buildStats);
+			MemoryContextSwitchTo(oldCtx);
+			MemoryContextReset(state->tmpCtx);
 
 			/* discard the existing data */
 			GinBufferReset(buffer);
@@ -1711,9 +1715,12 @@ _gin_parallel_merge(GinBuildState *state)
 			 */
 			AssertCheckItemPointers(buffer);
 
+			oldCtx = MemoryContextSwitchTo(state->tmpCtx);
 			ginEntryInsert(&state->ginstate,
 						   buffer->attnum, buffer->key, buffer->category,
 						   buffer->items, buffer->nfrozen, &state->buildStats);
+			MemoryContextSwitchTo(oldCtx);
+			MemoryContextReset(state->tmpCtx);
 
 			/* truncate the data we've just discarded */
 			GinBufferTrim(buffer);
-- 
2.25.1