From 8f5821493ad07fd9479b891fa14c4ba06be3e573 Mon Sep 17 00:00:00 2001 From: Onder Kalaci Date: Mon, 18 Jun 2018 18:13:42 +0300 Subject: [PATCH] Implement C interface for setting GUC We need the ability to switch to sequential mode (e.g., SET LOCAL citus.multi_shard_modify_mode = 'sequential'). This commit enables that. --- .../distributed/executor/multi_executor.c | 36 ++++++++++++++++++- .../expected/sequential_modifications.out | 29 +++++++++++++-- .../regress/sql/sequential_modifications.sql | 12 +++++-- 3 files changed, 71 insertions(+), 6 deletions(-) diff --git a/src/backend/distributed/executor/multi_executor.c b/src/backend/distributed/executor/multi_executor.c index a89193656..6e4fe0d19 100644 --- a/src/backend/distributed/executor/multi_executor.c +++ b/src/backend/distributed/executor/multi_executor.c @@ -47,10 +47,44 @@ int MultiShardConnectionType = PARALLEL_CONNECTION; -/* ocal function forward declarations */ +/* local function forward declarations */ +static void SetLocalMultiShardModifyModeToSequential(void); static Relation StubRelation(TupleDesc tupleDescriptor); +/* exports for SQL callable functions */ +PG_FUNCTION_INFO_V1(set_local_multi_shard_modify_mode_to_sequential); + + +/* + * set_local_multi_shard_modify_mode_to_sequential is a SQL + * interface for testing SetLocalMultiShardModifyModeToSequential(). + */ +Datum +set_local_multi_shard_modify_mode_to_sequential(PG_FUNCTION_ARGS) +{ + SetLocalMultiShardModifyModeToSequential(); + + PG_RETURN_VOID(); +} + + +/* + * SetLocalMultiShardModifyModeToSequential simply a C interface for + * setting the following: + * SET LOCAL citus.multi_shard_modify_mode = 'sequential'; + */ +static void +SetLocalMultiShardModifyModeToSequential() +{ + WarnNoTransactionChain(true, "SET LOCAL"); + + set_config_option("citus.multi_shard_modify_mode", "sequential", + (superuser() ? PGC_SUSET : PGC_USERSET), PGC_S_SESSION, + GUC_ACTION_LOCAL, true, 0, false); +} + + /* * ReturnTupleFromTuplestore reads the next tuple from the tuple store of the * given Citus scan node and returns it. It returns null if all tuples are read diff --git a/src/test/regress/expected/sequential_modifications.out b/src/test/regress/expected/sequential_modifications.out index 8483abf68..f72ea7684 100644 --- a/src/test/regress/expected/sequential_modifications.out +++ b/src/test/regress/expected/sequential_modifications.out @@ -51,6 +51,10 @@ BEGIN END; $$ LANGUAGE 'plpgsql' IMMUTABLE; +CREATE OR REPLACE FUNCTION set_local_multi_shard_modify_mode_to_sequential() + RETURNS void + LANGUAGE C STABLE STRICT + AS 'citus', $$set_local_multi_shard_modify_mode_to_sequential$$; -- disbable 2PC recovery since our tests will check that ALTER SYSTEM SET citus.recover_2pc_interval TO -1; SELECT pg_reload_conf(); @@ -66,6 +70,14 @@ SELECT create_distributed_table('test_table', 'a'); (1 row) +-- not useful if not in transaction +SELECT set_local_multi_shard_modify_mode_to_sequential(); +WARNING: SET LOCAL can only be used in transaction blocks + set_local_multi_shard_modify_mode_to_sequential +------------------------------------------------- + +(1 row) + -- we should see #worker transactions -- when sequential mode is used SET citus.multi_shard_modify_mode TO 'sequential'; @@ -406,7 +418,12 @@ INSERT INTO multi_shard_modify_test SELECT i, i::text, i FROM generate_series(0, BEGIN; INSERT INTO multi_shard_modify_test VALUES (1,'1',1), (2,'2',2), (3,'3',3), (4,'4',4); -- now switch to sequential mode to enable a successful TRUNCATE - SET LOCAL citus.multi_shard_modify_mode TO 'sequential'; + SELECT set_local_multi_shard_modify_mode_to_sequential(); + set_local_multi_shard_modify_mode_to_sequential +------------------------------------------------- + +(1 row) + TRUNCATE multi_shard_modify_test; COMMIT; -- see that all the data successfully removed @@ -451,7 +468,12 @@ INSERT INTO multi_shard_modify_test SELECT i, i::text, i FROM generate_series(0, BEGIN; INSERT INTO multi_shard_modify_test VALUES (1,'1',1), (2,'2',2), (3,'3',3), (4,'4',4); -- now switch to sequential mode to enable a successful INSERT .. SELECT - SET LOCAL citus.multi_shard_modify_mode TO 'sequential'; + SELECT set_local_multi_shard_modify_mode_to_sequential(); + set_local_multi_shard_modify_mode_to_sequential +------------------------------------------------- + +(1 row) + INSERT INTO multi_shard_modify_test SELECT * FROM multi_shard_modify_test; COMMIT; -- see that all the data successfully inserted @@ -471,10 +493,11 @@ SELECT pg_reload_conf(); SET search_path TO 'public'; DROP SCHEMA test_seq_ddl CASCADE; -NOTICE: drop cascades to 9 other objects +NOTICE: drop cascades to 10 other objects DETAIL: drop cascades to function test_seq_ddl.distributed_2pcs_are_equal_to_worker_count() drop cascades to function test_seq_ddl.distributed_2pcs_are_equal_to_placement_count() drop cascades to function test_seq_ddl.no_distributed_2pcs() +drop cascades to function test_seq_ddl.set_local_multi_shard_modify_mode_to_sequential() drop cascades to table test_seq_ddl.test_table drop cascades to table test_seq_ddl.ref_test drop cascades to table test_seq_ddl.test_table_rep_2 diff --git a/src/test/regress/sql/sequential_modifications.sql b/src/test/regress/sql/sequential_modifications.sql index 3f2d8af12..e95feb6cf 100644 --- a/src/test/regress/sql/sequential_modifications.sql +++ b/src/test/regress/sql/sequential_modifications.sql @@ -57,6 +57,11 @@ END; $$ LANGUAGE 'plpgsql' IMMUTABLE; +CREATE OR REPLACE FUNCTION set_local_multi_shard_modify_mode_to_sequential() + RETURNS void + LANGUAGE C STABLE STRICT + AS 'citus', $$set_local_multi_shard_modify_mode_to_sequential$$; + -- disbable 2PC recovery since our tests will check that ALTER SYSTEM SET citus.recover_2pc_interval TO -1; SELECT pg_reload_conf(); @@ -64,6 +69,9 @@ SELECT pg_reload_conf(); CREATE TABLE test_table(a int, b int); SELECT create_distributed_table('test_table', 'a'); +-- not useful if not in transaction +SELECT set_local_multi_shard_modify_mode_to_sequential(); + -- we should see #worker transactions -- when sequential mode is used SET citus.multi_shard_modify_mode TO 'sequential'; @@ -212,7 +220,7 @@ BEGIN; INSERT INTO multi_shard_modify_test VALUES (1,'1',1), (2,'2',2), (3,'3',3), (4,'4',4); -- now switch to sequential mode to enable a successful TRUNCATE - SET LOCAL citus.multi_shard_modify_mode TO 'sequential'; + SELECT set_local_multi_shard_modify_mode_to_sequential(); TRUNCATE multi_shard_modify_test; COMMIT; @@ -237,7 +245,7 @@ BEGIN; INSERT INTO multi_shard_modify_test VALUES (1,'1',1), (2,'2',2), (3,'3',3), (4,'4',4); -- now switch to sequential mode to enable a successful INSERT .. SELECT - SET LOCAL citus.multi_shard_modify_mode TO 'sequential'; + SELECT set_local_multi_shard_modify_mode_to_sequential(); INSERT INTO multi_shard_modify_test SELECT * FROM multi_shard_modify_test; COMMIT;