diff --git a/src/test/regress/expected/multi_extension.out b/src/test/regress/expected/multi_extension.out index 1e026a8d8..5e30d5868 100644 --- a/src/test/regress/expected/multi_extension.out +++ b/src/test/regress/expected/multi_extension.out @@ -7,6 +7,36 @@ -- not done yet. ALTER SEQUENCE pg_catalog.pg_dist_shardid_seq RESTART 580000; ALTER SEQUENCE pg_catalog.pg_dist_jobid_seq RESTART 580000; +CREATE SCHEMA test; +CREATE OR REPLACE FUNCTION test.maintenance_worker(p_dbname text DEFAULT current_database()) + RETURNS pg_stat_activity + LANGUAGE plpgsql +AS $$ +DECLARE + activity record; +BEGIN + LOOP + SELECT * INTO activity FROM pg_stat_activity + WHERE application_name = 'Citus Maintenance Daemon' AND datname = p_dbname; + IF activity.pid IS NOT NULL THEN + RETURN activity; + ELSE + PERFORM pg_sleep(0.1); + PERFORM pg_stat_clear_snapshot(); + END IF ; + END LOOP; +END; +$$; +-- check maintenance daemon is started +SELECT datname, + datname = current_database(), + usename = (SELECT extowner::regrole::text FROM pg_extension WHERE extname = 'citus') +FROM test.maintenance_worker(); + datname | ?column? | ?column? +------------+----------+---------- + regression | t | t +(1 row) + -- ensure no objects were created outside pg_catalog SELECT COUNT(*) FROM pg_depend AS pgd, @@ -15,7 +45,7 @@ FROM pg_depend AS pgd, WHERE pgd.refclassid = 'pg_extension'::regclass AND pgd.refobjid = pge.oid AND pge.extname = 'citus' AND - pgio.schema NOT IN ('pg_catalog', 'citus'); + pgio.schema NOT IN ('pg_catalog', 'citus', 'test'); count ------- 0 @@ -96,7 +126,7 @@ FROM pg_depend AS pgd, WHERE pgd.refclassid = 'pg_extension'::regclass AND pgd.refobjid = pge.oid AND pge.extname = 'citus' AND - pgio.schema NOT IN ('pg_catalog', 'citus'); + pgio.schema NOT IN ('pg_catalog', 'citus', 'test'); count ------- 0 @@ -189,3 +219,70 @@ ALTER EXTENSION citus UPDATE; --------+------+------+------- (0 rows) +\c - - - :master_port +-- check that maintenance daemon gets (re-)started for the right user +DROP EXTENSION citus; +CREATE USER testuser SUPERUSER; +SET ROLE testuser; +CREATE EXTENSION citus; +SELECT datname, + datname = current_database(), + usename = (SELECT extowner::regrole::text FROM pg_extension WHERE extname = 'citus') +FROM test.maintenance_worker(); + datname | ?column? | ?column? +------------+----------+---------- + regression | t | t +(1 row) + +-- and recreate as the right owner +RESET ROLE; +DROP EXTENSION citus; +CREATE EXTENSION citus; +-- Check that maintenance daemon can also be started in another database +CREATE DATABASE another; +NOTICE: Citus partially supports CREATE DATABASE for distributed databases +DETAIL: Citus does not propagate CREATE DATABASE command to workers +HINT: You can manually create a database and its extensions on workers. +\c another +CREATE EXTENSION citus; +CREATE SCHEMA test; +CREATE OR REPLACE FUNCTION test.maintenance_worker(p_dbname text DEFAULT current_database()) + RETURNS pg_stat_activity + LANGUAGE plpgsql +AS $$ +DECLARE + activity record; +BEGIN + LOOP + SELECT * INTO activity FROM pg_stat_activity + WHERE application_name = 'Citus Maintenance Daemon' AND datname = p_dbname; + IF activity.pid IS NOT NULL THEN + RETURN activity; + ELSE + PERFORM pg_sleep(0.1); + PERFORM pg_stat_clear_snapshot(); + END IF ; + END LOOP; +END; +$$; +SELECT datname, + datname = current_database(), + usename = (SELECT extowner::regrole::text FROM pg_extension WHERE extname = 'citus') +FROM test.maintenance_worker(); + datname | ?column? | ?column? +---------+----------+---------- + another | t | t +(1 row) + +-- Test that database with active worker can be dropped. That'll +-- require killing the maintenance worker. +\c regression +SELECT datname, + pg_terminate_backend(pid) +FROM test.maintenance_worker('another'); + datname | pg_terminate_backend +---------+---------------------- + another | t +(1 row) + +DROP DATABASE another; diff --git a/src/test/regress/sql/multi_extension.sql b/src/test/regress/sql/multi_extension.sql index cfbb677c9..5f5c40c47 100644 --- a/src/test/regress/sql/multi_extension.sql +++ b/src/test/regress/sql/multi_extension.sql @@ -10,6 +10,34 @@ ALTER SEQUENCE pg_catalog.pg_dist_shardid_seq RESTART 580000; ALTER SEQUENCE pg_catalog.pg_dist_jobid_seq RESTART 580000; +CREATE SCHEMA test; + +CREATE OR REPLACE FUNCTION test.maintenance_worker(p_dbname text DEFAULT current_database()) + RETURNS pg_stat_activity + LANGUAGE plpgsql +AS $$ +DECLARE + activity record; +BEGIN + LOOP + SELECT * INTO activity FROM pg_stat_activity + WHERE application_name = 'Citus Maintenance Daemon' AND datname = p_dbname; + IF activity.pid IS NOT NULL THEN + RETURN activity; + ELSE + PERFORM pg_sleep(0.1); + PERFORM pg_stat_clear_snapshot(); + END IF ; + END LOOP; +END; +$$; + +-- check maintenance daemon is started +SELECT datname, + datname = current_database(), + usename = (SELECT extowner::regrole::text FROM pg_extension WHERE extname = 'citus') +FROM test.maintenance_worker(); + -- ensure no objects were created outside pg_catalog SELECT COUNT(*) FROM pg_depend AS pgd, @@ -18,7 +46,8 @@ FROM pg_depend AS pgd, WHERE pgd.refclassid = 'pg_extension'::regclass AND pgd.refobjid = pge.oid AND pge.extname = 'citus' AND - pgio.schema NOT IN ('pg_catalog', 'citus'); + pgio.schema NOT IN ('pg_catalog', 'citus', 'test'); + -- DROP EXTENSION pre-created by the regression suite DROP EXTENSION citus; @@ -94,7 +123,7 @@ FROM pg_depend AS pgd, WHERE pgd.refclassid = 'pg_extension'::regclass AND pgd.refobjid = pge.oid AND pge.extname = 'citus' AND - pgio.schema NOT IN ('pg_catalog', 'citus'); + pgio.schema NOT IN ('pg_catalog', 'citus', 'test'); -- see incompatible version errors out RESET citus.enable_version_checks; @@ -173,3 +202,62 @@ ALTER EXTENSION citus UPDATE; -- if cache is invalidated succesfull, this \d should work without any problem \d + +\c - - - :master_port + +-- check that maintenance daemon gets (re-)started for the right user +DROP EXTENSION citus; +CREATE USER testuser SUPERUSER; +SET ROLE testuser; +CREATE EXTENSION citus; + +SELECT datname, + datname = current_database(), + usename = (SELECT extowner::regrole::text FROM pg_extension WHERE extname = 'citus') +FROM test.maintenance_worker(); + +-- and recreate as the right owner +RESET ROLE; +DROP EXTENSION citus; +CREATE EXTENSION citus; + + +-- Check that maintenance daemon can also be started in another database +CREATE DATABASE another; +\c another +CREATE EXTENSION citus; + +CREATE SCHEMA test; + +CREATE OR REPLACE FUNCTION test.maintenance_worker(p_dbname text DEFAULT current_database()) + RETURNS pg_stat_activity + LANGUAGE plpgsql +AS $$ +DECLARE + activity record; +BEGIN + LOOP + SELECT * INTO activity FROM pg_stat_activity + WHERE application_name = 'Citus Maintenance Daemon' AND datname = p_dbname; + IF activity.pid IS NOT NULL THEN + RETURN activity; + ELSE + PERFORM pg_sleep(0.1); + PERFORM pg_stat_clear_snapshot(); + END IF ; + END LOOP; +END; +$$; + +SELECT datname, + datname = current_database(), + usename = (SELECT extowner::regrole::text FROM pg_extension WHERE extname = 'citus') +FROM test.maintenance_worker(); + +-- Test that database with active worker can be dropped. That'll +-- require killing the maintenance worker. +\c regression +SELECT datname, + pg_terminate_backend(pid) +FROM test.maintenance_worker('another'); +DROP DATABASE another;