setup { CREATE OR REPLACE FUNCTION pg_catalog.master_create_distributed_table(table_name regclass, distribution_column text, distribution_method citus.distribution_type) RETURNS void LANGUAGE C STRICT AS 'citus', $$master_create_distributed_table$$; COMMENT ON FUNCTION pg_catalog.master_create_distributed_table(table_name regclass, distribution_column text, distribution_method citus.distribution_type) IS 'define the table distribution functions'; -- this function is dropped in Citus10, added here for tests CREATE OR REPLACE FUNCTION pg_catalog.master_create_worker_shards(table_name text, shard_count integer, replication_factor integer DEFAULT 2) RETURNS void AS 'citus', $$master_create_worker_shards$$ LANGUAGE C STRICT; CREATE TABLE test_dml_vs_repair (test_id integer NOT NULL, data int); SELECT master_create_distributed_table('test_dml_vs_repair', 'test_id', 'hash'); SELECT master_create_worker_shards('test_dml_vs_repair', 1, 2); } teardown { DROP TABLE IF EXISTS test_dml_vs_repair CASCADE; } session "s1" setup { DEALLOCATE all; TRUNCATE test_dml_vs_repair; PREPARE insertone AS INSERT INTO test_dml_vs_repair VALUES(1, 1); PREPARE insertall AS INSERT INTO test_dml_vs_repair SELECT test_id, data+1 FROM test_dml_vs_repair; } step "s1-begin" { BEGIN; } step "s1-insertone" { INSERT INTO test_dml_vs_repair VALUES(1, 1); } step "s1-prepared-insertone" { EXECUTE insertone; } step "s1-insertall" { INSERT INTO test_dml_vs_repair SELECT test_id, data+1 FROM test_dml_vs_repair; } step "s1-prepared-insertall" { EXECUTE insertall; } step "s1-display" { SELECT * FROM test_dml_vs_repair WHERE test_id = 1 ORDER BY test_id; } step "s1-commit" { COMMIT; } session "s2" step "s2-begin" { BEGIN; } step "s2-invalidate-57637" { UPDATE pg_dist_shard_placement SET shardstate = '3' WHERE shardid = (SELECT shardid FROM pg_dist_shard WHERE logicalrelid = 'test_dml_vs_repair'::regclass) AND nodeport = 57637; } step "s2-invalidate-57638" { UPDATE pg_dist_shard_placement SET shardstate = '3' WHERE shardid = (SELECT shardid FROM pg_dist_shard WHERE logicalrelid = 'test_dml_vs_repair'::regclass) AND nodeport = 57638; } step "s2-revalidate-57638" { UPDATE pg_dist_shard_placement SET shardstate = '1' WHERE shardid = (SELECT shardid FROM pg_dist_shard WHERE logicalrelid = 'test_dml_vs_repair'::regclass) AND nodeport = 57638; } step "s2-repair" { SELECT master_copy_shard_placement((SELECT shardid FROM pg_dist_shard WHERE logicalrelid = 'test_dml_vs_repair'::regclass), 'localhost', 57638, 'localhost', 57637); } step "s2-commit" { COMMIT; } // verify that repair is blocked by ongoing modifying simple transaction permutation "s2-invalidate-57637" "s1-begin" "s1-insertone" "s2-repair" "s1-commit" // verify that repair is blocked by ongoing modifying insert...select transaction permutation "s1-insertone" "s2-invalidate-57637" "s1-begin" "s1-insertall" "s2-repair" "s1-commit" // verify that modifications wait for shard repair permutation "s2-invalidate-57637" "s2-begin" "s2-repair" "s1-insertone" "s2-commit" "s2-invalidate-57638" "s1-display" "s2-invalidate-57637" "s2-revalidate-57638" "s1-display" // verify that prepared plain modifications wait for shard repair permutation "s2-invalidate-57637" "s1-prepared-insertone" "s2-begin" "s2-repair" "s1-prepared-insertone" "s2-commit" "s2-invalidate-57638" "s1-display" "s2-invalidate-57637" "s2-revalidate-57638" "s1-display" // verify that prepared INSERT ... SELECT waits for shard repair permutation "s2-invalidate-57637" "s1-insertone" "s1-prepared-insertall" "s2-begin" "s2-repair" "s1-prepared-insertall" "s2-commit" "s2-invalidate-57638" "s1-display" "s2-invalidate-57637" "s2-revalidate-57638" "s1-display"