From ff2050b30159867a7481e9747a129f7c078dac29 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Thu, 15 Nov 2012 15:00:51 +1000 Subject: [PATCH] Clean tables from remote pids when their node goes down Conflicts: src/ejabberd_sm.erl src/mod_muc/mod_muc.erl src/web/mod_bosh.erl --- src/ejabberd_cluster.erl | 1 + src/ejabberd_sm.erl | 7 ++++++- src/mod_muc/mod_muc.erl | 11 ++++++++--- src/web/mod_bosh.erl | 11 ++++++++--- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/ejabberd_cluster.erl b/src/ejabberd_cluster.erl index 284c01892..1e0789ec4 100644 --- a/src/ejabberd_cluster.erl +++ b/src/ejabberd_cluster.erl @@ -195,6 +195,7 @@ handle_info({node_down, Node}, State) -> {noreply, State}; handle_info({nodedown, Node, _}, State) -> ?INFO_MSG("node ~p goes down", [Node]), + ejabberd_hooks:run(node_down, [Node]), delete_node(?HASHTBL, Node), delete_node(?HASHTBL_NEW, Node), {noreply, State}; diff --git a/src/ejabberd_sm.erl b/src/ejabberd_sm.erl index 1c0046897..899573d45 100644 --- a/src/ejabberd_sm.erl +++ b/src/ejabberd_sm.erl @@ -395,7 +395,12 @@ node_up(_Node) -> node_down(Node) when Node == node() -> copy_sessions(mnesia:dirty_first(session)); -node_down(_) -> ok. +node_down(Node) -> + ets:select_delete( + session, + [{#session{sid = {'_', '$1'}, _ = '_'}, + [{'==', {'node', '$1'}, Node}], + [true]}]). copy_sessions('$end_of_table') -> ok; copy_sessions(Key) -> diff --git a/src/mod_muc/mod_muc.erl b/src/mod_muc/mod_muc.erl index 09fe95bee..ea7f19689 100644 --- a/src/mod_muc/mod_muc.erl +++ b/src/mod_muc/mod_muc.erl @@ -54,8 +54,8 @@ opts = [] :: list() | '_'}). -record(muc_online_room, - {name_host = {<<"">>, <<"">>} :: {binary(), binary()} | '$1', - pid = self() :: pid() | '$2' | '_'}). + {name_host = {<<"">>, <<"">>} :: {binary(), binary()} | '$1' | '_', + pid = self() :: pid() | '$1' | '$2' | '_'}). -record(muc_registered, {us_host = {{<<"">>, <<"">>}, <<"">>} :: {{binary(), binary()}, binary()} | '$1', @@ -272,7 +272,12 @@ node_up(_Node) -> node_down(Node) when Node == node() -> copy_rooms(mnesia:dirty_first(muc_online_room)); -node_down(_) -> ok. +node_down(Node) -> + ets:select_delete( + muc_online_room, + [{#muc_online_room{pid = '$1', _ = '_'}, + [{'==', {'node', '$1'}, Node}], + [true]}]). copy_rooms('$end_of_table') -> ok; copy_rooms(Key) -> diff --git a/src/web/mod_bosh.erl b/src/web/mod_bosh.erl index a3ee39f0d..f05c6cd79 100644 --- a/src/web/mod_bosh.erl +++ b/src/web/mod_bosh.erl @@ -45,8 +45,8 @@ -include("bosh.hrl"). --record(bosh, {sid = <<"">> :: binary() | '$1', - pid = self() :: pid() | '$2'}). +-record(bosh, {sid = <<"">> :: binary() | '$1' | '_', + pid = self() :: pid() | '$1' | '$2'}). %%%---------------------------------------------------------------------- %%% API @@ -136,7 +136,12 @@ node_up(_Node) -> node_down(Node) when Node == node() -> copy_entries(mnesia:dirty_first(bosh)); -node_down(_) -> ok. +node_down(Node) -> + ets:select_delete( + bosh, + [{#bosh{pid = '$1', _ = '_'}, + [{'==', {'node', '$1'}, Node}], + [true]}]). copy_entries('$end_of_table') -> ok; copy_entries(Key) ->