Merge pull request #2474 from citusdata/fix/min-client-message-fatal

Fix failures of tests on recent postgres builds
pull/2467/head
Nils Dijk 2018-11-13 17:40:21 +01:00 committed by GitHub
commit 2cc803afe0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 69 additions and 54 deletions

View File

@ -9,3 +9,6 @@
# Regression test output # Regression test output
/regression.diffs /regression.diffs
/regression.out /regression.out
# Failure test side effets
/proxy.output

View File

@ -204,17 +204,28 @@ SELECT citus.mitmproxy('conn.onQuery(query="^PREPARE TRANSACTION").kill()');
(1 row) (1 row)
-- hide the error message (it has the PID)... -- this transaction block will be sent to the coordinator as a remote command to hide the
-- error message that is caused during commit.
-- we'll test for the txn side-effects to ensure it didn't run -- we'll test for the txn side-effects to ensure it didn't run
SET client_min_messages TO FATAL; SELECT master_run_on_worker(
ARRAY['localhost']::text[],
ARRAY[:master_port]::int[],
ARRAY['
BEGIN; BEGIN;
DELETE FROM dml_test WHERE id = 1; DELETE FROM dml_test WHERE id = 1;
DELETE FROM dml_test WHERE id = 2; DELETE FROM dml_test WHERE id = 2;
INSERT INTO dml_test VALUES (5, 'Epsilon'); INSERT INTO dml_test VALUES (5, ''Epsilon'');
UPDATE dml_test SET name = 'alpha' WHERE id = 1; UPDATE dml_test SET name = ''alpha'' WHERE id = 1;
UPDATE dml_test SET name = 'gamma' WHERE id = 3; UPDATE dml_test SET name = ''gamma'' WHERE id = 3;
COMMIT; COMMIT;
SET client_min_messages TO DEFAULT; '],
false
);
master_run_on_worker
---------------------------
(localhost,57636,t,BEGIN)
(1 row)
SELECT citus.mitmproxy('conn.allow()'); SELECT citus.mitmproxy('conn.allow()');
mitmproxy mitmproxy
----------- -----------
@ -249,9 +260,7 @@ SELECT citus.mitmproxy('conn.onQuery(query="^PREPARE TRANSACTION").cancel(' ||
(1 row) (1 row)
-- hide the error message (it has the PID)...
-- we'll test for the txn side-effects to ensure it didn't run -- we'll test for the txn side-effects to ensure it didn't run
SET client_min_messages TO FATAL;
BEGIN; BEGIN;
DELETE FROM dml_test WHERE id = 1; DELETE FROM dml_test WHERE id = 1;
DELETE FROM dml_test WHERE id = 2; DELETE FROM dml_test WHERE id = 2;
@ -259,7 +268,7 @@ INSERT INTO dml_test VALUES (5, 'Epsilon');
UPDATE dml_test SET name = 'alpha' WHERE id = 1; UPDATE dml_test SET name = 'alpha' WHERE id = 1;
UPDATE dml_test SET name = 'gamma' WHERE id = 3; UPDATE dml_test SET name = 'gamma' WHERE id = 3;
COMMIT; COMMIT;
SET client_min_messages TO DEFAULT; ERROR: canceling statement due to user request
SELECT citus.mitmproxy('conn.allow()'); SELECT citus.mitmproxy('conn.allow()');
mitmproxy mitmproxy
----------- -----------

View File

@ -23,16 +23,6 @@ SELECT create_distributed_table('test_table','id');
-- Populate data to the table -- Populate data to the table
INSERT INTO test_table VALUES(1,1,1),(1,2,2),(2,1,1),(2,2,2),(3,1,1),(3,2,2); INSERT INTO test_table VALUES(1,1,1),(1,2,2),(2,1,1),(2,2,2),(3,1,1),(3,2,2);
-- Create a function to make sure that queries returning the same result
CREATE FUNCTION raise_failed_execution(query text) RETURNS void AS $$
BEGIN
EXECUTE query;
EXCEPTION WHEN OTHERS THEN
IF SQLERRM LIKE 'failed to execute task%' THEN
RAISE 'Task failed to execute';
END IF;
END;
$$LANGUAGE plpgsql;
-- Kill when the first COPY command arrived, since we have a single placement -- Kill when the first COPY command arrived, since we have a single placement
-- it is expected to error out. -- it is expected to error out.
SET client_min_messages TO ERROR; SET client_min_messages TO ERROR;
@ -42,9 +32,9 @@ SELECT citus.mitmproxy('conn.onQuery(query="^COPY").kill()');
(1 row) (1 row)
SELECT raise_failed_execution('SELECT count(*) FROM test_table'); SELECT public.raise_failed_execution('SELECT count(*) FROM test_table');
ERROR: Task failed to execute ERROR: Task failed to execute
CONTEXT: PL/pgSQL function raise_failed_execution(text) line 6 at RAISE CONTEXT: PL/pgSQL function public.raise_failed_execution(text) line 6 at RAISE
SET client_min_messages TO DEFAULT; SET client_min_messages TO DEFAULT;
-- Kill the connection with a CTE -- Kill the connection with a CTE
SELECT citus.mitmproxy('conn.onQuery(query="^COPY").kill()'); SELECT citus.mitmproxy('conn.onQuery(query="^COPY").kill()');
@ -70,12 +60,12 @@ SELECT citus.mitmproxy('conn.onQuery(query="^COPY").after(1).kill()');
(1 row) (1 row)
SELECT raise_failed_execution('WITH SELECT public.raise_failed_execution('WITH
results AS (SELECT * FROM test_table) results AS (SELECT * FROM test_table)
SELECT * FROM test_table, results SELECT * FROM test_table, results
WHERE test_table.id = results.id'); WHERE test_table.id = results.id');
ERROR: Task failed to execute ERROR: Task failed to execute
CONTEXT: PL/pgSQL function raise_failed_execution(text) line 6 at RAISE CONTEXT: PL/pgSQL function public.raise_failed_execution(text) line 6 at RAISE
SET client_min_messages TO DEFAULT; SET client_min_messages TO DEFAULT;
-- In parallel execution mode Citus opens separate connections for each shard -- In parallel execution mode Citus opens separate connections for each shard
-- so killing the connection after the first copy does not break it. -- so killing the connection after the first copy does not break it.
@ -297,7 +287,5 @@ WARNING: could not consume data from worker node
COMMIT; COMMIT;
DROP SCHEMA real_time_select_failure CASCADE; DROP SCHEMA real_time_select_failure CASCADE;
NOTICE: drop cascades to 2 other objects NOTICE: drop cascades to table test_table
DETAIL: drop cascades to function raise_failed_execution(text)
drop cascades to table test_table
SET search_path TO default; SET search_path TO default;

View File

@ -225,8 +225,12 @@ ERROR: parameter "citus.max_task_string_size" cannot be changed without restart
-- error message may vary between executions -- error message may vary between executions
-- hiding warning and error message -- hiding warning and error message
-- no output means the query has failed -- no output means the query has failed
SET client_min_messages to FATAL; SET client_min_messages to ERROR;
SELECT raise_failed_execution('
SELECT u.* FROM wide_table u JOIN wide_table v ON (u.long_column_002 = v.long_column_003); SELECT u.* FROM wide_table u JOIN wide_table v ON (u.long_column_002 = v.long_column_003);
');
ERROR: Task failed to execute
CONTEXT: PL/pgSQL function raise_failed_execution(text) line 6 at RAISE
-- following will succeed since it fetches few columns -- following will succeed since it fetches few columns
SELECT u.long_column_001, u.long_column_002, u.long_column_003 FROM wide_table u JOIN wide_table v ON (u.long_column_002 = v.long_column_003); SELECT u.long_column_001, u.long_column_002, u.long_column_003 FROM wide_table u JOIN wide_table v ON (u.long_column_002 = v.long_column_003);
long_column_001 | long_column_002 | long_column_003 long_column_001 | long_column_002 | long_column_003

View File

@ -109,3 +109,13 @@ $desc_views$
(1 row) (1 row)
-- Create a function to make sure that queries returning the same result
CREATE FUNCTION raise_failed_execution(query text) RETURNS void AS $$
BEGIN
EXECUTE query;
EXCEPTION WHEN OTHERS THEN
IF SQLERRM LIKE 'failed to execute task%' THEN
RAISE 'Task failed to execute';
END IF;
END;
$$LANGUAGE plpgsql;

View File

@ -107,19 +107,23 @@ SELECT * FROM dml_test ORDER BY id ASC;
-- fail at PREPARE TRANSACTION -- fail at PREPARE TRANSACTION
SELECT citus.mitmproxy('conn.onQuery(query="^PREPARE TRANSACTION").kill()'); SELECT citus.mitmproxy('conn.onQuery(query="^PREPARE TRANSACTION").kill()');
-- hide the error message (it has the PID)... -- this transaction block will be sent to the coordinator as a remote command to hide the
-- error message that is caused during commit.
-- we'll test for the txn side-effects to ensure it didn't run -- we'll test for the txn side-effects to ensure it didn't run
SET client_min_messages TO FATAL; SELECT master_run_on_worker(
ARRAY['localhost']::text[],
ARRAY[:master_port]::int[],
ARRAY['
BEGIN; BEGIN;
DELETE FROM dml_test WHERE id = 1; DELETE FROM dml_test WHERE id = 1;
DELETE FROM dml_test WHERE id = 2; DELETE FROM dml_test WHERE id = 2;
INSERT INTO dml_test VALUES (5, 'Epsilon'); INSERT INTO dml_test VALUES (5, ''Epsilon'');
UPDATE dml_test SET name = 'alpha' WHERE id = 1; UPDATE dml_test SET name = ''alpha'' WHERE id = 1;
UPDATE dml_test SET name = 'gamma' WHERE id = 3; UPDATE dml_test SET name = ''gamma'' WHERE id = 3;
COMMIT; COMMIT;
'],
SET client_min_messages TO DEFAULT; false
);
SELECT citus.mitmproxy('conn.allow()'); SELECT citus.mitmproxy('conn.allow()');
SELECT shardid FROM pg_dist_shard_placement WHERE shardstate = 3; SELECT shardid FROM pg_dist_shard_placement WHERE shardstate = 3;
@ -132,10 +136,7 @@ SELECT * FROM dml_test ORDER BY id ASC;
-- cancel at PREPARE TRANSACTION -- cancel at PREPARE TRANSACTION
SELECT citus.mitmproxy('conn.onQuery(query="^PREPARE TRANSACTION").cancel(' || pg_backend_pid() || ')'); SELECT citus.mitmproxy('conn.onQuery(query="^PREPARE TRANSACTION").cancel(' || pg_backend_pid() || ')');
-- hide the error message (it has the PID)...
-- we'll test for the txn side-effects to ensure it didn't run -- we'll test for the txn side-effects to ensure it didn't run
SET client_min_messages TO FATAL;
BEGIN; BEGIN;
DELETE FROM dml_test WHERE id = 1; DELETE FROM dml_test WHERE id = 1;
DELETE FROM dml_test WHERE id = 2; DELETE FROM dml_test WHERE id = 2;
@ -144,8 +145,6 @@ UPDATE dml_test SET name = 'alpha' WHERE id = 1;
UPDATE dml_test SET name = 'gamma' WHERE id = 3; UPDATE dml_test SET name = 'gamma' WHERE id = 3;
COMMIT; COMMIT;
SET client_min_messages TO DEFAULT;
SELECT citus.mitmproxy('conn.allow()'); SELECT citus.mitmproxy('conn.allow()');
SELECT shardid FROM pg_dist_shard_placement WHERE shardstate = 3; SELECT shardid FROM pg_dist_shard_placement WHERE shardstate = 3;
SELECT recover_prepared_transactions(); SELECT recover_prepared_transactions();

View File

@ -17,22 +17,11 @@ SELECT create_distributed_table('test_table','id');
-- Populate data to the table -- Populate data to the table
INSERT INTO test_table VALUES(1,1,1),(1,2,2),(2,1,1),(2,2,2),(3,1,1),(3,2,2); INSERT INTO test_table VALUES(1,1,1),(1,2,2),(2,1,1),(2,2,2),(3,1,1),(3,2,2);
-- Create a function to make sure that queries returning the same result
CREATE FUNCTION raise_failed_execution(query text) RETURNS void AS $$
BEGIN
EXECUTE query;
EXCEPTION WHEN OTHERS THEN
IF SQLERRM LIKE 'failed to execute task%' THEN
RAISE 'Task failed to execute';
END IF;
END;
$$LANGUAGE plpgsql;
-- Kill when the first COPY command arrived, since we have a single placement -- Kill when the first COPY command arrived, since we have a single placement
-- it is expected to error out. -- it is expected to error out.
SET client_min_messages TO ERROR; SET client_min_messages TO ERROR;
SELECT citus.mitmproxy('conn.onQuery(query="^COPY").kill()'); SELECT citus.mitmproxy('conn.onQuery(query="^COPY").kill()');
SELECT raise_failed_execution('SELECT count(*) FROM test_table'); SELECT public.raise_failed_execution('SELECT count(*) FROM test_table');
SET client_min_messages TO DEFAULT; SET client_min_messages TO DEFAULT;
-- Kill the connection with a CTE -- Kill the connection with a CTE
@ -46,7 +35,7 @@ WHERE test_table.id = results.id;
-- killing connection after first successful query should break. -- killing connection after first successful query should break.
SET client_min_messages TO ERROR; SET client_min_messages TO ERROR;
SELECT citus.mitmproxy('conn.onQuery(query="^COPY").after(1).kill()'); SELECT citus.mitmproxy('conn.onQuery(query="^COPY").after(1).kill()');
SELECT raise_failed_execution('WITH SELECT public.raise_failed_execution('WITH
results AS (SELECT * FROM test_table) results AS (SELECT * FROM test_table)
SELECT * FROM test_table, results SELECT * FROM test_table, results
WHERE test_table.id = results.id'); WHERE test_table.id = results.id');

View File

@ -220,9 +220,11 @@ SET citus.max_task_string_size TO 20000;
-- error message may vary between executions -- error message may vary between executions
-- hiding warning and error message -- hiding warning and error message
-- no output means the query has failed -- no output means the query has failed
SET client_min_messages to FATAL; SET client_min_messages to ERROR;
SELECT raise_failed_execution('
SELECT u.* FROM wide_table u JOIN wide_table v ON (u.long_column_002 = v.long_column_003); SELECT u.* FROM wide_table u JOIN wide_table v ON (u.long_column_002 = v.long_column_003);
');
-- following will succeed since it fetches few columns -- following will succeed since it fetches few columns
SELECT u.long_column_001, u.long_column_002, u.long_column_003 FROM wide_table u JOIN wide_table v ON (u.long_column_002 = v.long_column_003); SELECT u.long_column_001, u.long_column_002, u.long_column_003 FROM wide_table u JOIN wide_table v ON (u.long_column_002 = v.long_column_003);

View File

@ -106,3 +106,14 @@ ORDER BY a.attrelid, a.attnum;
$desc_views$ $desc_views$
); );
-- Create a function to make sure that queries returning the same result
CREATE FUNCTION raise_failed_execution(query text) RETURNS void AS $$
BEGIN
EXECUTE query;
EXCEPTION WHEN OTHERS THEN
IF SQLERRM LIKE 'failed to execute task%' THEN
RAISE 'Task failed to execute';
END IF;
END;
$$LANGUAGE plpgsql;