From 57a2f96d489fe9c2b81b0310d7b9efcdd45460bc Mon Sep 17 00:00:00 2001
From: Daniil Davidov <d.davydov@postgrespro.ru>
Date: Sat, 28 Feb 2026 18:36:08 +0700
Subject: [PATCH 1/3] fixes for 0003 patch

---
 src/backend/commands/vacuumparallel.c | 23 +++++++++++++----------
 1 file changed, 13 insertions(+), 10 deletions(-)

diff --git a/src/backend/commands/vacuumparallel.c b/src/backend/commands/vacuumparallel.c
index 0ee4019f561..80b57bf9da3 100644
--- a/src/backend/commands/vacuumparallel.c
+++ b/src/backend/commands/vacuumparallel.c
@@ -74,13 +74,6 @@ typedef struct VacuumCostParams
 	(cost_params)->cost_page_hit = VacuumCostPageHit; \
 	(cost_params)->cost_page_miss = VacuumCostPageMiss
 
-#define VacCostParamsEquals(params) \
-	(vacuum_cost_delay == (params).cost_delay && \
-	 vacuum_cost_limit == (params).cost_limit && \
-	 VacuumCostPageDirty == (params).cost_page_dirty && \
-	 VacuumCostPageHit == (params).cost_page_hit && \
-	 VacuumCostPageMiss == (params).cost_page_miss)
-
 /*
  * Struct for cost-based vacuum delay related parameters to share among an
  * autovacuum worker and its parallel vacuum workers.
@@ -669,24 +662,34 @@ parallel_vacuum_update_shared_delay_params(void)
 void
 parallel_vacuum_propagate_shared_delay_params(void)
 {
+	VacuumCostParams *params_data;
+
 	Assert(AmAutoVacuumWorkerProcess());
 
 	/* Check whether we are running parallel autovacuum */
 	if (pv_shared_cost_params == NULL)
 		return;
 
-	SpinLockAcquire(&pv_shared_cost_params->mutex);
+	/*
+	 * Only leader worker can modify this shared structure, so we can read it
+	 * without acquiring a lock.
+	 */
+	params_data = &pv_shared_cost_params->params_data;
 
-	if (VacCostParamsEquals(pv_shared_cost_params->params_data))
+	if (vacuum_cost_delay == params_data->cost_delay &&
+		vacuum_cost_limit == params_data->cost_limit &&
+		VacuumCostPageDirty == params_data->cost_page_dirty &&
+		VacuumCostPageHit == params_data->cost_page_hit &&
+		VacuumCostPageMiss == params_data->cost_page_miss)
 	{
 		/*
 		 * We don't need to update shared cost-based vacuum delay params if
 		 * they haven't changed.
 		 */
-		SpinLockRelease(&pv_shared_cost_params->mutex);
 		return;
 	}
 
+	SpinLockAcquire(&pv_shared_cost_params->mutex);
 	FillVacCostParams(&pv_shared_cost_params->params_data);
 	SpinLockRelease(&pv_shared_cost_params->mutex);
 
-- 
2.43.0

