From 9411ca22eff13d62638517556f2ab8a7dafab5f3 Mon Sep 17 00:00:00 2001 From: Masahiko Sawada Date: Thu, 21 Mar 2024 23:16:27 +0900 Subject: [PATCH v78 6/6] Adjust the vacuum improvement patch to new TidStore APIs. --- src/backend/access/heap/vacuumlazy.c | 5 ++-- src/backend/commands/vacuumparallel.c | 38 ++++++++------------------- 2 files changed, 13 insertions(+), 30 deletions(-) diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index 320b8785f3..82c5a2c690 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -3155,7 +3155,7 @@ dead_items_alloc(LVRelState *vacrel, int nworkers) } /* Serial VACUUM case */ - vacrel->dead_items = TidStoreCreate(vac_work_mem, NULL, 0); + vacrel->dead_items = TidStoreCreateLocal(vac_work_mem); dead_items_info = (VacDeadItemsInfo *) palloc(sizeof(VacDeadItemsInfo)); dead_items_info->max_bytes = vac_work_mem; @@ -3196,8 +3196,7 @@ dead_items_reset(LVRelState *vacrel) /* Recreate the tidstore with the same max_bytes limitation */ TidStoreDestroy(dead_items); - vacrel->dead_items = TidStoreCreate(vacrel->dead_items_info->max_bytes, - NULL, 0); + vacrel->dead_items = TidStoreCreateLocal(vacrel->dead_items_info->max_bytes); /* Reset the counter */ vacrel->dead_items_info->num_items = 0; diff --git a/src/backend/commands/vacuumparallel.c b/src/backend/commands/vacuumparallel.c index 9606554003..719055a734 100644 --- a/src/backend/commands/vacuumparallel.c +++ b/src/backend/commands/vacuumparallel.c @@ -45,7 +45,7 @@ * use small integers. */ #define PARALLEL_VACUUM_KEY_SHARED 1 -#define PARALLEL_VACUUM_KEY_DEAD_ITEMS 2 +/* 2 was PARALLEL_VACUUM_KEY_DEAD_ITEMS */ #define PARALLEL_VACUUM_KEY_QUERY_TEXT 3 #define PARALLEL_VACUUM_KEY_BUFFER_USAGE 4 #define PARALLEL_VACUUM_KEY_WAL_USAGE 5 @@ -111,6 +111,9 @@ typedef struct PVShared /* Counter for vacuuming and cleanup */ pg_atomic_uint32 idx; + /* DSA handle where the TidStore lives */ + dsa_handle dead_items_dsa_handle; + /* DSA pointer to the shared TidStore */ dsa_pointer dead_items_handle; @@ -183,7 +186,6 @@ struct ParallelVacuumState /* Shared dead items space among parallel vacuum workers */ TidStore *dead_items; - dsa_area *dead_items_area; /* Points to buffer usage area in DSM */ BufferUsage *buffer_usage; @@ -249,12 +251,9 @@ parallel_vacuum_init(Relation rel, Relation *indrels, int nindexes, PVIndStats *indstats; BufferUsage *buffer_usage; WalUsage *wal_usage; - void *area_space; - dsa_area *dead_items_dsa; bool *will_parallel_vacuum; Size est_indstats_len; Size est_shared_len; - Size dsa_minsize = dsa_minimum_size(); int nindexes_mwm = 0; int parallel_workers = 0; int querylen; @@ -303,10 +302,6 @@ parallel_vacuum_init(Relation rel, Relation *indrels, int nindexes, shm_toc_estimate_chunk(&pcxt->estimator, est_shared_len); shm_toc_estimate_keys(&pcxt->estimator, 1); - /* Initial size of DSA for dead tuples -- PARALLEL_VACUUM_KEY_DEAD_ITEMS */ - shm_toc_estimate_chunk(&pcxt->estimator, dsa_minsize); - shm_toc_estimate_keys(&pcxt->estimator, 1); - /* * Estimate space for BufferUsage and WalUsage -- * PARALLEL_VACUUM_KEY_BUFFER_USAGE and PARALLEL_VACUUM_KEY_WAL_USAGE. @@ -371,15 +366,8 @@ parallel_vacuum_init(Relation rel, Relation *indrels, int nindexes, pvs->indstats = indstats; /* Prepare DSA space for dead items */ - area_space = shm_toc_allocate(pcxt->toc, dsa_minsize); - shm_toc_insert(pcxt->toc, PARALLEL_VACUUM_KEY_DEAD_ITEMS, area_space); - dead_items_dsa = dsa_create_in_place(area_space, dsa_minsize, - LWTRANCHE_PARALLEL_VACUUM_DSA, - pcxt->seg); - dead_items = TidStoreCreate(vac_work_mem, dead_items_dsa, - LWTRANCHE_PARALLEL_VACUUM_DSA); + dead_items = TidStoreCreateShared(vac_work_mem, LWTRANCHE_PARALLEL_VACUUM_DSA); pvs->dead_items = dead_items; - pvs->dead_items_area = dead_items_dsa; /* Prepare shared information */ shared = (PVShared *) shm_toc_allocate(pcxt->toc, est_shared_len); @@ -390,6 +378,7 @@ parallel_vacuum_init(Relation rel, Relation *indrels, int nindexes, (nindexes_mwm > 0) ? maintenance_work_mem / Min(parallel_workers, nindexes_mwm) : maintenance_work_mem; + shared->dead_items_dsa_handle = dsa_get_handle(TidStoreGetDSA(dead_items)); shared->dead_items_handle = TidStoreGetHandle(dead_items); shared->dead_items_info.max_bytes = vac_work_mem; @@ -461,7 +450,6 @@ parallel_vacuum_end(ParallelVacuumState *pvs, IndexBulkDeleteResult **istats) } TidStoreDestroy(pvs->dead_items); - dsa_detach(pvs->dead_items_area); DestroyParallelContext(pvs->pcxt); ExitParallelMode(); @@ -493,11 +481,11 @@ parallel_vacuum_reset_dead_items(ParallelVacuumState *pvs) * limitation we just used. */ TidStoreDestroy(dead_items); - dsa_trim(pvs->dead_items_area); - pvs->dead_items = TidStoreCreate(dead_items_info->max_bytes, pvs->dead_items_area, - LWTRANCHE_PARALLEL_VACUUM_DSA); + pvs->dead_items = TidStoreCreateShared(dead_items_info->max_bytes, + LWTRANCHE_PARALLEL_VACUUM_DSA); /* Update the DSA pointer for dead_items to the new one */ + pvs->shared->dead_items_dsa_handle = dsa_get_handle(TidStoreGetDSA(dead_items)); pvs->shared->dead_items_handle = TidStoreGetHandle(dead_items); /* Reset the counter */ @@ -1005,8 +993,6 @@ parallel_vacuum_main(dsm_segment *seg, shm_toc *toc) PVIndStats *indstats; PVShared *shared; TidStore *dead_items; - void *area_space; - dsa_area *dead_items_area; BufferUsage *buffer_usage; WalUsage *wal_usage; int nindexes; @@ -1051,9 +1037,8 @@ parallel_vacuum_main(dsm_segment *seg, shm_toc *toc) false); /* Set dead items */ - area_space = shm_toc_lookup(toc, PARALLEL_VACUUM_KEY_DEAD_ITEMS, false); - dead_items_area = dsa_attach_in_place(area_space, seg); - dead_items = TidStoreAttach(dead_items_area, shared->dead_items_handle); + dead_items = TidStoreAttach(shared->dead_items_dsa_handle, + shared->dead_items_handle); /* Set cost-based vacuum delay */ VacuumUpdateCosts(); @@ -1102,7 +1087,6 @@ parallel_vacuum_main(dsm_segment *seg, shm_toc *toc) &wal_usage[ParallelWorkerNumber]); TidStoreDetach(dead_items); - dsa_detach(dead_items_area); /* Pop the error context stack */ error_context_stack = errcallback.previous; -- 2.39.3