mirror of https://github.com/citusdata/citus.git
128 lines
3.0 KiB
Ruby
128 lines
3.0 KiB
Ruby
#include "isolation_mx_common.include.spec"
|
|
|
|
setup
|
|
{
|
|
CREATE OR REPLACE FUNCTION trigger_metadata_sync()
|
|
RETURNS void
|
|
LANGUAGE C STRICT
|
|
AS 'citus';
|
|
|
|
CREATE OR REPLACE FUNCTION wait_until_metadata_sync(timeout INTEGER DEFAULT 15000)
|
|
RETURNS void
|
|
LANGUAGE C STRICT
|
|
AS 'citus';
|
|
|
|
CREATE TABLE deadlock_detection_test (user_id int UNIQUE, some_val int);
|
|
INSERT INTO deadlock_detection_test SELECT i, i FROM generate_series(1,7) i;
|
|
SELECT create_distributed_table('deadlock_detection_test', 'user_id');
|
|
|
|
CREATE TABLE t2(a int);
|
|
SELECT create_distributed_table('t2', 'a');
|
|
}
|
|
|
|
teardown
|
|
{
|
|
DROP FUNCTION trigger_metadata_sync();
|
|
DROP TABLE deadlock_detection_test;
|
|
DROP TABLE t2;
|
|
SET citus.shard_replication_factor = 1;
|
|
}
|
|
|
|
session "s1"
|
|
|
|
step "enable-deadlock-detection"
|
|
{
|
|
ALTER SYSTEM SET citus.distributed_deadlock_detection_factor TO 3;
|
|
}
|
|
|
|
step "disable-deadlock-detection"
|
|
{
|
|
ALTER SYSTEM SET citus.distributed_deadlock_detection_factor TO -1;
|
|
}
|
|
|
|
step "reload-conf"
|
|
{
|
|
SELECT pg_reload_conf();
|
|
}
|
|
|
|
step "s1-begin"
|
|
{
|
|
BEGIN;
|
|
}
|
|
|
|
step "s1-update-1"
|
|
{
|
|
UPDATE deadlock_detection_test SET some_val = 1 WHERE user_id = 1;
|
|
}
|
|
|
|
step "s1-update-2"
|
|
{
|
|
UPDATE deadlock_detection_test SET some_val = 1 WHERE user_id = 2;
|
|
}
|
|
|
|
step "s1-commit"
|
|
{
|
|
COMMIT;
|
|
}
|
|
|
|
session "s2"
|
|
|
|
step "s2-start-session-level-connection"
|
|
{
|
|
SELECT start_session_level_connection_to_node('localhost', 57638);
|
|
}
|
|
|
|
step "s2-stop-connection"
|
|
{
|
|
SELECT stop_session_level_connection_to_node();
|
|
}
|
|
|
|
step "s2-begin-on-worker"
|
|
{
|
|
SELECT run_commands_on_session_level_connection_to_node('BEGIN');
|
|
}
|
|
|
|
step "s2-update-1-on-worker"
|
|
{
|
|
SELECT run_commands_on_session_level_connection_to_node('UPDATE deadlock_detection_test SET some_val = 2 WHERE user_id = 1');
|
|
}
|
|
|
|
step "s2-update-2-on-worker"
|
|
{
|
|
SELECT run_commands_on_session_level_connection_to_node('UPDATE deadlock_detection_test SET some_val = 2 WHERE user_id = 2');
|
|
}
|
|
|
|
step "s2-truncate-on-worker"
|
|
{
|
|
SELECT run_commands_on_session_level_connection_to_node('TRUNCATE t2');
|
|
}
|
|
|
|
step "s2-commit-on-worker"
|
|
{
|
|
SELECT run_commands_on_session_level_connection_to_node('COMMIT');
|
|
}
|
|
|
|
session "s3"
|
|
|
|
step "s3-invalidate-metadata"
|
|
{
|
|
update pg_dist_node SET metadatasynced = false;
|
|
}
|
|
|
|
step "s3-resync"
|
|
{
|
|
SELECT trigger_metadata_sync();
|
|
}
|
|
|
|
step "s3-wait"
|
|
{
|
|
SELECT pg_sleep(2);
|
|
}
|
|
|
|
// Backends can block metadata sync. The following test verifies that if this happens,
|
|
// we still do distributed deadlock detection. In the following, s2-truncate-on-worker
|
|
// causes the concurrent metadata sync to be blocked. But s2 and s1 themselves are
|
|
// themselves involved in a distributed deadlock.
|
|
// See https://github.com/citusdata/citus/issues/4393 for more details.
|
|
permutation "enable-deadlock-detection" "reload-conf" "s2-start-session-level-connection" "s1-begin" "s1-update-1" "s2-begin-on-worker" "s2-update-2-on-worker" "s2-truncate-on-worker" "s3-invalidate-metadata" "s3-resync" "s3-wait" "s2-update-1-on-worker" "s1-update-2" "s1-commit" "s2-commit-on-worker" "disable-deadlock-detection" "reload-conf" "s2-stop-connection"
|