0001-POC-use-proc-signals-to-propagate-the-shared-vacuum-.patch
text/x-patch
Filename: 0001-POC-use-proc-signals-to-propagate-the-shared-vacuum-.patch
Type: text/x-patch
Part: 0
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 0001
Subject: POC: use proc signals to propagate the shared vacuum delay parameters.
| File | + | − |
|---|---|---|
| src/backend/access/heap/vacuumlazy.c | 0 | 12 |
| src/backend/access/transam/parallel.c | 20 | 0 |
| src/backend/commands/vacuum.c | 25 | 13 |
| src/backend/commands/vacuumparallel.c | 63 | 83 |
| src/backend/storage/ipc/procsignal.c | 4 | 0 |
| src/include/access/parallel.h | 2 | 0 |
| src/include/commands/vacuum.h | 5 | 0 |
| src/include/storage/procsignal.h | 3 | 1 |
| src/test/modules/test_autovacuum/Makefile | 0 | 4 |
| src/test/modules/test_autovacuum/meson.build | 0 | 3 |
| src/test/modules/test_autovacuum/t/001_parallel_autovacuum.pl | 0 | 78 |
From f90a43e0a6297511144f2b31b322e508bcdc3369 Mon Sep 17 00:00:00 2001
From: Masahiko Sawada <sawada.mshk@gmail.com>
Date: Thu, 2 Apr 2026 02:07:23 -0700
Subject: [PATCH] POC: use proc signals to propagate the shared vacuum delay
parameters.
---
src/backend/access/heap/vacuumlazy.c | 12 --
src/backend/access/transam/parallel.c | 20 +++
src/backend/commands/vacuum.c | 38 +++--
src/backend/commands/vacuumparallel.c | 146 ++++++++----------
src/backend/storage/ipc/procsignal.c | 4 +
src/include/access/parallel.h | 2 +
src/include/commands/vacuum.h | 5 +
src/include/storage/procsignal.h | 4 +-
src/test/modules/test_autovacuum/Makefile | 4 -
src/test/modules/test_autovacuum/meson.build | 3 -
.../t/001_parallel_autovacuum.pl | 78 ----------
11 files changed, 122 insertions(+), 194 deletions(-)
diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 39395aed0d5..88c71cd85b6 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -152,7 +152,6 @@
#include "storage/latch.h"
#include "storage/lmgr.h"
#include "storage/read_stream.h"
-#include "utils/injection_point.h"
#include "utils/lsyscache.h"
#include "utils/pg_rusage.h"
#include "utils/timestamp.h"
@@ -863,17 +862,6 @@ heap_vacuum_rel(Relation rel, const VacuumParams *params,
lazy_check_wraparound_failsafe(vacrel);
dead_items_alloc(vacrel, params->nworkers);
-#ifdef USE_INJECTION_POINTS
-
- /*
- * Used by tests to pause before parallel vacuum is launched, allowing
- * test code to modify configuration that the leader then propagates to
- * workers.
- */
- if (AmAutoVacuumWorkerProcess() && ParallelVacuumIsActive(vacrel))
- INJECTION_POINT("autovacuum-start-parallel-vacuum", NULL);
-#endif
-
/*
* Call lazy_scan_heap to perform all required heap pruning, index
* vacuuming, and heap vacuuming (plus related processing)
diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c
index ab1dfb30e73..a8ba09832fc 100644
--- a/src/backend/access/transam/parallel.c
+++ b/src/backend/access/transam/parallel.c
@@ -1035,6 +1035,26 @@ ParallelContextActive(void)
return !dlist_is_empty(&pcxt_list);
}
+/*
+ * Send a signal to all workers.
+ */
+void
+SendProcSignalToParallelWorkers(ParallelContext *pcxt, ProcSignalReason reason)
+{
+ for (int i = 0; i < pcxt->nworkers_launched; i++)
+ {
+ pid_t pid;
+
+ if (pcxt->worker[i].error_mqh == NULL ||
+ pcxt->worker[i].bgwhandle == NULL ||
+ GetBackgroundWorkerPid(pcxt->worker[i].bgwhandle,
+ &pid) != BGWH_STARTED)
+ continue;
+
+ (void) SendProcSignal(pid, reason, ParallelLeaderProcNumber);
+ }
+}
+
/*
* Handle receipt of an interrupt indicating a parallel worker message.
*
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index 62d03c8e190..2bf53debc4e 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -621,6 +621,9 @@ vacuum(List *relations, const VacuumParams *params, BufferAccessStrategy bstrate
VacuumSharedCostBalance = NULL;
VacuumActiveNWorkers = NULL;
+ ParallelVacuumSharedCostParams = NULL;
+ CurrentParallelVacuumState = NULL;
+
/*
* Loop to process each selected relation.
*/
@@ -2435,19 +2438,8 @@ vacuum_delay_point(bool is_analyze)
/* Always check for interrupts */
CHECK_FOR_INTERRUPTS();
- if (InterruptPending)
- return;
-
- if (IsParallelWorker())
- {
- /*
- * Update cost-based vacuum delay parameters for a parallel autovacuum
- * worker if any changes are detected.
- */
- parallel_vacuum_update_shared_delay_params();
- }
-
- if (!VacuumCostActive && !ConfigReloadPending)
+ if (InterruptPending ||
+ (!VacuumCostActive && !ConfigReloadPending && !ParallelVacuumParamsUpdatePending))
return;
/*
@@ -2469,6 +2461,26 @@ vacuum_delay_point(bool is_analyze)
parallel_vacuum_propagate_shared_delay_params();
}
+ /*
+ * Update cost-based vacuum delay parameters for a parallel autovacuum
+ * worker if requested from the autovacuum worker (the leader process).
+ */
+ if (ParallelVacuumParamsUpdatePending && ParallelVacuumSharedCostParams != NULL)
+ {
+ Assert(IsParallelWorker());
+
+ ParallelVacuumParamsUpdatePending = false;
+ parallel_vacuum_update_shared_delay_params();
+
+ elog(DEBUG2,
+ "parallel autovacuum worker updated cost params: cost_limit=%d, cost_delay=%g, cost_page_miss=%d, cost_page_dirty=%d, cost_page_hit=%d",
+ vacuum_cost_limit,
+ vacuum_cost_delay,
+ VacuumCostPageMiss,
+ VacuumCostPageDirty,
+ VacuumCostPageHit);
+ }
+
/*
* If we disabled cost-based delays after reloading the config file,
* return.
diff --git a/src/backend/commands/vacuumparallel.c b/src/backend/commands/vacuumparallel.c
index bac3bd28214..c3d7ad2366e 100644
--- a/src/backend/commands/vacuumparallel.c
+++ b/src/backend/commands/vacuumparallel.c
@@ -21,9 +21,8 @@
* For parallel autovacuum, we need to propagate cost-based vacuum delay
* parameters from the leader to its workers, as the leader's parameters can
* change even while processing a table (e.g., due to a config reload).
- * The PVSharedCostParams struct manages these parameters using a
- * generation counter. Each parallel worker polls this shared state and
- * refreshes its local delay parameters whenever a change is detected.
+ * After the autovacuum process updates any vacuum delay parameters, it
+ * notifies its parallel vacuum workers to refresh their local parameters.
*
* Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
@@ -46,7 +45,6 @@
#include "storage/bufmgr.h"
#include "storage/proc.h"
#include "tcop/tcopprot.h"
-#include "utils/injection_point.h"
#include "utils/lsyscache.h"
#include "utils/rel.h"
@@ -67,17 +65,6 @@
*/
typedef struct PVSharedCostParams
{
- /*
- * The generation counter is incremented by the leader process each time
- * it updates the shared cost-based vacuum delay parameters. Parallel
- * vacuum workers compare it with their local generation,
- * shared_params_generation_local, to detect whether they need to refresh
- * their local parameters. The generation starts from 1 so that a freshly
- * started worker (whose local copy is 0) will always load the initial
- * parameters on its first check.
- */
- pg_atomic_uint32 generation;
-
slock_t mutex; /* protects all fields below */
/* Parameters to share with parallel workers */
@@ -271,16 +258,21 @@ struct ParallelVacuumState
PVIndVacStatus status;
};
-static PVSharedCostParams *pv_shared_cost_params = NULL;
+/*
+ * ParallelVacuumSharedCostParams and CurrentParallelVacuumState are
+ * used only for an autovacuum worker to propagate the shared vacuum
+ * delay parameters to its parallel vacuum workers.
+ *
+ * CurrentParallelVacuumState is set only in the leader process (i.e.,
+ * autovacuum worker processes).
+ */
+PVSharedCostParams *ParallelVacuumSharedCostParams = NULL;
+ParallelVacuumState *CurrentParallelVacuumState = NULL;
/*
- * Worker-local copy of the last cost-parameter generation this worker has
- * applied. Initialized to 0; since the leader initializes the shared
- * generation counter to 1, the first call to
- * parallel_vacuum_update_shared_delay_params() will always detect a
- * mismatch and read the initial parameters from shared memory.
+ * Is there an update on the shared vacuum delay parameters?
*/
-static uint32 shared_params_generation_local = 0;
+volatile sig_atomic_t ParallelVacuumParamsUpdatePending = false;
static int parallel_vacuum_compute_workers(Relation *indrels, int nindexes, int nrequested,
bool *will_parallel_vacuum);
@@ -463,10 +455,10 @@ parallel_vacuum_init(Relation rel, Relation *indrels, int nindexes,
if (shared->is_autovacuum)
{
parallel_vacuum_set_cost_parameters(&shared->cost_params);
- pg_atomic_init_u32(&shared->cost_params.generation, 1);
SpinLockInit(&shared->cost_params.mutex);
- pv_shared_cost_params = &(shared->cost_params);
+ ParallelVacuumSharedCostParams = &(shared->cost_params);
+ CurrentParallelVacuumState = pvs;
}
shm_toc_insert(pcxt->toc, PARALLEL_VACUUM_KEY_SHARED, shared);
@@ -535,7 +527,10 @@ parallel_vacuum_end(ParallelVacuumState *pvs, IndexBulkDeleteResult **istats)
ExitParallelMode();
if (AmAutoVacuumWorkerProcess())
- pv_shared_cost_params = NULL;
+ {
+ ParallelVacuumSharedCostParams = NULL;
+ CurrentParallelVacuumState = NULL;
+ }
pfree(pvs->will_parallel_vacuum);
pfree(pvs);
@@ -627,6 +622,23 @@ parallel_vacuum_set_cost_parameters(PVSharedCostParams *params)
params->cost_page_miss = VacuumCostPageMiss;
}
+/*
+ * Handle receipt of an interrupt indicating an update of the shared vacuum
+ * delay parameters.
+ */
+void
+HandleParallelVacuumParamsUpdate(void)
+{
+ if (ParallelVacuumSharedCostParams == NULL)
+ return;
+
+ /*
+ * Update the shared delay parameters at the next vacuum_delay_point()
+ * time.
+ */
+ ParallelVacuumParamsUpdatePending = true;
+}
+
/*
* Updates the cost-based vacuum delay parameters for parallel autovacuum
* workers.
@@ -636,40 +648,18 @@ parallel_vacuum_set_cost_parameters(PVSharedCostParams *params)
void
parallel_vacuum_update_shared_delay_params(void)
{
- uint32 params_generation;
-
Assert(IsParallelWorker());
+ Assert(ParallelVacuumSharedCostParams);
- /* Quick return if the worker is not running for the autovacuum */
- if (pv_shared_cost_params == NULL)
- return;
-
- params_generation = pg_atomic_read_u32(&pv_shared_cost_params->generation);
- Assert(shared_params_generation_local <= params_generation);
-
- /* Return if parameters had not changed in the leader */
- if (params_generation == shared_params_generation_local)
- return;
-
- SpinLockAcquire(&pv_shared_cost_params->mutex);
- VacuumCostDelay = pv_shared_cost_params->cost_delay;
- VacuumCostLimit = pv_shared_cost_params->cost_limit;
- VacuumCostPageDirty = pv_shared_cost_params->cost_page_dirty;
- VacuumCostPageHit = pv_shared_cost_params->cost_page_hit;
- VacuumCostPageMiss = pv_shared_cost_params->cost_page_miss;
- SpinLockRelease(&pv_shared_cost_params->mutex);
+ SpinLockAcquire(&ParallelVacuumSharedCostParams->mutex);
+ VacuumCostDelay = ParallelVacuumSharedCostParams->cost_delay;
+ VacuumCostLimit = ParallelVacuumSharedCostParams->cost_limit;
+ VacuumCostPageDirty = ParallelVacuumSharedCostParams->cost_page_dirty;
+ VacuumCostPageHit = ParallelVacuumSharedCostParams->cost_page_hit;
+ VacuumCostPageMiss = ParallelVacuumSharedCostParams->cost_page_miss;
+ SpinLockRelease(&ParallelVacuumSharedCostParams->mutex);
VacuumUpdateCosts();
-
- shared_params_generation_local = params_generation;
-
- elog(DEBUG2,
- "parallel autovacuum worker updated cost params: cost_limit=%d, cost_delay=%g, cost_page_miss=%d, cost_page_dirty=%d, cost_page_hit=%d",
- vacuum_cost_limit,
- vacuum_cost_delay,
- VacuumCostPageMiss,
- VacuumCostPageDirty,
- VacuumCostPageHit);
}
/*
@@ -685,30 +675,30 @@ parallel_vacuum_propagate_shared_delay_params(void)
/*
* Quick return if the leader process is not sharing the delay parameters.
*/
- if (pv_shared_cost_params == NULL)
+ if (ParallelVacuumSharedCostParams == NULL)
return;
/*
* Check if any delay parameters have changed. We can read them without
* locks as only the leader can modify them.
*/
- if (vacuum_cost_delay == pv_shared_cost_params->cost_delay &&
- vacuum_cost_limit == pv_shared_cost_params->cost_limit &&
- VacuumCostPageDirty == pv_shared_cost_params->cost_page_dirty &&
- VacuumCostPageHit == pv_shared_cost_params->cost_page_hit &&
- VacuumCostPageMiss == pv_shared_cost_params->cost_page_miss)
+ if (vacuum_cost_delay == ParallelVacuumSharedCostParams->cost_delay &&
+ vacuum_cost_limit == ParallelVacuumSharedCostParams->cost_limit &&
+ VacuumCostPageDirty == ParallelVacuumSharedCostParams->cost_page_dirty &&
+ VacuumCostPageHit == ParallelVacuumSharedCostParams->cost_page_hit &&
+ VacuumCostPageMiss == ParallelVacuumSharedCostParams->cost_page_miss)
return;
/* Update the shared delay parameters */
- SpinLockAcquire(&pv_shared_cost_params->mutex);
- parallel_vacuum_set_cost_parameters(pv_shared_cost_params);
- SpinLockRelease(&pv_shared_cost_params->mutex);
+ SpinLockAcquire(&ParallelVacuumSharedCostParams->mutex);
+ parallel_vacuum_set_cost_parameters(ParallelVacuumSharedCostParams);
+ SpinLockRelease(&ParallelVacuumSharedCostParams->mutex);
- /*
- * Increment the generation of the parameters, i.e. let parallel workers
- * know that they should re-read shared cost params.
- */
- pg_atomic_fetch_add_u32(&pv_shared_cost_params->generation, 1);
+ Assert(CurrentParallelVacuumState);
+ SendProcSignalToParallelWorkers(CurrentParallelVacuumState->pcxt,
+ PROCSIG_PARALLEL_VACUUM_PARAMS_UPDATE);
+
+ elog(LOG, "XXX SEND PROCSIGS");
}
/*
@@ -912,16 +902,6 @@ parallel_vacuum_process_all_indexes(ParallelVacuumState *pvs, int num_index_scan
pvs->pcxt->nworkers_launched, nworkers)));
}
-#ifdef USE_INJECTION_POINTS
-
- /*
- * Used by tests to pause after workers are launched but before index
- * vacuuming begins.
- */
- if (AmAutoVacuumWorkerProcess() && nworkers > 0)
- INJECTION_POINT("autovacuum-leader-before-indexes-processing", NULL);
-#endif
-
/* Vacuum the indexes that can be processed by only leader process */
parallel_vacuum_process_unsafe_indexes(pvs);
@@ -1262,10 +1242,10 @@ parallel_vacuum_main(dsm_segment *seg, shm_toc *toc)
* Parallel autovacuum workers initialize cost-based delay parameters
* from the leader's shared state rather than GUC defaults, because
* the leader may have applied per-table or autovacuum-specific
- * overrides. pv_shared_cost_params must be set before calling
- * parallel_vacuum_update_shared_delay_params().
+ * overrides. ParallelVacuumSharedCostParams must be set before
+ * calling parallel_vacuum_update_shared_delay_params().
*/
- pv_shared_cost_params = &(shared->cost_params);
+ ParallelVacuumSharedCostParams = &(shared->cost_params);
parallel_vacuum_update_shared_delay_params();
}
else
@@ -1327,7 +1307,7 @@ parallel_vacuum_main(dsm_segment *seg, shm_toc *toc)
FreeAccessStrategy(pvs.bstrategy);
if (shared->is_autovacuum)
- pv_shared_cost_params = NULL;
+ ParallelVacuumSharedCostParams = NULL;
}
/*
diff --git a/src/backend/storage/ipc/procsignal.c b/src/backend/storage/ipc/procsignal.c
index 7e017c8d53b..bf4f17ca8b4 100644
--- a/src/backend/storage/ipc/procsignal.c
+++ b/src/backend/storage/ipc/procsignal.c
@@ -19,6 +19,7 @@
#include "access/parallel.h"
#include "commands/async.h"
+#include "commands/vacuum.h"
#include "miscadmin.h"
#include "pgstat.h"
#include "port/pg_bitutils.h"
@@ -703,6 +704,9 @@ procsignal_sigusr1_handler(SIGNAL_ARGS)
if (CheckProcSignal(PROCSIG_RECOVERY_CONFLICT))
HandleRecoveryConflictInterrupt();
+ if (CheckProcSignal(PROCSIG_PARALLEL_VACUUM_PARAMS_UPDATE))
+ HandleParallelVacuumParamsUpdate();
+
SetLatch(MyLatch);
}
diff --git a/src/include/access/parallel.h b/src/include/access/parallel.h
index 60f857675e0..90084581f7c 100644
--- a/src/include/access/parallel.h
+++ b/src/include/access/parallel.h
@@ -19,6 +19,7 @@
#include "access/xlogdefs.h"
#include "lib/ilist.h"
#include "postmaster/bgworker.h"
+#include "storage/procsignal.h"
#include "storage/shm_mq.h"
#include "storage/shm_toc.h"
@@ -71,6 +72,7 @@ extern void WaitForParallelWorkersToAttach(ParallelContext *pcxt);
extern void WaitForParallelWorkersToFinish(ParallelContext *pcxt);
extern void DestroyParallelContext(ParallelContext *pcxt);
extern bool ParallelContextActive(void);
+extern void SendProcSignalToParallelWorkers(ParallelContext *pcxt, ProcSignalReason reason);
extern void HandleParallelMessageInterrupt(void);
extern void ProcessParallelMessages(void);
diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h
index 69fec07491b..8b59e3ae1c2 100644
--- a/src/include/commands/vacuum.h
+++ b/src/include/commands/vacuum.h
@@ -360,6 +360,10 @@ extern PGDLLIMPORT int vacuum_cost_limit;
extern PGDLLIMPORT int64 parallel_vacuum_worker_delay_ns;
+extern PGDLLIMPORT struct PVSharedCostParams *ParallelVacuumSharedCostParams;
+extern PGDLLIMPORT struct ParallelVacuumState *CurrentParallelVacuumState;
+extern PGDLLIMPORT volatile sig_atomic_t ParallelVacuumParamsUpdatePending;
+
/* in commands/vacuum.c */
extern void ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel);
extern void vacuum(List *relations, const VacuumParams *params,
@@ -425,6 +429,7 @@ extern void parallel_vacuum_cleanup_all_indexes(ParallelVacuumState *pvs,
extern void parallel_vacuum_update_shared_delay_params(void);
extern void parallel_vacuum_propagate_shared_delay_params(void);
extern void parallel_vacuum_main(dsm_segment *seg, shm_toc *toc);
+extern void HandleParallelVacuumParamsUpdate(void);
/* in commands/analyze.c */
extern void analyze_rel(Oid relid, RangeVar *relation,
diff --git a/src/include/storage/procsignal.h b/src/include/storage/procsignal.h
index 348fba53a93..ac9a6e841fd 100644
--- a/src/include/storage/procsignal.h
+++ b/src/include/storage/procsignal.h
@@ -39,9 +39,11 @@ typedef enum
PROCSIG_RECOVERY_CONFLICT, /* backend is blocking recovery, check
* PGPROC->pendingRecoveryConflicts for the
* reason */
+ PROCSIG_PARALLEL_VACUUM_PARAMS_UPDATE, /* parallel autovacuum worker:
+ * reload cost params */
} ProcSignalReason;
-#define NUM_PROCSIGNALS (PROCSIG_RECOVERY_CONFLICT + 1)
+#define NUM_PROCSIGNALS (PROCSIG_PARALLEL_VACUUM_PARAMS_UPDATE + 1)
typedef enum
{
diff --git a/src/test/modules/test_autovacuum/Makefile b/src/test/modules/test_autovacuum/Makefile
index 188ec9f96a2..d91a3405e34 100644
--- a/src/test/modules/test_autovacuum/Makefile
+++ b/src/test/modules/test_autovacuum/Makefile
@@ -4,10 +4,6 @@ PGFILEDESC = "test_autovacuum - test code for parallel autovacuum"
TAP_TESTS = 1
-EXTRA_INSTALL = src/test/modules/injection_points
-
-export enable_injection_points
-
ifdef USE_PGXS
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
diff --git a/src/test/modules/test_autovacuum/meson.build b/src/test/modules/test_autovacuum/meson.build
index 86e392bc0de..94a3e8a038d 100644
--- a/src/test/modules/test_autovacuum/meson.build
+++ b/src/test/modules/test_autovacuum/meson.build
@@ -5,9 +5,6 @@ tests += {
'sd': meson.current_source_dir(),
'bd': meson.current_build_dir(),
'tap': {
- 'env': {
- 'enable_injection_points': get_option('injection_points') ? 'yes' : 'no',
- },
'tests': [
't/001_parallel_autovacuum.pl',
],
diff --git a/src/test/modules/test_autovacuum/t/001_parallel_autovacuum.pl b/src/test/modules/test_autovacuum/t/001_parallel_autovacuum.pl
index 9e65eafb549..6536a3b265a 100644
--- a/src/test/modules/test_autovacuum/t/001_parallel_autovacuum.pl
+++ b/src/test/modules/test_autovacuum/t/001_parallel_autovacuum.pl
@@ -9,11 +9,6 @@ use PostgreSQL::Test::Cluster;
use PostgreSQL::Test::Utils;
use Test::More;
-if ($ENV{enable_injection_points} ne 'yes')
-{
- plan skip_all => 'Injection points not supported by this build';
-}
-
# Before each test we should disable autovacuum for 'test_autovac' table and
# generate some dead tuples in it. Returns the current autovacuum_count of
# the table test_autovac.
@@ -66,20 +61,6 @@ log_autovacuum_min_duration = -1
});
$node->start;
-# Check if the extension injection_points is available, as it may be
-# possible that this script is run with installcheck, where the module
-# would not be installed by default.
-if (!$node->check_extension('injection_points'))
-{
- plan skip_all => 'Extension injection_points not installed';
-}
-
-# Create all functions needed for testing
-$node->safe_psql(
- 'postgres', qq{
- CREATE EXTENSION injection_points;
-});
-
my $indexes_num = 3;
my $initial_rows_num = 10_000;
my $autovacuum_parallel_workers = 2;
@@ -134,64 +115,5 @@ ok( $node->log_contains(
qr/parallel workers: index vacuum: 2 planned, 2 launched in total/,
$log_offset));
-# Test 2:
-# Check whether parallel autovacuum leader can propagate cost-based parameters
-# to the parallel workers.
-
-$av_count = prepare_for_next_test($node, 2);
-$log_offset = -s $node->logfile;
-
-$node->safe_psql(
- 'postgres', qq{
- SELECT injection_points_attach('autovacuum-start-parallel-vacuum', 'wait');
- SELECT injection_points_attach('autovacuum-leader-before-indexes-processing', 'wait');
-
- ALTER TABLE test_autovac SET (autovacuum_parallel_workers = 1, autovacuum_enabled = true);
-});
-
-# Wait until parallel autovacuum is inited
-$node->wait_for_event('autovacuum worker',
- 'autovacuum-start-parallel-vacuum');
-
-# Update the shared cost-based delay parameters.
-$node->safe_psql(
- 'postgres', qq{
- ALTER SYSTEM SET vacuum_cost_limit = 500;
- ALTER SYSTEM SET vacuum_cost_page_miss = 10;
- ALTER SYSTEM SET vacuum_cost_page_dirty = 10;
- ALTER SYSTEM SET vacuum_cost_page_hit = 10;
- SELECT pg_reload_conf();
-});
-
-# Resume the leader process to update the shared parameters during heap scan (i.e.
-# vacuum_delay_point() is called) and launch a parallel vacuum worker, but it stops
-# before vacuuming indexes due to the injection point.
-$node->safe_psql(
- 'postgres', qq{
- SELECT injection_points_wakeup('autovacuum-start-parallel-vacuum');
-});
-$node->wait_for_event('autovacuum worker',
- 'autovacuum-leader-before-indexes-processing');
-
-# Check whether parallel worker successfully updated all parameters during
-# index processing
-$node->wait_for_log(
- qr/parallel autovacuum worker updated cost params: cost_limit=500, cost_delay=2, cost_page_miss=10, cost_page_dirty=10, cost_page_hit=10/,
- $log_offset);
-
-$node->safe_psql(
- 'postgres', qq{
- SELECT injection_points_wakeup('autovacuum-leader-before-indexes-processing');
-});
-
-wait_for_autovacuum_complete($node, $av_count);
-
-# Cleanup
-$node->safe_psql(
- 'postgres', qq{
- SELECT injection_points_detach('autovacuum-start-parallel-vacuum');
- SELECT injection_points_detach('autovacuum-leader-before-indexes-processing');
-});
-
$node->stop;
done_testing();
--
2.53.0