From 731457a8bb9fe29f4e98b7a299c3f8bedba94eac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20R=C3=A9mond?= Date: Mon, 13 Aug 2007 17:28:26 +0000 Subject: [PATCH] * src/mod_offline.erl: Added a config option to define the maximum number of offline messages per user (EJAB-314). SVN Revision: 878 --- ChangeLog | 3 +++ src/mod_offline.erl | 30 +++++++++++++++--------------- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5ab5e9666..ef0e76217 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2007-08-13 Mickael Remond + * src/mod_offline.erl: Added a config option to define the maximum + number of offline messages per user (EJAB-314). + * doc/guide.tex: Added documentation for the mod_offline quota (EJAB-314). diff --git a/src/mod_offline.erl b/src/mod_offline.erl index da221aaef..2caf621d8 100644 --- a/src/mod_offline.erl +++ b/src/mod_offline.erl @@ -12,7 +12,7 @@ -behaviour(gen_mod). -export([start/2, - init/0, + init/1, stop/1, store_packet/3, resend_offline_messages/2, @@ -29,12 +29,7 @@ -define(PROCNAME, ejabberd_offline). -define(OFFLINE_TABLE_LOCK_THRESHOLD, 1000). -%% TODO: Move this part as a module config file parameter: -%% Can be an integer > 0 or infinity: -%%-define(MAX_OFFLINE_MSGS, infinity). --define(MAX_OFFLINE_MSGS, 5). - -start(Host, _Opts) -> +start(Host, Opts) -> mnesia:create_table(offline_msg, [{disc_only_copies, [node()]}, {type, bag}, @@ -48,20 +43,25 @@ start(Host, _Opts) -> ?MODULE, remove_user, 50), ejabberd_hooks:add(anonymous_purge_hook, Host, ?MODULE, remove_user, 50), + MAX_OFFLINE_MSGS = gen_mod:get_opt(user_max_messages, Opts, infinity), register(gen_mod:get_module_proc(Host, ?PROCNAME), - spawn(?MODULE, init, [])). + spawn(?MODULE, init, [MAX_OFFLINE_MSGS])). -init() -> - loop(). +%% MAX_OFFLINE_MSGS is either infinity of integer > 0 +init(infinity) -> + loop(infinity); +init(MAX_OFFLINE_MSGS) + when integer(MAX_OFFLINE_MSGS), MAX_OFFLINE_MSGS > 0 -> + loop(MAX_OFFLINE_MSGS). -loop() -> +loop(MAX_OFFLINE_MSGS) -> receive #offline_msg{us=US} = Msg -> Msgs = receive_all(US, [Msg]), Len = length(Msgs), F = fun() -> %% Only count messages if needed: - Count = if ?MAX_OFFLINE_MSGS =/= infinity -> + Count = if MAX_OFFLINE_MSGS =/= infinity -> Len + p1_mnesia:count_records( offline_msg, #offline_msg{us=US, _='_'}); @@ -69,7 +69,7 @@ loop() -> 0 end, if - Count > ?MAX_OFFLINE_MSGS -> + Count > MAX_OFFLINE_MSGS -> discard_warn_sender(Msgs); true -> if @@ -84,9 +84,9 @@ loop() -> end end, mnesia:transaction(F), - loop(); + loop(MAX_OFFLINE_MSGS); _ -> - loop() + loop(MAX_OFFLINE_MSGS) end. receive_all(US, Msgs) ->