mirror of https://github.com/citusdata/citus.git
Improve isolation block detection
parent
e25a1c49be
commit
cb5acb8f63
|
@ -1,8 +1,8 @@
|
||||||
CREATE FUNCTION pg_catalog.citus_backend_gpid()
|
CREATE FUNCTION pg_catalog.citus_backend_gpid(pid int default NULL)
|
||||||
RETURNS BIGINT
|
RETURNS BIGINT
|
||||||
LANGUAGE C STRICT
|
LANGUAGE C
|
||||||
AS 'MODULE_PATHNAME',$$citus_backend_gpid$$;
|
AS 'MODULE_PATHNAME',$$citus_backend_gpid$$;
|
||||||
COMMENT ON FUNCTION pg_catalog.citus_backend_gpid()
|
COMMENT ON FUNCTION pg_catalog.citus_backend_gpid(int)
|
||||||
IS 'returns gpid of the current backend';
|
IS 'returns gpid of the current backend';
|
||||||
|
|
||||||
GRANT EXECUTE ON FUNCTION pg_catalog.citus_backend_gpid() TO PUBLIC;
|
GRANT EXECUTE ON FUNCTION pg_catalog.citus_backend_gpid(int) TO PUBLIC;
|
||||||
|
|
|
@ -24,14 +24,16 @@ RETURNS boolean AS $$
|
||||||
FROM get_all_active_transactions() WHERE process_id = pBlockedPid;
|
FROM get_all_active_transactions() WHERE process_id = pBlockedPid;
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
FOR r IN select a1.query blocking_query, a2.query waiting_query from citus_internal_global_blocked_processes() p join pg_stat_activity a1 on p.blocking_pid = a1.pid join pg_stat_activity a2 on p.waiting_pid = a2.pid WHERE waiting_global_pid = mBlockedGlobalPid
|
RAISE WARNING E'DETECTING BLOCKS FOR %', mBlockedGlobalPid;
|
||||||
|
FOR r IN select p.blocking_global_pid, a1.query blocking_query, p.waiting_global_pid, a2.query waiting_query from citus_internal_global_blocked_processes() p join pg_stat_activity a1 on p.blocking_pid = a1.pid join pg_stat_activity a2 on p.waiting_pid = a2.pid WHERE waiting_global_pid = mBlockedGlobalPid
|
||||||
LOOP
|
LOOP
|
||||||
RAISE WARNING E'%\nBLOCKS\n%', r.blocking_query, r.waiting_query;
|
RAISE WARNING E'GPID: % %\nBLOCKS\nGPID: % %', r.blocking_global_pid, r.blocking_query, r.waiting_global_pid, r.waiting_query;
|
||||||
END LOOP;
|
END LOOP;
|
||||||
|
|
||||||
RETURN EXISTS (
|
RETURN EXISTS (
|
||||||
SELECT 1 FROM citus_internal_global_blocked_processes()
|
SELECT 1 FROM citus_internal_global_blocked_processes()
|
||||||
WHERE waiting_global_pid = mBlockedGlobalPid
|
WHERE waiting_global_pid = mBlockedGlobalPid
|
||||||
|
AND blocking_global_pid in (SELECT citus_backend_gpid(pid) FROM unnest(pInterestingPids) pid)
|
||||||
);
|
);
|
||||||
END;
|
END;
|
||||||
$$ LANGUAGE plpgsql;
|
$$ LANGUAGE plpgsql;
|
||||||
|
|
|
@ -4,6 +4,7 @@ RETURNS boolean AS $$
|
||||||
mBlockedGlobalPid int8;
|
mBlockedGlobalPid int8;
|
||||||
workerProcessId integer := current_setting('citus.isolation_test_session_remote_process_id');
|
workerProcessId integer := current_setting('citus.isolation_test_session_remote_process_id');
|
||||||
coordinatorProcessId integer := current_setting('citus.isolation_test_session_process_id');
|
coordinatorProcessId integer := current_setting('citus.isolation_test_session_process_id');
|
||||||
|
r record;
|
||||||
BEGIN
|
BEGIN
|
||||||
IF pg_catalog.old_pg_isolation_test_session_is_blocked(pBlockedPid, pInterestingPids) THEN
|
IF pg_catalog.old_pg_isolation_test_session_is_blocked(pBlockedPid, pInterestingPids) THEN
|
||||||
RETURN true;
|
RETURN true;
|
||||||
|
@ -23,6 +24,12 @@ RETURNS boolean AS $$
|
||||||
FROM get_all_active_transactions() WHERE process_id = pBlockedPid;
|
FROM get_all_active_transactions() WHERE process_id = pBlockedPid;
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
|
RAISE WARNING E'DETECTING BLOCKS FOR %', mBlockedGlobalPid;
|
||||||
|
FOR r IN select p.blocking_global_pid, a1.query blocking_query, p.waiting_global_pid, a2.query waiting_query from citus_internal_global_blocked_processes() p join pg_stat_activity a1 on p.blocking_pid = a1.pid join pg_stat_activity a2 on p.waiting_pid = a2.pid
|
||||||
|
LOOP
|
||||||
|
RAISE WARNING E'GPID: % %\nBLOCKS\nGPID: % %', r.blocking_global_pid, r.blocking_query, r.waiting_global_pid, r.waiting_query;
|
||||||
|
END LOOP;
|
||||||
|
|
||||||
IF current_setting('citus.isolation_test_check_all_blocks') = 'off' THEN
|
IF current_setting('citus.isolation_test_check_all_blocks') = 'off' THEN
|
||||||
RETURN EXISTS (
|
RETURN EXISTS (
|
||||||
SELECT 1 FROM citus_internal_global_blocked_processes()
|
SELECT 1 FROM citus_internal_global_blocked_processes()
|
||||||
|
|
Loading…
Reference in New Issue