aboutsummaryrefslogtreecommitdiff
path: root/src/mod_pubsub/mod_pubsub_odbc.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mod_pubsub/mod_pubsub_odbc.erl')
-rw-r--r--src/mod_pubsub/mod_pubsub_odbc.erl40
1 files changed, 30 insertions, 10 deletions
diff --git a/src/mod_pubsub/mod_pubsub_odbc.erl b/src/mod_pubsub/mod_pubsub_odbc.erl
index a30009f4e..2eeb49c82 100644
--- a/src/mod_pubsub/mod_pubsub_odbc.erl
+++ b/src/mod_pubsub/mod_pubsub_odbc.erl
@@ -134,8 +134,7 @@
last_item_cache = false,
max_items_node = ?MAXITEMS,
nodetree = ?STDTREE,
- plugins = [?STDNODE],
- send_loop}).
+ plugins = [?STDNODE]}).
%%====================================================================
%% API
@@ -195,6 +194,7 @@ init([ServerHost, Opts]) ->
ets:insert(gen_mod:get_module_proc(ServerHost, config), {last_item_cache, LastItemCache}),
ets:insert(gen_mod:get_module_proc(ServerHost, config), {max_items_node, MaxItemsNode}),
ets:insert(gen_mod:get_module_proc(ServerHost, config), {pep_mapping, PepMapping}),
+ ets:insert(gen_mod:get_module_proc(ServerHost, config), {ignore_pep_from_offline, PepOffline}),
ets:insert(gen_mod:get_module_proc(ServerHost, config), {host, Host}),
ejabberd_hooks:add(disco_sm_identity, ServerHost, ?MODULE, disco_sm_identity, 75),
ejabberd_hooks:add(disco_sm_features, ServerHost, ?MODULE, disco_sm_features, 75),
@@ -227,9 +227,14 @@ init([ServerHost, Opts]) ->
max_items_node = MaxItemsNode,
nodetree = NodeTree,
plugins = Plugins},
- SendLoop = spawn(?MODULE, send_loop, [State]), %% TODO put this in supervision
- register(gen_mod:get_module_proc(ServerHost, ?LOOPNAME), SendLoop),
- {ok, State#state{send_loop = SendLoop}}.
+ init_send_loop(ServerHost, State),
+ {ok, State}.
+
+init_send_loop(ServerHost, State) ->
+ Proc = gen_mod:get_module_proc(ServerHost, ?LOOPNAME),
+ SendLoop = spawn(?MODULE, send_loop, [State]),
+ register(Proc, SendLoop),
+ SendLoop.
%% @spec (Host, ServerHost, Opts) -> Plugins
%% Host = mod_pubsub:host() Opts = [{Key,Value}]
@@ -523,8 +528,24 @@ presence_probe(#jid{luser = User, lserver = Server, lresource = Resource}, #jid{
presence(Host, {presence, User, Server, [Resource], JID}).
presence(ServerHost, Presence) ->
- Proc = gen_mod:get_module_proc(ServerHost, ?LOOPNAME),
- Proc ! Presence.
+ SendLoop = case whereis(gen_mod:get_module_proc(ServerHost, ?LOOPNAME)) of
+ undefined ->
+ % in case send_loop process died, we rebuild a minimal State record and respawn it
+ Host = host(ServerHost),
+ Plugins = plugins(Host),
+ PepOffline = case catch ets:lookup(gen_mod:get_module_proc(ServerHost, config), ignore_pep_from_offline) of
+ [{ignore_pep_from_offline, PO}] -> PO;
+ _ -> true
+ end,
+ State = #state{host = Host,
+ server_host = ServerHost,
+ ignore_pep_from_offline = PepOffline,
+ plugins = Plugins},
+ init_send_loop(ServerHost, State);
+ Pid ->
+ Pid
+ end,
+ SendLoop ! Presence.
%% -------
%% subscription hooks handling functions
@@ -656,8 +677,7 @@ handle_info(_Info, State) ->
terminate(_Reason, #state{host = Host,
server_host = ServerHost,
nodetree = TreePlugin,
- plugins = Plugins,
- send_loop = SendLoop}) ->
+ plugins = Plugins}) ->
ejabberd_router:unregister_route(Host),
case lists:member(?PEPNODE, Plugins) of
true ->
@@ -680,7 +700,7 @@ terminate(_Reason, #state{host = Host,
gen_iq_handler:remove_iq_handler(ejabberd_sm, ServerHost, ?NS_PUBSUB),
gen_iq_handler:remove_iq_handler(ejabberd_sm, ServerHost, ?NS_PUBSUB_OWNER),
mod_disco:unregister_feature(ServerHost, ?NS_PUBSUB),
- SendLoop ! stop,
+ gen_mod:get_module_proc(ServerHost, ?LOOPNAME) ! stop,
terminate_plugins(Host, ServerHost, Plugins, TreePlugin).
%%--------------------------------------------------------------------