mirror of https://github.com/citusdata/citus.git
187 lines
6.7 KiB
Python
187 lines
6.7 KiB
Python
// we use 5 as the partition key value through out the test
|
|
// so setting the corresponding shard here is useful
|
|
setup
|
|
{
|
|
SET citus.shard_count TO 2;
|
|
SET citus.shard_replication_factor TO 2;
|
|
CREATE TABLE test_repair_placement_vs_modification (x int, y int);
|
|
SELECT create_distributed_table('test_repair_placement_vs_modification', 'x');
|
|
|
|
SELECT get_shard_id_for_distribution_column('test_repair_placement_vs_modification', 5) INTO selected_shard;
|
|
|
|
SET citus.shard_replication_factor TO 1;
|
|
CREATE TABLE test_copy_placement_vs_modification (x int, y int);
|
|
SELECT create_distributed_table('test_copy_placement_vs_modification', 'x');
|
|
}
|
|
|
|
teardown
|
|
{
|
|
DROP TABLE test_repair_placement_vs_modification;
|
|
DROP TABLE selected_shard;
|
|
DROP TABLE test_copy_placement_vs_modification;
|
|
}
|
|
|
|
session "s1"
|
|
|
|
step "s1-begin"
|
|
{
|
|
BEGIN;
|
|
SET LOCAL citus.select_opens_transaction_block TO off;
|
|
}
|
|
|
|
// since test_repair_placement_vs_modification has rep > 1 simple select query doesn't hit all placements
|
|
// hence not all placements are cached
|
|
step "s1-load-cache"
|
|
{
|
|
TRUNCATE test_repair_placement_vs_modification;
|
|
}
|
|
|
|
step "s1-insert"
|
|
{
|
|
INSERT INTO test_repair_placement_vs_modification VALUES (5, 10);
|
|
}
|
|
|
|
step "s1-update"
|
|
{
|
|
UPDATE test_repair_placement_vs_modification SET y = 5 WHERE x = 5;
|
|
}
|
|
|
|
step "s1-delete"
|
|
{
|
|
DELETE FROM test_repair_placement_vs_modification WHERE x = 5;
|
|
}
|
|
|
|
step "s1-select"
|
|
{
|
|
SELECT count(*) FROM test_repair_placement_vs_modification WHERE x = 5;
|
|
}
|
|
|
|
step "s1-ddl"
|
|
{
|
|
CREATE INDEX test_repair_placement_vs_modification_index ON test_repair_placement_vs_modification(x);
|
|
}
|
|
|
|
step "s1-copy"
|
|
{
|
|
COPY test_repair_placement_vs_modification FROM PROGRAM 'echo 1,1 && echo 2,2 && echo 3,3 && echo 4,4 && echo 5,5' WITH CSV;
|
|
}
|
|
|
|
step "s1-insert-copy-table"
|
|
{
|
|
INSERT INTO test_copy_placement_vs_modification VALUES (5, 10);
|
|
}
|
|
|
|
step "s1-update-copy-table"
|
|
{
|
|
UPDATE test_copy_placement_vs_modification SET y = 5 WHERE x = 5;
|
|
}
|
|
|
|
step "s1-delete-copy-table"
|
|
{
|
|
DELETE FROM test_copy_placement_vs_modification WHERE x = 5;
|
|
}
|
|
|
|
step "s1-select-copy-table"
|
|
{
|
|
SELECT count(*) FROM test_copy_placement_vs_modification WHERE x = 5;
|
|
}
|
|
|
|
step "s1-ddl-copy-table"
|
|
{
|
|
CREATE INDEX test_copy_placement_vs_modification_index ON test_copy_placement_vs_modification(x);
|
|
}
|
|
|
|
step "s1-copy-copy-table"
|
|
{
|
|
COPY test_copy_placement_vs_modification FROM PROGRAM 'echo 1,1 && echo 2,2 && echo 3,3 && echo 4,4 && echo 5,5' WITH CSV;
|
|
}
|
|
|
|
step "s1-commit"
|
|
{
|
|
COMMIT;
|
|
}
|
|
|
|
session "s2"
|
|
|
|
step "s2-begin"
|
|
{
|
|
BEGIN;
|
|
}
|
|
|
|
step "s2-set-placement-inactive"
|
|
{
|
|
UPDATE pg_dist_shard_placement SET shardstate = 3 WHERE shardid IN (SELECT * FROM selected_shard) AND nodeport = 57638;
|
|
}
|
|
|
|
step "s2-repair-placement"
|
|
{
|
|
SELECT master_copy_shard_placement((SELECT * FROM selected_shard), 'localhost', 57637, 'localhost', 57638);
|
|
}
|
|
|
|
step "s2-copy-placement"
|
|
{
|
|
SELECT master_copy_shard_placement((SELECT get_shard_id_for_distribution_column('test_copy_placement_vs_modification', 5)),
|
|
'localhost', 57637, 'localhost', 57638,
|
|
do_repair := false, transfer_mode := 'block_writes');
|
|
}
|
|
|
|
step "s2-commit"
|
|
{
|
|
COMMIT;
|
|
}
|
|
|
|
step "s2-print-content"
|
|
{
|
|
SELECT
|
|
nodeport, success, result
|
|
FROM
|
|
run_command_on_placements('test_repair_placement_vs_modification', 'select y from %s WHERE x = 5')
|
|
WHERE
|
|
shardid IN (SELECT * FROM selected_shard)
|
|
ORDER BY
|
|
nodeport;
|
|
}
|
|
|
|
step "s2-print-index-count"
|
|
{
|
|
SELECT
|
|
nodeport, success, result
|
|
FROM
|
|
run_command_on_placements('test_repair_placement_vs_modification', 'select count(*) from pg_indexes WHERE tablename = ''%s''')
|
|
ORDER BY
|
|
nodeport;
|
|
}
|
|
|
|
// repair a placement while concurrently performing an update/delete/insert/copy
|
|
// note that at some points we use "s1-select" just after "s1-begin" given that BEGIN
|
|
// may invalidate cache at certain cases
|
|
permutation "s1-load-cache" "s1-insert" "s1-begin" "s1-select" "s2-set-placement-inactive" "s2-begin" "s2-repair-placement" "s1-update" "s2-commit" "s1-commit" "s2-print-content"
|
|
permutation "s1-load-cache" "s1-insert" "s1-begin" "s1-select" "s2-set-placement-inactive" "s2-begin" "s2-repair-placement" "s1-delete" "s2-commit" "s1-commit" "s2-print-content"
|
|
permutation "s1-load-cache" "s1-begin" "s1-select" "s2-set-placement-inactive" "s2-begin" "s2-repair-placement" "s1-insert" "s2-commit" "s1-commit" "s2-print-content"
|
|
permutation "s1-load-cache" "s1-begin" "s1-select" "s2-set-placement-inactive" "s2-begin" "s2-repair-placement" "s1-copy" "s2-commit" "s1-commit" "s2-print-content"
|
|
permutation "s1-load-cache" "s1-begin" "s1-select" "s2-set-placement-inactive" "s2-begin" "s2-repair-placement" "s1-ddl" "s2-commit" "s1-commit" "s2-print-index-count"
|
|
|
|
|
|
// the same tests without loading the cache at first
|
|
permutation "s1-insert" "s1-begin" "s1-select" "s2-set-placement-inactive" "s2-begin" "s2-repair-placement" "s1-update" "s2-commit" "s1-commit" "s2-print-content"
|
|
permutation "s1-insert" "s1-begin" "s1-select" "s2-set-placement-inactive" "s2-begin" "s2-repair-placement" "s1-delete" "s2-commit" "s1-commit" "s2-print-content"
|
|
permutation "s1-begin" "s1-select" "s2-set-placement-inactive" "s2-begin" "s2-repair-placement" "s1-insert" "s2-commit" "s1-commit" "s2-print-content"
|
|
permutation "s1-begin" "s1-select" "s2-set-placement-inactive" "s2-begin" "s2-repair-placement" "s1-copy" "s2-commit" "s1-commit" "s2-print-content"
|
|
permutation "s1-begin" "s1-select" "s2-set-placement-inactive" "s2-begin" "s2-repair-placement" "s1-ddl" "s2-commit" "s1-commit" "s2-print-index-count"
|
|
|
|
// verify that copy placement (do_repair := false) blocks other operations, except SELECT
|
|
permutation "s1-begin" "s2-begin" "s2-copy-placement" "s1-update-copy-table" "s2-commit" "s1-commit"
|
|
permutation "s1-begin" "s2-begin" "s2-copy-placement" "s1-delete-copy-table" "s2-commit" "s1-commit"
|
|
permutation "s1-begin" "s2-begin" "s2-copy-placement" "s1-insert-copy-table" "s2-commit" "s1-commit"
|
|
permutation "s1-begin" "s2-begin" "s2-copy-placement" "s1-copy-copy-table" "s2-commit" "s1-commit"
|
|
permutation "s1-begin" "s2-begin" "s2-copy-placement" "s1-ddl-copy-table" "s2-commit" "s1-commit"
|
|
permutation "s1-begin" "s2-begin" "s2-copy-placement" "s1-select-copy-table" "s2-commit" "s1-commit"
|
|
|
|
// verify that copy placement (do_repair := false) is blocked by other operations, except SELECT
|
|
permutation "s1-begin" "s2-begin" "s1-update-copy-table" "s2-copy-placement" "s1-commit" "s2-commit"
|
|
permutation "s1-begin" "s2-begin" "s1-delete-copy-table" "s2-copy-placement" "s1-commit" "s2-commit"
|
|
permutation "s1-begin" "s2-begin" "s1-insert-copy-table" "s2-copy-placement" "s1-commit" "s2-commit"
|
|
permutation "s1-begin" "s2-begin" "s1-copy-copy-table" "s2-copy-placement" "s1-commit" "s2-commit"
|
|
permutation "s1-begin" "s2-begin" "s1-ddl-copy-table" "s2-copy-placement" "s1-commit" "s2-commit"
|
|
permutation "s1-begin" "s2-begin" "s1-select-copy-table" "s2-copy-placement" "s1-commit" "s2-commit"
|