Move parallel vacuum code to vacuumparallel.c.

This commit moves parallel vacuum related code to a new file
commands/vacuumparallel.c so that any table AM supporting indexes can
utilize parallel vacuum in order to call index AM callbacks (ambulkdelete
and amvacuumcleanup) with parallel workers.

Another reason for this refactoring is that the parallel vacuum isn't
specific to heap so it doesn't make sense to keep this code in
heap/vacuumlazy.c.

Author: Masahiko Sawada, based on suggestion from Andres Freund
Reviewed-by: Hou Zhijie, Amit Kapila, Haiying Tang
Discussion: https://www.postgresql.org/message-id/20211030212101.ae3qcouatwmy7tbr%40alap3.anarazel.de
This commit is contained in:
Amit Kapila 2021-12-23 11:42:52 +05:30
parent e2e1bbde46
commit 8e1fae1938
8 changed files with 1125 additions and 983 deletions

File diff suppressed because it is too large Load Diff

View File

@ -14,7 +14,6 @@
#include "postgres.h" #include "postgres.h"
#include "access/heapam.h"
#include "access/nbtree.h" #include "access/nbtree.h"
#include "access/parallel.h" #include "access/parallel.h"
#include "access/session.h" #include "access/session.h"
@ -25,6 +24,7 @@
#include "catalog/pg_enum.h" #include "catalog/pg_enum.h"
#include "catalog/storage.h" #include "catalog/storage.h"
#include "commands/async.h" #include "commands/async.h"
#include "commands/vacuum.h"
#include "executor/execParallel.h" #include "executor/execParallel.h"
#include "libpq/libpq.h" #include "libpq/libpq.h"
#include "libpq/pqformat.h" #include "libpq/pqformat.h"

View File

@ -59,6 +59,7 @@ OBJS = \
typecmds.o \ typecmds.o \
user.o \ user.o \
vacuum.o \ vacuum.o \
vacuumparallel.o \
variable.o \ variable.o \
view.o view.o

View File

@ -7,8 +7,9 @@
* commands, (b) code to compute various vacuum thresholds, and (c) index * commands, (b) code to compute various vacuum thresholds, and (c) index
* vacuum code. * vacuum code.
* *
* VACUUM for heap AM is implemented in vacuumlazy.c, ANALYZE in analyze.c, and * VACUUM for heap AM is implemented in vacuumlazy.c, parallel vacuum in
* VACUUM FULL is a variant of CLUSTER, handled in cluster.c. * vacuumparallel.c, ANALYZE in analyze.c, and VACUUM FULL is a variant of
* CLUSTER, handled in cluster.c.
* *
* *
* Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group

File diff suppressed because it is too large Load Diff

View File

@ -198,7 +198,6 @@ extern void heap_get_root_tuples(Page page, OffsetNumber *root_offsets);
struct VacuumParams; struct VacuumParams;
extern void heap_vacuum_rel(Relation rel, extern void heap_vacuum_rel(Relation rel,
struct VacuumParams *params, BufferAccessStrategy bstrategy); struct VacuumParams *params, BufferAccessStrategy bstrategy);
extern void parallel_vacuum_main(dsm_segment *seg, shm_toc *toc);
/* in heap/heapam_visibility.c */ /* in heap/heapam_visibility.c */
extern bool HeapTupleSatisfiesVisibility(HeapTuple stup, Snapshot snapshot, extern bool HeapTupleSatisfiesVisibility(HeapTuple stup, Snapshot snapshot,

View File

@ -16,6 +16,7 @@
#include "access/htup.h" #include "access/htup.h"
#include "access/genam.h" #include "access/genam.h"
#include "access/parallel.h"
#include "catalog/pg_class.h" #include "catalog/pg_class.h"
#include "catalog/pg_statistic.h" #include "catalog/pg_statistic.h"
#include "catalog/pg_type.h" #include "catalog/pg_type.h"
@ -63,6 +64,9 @@
/* value for checking vacuum flags */ /* value for checking vacuum flags */
#define VACUUM_OPTION_MAX_VALID_VALUE ((1 << 3) - 1) #define VACUUM_OPTION_MAX_VALID_VALUE ((1 << 3) - 1)
/* Abstract type for parallel vacuum state */
typedef struct ParallelVacuumState ParallelVacuumState;
/*---------- /*----------
* ANALYZE builds one of these structs for each attribute (column) that is * ANALYZE builds one of these structs for each attribute (column) that is
* to be analyzed. The struct and subsidiary data are in anl_context, * to be analyzed. The struct and subsidiary data are in anl_context,
@ -305,6 +309,22 @@ extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo,
IndexBulkDeleteResult *istat); IndexBulkDeleteResult *istat);
extern Size vac_max_items_to_alloc_size(int max_items); extern Size vac_max_items_to_alloc_size(int max_items);
/* in commands/vacuumparallel.c */
extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels,
int nindexes, int nrequested_workers,
int max_items, int elevel,
BufferAccessStrategy bstrategy);
extern void parallel_vacuum_end(ParallelVacuumState *pvs, IndexBulkDeleteResult **istats);
extern VacDeadItems *parallel_vacuum_get_dead_items(ParallelVacuumState *pvs);
extern void parallel_vacuum_bulkdel_all_indexes(ParallelVacuumState *pvs,
long num_table_tuples,
int num_index_scans);
extern void parallel_vacuum_cleanup_all_indexes(ParallelVacuumState *pvs,
long num_table_tuples,
int num_index_scans,
bool estimated_count);
extern void parallel_vacuum_main(dsm_segment *seg, shm_toc *toc);
/* in commands/analyze.c */ /* in commands/analyze.c */
extern void analyze_rel(Oid relid, RangeVar *relation, extern void analyze_rel(Oid relid, RangeVar *relation,
VacuumParams *params, List *va_cols, bool in_outer_xact, VacuumParams *params, List *va_cols, bool in_outer_xact,

View File

@ -1306,13 +1306,8 @@ LPWSTR
LSEG LSEG
LUID LUID
LVPagePruneState LVPagePruneState
LVParallelIndStats
LVParallelIndVacStatus
LVParallelState
LVRelState LVRelState
LVSavedErrInfo LVSavedErrInfo
LVShared
LVSharedIndStats
LWLock LWLock
LWLockHandle LWLockHandle
LWLockMode LWLockMode
@ -1775,7 +1770,10 @@ PTIterationArray
PTOKEN_PRIVILEGES PTOKEN_PRIVILEGES
PTOKEN_USER PTOKEN_USER
PUTENVPROC PUTENVPROC
PVIndStats
PvIndVacStatus
PVOID PVOID
PVShared
PX_Alias PX_Alias
PX_Cipher PX_Cipher
PX_Combo PX_Combo
@ -1809,6 +1807,7 @@ ParallelSlotResultHandler
ParallelState ParallelState
ParallelTableScanDesc ParallelTableScanDesc
ParallelTableScanDescData ParallelTableScanDescData
ParallelVacuumState
ParallelWorkerContext ParallelWorkerContext
ParallelWorkerInfo ParallelWorkerInfo
Param Param