From c168a53ebc2fcf479a1452d5ff9f5b2b0740073f Mon Sep 17 00:00:00 2001 From: Hadi Moshayedi Date: Fri, 3 Apr 2020 16:54:50 -0700 Subject: [PATCH] Tests for replicate_reference_tables --- .../multi_replicate_reference_table.out | 81 ++++++++++++++++++- .../sql/multi_replicate_reference_table.sql | 45 ++++++++++- 2 files changed, 124 insertions(+), 2 deletions(-) diff --git a/src/test/regress/expected/multi_replicate_reference_table.out b/src/test/regress/expected/multi_replicate_reference_table.out index e17901906..cabf02679 100644 --- a/src/test/regress/expected/multi_replicate_reference_table.out +++ b/src/test/regress/expected/multi_replicate_reference_table.out @@ -760,13 +760,92 @@ ORDER BY 1,4,5; 1370015 | 1 | 0 | localhost | 57637 (1 row) --- this should have no effect +SELECT 1 FROM master_remove_node('localhost', :worker_2_port); + ?column? +--------------------------------------------------------------------- + 1 +(1 row) + +CREATE TABLE ref_table(a int); +SELECT create_reference_table('ref_table'); + create_reference_table +--------------------------------------------------------------------- + +(1 row) + +INSERT INTO ref_table SELECT * FROM generate_series(1, 10); SELECT 1 FROM master_add_node('localhost', :worker_2_port); ?column? --------------------------------------------------------------------- 1 (1 row) +-- verify we cannot replicate reference tables in a transaction modifying pg_dist_node +BEGIN; +SELECT 1 FROM master_add_inactive_node('invalid-node-name', 9999); + ?column? +--------------------------------------------------------------------- + 1 +(1 row) + +SELECT replicate_reference_tables(); +ERROR: cannot replicate reference tables in a transaction that modified node metadata +ROLLBACK; +-- verify we cannot replicate reference tables in a transaction which +-- modified reference tables +BEGIN; +DELETE FROM ref_table; +SELECT replicate_reference_tables(); +ERROR: cannot replicate reference tables in a transaction that modified a reference table +ROLLBACK; +BEGIN; +ALTER TABLE ref_table ADD COLUMN b int; +SELECT replicate_reference_tables(); +ERROR: cannot replicate reference tables in a transaction that modified a reference table +ROLLBACK; +BEGIN; +CREATE INDEX ref_idx ON ref_table(a); +SELECT replicate_reference_tables(); +ERROR: cannot replicate reference tables in a transaction that modified a reference table +ROLLBACK; +-- +-- read from reference table, then replicate, then write. verify +-- placements are consistent. +-- +BEGIN; +SELECT count(*) FROM ref_table; + count +--------------------------------------------------------------------- + 10 +(1 row) + +SELECT replicate_reference_tables(); + replicate_reference_tables +--------------------------------------------------------------------- + +(1 row) + +INSERT INTO ref_table VALUES (11); +SELECT count(*), sum(a) FROM ref_table; + count | sum +--------------------------------------------------------------------- + 11 | 66 +(1 row) + +UPDATE ref_table SET a = a + 1; +SELECT sum(a) FROM ref_table; + sum +--------------------------------------------------------------------- + 77 +(1 row) + +COMMIT; +SELECT min(result) = max(result) AS consistent FROM run_command_on_placements('ref_table', 'SELECT sum(a) FROM %s'); + consistent +--------------------------------------------------------------------- + t +(1 row) + -- test adding an invalid node while we have reference tables to replicate -- set client message level to ERROR and verbosity to terse to supporess -- OS-dependent host name resolution warnings diff --git a/src/test/regress/sql/multi_replicate_reference_table.sql b/src/test/regress/sql/multi_replicate_reference_table.sql index 2cc1634d7..56d458296 100644 --- a/src/test/regress/sql/multi_replicate_reference_table.sql +++ b/src/test/regress/sql/multi_replicate_reference_table.sql @@ -501,9 +501,52 @@ WHERE AND nodeport != :master_port ORDER BY 1,4,5; --- this should have no effect +SELECT 1 FROM master_remove_node('localhost', :worker_2_port); + +CREATE TABLE ref_table(a int); +SELECT create_reference_table('ref_table'); +INSERT INTO ref_table SELECT * FROM generate_series(1, 10); + SELECT 1 FROM master_add_node('localhost', :worker_2_port); +-- verify we cannot replicate reference tables in a transaction modifying pg_dist_node +BEGIN; +SELECT 1 FROM master_add_inactive_node('invalid-node-name', 9999); +SELECT replicate_reference_tables(); +ROLLBACK; + +-- verify we cannot replicate reference tables in a transaction which +-- modified reference tables +BEGIN; +DELETE FROM ref_table; +SELECT replicate_reference_tables(); +ROLLBACK; + +BEGIN; +ALTER TABLE ref_table ADD COLUMN b int; +SELECT replicate_reference_tables(); +ROLLBACK; + +BEGIN; +CREATE INDEX ref_idx ON ref_table(a); +SELECT replicate_reference_tables(); +ROLLBACK; + +-- +-- read from reference table, then replicate, then write. verify +-- placements are consistent. +-- +BEGIN; +SELECT count(*) FROM ref_table; +SELECT replicate_reference_tables(); +INSERT INTO ref_table VALUES (11); +SELECT count(*), sum(a) FROM ref_table; +UPDATE ref_table SET a = a + 1; +SELECT sum(a) FROM ref_table; +COMMIT; + +SELECT min(result) = max(result) AS consistent FROM run_command_on_placements('ref_table', 'SELECT sum(a) FROM %s'); + -- test adding an invalid node while we have reference tables to replicate -- set client message level to ERROR and verbosity to terse to supporess -- OS-dependent host name resolution warnings