citus/src/test/regress/spec/isolation_progress_monitori...

134 lines
3.0 KiB
Ruby

// Isolation tests for checking the progress monitoring infrastructure
// We create three different processes, two of the type "1337" and one of type "3778"
// We utilize advisory locks to control steps of the processes
// Different locks are held for each step so that the processes stop at each step and
// we can see their progress.
setup
{
CREATE FUNCTION create_progress(bigint, bigint)
RETURNS void
AS 'citus'
LANGUAGE C STRICT;
CREATE FUNCTION update_progress(bigint, bigint)
RETURNS void
AS 'citus'
LANGUAGE C STRICT;
CREATE FUNCTION finish_progress()
RETURNS void
AS 'citus'
LANGUAGE C STRICT;
CREATE OR REPLACE FUNCTION show_progress(bigint)
RETURNS TABLE(step int, progress bigint)
AS 'citus'
LANGUAGE C STRICT;
CREATE FUNCTION sample_operation(command_type bigint, lockid bigint, progress bigint)
RETURNS VOID AS $$
BEGIN
PERFORM create_progress(command_type, 2);
PERFORM pg_advisory_xact_lock(lockid);
PERFORM update_progress(0, progress);
PERFORM pg_advisory_xact_lock(lockid + 1);
PERFORM update_progress(1, progress);
PERFORM pg_advisory_xact_lock(lockid + 2);
PERFORM finish_progress();
END;
$$ LANGUAGE 'plpgsql';
}
teardown
{
DROP FUNCTION IF EXISTS create_progress(bigint, bigint);
DROP FUNCTION IF EXISTS update_progress(bigint, bigint);
DROP FUNCTION IF EXISTS finish_progress();
DROP FUNCTION IF EXISTS show_progress(bigint);
DROP FUNCTION IF EXISTS sample_operation(bigint, bigint, bigint);
}
session "s1"
step "s1-start-operation"
{
SELECT sample_operation(1337, 10, -1);
}
session "s2"
step "s2-start-operation"
{
SELECT sample_operation(1337, 20, 2);
}
session "s3"
step "s3-start-operation"
{
SELECT sample_operation(3778, 30, 9);
}
session "lock-orchestrator"
step "take-locks"
{
-- Locks for steps of sample operation in s1
SELECT pg_advisory_lock(10);
SELECT pg_advisory_lock(11);
SELECT pg_advisory_lock(12);
-- Locks for steps of sample operation in s2
SELECT pg_advisory_lock(20);
SELECT pg_advisory_lock(21);
SELECT pg_advisory_lock(22);
-- Locks for steps of sample operation in s3
SELECT pg_advisory_lock(30);
SELECT pg_advisory_lock(31);
SELECT pg_advisory_lock(32);
}
step "release-locks-1"
{
-- Release the locks of first steps of sample operations
SELECT pg_advisory_unlock(10);
SELECT pg_advisory_unlock(20);
SELECT pg_advisory_unlock(30);
}
step "release-locks-2"
{
-- Release the locks of second steps of sample operations
SELECT pg_advisory_unlock(11);
SELECT pg_advisory_unlock(21);
SELECT pg_advisory_unlock(31);
}
step "release-locks-3"
{
-- Release the locks of final steps of sample operations
SELECT pg_advisory_unlock(12);
SELECT pg_advisory_unlock(22);
SELECT pg_advisory_unlock(32);
}
session "monitor"
step "show-progress"
{
SELECT show_progress(1337);
SELECT show_progress(3778);
}
permutation "take-locks" "s1-start-operation" "s2-start-operation" "s3-start-operation" "show-progress" "release-locks-1" "show-progress" "release-locks-2" "show-progress" "release-locks-3"