Failure tests for INSERT/SELECT repartition

pull/3376/head
Hadi Moshayedi 2020-01-14 14:55:05 -08:00
parent 665b33dca1
commit 43218eebf6
3 changed files with 297 additions and 0 deletions

View File

@ -0,0 +1,200 @@
--
-- failure_insert_select_repartition
--
-- performs failure/cancellation test for repartitioned insert/select.
--
CREATE SCHEMA repartitioned_insert_select;
SET SEARCH_PATH=repartitioned_insert_select;
SELECT pg_backend_pid() as pid \gset
SET citus.next_shard_id TO 4213581;
SET citus.shard_count TO 4;
SET citus.shard_replication_factor TO 2;
CREATE TABLE replicated_source_table(a int, b int);
SELECT create_distributed_table('replicated_source_table', 'a');
create_distributed_table
---------------------------------------------------------------------
(1 row)
INSERT INTO replicated_source_table SELECT i, i*i FROM generate_series(1, 10) i;
SET citus.shard_count TO 3;
CREATE TABLE replicated_target_table(a int, b int);
SELECT create_distributed_table('replicated_target_table', 'a');
create_distributed_table
---------------------------------------------------------------------
(1 row)
SET citus.shard_replication_factor TO 1;
SET citus.shard_count TO 4;
CREATE TABLE source_table(a int, b int);
SELECT create_distributed_table('source_table', 'a');
create_distributed_table
---------------------------------------------------------------------
(1 row)
INSERT INTO source_table SELECT i, i*i FROM generate_series(1, 10) i;
SET citus.shard_count TO 3;
CREATE TABLE target_table(a int, b int);
SELECT create_distributed_table('target_table', 'a');
create_distributed_table
---------------------------------------------------------------------
(1 row)
--
-- kill worker_partition_query_result
-- this fails the query on source table, so replicated case should succeed
--
SELECT citus.mitmproxy('conn.onQuery(query="worker_partition_query_result").kill()');
mitmproxy
---------------------------------------------------------------------
(1 row)
INSERT INTO target_table SELECT * FROM source_table;
ERROR: connection error: localhost:xxxxx
DETAIL: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
SELECT * FROM target_table ORDER BY a;
a | b
---------------------------------------------------------------------
(0 rows)
SELECT citus.mitmproxy('conn.onQuery(query="worker_partition_query_result").kill()');
mitmproxy
---------------------------------------------------------------------
(1 row)
INSERT INTO target_table SELECT * FROM replicated_source_table;
WARNING: connection error: localhost:xxxxx
DETAIL: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
WARNING: connection error: localhost:xxxxx
DETAIL: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
SELECT * FROM target_table ORDER BY a;
a | b
---------------------------------------------------------------------
1 | 1
2 | 4
3 | 9
4 | 16
5 | 25
6 | 36
7 | 49
8 | 64
9 | 81
10 | 100
(10 rows)
--
-- kill fetch_intermediate_results
-- this fails the fetch into target, so source replication doesn't matter
-- and both should fail
--
TRUNCATE target_table;
SELECT citus.mitmproxy('conn.onQuery(query="fetch_intermediate_results").kill()');
mitmproxy
---------------------------------------------------------------------
(1 row)
INSERT INTO target_table SELECT * FROM source_table;
ERROR: connection error: localhost:xxxxx
DETAIL: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
SELECT * FROM target_table ORDER BY a;
a | b
---------------------------------------------------------------------
(0 rows)
SELECT citus.mitmproxy('conn.onQuery(query="fetch_intermediate_results").kill()');
mitmproxy
---------------------------------------------------------------------
(1 row)
INSERT INTO target_table SELECT * FROM replicated_source_table;
ERROR: connection error: localhost:xxxxx
DETAIL: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
SELECT * FROM target_table ORDER BY a;
a | b
---------------------------------------------------------------------
(0 rows)
--
-- kill read_intermediate_results
-- again, both should fail
--
TRUNCATE target_table;
SELECT citus.mitmproxy('conn.onQuery(query="read_intermediate_results").kill()');
mitmproxy
---------------------------------------------------------------------
(1 row)
INSERT INTO target_table SELECT * FROM source_table;
ERROR: connection error: localhost:xxxxx
DETAIL: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
SELECT * FROM target_table ORDER BY a;
a | b
---------------------------------------------------------------------
(0 rows)
SELECT citus.mitmproxy('conn.onQuery(query="read_intermediate_results").kill()');
mitmproxy
---------------------------------------------------------------------
(1 row)
INSERT INTO target_table SELECT * FROM replicated_source_table;
ERROR: connection error: localhost:xxxxx
DETAIL: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
SELECT * FROM target_table ORDER BY a;
a | b
---------------------------------------------------------------------
(0 rows)
--
-- We error out even if table is replicated and only one of the replicas
-- fail.
--
SELECT citus.mitmproxy('conn.onQuery(query="read_intermediate_results").kill()');
mitmproxy
---------------------------------------------------------------------
(1 row)
INSERT INTO replicated_target_table SELECT * FROM source_table;
ERROR: connection error: localhost:xxxxx
DETAIL: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
SELECT * FROM replicated_target_table;
a | b
---------------------------------------------------------------------
(0 rows)
RESET SEARCH_PATH;
SELECT citus.mitmproxy('conn.allow()');
mitmproxy
---------------------------------------------------------------------
(1 row)
\set VERBOSITY TERSE
DROP SCHEMA repartitioned_insert_select CASCADE;
NOTICE: drop cascades to 4 other objects

View File

@ -6,6 +6,7 @@ test: failure_setup
test: multi_test_helpers test: multi_test_helpers
test: failure_replicated_partitions test: failure_replicated_partitions
test: multi_test_catalog_views test: multi_test_catalog_views
test: failure_insert_select_repartition
test: failure_distributed_results test: failure_distributed_results
test: failure_ddl test: failure_ddl
test: failure_truncate test: failure_truncate

View File

@ -0,0 +1,96 @@
--
-- failure_insert_select_repartition
--
-- performs failure/cancellation test for repartitioned insert/select.
--
CREATE SCHEMA repartitioned_insert_select;
SET SEARCH_PATH=repartitioned_insert_select;
SELECT pg_backend_pid() as pid \gset
SET citus.next_shard_id TO 4213581;
SET citus.shard_count TO 4;
SET citus.shard_replication_factor TO 2;
CREATE TABLE replicated_source_table(a int, b int);
SELECT create_distributed_table('replicated_source_table', 'a');
INSERT INTO replicated_source_table SELECT i, i*i FROM generate_series(1, 10) i;
SET citus.shard_count TO 3;
CREATE TABLE replicated_target_table(a int, b int);
SELECT create_distributed_table('replicated_target_table', 'a');
SET citus.shard_replication_factor TO 1;
SET citus.shard_count TO 4;
CREATE TABLE source_table(a int, b int);
SELECT create_distributed_table('source_table', 'a');
INSERT INTO source_table SELECT i, i*i FROM generate_series(1, 10) i;
SET citus.shard_count TO 3;
CREATE TABLE target_table(a int, b int);
SELECT create_distributed_table('target_table', 'a');
--
-- kill worker_partition_query_result
-- this fails the query on source table, so replicated case should succeed
--
SELECT citus.mitmproxy('conn.onQuery(query="worker_partition_query_result").kill()');
INSERT INTO target_table SELECT * FROM source_table;
SELECT * FROM target_table ORDER BY a;
SELECT citus.mitmproxy('conn.onQuery(query="worker_partition_query_result").kill()');
INSERT INTO target_table SELECT * FROM replicated_source_table;
SELECT * FROM target_table ORDER BY a;
--
-- kill fetch_intermediate_results
-- this fails the fetch into target, so source replication doesn't matter
-- and both should fail
--
TRUNCATE target_table;
SELECT citus.mitmproxy('conn.onQuery(query="fetch_intermediate_results").kill()');
INSERT INTO target_table SELECT * FROM source_table;
SELECT * FROM target_table ORDER BY a;
SELECT citus.mitmproxy('conn.onQuery(query="fetch_intermediate_results").kill()');
INSERT INTO target_table SELECT * FROM replicated_source_table;
SELECT * FROM target_table ORDER BY a;
--
-- kill read_intermediate_results
-- again, both should fail
--
TRUNCATE target_table;
SELECT citus.mitmproxy('conn.onQuery(query="read_intermediate_results").kill()');
INSERT INTO target_table SELECT * FROM source_table;
SELECT * FROM target_table ORDER BY a;
SELECT citus.mitmproxy('conn.onQuery(query="read_intermediate_results").kill()');
INSERT INTO target_table SELECT * FROM replicated_source_table;
SELECT * FROM target_table ORDER BY a;
--
-- We error out even if table is replicated and only one of the replicas
-- fail.
--
SELECT citus.mitmproxy('conn.onQuery(query="read_intermediate_results").kill()');
INSERT INTO replicated_target_table SELECT * FROM source_table;
SELECT * FROM replicated_target_table;
RESET SEARCH_PATH;
SELECT citus.mitmproxy('conn.allow()');
\set VERBOSITY TERSE
DROP SCHEMA repartitioned_insert_select CASCADE;