citus/src/test/regress/spec/isolation_get_all_active_tr...

127 lines
3.3 KiB
Ruby

setup
{
SET LOCAL citus.multi_shard_modify_mode TO 'sequential';
SET citus.shard_replication_factor TO 1;
CREATE TABLE test_table(column1 int, column2 int);
SELECT create_distributed_table('test_table', 'column1');
CREATE USER test_user_1;
CREATE USER test_user_2;
CREATE USER test_readonly;
CREATE USER test_monitor;
GRANT pg_monitor TO test_monitor;
}
teardown
{
DROP TABLE test_table;
DROP USER test_user_1, test_user_2, test_readonly, test_monitor;
DROP TABLE IF EXISTS selected_pid;
}
session "s1"
// run_command_on_placements is done in a separate step because the setup is executed as a single transaction
step "s1-grant"
{
GRANT ALL ON test_table TO test_user_1;
GRANT ALL ON test_table TO test_user_2;
}
step "s1-begin-insert"
{
BEGIN;
SET ROLE test_user_1;
INSERT INTO test_table VALUES (100, 100);
}
step "s1-commit"
{
COMMIT;
}
session "s2"
step "s2-begin-insert"
{
BEGIN;
SET ROLE test_user_2;
INSERT INTO test_table VALUES (200, 200);
}
step "s2-commit"
{
COMMIT;
}
session "s3"
step "s3-as-admin"
{
-- Admin should be able to see all transactions
SELECT count(*) FROM get_all_active_transactions() WHERE transaction_number != 0;
SELECT count(*) FROM get_global_active_transactions() WHERE transaction_number != 0;
}
step "s3-as-user-1"
{
-- Even though we change the user via SET ROLE, the backends' (e.g., s1/2-begin-insert)
-- userId (e.g., PG_PROC->userId) does not change, and hence none of the
-- transactions show up because here we are using test_user_1. This is a
-- limitation of isolation tester, we should be able to re-connect with
-- test_user_1 on s1/2-begin-insert to show that test_user_1 sees only its own processes
SET ROLE test_user_1;
SELECT count(*) FROM get_all_active_transactions() WHERE transaction_number != 0;
SELECT count(*) FROM get_global_active_transactions() WHERE transaction_number != 0;
}
step "s3-as-readonly"
{
-- Even though we change the user via SET ROLE, the backends' (e.g., s1/2-begin-insert)
-- userId (e.g., PG_PROC->userId) does not change, and hence none of the
-- transactions show up because here we are using test_readonly. This is a
-- limitation of isolation tester, we should be able to re-connect with
-- test_readonly on s1/2-begin-insert to show that test_readonly sees only
-- its own processes
SET ROLE test_readonly;
SELECT count(*) FROM get_all_active_transactions() WHERE transaction_number != 0;
SELECT count(*) FROM get_global_active_transactions() WHERE transaction_number != 0;
}
step "s3-as-monitor"
{
-- Monitor should see all transactions
SET ROLE test_monitor;
SELECT count(*) FROM get_all_active_transactions() WHERE transaction_number != 0;
SELECT count(*) FROM get_global_active_transactions() WHERE transaction_number != 0;
}
step "s3-show-activity"
{
SET ROLE postgres;
select count(*) from get_all_active_transactions() where process_id IN (SELECT * FROM selected_pid);
}
session "s4"
step "s4-record-pid"
{
SELECT pg_backend_pid() INTO selected_pid;
}
session "s5"
step "s5-kill"
{
SELECT pg_terminate_backend(pg_backend_pid) FROM selected_pid;
}
permutation "s1-grant" "s1-begin-insert" "s2-begin-insert" "s3-as-admin" "s3-as-user-1" "s3-as-readonly" "s3-as-monitor" "s1-commit" "s2-commit"
permutation "s4-record-pid" "s3-show-activity" "s5-kill" "s3-show-activity"