Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 9bc108b

Browse files
committed
Fixs bugs in distributed deadlock detection
1 parent 5748312 commit 9bc108b

File tree

1 file changed

+11
-4
lines changed

1 file changed

+11
-4
lines changed

pg_shardman--1.0.sql

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1932,6 +1932,7 @@ CREATE FUNCTION get_system_identifier()
19321932
-- Some useful views.
19331933
-----------------------------------------------------------------------
19341934

1935+
-- Type to represent vertex in lock graph
19351936
create type process as (node int, pid int);
19361937

19371938
-- View to build lock graph which can be used to detect global deadlock
@@ -1951,11 +1952,17 @@ CREATE VIEW lock_graph(wait,hold) AS
19511952
split_part(application_name,':',3)::int)::shardman.process,
19521953
ROW(shardman.get_my_id(),
19531954
pid)::shardman.process
1954-
FROM pg_stat_activity WHERE application_name LIKE 'pgfdw:%';
1955+
FROM pg_stat_activity WHERE application_name LIKE 'pgfdw:%' AND wait_event<>'ClientRead'
1956+
UNION ALL
1957+
SELECT ROW(shardman.get_my_id(),
1958+
pid)::shardman.process,
1959+
ROW(shardman.get_node_by_sysid(split_part(application_name,':',2)::bigint),
1960+
split_part(application_name,':',3)::int)::shardman.process
1961+
FROM pg_stat_activity WHERE application_name LIKE 'pgfdw:%' AND wait_event='ClientRead';
19551962

19561963
-- Pack lock graph into string
19571964
CREATE FUNCTION serialize_lock_graph() RETURNS TEXT AS $$
1958-
SELECT string_agg((wait).node||':'||(wait).pid||'->'||(hold).node||':'||(hold).pid, ',') FROM shardman.lock_graph;
1965+
SELECT COALESCE(string_agg((wait).node||':'||(wait).pid||'->'||(hold).node||':'||(hold).pid, ','),'') FROM shardman.lock_graph;
19591966
$$ LANGUAGE sql;
19601967

19611968
-- Unpack lock graph from string
@@ -1964,11 +1971,11 @@ CREATE FUNCTION deserialize_lock_graph(edges text) RETURNS SETOF shardman.lock_g
19641971
split_part(split_part(edge, '->', 1), ':', 2)::int)::shardman.process AS wait,
19651972
ROW(split_part(split_part(edge, '->', 2), ':', 1)::int,
19661973
split_part(split_part(edge, '->', 2), ':', 2)::int)::shardman.process AS hold
1967-
FROM regexp_split_to_table(edges, ',') edge;
1974+
FROM regexp_split_to_table(edges, ',') edge WHERE edge<>'';
19681975
$$ LANGUAGE sql;
19691976

19701977
-- Collect lock graphs from all nodes
1971-
CREATE global_lock_graph() RETURNS text AS $$
1978+
CREATE FUNCTION global_lock_graph() RETURNS text AS $$
19721979
DECLARE
19731980
node_id int;
19741981
poll text = '';

0 commit comments

Comments
 (0)