summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mod_muc.erl16
-rw-r--r--src/mod_muc_room.erl2
-rw-r--r--test/ejabberd_SUITE.erl3
3 files changed, 20 insertions, 1 deletions
diff --git a/src/mod_muc.erl b/src/mod_muc.erl
index 05becd20..7dd1736d 100644
--- a/src/mod_muc.erl
+++ b/src/mod_muc.erl
@@ -41,6 +41,7 @@
restore_room/3,
forget_room/3,
create_room/5,
+ shutdown_rooms/1,
process_iq_disco_items/4,
broadcast_service_message/2,
can_use_nick/4]).
@@ -96,10 +97,23 @@ start(Host, Opts) ->
supervisor:start_child(ejabberd_sup, ChildSpec).
stop(Host) ->
+ Rooms = shutdown_rooms(Host),
stop_supervisor(Host),
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
gen_server:call(Proc, stop),
- supervisor:delete_child(ejabberd_sup, Proc).
+ supervisor:delete_child(ejabberd_sup, Proc),
+ {wait, Rooms}.
+
+shutdown_rooms(Host) ->
+ MyHost = gen_mod:get_module_opt_host(Host, mod_muc,
+ <<"conference.@HOST@">>),
+ Rooms = mnesia:dirty_select(muc_online_room,
+ [{#muc_online_room{name_host = '$1',
+ pid = '$2'},
+ [{'==', {element, 2, '$1'}, MyHost}],
+ ['$2']}]),
+ [Pid ! shutdown || Pid <- Rooms],
+ Rooms.
%% This function is called by a room in three situations:
%% A) The owner of the room destroyed it
diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl
index 7c9bdd41..05a6ec4c 100644
--- a/src/mod_muc_room.erl
+++ b/src/mod_muc_room.erl
@@ -830,6 +830,8 @@ handle_info({captcha_failed, From}, normal_state,
_ -> StateData
end,
{next_state, normal_state, NewState};
+handle_info(shutdown, _StateName, StateData) ->
+ {stop, shutdown, StateData};
handle_info(_Info, StateName, StateData) ->
{next_state, StateName, StateData}.
diff --git a/test/ejabberd_SUITE.erl b/test/ejabberd_SUITE.erl
index 05c7db27..f4e7d8d7 100644
--- a/test/ejabberd_SUITE.erl
+++ b/test/ejabberd_SUITE.erl
@@ -110,10 +110,12 @@ init_per_group(no_db, Config) ->
{atomic, ok} = ejabberd_auth:try_register(User, Server, Password),
Config;
init_per_group(mnesia, Config) ->
+ mod_muc:shutdown_rooms(?MNESIA_VHOST),
set_opt(server, ?MNESIA_VHOST, Config);
init_per_group(mysql, Config) ->
case catch ejabberd_odbc:sql_query(?MYSQL_VHOST, [<<"select 1;">>]) of
{selected, _, _} ->
+ mod_muc:shutdown_rooms(?MYSQL_VHOST),
create_sql_tables(mysql, ?config(base_dir, Config)),
set_opt(server, ?MYSQL_VHOST, Config);
Err ->
@@ -122,6 +124,7 @@ init_per_group(mysql, Config) ->
init_per_group(pgsql, Config) ->
case catch ejabberd_odbc:sql_query(?PGSQL_VHOST, [<<"select 1;">>]) of
{selected, _, _} ->
+ mod_muc:shutdown_rooms(?PGSQL_VHOST),
create_sql_tables(pgsql, ?config(base_dir, Config)),
set_opt(server, ?PGSQL_VHOST, Config);
Err ->