From b649988718442143256eae59f29b770d08f1fc97 Mon Sep 17 00:00:00 2001
From: Daniil Davidov <d.davydov@postgrespro.ru>
Date: Thu, 2 Apr 2026 22:08:06 +0700
Subject: [PATCH] Make sure that all recourses have been released in parallel
 autovacuum

---
 src/backend/access/transam/parallel.c |  7 +++++++
 src/backend/commands/vacuumparallel.c | 15 +++++++++++++++
 src/include/access/parallel.h         |  3 +++
 3 files changed, 25 insertions(+)

diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c
index ab1dfb30e73..81bca48bcfa 100644
--- a/src/backend/access/transam/parallel.c
+++ b/src/backend/access/transam/parallel.c
@@ -1292,6 +1292,13 @@ AtEOXact_Parallel(bool isCommit)
 			elog(WARNING, "leaked parallel context");
 		DestroyParallelContext(pcxt);
 	}
+
+	/*
+	 * Parallel autovacuum may have resources that depend on ParallelContext,
+	 * but are local to vacuumparallel.c
+	 */
+	if (AmAutoVacuumWorkerProcess())
+		AtEOXact_ParallelAutovacuum(isCommit);
 }
 
 /*
diff --git a/src/backend/commands/vacuumparallel.c b/src/backend/commands/vacuumparallel.c
index bac3bd28214..68d4a25528d 100644
--- a/src/backend/commands/vacuumparallel.c
+++ b/src/backend/commands/vacuumparallel.c
@@ -541,6 +541,21 @@ parallel_vacuum_end(ParallelVacuumState *pvs, IndexBulkDeleteResult **istats)
 	pfree(pvs);
 }
 
+/*
+ * End-of-transaction cleanup for parallel autovacuum.
+ */
+void
+AtEOXact_ParallelAutovacuum(bool isCommit)
+{
+	if (pv_shared_cost_params == NULL)
+		return;
+
+	if (isCommit)
+		elog(WARNING, "leaked parallel autovacuum state");
+
+	pv_shared_cost_params = NULL;
+}
+
 /*
  * Returns the dead items space and dead items information.
  */
diff --git a/src/include/access/parallel.h b/src/include/access/parallel.h
index 60f857675e0..553273b1529 100644
--- a/src/include/access/parallel.h
+++ b/src/include/access/parallel.h
@@ -80,4 +80,7 @@ extern void ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end);
 
 extern void ParallelWorkerMain(Datum main_arg);
 
+/* vacuumparallel.c */
+extern void AtEOXact_ParallelAutovacuum(bool isCommit);
+
 #endif							/* PARALLEL_H */
-- 
2.43.0

