]> granicus.if.org Git - ejabberd/commitdiff
Fix C2S session close on server shutdown
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>
Thu, 8 May 2014 17:28:12 +0000 (21:28 +0400)
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>
Thu, 8 May 2014 17:39:53 +0000 (21:39 +0400)
src/ejabberd_app.erl
src/ejabberd_sm.erl

index 6d315c6d3a35bca0bf5fc9b63f74463da7e00183..8106b7b0d135aac70cf0375911529631c6d8fe9c 100644 (file)
@@ -177,10 +177,12 @@ add_windows_nameservers() ->
 
 
 broadcast_c2s_shutdown() ->
-    Children = supervisor:which_children(ejabberd_c2s_sup),
+    Children = ejabberd_sm:get_all_pids(),
     lists:foreach(
-      fun({_, C2SPid, _, _}) ->
-             C2SPid ! system_shutdown
+      fun(C2SPid) when node(C2SPid) == node() ->
+             C2SPid ! system_shutdown;
+        (_) ->
+             ok
       end, Children).
 
 %%%
index 094918cd9340834bc489169ea386e14fa9a9deff..9fc6a86ef046e03c929795ed4b4e352cf42af3fd 100644 (file)
@@ -59,6 +59,7 @@
         get_user_info/3,
         get_user_ip/3,
         get_max_user_sessions/2,
+        get_all_pids/0,
         is_existing_resource/3
        ]).
 
@@ -283,13 +284,23 @@ dirty_get_my_sessions_list() ->
        [{'==', {node, '$1'}, node()}],
        ['$_']}]).
 
+-spec get_vh_session_list(binary()) -> [ljid()].
+
 get_vh_session_list(Server) ->
     LServer = jlib:nameprep(Server),
     mnesia:dirty_select(session,
                        [{#session{usr = '$1', _ = '_'},
                          [{'==', {element, 2, '$1'}, LServer}], ['$1']}]).
 
--spec get_vh_session_list(binary()) -> [ljid()].
+-spec get_all_pids() -> [pid()].
+
+get_all_pids() ->
+    mnesia:dirty_select(
+      session,
+      ets:fun2ms(
+        fun(#session{sid = {_, Pid}}) ->
+               Pid
+        end)).
 
 get_vh_session_number(Server) ->
     LServer = jlib:nameprep(Server),