blob: 415b0ffffe43cdfd4ce6f5a0e1404bf39edc85a0 [file] [log] [blame]
-- create a resource group when gp_resource_manager is queue
DROP ROLE IF EXISTS role_concurrency_test;
-- start_ignore
DROP RESOURCE GROUP rg_concurrency_test;
-- end_ignore
CREATE RESOURCE GROUP rg_concurrency_test WITH(concurrency=1, cpu_max_percent=20);
CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test;
-- After a 'q' command the client connection is disconnected but the
-- QD may still be alive, if we then query pg_stat_activity quick enough
-- we might still see this session with query '<IDLE>'.
-- A filter is put to filter out this kind of quitted sessions.
CREATE OR REPLACE VIEW rg_activity_status AS
SELECT rsgname, wait_event_type, state, query
FROM pg_stat_activity
WHERE rsgname='rg_concurrency_test'
AND query <> '<IDLE>';
--
-- 1. increase concurrency after pending queries
--
ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1;
11:SET ROLE role_concurrency_test;
11:BEGIN;
21:SET ROLE role_concurrency_test;
22:SET ROLE role_concurrency_test;
21&:BEGIN;
22&:BEGIN;
ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 2;
11:END;
11q:
21<:
22<:
SELECT * FROM rg_activity_status;
21:END;
22:END;
21q:
22q:
SELECT * FROM rg_activity_status;
--
-- 2. increase concurrency before pending queries
--
ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1;
11:SET ROLE role_concurrency_test;
11:BEGIN;
ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 2;
21:SET ROLE role_concurrency_test;
22:SET ROLE role_concurrency_test;
21:BEGIN;
22&:BEGIN;
SELECT * FROM rg_activity_status;
11:END;
11q:
22<:
SELECT * FROM rg_activity_status;
21:END;
22:END;
21q:
22q:
SELECT * FROM rg_activity_status;
--
-- 3. decrease concurrency
--
ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 10;
11:SET ROLE role_concurrency_test;
11:BEGIN;
12:SET ROLE role_concurrency_test;
12:BEGIN;
13:SET ROLE role_concurrency_test;
13:BEGIN;
14:SET ROLE role_concurrency_test;
14:BEGIN;
15:SET ROLE role_concurrency_test;
15:BEGIN;
ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1;
11q:
12q:
13q:
14q:
15q:
-- start_ignore
-- The 'q' command returns before the underlying segments all actually quit,
-- so a following DROP command might fail. Add a delay here as a workaround.
SELECT pg_sleep(1);
-- end_ignore
--
-- 4. increase concurrency from 0
--
DROP ROLE role_concurrency_test;
DROP RESOURCE GROUP rg_concurrency_test;
CREATE RESOURCE GROUP rg_concurrency_test WITH(concurrency=0, cpu_max_percent=20);
CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test;
11:SET ROLE role_concurrency_test;
11&:BEGIN;
SELECT * FROM rg_activity_status;
ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1;
11<:
SELECT * FROM rg_activity_status;
11:END;
11q:
--
-- 5.1 decrease concurrency to 0,
-- without running queries,
-- without pending queries.
--
ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1;
SELECT * FROM rg_activity_status;
ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 0;
SELECT * FROM rg_activity_status;
--
-- 5.2 decrease concurrency to 0,
-- with running queries,
-- without pending queries.
--
ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1;
SELECT * FROM rg_activity_status;
11:SET ROLE role_concurrency_test;
11:BEGIN;
SELECT * FROM rg_activity_status;
ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 0;
SELECT * FROM rg_activity_status;
11:END;
11q:
--
-- 5.3 decrease concurrency to 0,
-- with running queries,
-- with pending queries.
--
ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 1;
SELECT * FROM rg_activity_status;
11:SET ROLE role_concurrency_test;
11:BEGIN;
12:SET ROLE role_concurrency_test;
12&:BEGIN;
SELECT * FROM rg_activity_status;
ALTER RESOURCE GROUP rg_concurrency_test SET CONCURRENCY 0;
SELECT * FROM rg_activity_status;
11:END;
11q:
SELECT * FROM rg_activity_status;
SELECT pg_cancel_backend(pid) FROM pg_stat_activity
WHERE wait_event_type='ResourceGroup' AND rsgname='rg_concurrency_test';
12<:
12q:
SELECT * FROM rg_activity_status;
-- 6: drop a resgroup with concurrency=0 and pending queries
DROP ROLE IF EXISTS role_concurrency_test;
-- start_ignore
DROP RESOURCE GROUP rg_concurrency_test;
-- end_ignore
CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=0, cpu_max_percent=20);
CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test;
61:SET ROLE role_concurrency_test;
61&:BEGIN;
ALTER ROLE role_concurrency_test RESOURCE GROUP none;
DROP RESOURCE GROUP rg_concurrency_test;
61<:
61:END;
61q:
-- 7: drop a role with concurrency=0 and pending queries
DROP ROLE IF EXISTS role_concurrency_test;
-- start_ignore
DROP RESOURCE GROUP rg_concurrency_test;
-- end_ignore
CREATE RESOURCE GROUP rg_concurrency_test WITH (concurrency=0, cpu_max_percent=20);
CREATE ROLE role_concurrency_test RESOURCE GROUP rg_concurrency_test;
61:SET ROLE role_concurrency_test;
61&:BEGIN;
DROP ROLE role_concurrency_test;
DROP RESOURCE GROUP rg_concurrency_test;
61<:
61q:
-- cleanup
-- start_ignore
DROP VIEW rg_activity_status;
DROP ROLE role_concurrency_test;
DROP RESOURCE GROUP rg_concurrency_test;
-- end_ignore