@@ -1932,6 +1932,7 @@ CREATE FUNCTION get_system_identifier()
1932
1932
-- Some useful views.
1933
1933
-- ---------------------------------------------------------------------
1934
1934
1935
+ -- Type to represent vertex in lock graph
1935
1936
create type process as (node int , pid int );
1936
1937
1937
1938
-- View to build lock graph which can be used to detect global deadlock
@@ -1951,11 +1952,17 @@ CREATE VIEW lock_graph(wait,hold) AS
1951
1952
split_part(application_name,' :' ,3 )::int )::shardman .process ,
1952
1953
ROW(shardman .get_my_id (),
1953
1954
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' ;
1955
1962
1956
1963
-- Pack lock graph into string
1957
1964
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 ;
1959
1966
$$ LANGUAGE sql;
1960
1967
1961
1968
-- Unpack lock graph from string
@@ -1964,11 +1971,11 @@ CREATE FUNCTION deserialize_lock_graph(edges text) RETURNS SETOF shardman.lock_g
1964
1971
split_part(split_part(edge, ' ->' , 1 ), ' :' , 2 )::int )::shardman .process AS wait,
1965
1972
ROW(split_part(split_part(edge, ' ->' , 2 ), ' :' , 1 )::int ,
1966
1973
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 <> ' ' ;
1968
1975
$$ LANGUAGE sql;
1969
1976
1970
1977
-- Collect lock graphs from all nodes
1971
- CREATE global_lock_graph() RETURNS text AS $$
1978
+ CREATE FUNCTION global_lock_graph () RETURNS text AS $$
1972
1979
DECLARE
1973
1980
node_id int ;
1974
1981
poll text = ' ' ;
0 commit comments