mirror of https://github.com/citusdata/citus.git
Changelog: handle VACUUM PARALLEL option
Postgres 13 added a new VACUUM option, PARALLEL. It is now supported in our code as well. Relevant changelog message on postgres: Allow VACUUM to process indexes in parallel (Masahiko Sawada, Amit Kapila)pull/3900/head
parent
1070828465
commit
87088d92bc
|
@ -29,7 +29,10 @@
|
||||||
#include "storage/lmgr.h"
|
#include "storage/lmgr.h"
|
||||||
#include "utils/builtins.h"
|
#include "utils/builtins.h"
|
||||||
#include "utils/lsyscache.h"
|
#include "utils/lsyscache.h"
|
||||||
|
#include "postmaster/bgworker_internals.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define VACUUM_PARALLEL_NOTSET -2
|
||||||
/*
|
/*
|
||||||
* Subset of VacuumParams we care about
|
* Subset of VacuumParams we care about
|
||||||
*/
|
*/
|
||||||
|
@ -40,8 +43,11 @@ typedef struct CitusVacuumParams
|
||||||
VacOptTernaryValue truncate;
|
VacOptTernaryValue truncate;
|
||||||
VacOptTernaryValue index_cleanup;
|
VacOptTernaryValue index_cleanup;
|
||||||
#endif
|
#endif
|
||||||
} CitusVacuumParams;
|
|
||||||
|
|
||||||
|
#if PG_VERSION_NUM >= PG_VERSION_13
|
||||||
|
int nworkers;
|
||||||
|
#endif
|
||||||
|
} CitusVacuumParams;
|
||||||
|
|
||||||
/* Local functions forward declarations for processing distributed table commands */
|
/* Local functions forward declarations for processing distributed table commands */
|
||||||
static bool IsDistributedVacuumStmt(int vacuumOptions, List *vacuumRelationIdList);
|
static bool IsDistributedVacuumStmt(int vacuumOptions, List *vacuumRelationIdList);
|
||||||
|
@ -285,6 +291,9 @@ DeparseVacuumStmtPrefix(CitusVacuumParams vacuumParams)
|
||||||
&& vacuumParams.truncate == VACOPT_TERNARY_DEFAULT &&
|
&& vacuumParams.truncate == VACOPT_TERNARY_DEFAULT &&
|
||||||
vacuumParams.index_cleanup == VACOPT_TERNARY_DEFAULT
|
vacuumParams.index_cleanup == VACOPT_TERNARY_DEFAULT
|
||||||
#endif
|
#endif
|
||||||
|
#if PG_VERSION_NUM >= PG_VERSION_13
|
||||||
|
&& vacuumParams.nworkers == VACUUM_PARALLEL_NOTSET
|
||||||
|
#endif
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return vacuumPrefix->data;
|
return vacuumPrefix->data;
|
||||||
|
@ -341,6 +350,12 @@ DeparseVacuumStmtPrefix(CitusVacuumParams vacuumParams)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if PG_VERSION_NUM >= PG_VERSION_13
|
||||||
|
if (vacuumParams.nworkers != VACUUM_PARALLEL_NOTSET) {
|
||||||
|
appendStringInfo(vacuumPrefix, "PARALLEL %d,", vacuumParams.nworkers);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
vacuumPrefix->data[vacuumPrefix->len - 1] = ')';
|
vacuumPrefix->data[vacuumPrefix->len - 1] = ')';
|
||||||
|
|
||||||
appendStringInfoChar(vacuumPrefix, ' ');
|
appendStringInfoChar(vacuumPrefix, ' ');
|
||||||
|
@ -421,6 +436,8 @@ ExtractVacuumTargetRels(VacuumStmt *vacuumStmt)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is mostly ExecVacuum from Postgres's commands/vacuum.c
|
* This is mostly ExecVacuum from Postgres's commands/vacuum.c
|
||||||
|
* Note that ExecVacuum does an actual vacuum as well and we don't want
|
||||||
|
* that to happen in the coordinator hence we copied the rest here.
|
||||||
*/
|
*/
|
||||||
static CitusVacuumParams
|
static CitusVacuumParams
|
||||||
VacuumStmtParams(VacuumStmt *vacstmt)
|
VacuumStmtParams(VacuumStmt *vacstmt)
|
||||||
|
@ -436,6 +453,9 @@ VacuumStmtParams(VacuumStmt *vacstmt)
|
||||||
/* Set default value */
|
/* Set default value */
|
||||||
params.index_cleanup = VACOPT_TERNARY_DEFAULT;
|
params.index_cleanup = VACOPT_TERNARY_DEFAULT;
|
||||||
params.truncate = VACOPT_TERNARY_DEFAULT;
|
params.truncate = VACOPT_TERNARY_DEFAULT;
|
||||||
|
#if PG_VERSION_NUM >= PG_VERSION_13
|
||||||
|
params.nworkers = VACUUM_PARALLEL_NOTSET;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Parse options list */
|
/* Parse options list */
|
||||||
DefElem *opt = NULL;
|
DefElem *opt = NULL;
|
||||||
|
@ -484,6 +504,30 @@ VacuumStmtParams(VacuumStmt *vacstmt)
|
||||||
params.truncate = defGetBoolean(opt) ? VACOPT_TERNARY_ENABLED :
|
params.truncate = defGetBoolean(opt) ? VACOPT_TERNARY_ENABLED :
|
||||||
VACOPT_TERNARY_DISABLED;
|
VACOPT_TERNARY_DISABLED;
|
||||||
}
|
}
|
||||||
|
#if PG_VERSION_NUM >= PG_VERSION_13
|
||||||
|
else if (strcmp(opt->defname, "parallel") == 0) {
|
||||||
|
|
||||||
|
if (opt->arg == NULL)
|
||||||
|
{
|
||||||
|
ereport(ERROR,
|
||||||
|
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||||
|
errmsg("parallel option requires a value between 0 and %d",
|
||||||
|
MAX_PARALLEL_WORKER_LIMIT)));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int nworkers;
|
||||||
|
nworkers = defGetInt32(opt);
|
||||||
|
if (nworkers < 0 || nworkers > MAX_PARALLEL_WORKER_LIMIT)
|
||||||
|
ereport(ERROR,
|
||||||
|
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||||
|
errmsg("parallel vacuum degree must be between 0 and %d",
|
||||||
|
MAX_PARALLEL_WORKER_LIMIT)));
|
||||||
|
|
||||||
|
params.nworkers = nworkers;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
create schema test_pg13;
|
||||||
|
set search_path to test_pg13;
|
||||||
|
SET citus.shard_replication_factor to 1;
|
||||||
|
SET citus.shard_count to 2;
|
||||||
|
SET citus.next_shard_id TO 65000;
|
||||||
|
CREATE TABLE dist_table (name char, age int);
|
||||||
|
CREATE INDEX name_index on dist_table(name);
|
||||||
|
SELECT create_distributed_table('dist_table', 'name');
|
||||||
|
create_distributed_table
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SET client_min_messages to DEBUG1;
|
||||||
|
SET citus.log_remote_commands to ON;
|
||||||
|
-- make sure vacuum parallel doesn't error out
|
||||||
|
VACUUM (PARALLEL 2) dist_table;
|
||||||
|
NOTICE: issuing VACUUM (PARALLEL 2) test_pg13.dist_table_65000
|
||||||
|
DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx
|
||||||
|
NOTICE: issuing VACUUM (PARALLEL 2) test_pg13.dist_table_65001
|
||||||
|
DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx
|
||||||
|
VACUUM (PARALLEL 0) dist_table;
|
||||||
|
NOTICE: issuing VACUUM (PARALLEL 0) test_pg13.dist_table_65000
|
||||||
|
DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx
|
||||||
|
NOTICE: issuing VACUUM (PARALLEL 0) test_pg13.dist_table_65001
|
||||||
|
DETAIL: on server postgres@localhost:xxxxx connectionId: xxxxxxx
|
||||||
|
-- This should error out since -5 is not valid.
|
||||||
|
VACUUM (PARALLEL -5) dist_table;
|
||||||
|
ERROR: parallel vacuum degree must be between 0 and 1024
|
||||||
|
-- This should error out since no number is given
|
||||||
|
VACUUM (PARALLEL) dist_table;
|
||||||
|
ERROR: parallel option requires a value between 0 and 1024
|
||||||
|
RESET client_min_messages;
|
||||||
|
RESET citus.log_remote_commands;
|
||||||
|
drop schema test_pg13 cascade;
|
||||||
|
NOTICE: drop cascades to table dist_table
|
|
@ -80,7 +80,7 @@ test: set_operation_and_local_tables
|
||||||
|
|
||||||
test: subqueries_deep subquery_view subquery_partitioning subquery_complex_target_list subqueries_not_supported subquery_in_where
|
test: subqueries_deep subquery_view subquery_partitioning subquery_complex_target_list subqueries_not_supported subquery_in_where
|
||||||
test: non_colocated_leaf_subquery_joins non_colocated_subquery_joins non_colocated_join_order
|
test: non_colocated_leaf_subquery_joins non_colocated_subquery_joins non_colocated_join_order
|
||||||
test: subquery_prepared_statements pg12 cte_inline
|
test: subquery_prepared_statements pg12 cte_inline pg13
|
||||||
|
|
||||||
# ----------
|
# ----------
|
||||||
# Miscellaneous tests to check our query planning behavior
|
# Miscellaneous tests to check our query planning behavior
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
|
||||||
|
create schema test_pg13;
|
||||||
|
set search_path to test_pg13;
|
||||||
|
|
||||||
|
SET citus.shard_replication_factor to 1;
|
||||||
|
SET citus.shard_count to 2;
|
||||||
|
SET citus.next_shard_id TO 65000;
|
||||||
|
|
||||||
|
CREATE TABLE dist_table (name char, age int);
|
||||||
|
CREATE INDEX name_index on dist_table(name);
|
||||||
|
|
||||||
|
SELECT create_distributed_table('dist_table', 'name');
|
||||||
|
|
||||||
|
SET client_min_messages to DEBUG1;
|
||||||
|
SET citus.log_remote_commands to ON;
|
||||||
|
-- make sure vacuum parallel doesn't error out
|
||||||
|
VACUUM (PARALLEL 2) dist_table;
|
||||||
|
VACUUM (PARALLEL 0) dist_table;
|
||||||
|
-- This should error out since -5 is not valid.
|
||||||
|
VACUUM (PARALLEL -5) dist_table;
|
||||||
|
-- This should error out since no number is given
|
||||||
|
VACUUM (PARALLEL) dist_table;
|
||||||
|
|
||||||
|
RESET client_min_messages;
|
||||||
|
RESET citus.log_remote_commands;
|
||||||
|
|
||||||
|
drop schema test_pg13 cascade;
|
Loading…
Reference in New Issue