mirror of https://github.com/citusdata/citus.git
150 lines
4.2 KiB
PL/PgSQL
150 lines
4.2 KiB
PL/PgSQL
CREATE SCHEMA distribute_lock_tests;
|
|
SET search_path TO distribute_lock_tests;
|
|
|
|
SET citus.next_shard_id TO 10000;
|
|
|
|
CREATE TABLE dist_table(a int);
|
|
|
|
SELECT create_distributed_table('dist_table', 'a');
|
|
|
|
INSERT INTO dist_table SELECT n FROM generate_series(1, 5) n;
|
|
|
|
-- Test acquiring lock outside transaction
|
|
LOCK dist_table IN ACCESS EXCLUSIVE MODE;
|
|
|
|
-- Test acquiring lock inside procedure
|
|
DO $$
|
|
BEGIN
|
|
LOCK dist_table IN ACCESS EXCLUSIVE MODE;
|
|
END;
|
|
$$;
|
|
|
|
-- Try all valid lock options; also try omitting the optional TABLE keyword.
|
|
BEGIN TRANSACTION;
|
|
LOCK TABLE dist_table IN ACCESS SHARE MODE;
|
|
LOCK dist_table IN ROW SHARE MODE;
|
|
LOCK TABLE dist_table IN ROW EXCLUSIVE MODE;
|
|
LOCK TABLE dist_table IN SHARE UPDATE EXCLUSIVE MODE;
|
|
LOCK TABLE dist_table IN SHARE MODE;
|
|
LOCK dist_table IN SHARE ROW EXCLUSIVE MODE;
|
|
LOCK TABLE dist_table IN EXCLUSIVE MODE;
|
|
LOCK TABLE dist_table IN ACCESS EXCLUSIVE MODE;
|
|
ROLLBACK;
|
|
|
|
-- Test that when the user does not have the required permissions to lock
|
|
-- the locks are not forwarded to the workers
|
|
|
|
SET client_min_messages TO ERROR;
|
|
SELECT run_command_on_workers($$
|
|
SET citus.enable_ddl_propagation TO OFF;
|
|
CREATE ROLE read_only_user WITH LOGIN;
|
|
RESET citus.enable_ddl_propagation;
|
|
$$);
|
|
|
|
SET citus.enable_ddl_propagation TO OFF;
|
|
CREATE ROLE read_only_user WITH LOGIN;
|
|
GRANT ALL ON SCHEMA distribute_lock_tests TO read_only_user;
|
|
GRANT SELECT ON dist_table TO read_only_user;
|
|
RESET citus.enable_ddl_propagation;
|
|
RESET client_min_messages;
|
|
|
|
SET ROLE read_only_user;
|
|
SET citus.log_remote_commands TO ON;
|
|
|
|
BEGIN;
|
|
LOCK dist_table IN ACCESS EXCLUSIVE MODE;
|
|
ROLLBACK;
|
|
|
|
SET citus.log_remote_commands TO OFF;
|
|
RESET ROLE;
|
|
|
|
-- test that user with view permissions can lock the tables
|
|
-- which the view is built on
|
|
CREATE VIEW myview AS SELECT * FROM dist_table;
|
|
|
|
SET client_min_messages TO ERROR;
|
|
SELECT run_command_on_workers($$
|
|
SET citus.enable_ddl_propagation TO OFF;
|
|
CREATE ROLE user_with_view_permissions WITH LOGIN;
|
|
GRANT ALL ON SCHEMA distribute_lock_tests TO user_with_view_permissions;
|
|
GRANT ALL ON distribute_lock_tests.myview TO user_with_view_permissions;
|
|
RESET citus.enable_ddl_propagation;
|
|
$$);
|
|
|
|
SET citus.enable_ddl_propagation TO OFF;
|
|
CREATE ROLE user_with_view_permissions WITH LOGIN;
|
|
GRANT ALL ON SCHEMA distribute_lock_tests TO user_with_view_permissions;
|
|
GRANT ALL ON myview TO user_with_view_permissions;
|
|
RESET citus.enable_ddl_propagation;
|
|
RESET client_min_messages;
|
|
|
|
SET ROLE TO user_with_view_permissions;
|
|
|
|
BEGIN;
|
|
LOCK myview IN ACCESS EXCLUSIVE MODE;
|
|
SELECT run_command_on_workers($$
|
|
SELECT mode FROM pg_locks WHERE relation = 'distribute_lock_tests.dist_table'::regclass ORDER BY 1;
|
|
$$);
|
|
|
|
ROLLBACK;
|
|
|
|
RESET ROLE;
|
|
|
|
\c - - - :worker_1_port
|
|
SET search_path TO distribute_lock_tests;
|
|
|
|
-- Test trying to lock from a worker when the coordinator is not in the metadata
|
|
SET citus.allow_unsafe_locks_from_workers TO 'off';
|
|
BEGIN;
|
|
LOCK dist_table IN ACCESS EXCLUSIVE MODE;
|
|
ROLLBACK;
|
|
|
|
-- Verify that the same restriction does not apply to worker local tables
|
|
CREATE TABLE local_table(a int);
|
|
|
|
-- Verify that no locks will be distributed for the local lock
|
|
SET citus.log_remote_commands TO ON;
|
|
|
|
BEGIN;
|
|
LOCK local_table IN ACCESS EXCLUSIVE MODE;
|
|
ROLLBACK;
|
|
|
|
RESET citus.log_remote_commands;
|
|
|
|
-- Cleanup local table
|
|
DROP TABLE local_table;
|
|
|
|
-- Test that setting the guc to 'on' will allow the lock from workers
|
|
SET citus.allow_unsafe_locks_from_workers TO 'on';
|
|
BEGIN;
|
|
LOCK dist_table IN ACCESS EXCLUSIVE MODE;
|
|
ROLLBACK;
|
|
|
|
-- Test locking a shard
|
|
SET citus.enable_manual_changes_to_shards TO OFF;
|
|
BEGIN;
|
|
LOCK dist_table_10000 IN ACCESS EXCLUSIVE MODE;
|
|
ROLLBACK;
|
|
|
|
-- Test allowing shard locks with the citus.enable_manual_changes_to_shards guc
|
|
SET citus.enable_manual_changes_to_shards TO ON;
|
|
|
|
BEGIN;
|
|
LOCK dist_table_10000 IN ACCESS EXCLUSIVE MODE;
|
|
ROLLBACK;
|
|
|
|
RESET citus.enable_manual_changes_to_shards;
|
|
|
|
\c - - - :master_port
|
|
DROP SCHEMA distribute_lock_tests CASCADE;
|
|
SET citus.enable_ddl_propagation TO OFF;
|
|
DROP ROLE read_only_user;
|
|
DROP ROLE user_with_view_permissions;
|
|
RESET citus.enable_ddl_propagation;
|
|
SELECT run_command_on_workers($$
|
|
SET citus.enable_ddl_propagation TO OFF;
|
|
DROP USER read_only_user;
|
|
DROP USER user_with_view_permissions;
|
|
RESET citus.enable_ddl_propagation;
|
|
$$);
|