mirror of https://github.com/citusdata/citus.git
35 lines
1.2 KiB
PL/PgSQL
35 lines
1.2 KiB
PL/PgSQL
DROP FUNCTION pg_catalog.citus_blocking_pids;
|
|
CREATE FUNCTION pg_catalog.citus_blocking_pids(pBlockedPid integer)
|
|
RETURNS int4[] AS $$
|
|
DECLARE
|
|
mLocalBlockingPids int4[];
|
|
mRemoteBlockingPids int4[];
|
|
mLocalGlobalPid int8;
|
|
BEGIN
|
|
SELECT pg_catalog.old_pg_blocking_pids(pBlockedPid) INTO mLocalBlockingPids;
|
|
|
|
IF (array_length(mLocalBlockingPids, 1) > 0) THEN
|
|
RETURN mLocalBlockingPids;
|
|
END IF;
|
|
|
|
-- pg says we're not blocked locally; check whether we're blocked globally.
|
|
SELECT global_pid INTO mLocalGlobalPid
|
|
FROM get_all_active_transactions() WHERE process_id = pBlockedPid;
|
|
|
|
SELECT array_agg(global_pid) INTO mRemoteBlockingPids FROM (
|
|
WITH activeTransactions AS (
|
|
SELECT global_pid FROM get_all_active_transactions()
|
|
), blockingTransactions AS (
|
|
SELECT blocking_global_pid FROM citus_internal.global_blocked_processes()
|
|
WHERE waiting_global_pid = mLocalGlobalPid
|
|
)
|
|
SELECT activeTransactions.global_pid FROM activeTransactions, blockingTransactions
|
|
WHERE activeTransactions.global_pid = blockingTransactions.blocking_global_pid
|
|
) AS sub;
|
|
|
|
RETURN mRemoteBlockingPids;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
REVOKE ALL ON FUNCTION citus_blocking_pids(integer) FROM PUBLIC;
|