From 6ad5bc29bd87b14e7aeec828f3731a12b126fb96 Mon Sep 17 00:00:00 2001 From: Masahiko Sawada Date: Tue, 15 Oct 2019 17:03:22 +0900 Subject: [PATCH v37 1/3] Add index AM field and callback for parallel index vacuum --- contrib/bloom/blutils.c | 4 ++ doc/src/sgml/indexam.sgml | 19 ++++++++++ src/backend/access/brin/brin.c | 4 ++ src/backend/access/gin/ginutil.c | 4 ++ src/backend/access/gist/gist.c | 4 ++ src/backend/access/hash/hash.c | 3 ++ src/backend/access/nbtree/nbtree.c | 3 ++ src/backend/access/spgist/spgutils.c | 4 ++ src/include/access/amapi.h | 4 ++ src/include/commands/vacuum.h | 37 +++++++++++++++++++ .../modules/dummy_index_am/dummy_index_am.c | 3 ++ 11 files changed, 89 insertions(+) diff --git a/contrib/bloom/blutils.c b/contrib/bloom/blutils.c index e2063bac62..1a8b3474db 100644 --- a/contrib/bloom/blutils.c +++ b/contrib/bloom/blutils.c @@ -18,6 +18,7 @@ #include "access/reloptions.h" #include "bloom.h" #include "catalog/index.h" +#include "commands/vacuum.h" #include "miscadmin.h" #include "storage/bufmgr.h" #include "storage/freespace.h" @@ -121,6 +122,9 @@ blhandler(PG_FUNCTION_ARGS) amroutine->ampredlocks = false; amroutine->amcanparallel = false; amroutine->amcaninclude = false; + amroutine->amparallelvacuumoptions = + VACUUM_OPTION_PARALLEL_BULKDEL | VACUUM_OPTION_PARALLEL_CLEANUP; + amroutine->amusemaintenanceworkmem = false; amroutine->amkeytype = InvalidOid; amroutine->ambuild = blbuild; diff --git a/doc/src/sgml/indexam.sgml b/doc/src/sgml/indexam.sgml index dd54c68802..f9211a5ec9 100644 --- a/doc/src/sgml/indexam.sgml +++ b/doc/src/sgml/indexam.sgml @@ -122,6 +122,10 @@ typedef struct IndexAmRoutine bool amcanparallel; /* does AM support columns included with clause INCLUDE? */ bool amcaninclude; + /* OR of parallel vacuum flags */ + uint8 amparallelvacuumoptions; + /* does AM use maintenance_work_mem? */ + bool amusemaintenanceworkmem; /* type of data stored in index, or InvalidOid if variable */ Oid amkeytype; @@ -731,6 +735,21 @@ amparallelrescan (IndexScanDesc scan); the beginning. + + +Size +amestimateparallelvacuum (void); + + Estimate and return the number of bytes of dynamic shared memory needed to + store statistics returned by the access method. + + + + It is not necessary to implement this function for access methods which + do not support parallel vacuum or in cases where the access method does not + require more than size of IndexBulkDeleteResult to + store statistics. + diff --git a/src/backend/access/brin/brin.c b/src/backend/access/brin/brin.c index 294ffa6e20..00ee84a896 100644 --- a/src/backend/access/brin/brin.c +++ b/src/backend/access/brin/brin.c @@ -27,6 +27,7 @@ #include "access/xloginsert.h" #include "catalog/index.h" #include "catalog/pg_am.h" +#include "commands/vacuum.h" #include "miscadmin.h" #include "pgstat.h" #include "postmaster/autovacuum.h" @@ -101,6 +102,9 @@ brinhandler(PG_FUNCTION_ARGS) amroutine->ampredlocks = false; amroutine->amcanparallel = false; amroutine->amcaninclude = false; + amroutine->amparallelvacuumoptions = + VACUUM_OPTION_PARALLEL_CLEANUP; + amroutine->amusemaintenanceworkmem = false; amroutine->amkeytype = InvalidOid; amroutine->ambuild = brinbuild; diff --git a/src/backend/access/gin/ginutil.c b/src/backend/access/gin/ginutil.c index 38593554f0..5685e8caf6 100644 --- a/src/backend/access/gin/ginutil.c +++ b/src/backend/access/gin/ginutil.c @@ -20,6 +20,7 @@ #include "access/xloginsert.h" #include "catalog/pg_collation.h" #include "catalog/pg_type.h" +#include "commands/vacuum.h" #include "miscadmin.h" #include "storage/indexfsm.h" #include "storage/lmgr.h" @@ -53,6 +54,9 @@ ginhandler(PG_FUNCTION_ARGS) amroutine->ampredlocks = true; amroutine->amcanparallel = false; amroutine->amcaninclude = false; + amroutine->amparallelvacuumoptions = + VACUUM_OPTION_PARALLEL_BULKDEL | VACUUM_OPTION_PARALLEL_CLEANUP; + amroutine->amusemaintenanceworkmem = true; amroutine->amkeytype = InvalidOid; amroutine->ambuild = ginbuild; diff --git a/src/backend/access/gist/gist.c b/src/backend/access/gist/gist.c index a259c80616..7df990cc63 100644 --- a/src/backend/access/gist/gist.c +++ b/src/backend/access/gist/gist.c @@ -17,6 +17,7 @@ #include "access/gist_private.h" #include "access/gistscan.h" #include "catalog/pg_collation.h" +#include "commands/vacuum.h" #include "miscadmin.h" #include "nodes/execnodes.h" #include "storage/lmgr.h" @@ -74,6 +75,9 @@ gisthandler(PG_FUNCTION_ARGS) amroutine->ampredlocks = true; amroutine->amcanparallel = false; amroutine->amcaninclude = true; + amroutine->amparallelvacuumoptions = + VACUUM_OPTION_PARALLEL_BULKDEL | VACUUM_OPTION_PARALLEL_COND_CLEANUP; + amroutine->amusemaintenanceworkmem = false; amroutine->amkeytype = InvalidOid; amroutine->ambuild = gistbuild; diff --git a/src/backend/access/hash/hash.c b/src/backend/access/hash/hash.c index a0597a0c6e..53db3ab24b 100644 --- a/src/backend/access/hash/hash.c +++ b/src/backend/access/hash/hash.c @@ -72,6 +72,9 @@ hashhandler(PG_FUNCTION_ARGS) amroutine->ampredlocks = true; amroutine->amcanparallel = false; amroutine->amcaninclude = false; + amroutine->amparallelvacuumoptions = + VACUUM_OPTION_PARALLEL_BULKDEL; + amroutine->amusemaintenanceworkmem = false; amroutine->amkeytype = INT4OID; amroutine->ambuild = hashbuild; diff --git a/src/backend/access/nbtree/nbtree.c b/src/backend/access/nbtree/nbtree.c index c67235ab80..a2904a9c82 100644 --- a/src/backend/access/nbtree/nbtree.c +++ b/src/backend/access/nbtree/nbtree.c @@ -123,6 +123,9 @@ bthandler(PG_FUNCTION_ARGS) amroutine->ampredlocks = true; amroutine->amcanparallel = true; amroutine->amcaninclude = true; + amroutine->amparallelvacuumoptions = + VACUUM_OPTION_PARALLEL_BULKDEL | VACUUM_OPTION_PARALLEL_COND_CLEANUP; + amroutine->amusemaintenanceworkmem = false; amroutine->amkeytype = InvalidOid; amroutine->ambuild = btbuild; diff --git a/src/backend/access/spgist/spgutils.c b/src/backend/access/spgist/spgutils.c index e2d391ee75..5d814eeba9 100644 --- a/src/backend/access/spgist/spgutils.c +++ b/src/backend/access/spgist/spgutils.c @@ -22,6 +22,7 @@ #include "access/transam.h" #include "access/xact.h" #include "catalog/pg_amop.h" +#include "commands/vacuum.h" #include "storage/bufmgr.h" #include "storage/indexfsm.h" #include "storage/lmgr.h" @@ -56,6 +57,9 @@ spghandler(PG_FUNCTION_ARGS) amroutine->ampredlocks = false; amroutine->amcanparallel = false; amroutine->amcaninclude = false; + amroutine->amparallelvacuumoptions = + VACUUM_OPTION_PARALLEL_BULKDEL | VACUUM_OPTION_PARALLEL_COND_CLEANUP; + amroutine->amusemaintenanceworkmem = false; amroutine->amkeytype = InvalidOid; amroutine->ambuild = spgbuild; diff --git a/src/include/access/amapi.h b/src/include/access/amapi.h index 6e3db06eed..3fb5a030bd 100644 --- a/src/include/access/amapi.h +++ b/src/include/access/amapi.h @@ -197,6 +197,10 @@ typedef struct IndexAmRoutine bool amcanparallel; /* does AM support columns included with clause INCLUDE? */ bool amcaninclude; + /* OR of parallel vacuum flags. See vacuum.h for flags. */ + uint8 amparallelvacuumoptions; + /* does AM use maintenance_work_mem? */ + bool amusemaintenanceworkmem; /* type of data stored in index, or InvalidOid if variable */ Oid amkeytype; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index 128f7ae65d..b05aedc670 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -23,6 +23,43 @@ #include "storage/lock.h" #include "utils/relcache.h" +/* + * Flags for amparallelvacuumoptions to control the participation of bulkdelete + * and vacuumcleanup in parallel vacuum. + */ + +/* + * Both bulkdelete and vacuumcleanup are disabled by default. This will be + * used by IndexAM's that don't want to or cannot participate in parallel vacuum. + * If an index AM doesn't have a way to communicate the index statistics allocated + * by the first ambulkdelete call to the subsequent ones until amvacuumcleanup, + * the index AM cannot participate in parallel vacuum. + */ +#define VACUUM_OPTION_NO_PARALLEL 0 + +/* + * bulkdelete can be performed in parallel. This option can be used by + * IndexAm's that need to scan the index to delete the tuples. + */ +#define VACUUM_OPTION_PARALLEL_BULKDEL (1 << 0) + +/* + * vacuumcleanup can be performed in parallel if bulkdelete is not performed + * yet. This will be used by IndexAM's that can scan the index if the + * bulkdelete is not performed. + */ +#define VACUUM_OPTION_PARALLEL_COND_CLEANUP (1 << 1) + +/* + * vacuumcleanup can be performed in parallel even if bulkdelete has already + * processed the index. This will be used by IndexAM's that scan the index + * during the cleanup phase of index irrespective of whether the index is + * already scanned or not during bulkdelete phase. + */ +#define VACUUM_OPTION_PARALLEL_CLEANUP (1 << 2) + +/* value for checking vacuum flags */ +#define VACUUM_OPTION_MAX_VALID_VALUE ((1 << 3) - 1) /*---------- * ANALYZE builds one of these structs for each attribute (column) that is diff --git a/src/test/modules/dummy_index_am/dummy_index_am.c b/src/test/modules/dummy_index_am/dummy_index_am.c index 053636e4b4..246d68ffc8 100644 --- a/src/test/modules/dummy_index_am/dummy_index_am.c +++ b/src/test/modules/dummy_index_am/dummy_index_am.c @@ -16,6 +16,7 @@ #include "access/amapi.h" #include "access/reloptions.h" #include "catalog/index.h" +#include "commands/vacuum.h" #include "nodes/pathnodes.h" #include "utils/guc.h" #include "utils/rel.h" @@ -294,6 +295,8 @@ dihandler(PG_FUNCTION_ARGS) amroutine->ampredlocks = false; amroutine->amcanparallel = false; amroutine->amcaninclude = false; + amroutine->amparallelvacuumoptions = VACUUM_OPTION_NO_PARALLEL; + amroutine->amusemaintenanceworkmem = false; amroutine->amkeytype = InvalidOid; amroutine->ambuild = dibuild; -- 2.23.0