mirror of https://github.com/citusdata/citus.git
134 lines
3.0 KiB
Ruby
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"
|