aboutsummaryrefslogtreecommitdiff
path: root/src/mod_mnesia_mngt.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mod_mnesia_mngt.erl')
-rw-r--r--src/mod_mnesia_mngt.erl131
1 files changed, 67 insertions, 64 deletions
diff --git a/src/mod_mnesia_mngt.erl b/src/mod_mnesia_mngt.erl
index 0c5ad1d36..f7aa962a6 100644
--- a/src/mod_mnesia_mngt.erl
+++ b/src/mod_mnesia_mngt.erl
@@ -6,32 +6,38 @@
%% mod_mnesia_mgmt:stop("localhost").
-module(mod_mnesia_mngt).
+
-author('mremond@process-one.net').
-behaviour(gen_mod).
+
-behavior(gen_server).
-export([start/2, start_link/2, stop/1]).
%% gen_server callbacks
--export([init/1, handle_call/3, handle_cast/2, handle_info/2,
- terminate/2, code_change/3]).
+-export([init/1, handle_call/3, handle_cast/2,
+ handle_info/2, terminate/2, code_change/3]).
-include("ejabberd.hrl").
+
-include("jlib.hrl").
--record(modstate, {host, logdir, iodevice, timer}).
+-record(modstate, {host = <<"">> :: binary(),
+ logdir = <<"">> :: binary(),
+ iodevice :: file:io_device(),
+ timer :: timer:tref()}).
-define(SUPERVISOR, ejabberd_sup).
+
-define(PROCNAME, mod_mnesia_mgmt).
--define(STANDARD_ACCEPT_INTERVAL, 20). %% accept maximum one new connection every 20ms
--define(ACCEPT_INTERVAL, 200). %% This is used when Mnesia is overloaded
--define(RATE_LIMIT_DURATION, 120000). %% Time during which the rate limitation need to be maintained
+-define(STANDARD_ACCEPT_INTERVAL, 20).
+
+-define(ACCEPT_INTERVAL, 200).
+
+-define(RATE_LIMIT_DURATION, 120000).
-%%====================================================================
-%% gen_mod callbacks
-%%====================================================================
start(Host, Opts) ->
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
Spec = {Proc, {?MODULE, start_link, [Host, Opts]},
@@ -45,25 +51,27 @@ stop(Host) ->
start_link(Host, Opts) ->
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
- gen_server:start_link({local, Proc}, ?MODULE, [Host, Opts], []).
+ gen_server:start_link({local, Proc}, ?MODULE,
+ [Host, Opts], []).
-%%====================================================================
-%% gen_server callbacks
-%%====================================================================
init([Host, Opts]) ->
?INFO_MSG("Starting mod_mnesia_mgmt for: ~p", [Host]),
- ejabberd_listener:rate_limit([5222, 5223], ?STANDARD_ACCEPT_INTERVAL),
- MyHost = gen_mod:get_opt_host(Host, Opts, "mnesia_mngt.@HOST@"),
-
- Logdir = gen_mod:get_opt(logdir, Opts, "/tmp/xmpplogs/"),
- make_dir_rec(Logdir),
+ ejabberd_listener:rate_limit([5222, 5223],
+ ?STANDARD_ACCEPT_INTERVAL),
+ MyHost = gen_mod:get_opt_host(Host, Opts,
+ <<"mnesia_mngt.@HOST@">>),
+ Logdir = gen_mod:get_opt(logdir, Opts,
+ fun iolist_to_binary/1,
+ <<"/tmp/xmpplogs/">>),
+ make_dir_rec(binary_to_list(Logdir)),
{ok, IOD} = file:open(filename(Logdir), [append]),
-
mnesia:subscribe(system),
+ {ok,
+ #modstate{host = MyHost, logdir = Logdir,
+ iodevice = IOD}}.
- {ok, #modstate{host = MyHost, logdir = Logdir, iodevice = IOD}}.
-
-terminate(_Reason, #modstate{host = Host, iodevice = IOD}) ->
+terminate(_Reason,
+ #modstate{host = Host, iodevice = IOD}) ->
?INFO_MSG("Stopping mod_mnesia_mgmt for: ~s", [Host]),
mnesia:unsubscribe(system),
file:close(IOD).
@@ -73,20 +81,24 @@ handle_call(stop, _From, State) ->
handle_call(_Req, _From, State) ->
{reply, {error, badarg}, State}.
-handle_cast(_Msg, State) ->
- {noreply, State}.
+handle_cast(_Msg, State) -> {noreply, State}.
-handle_info({mnesia_system_event,{mnesia_overload, {mnesia_tm, message_queue_len, Values}}},
+handle_info({mnesia_system_event,
+ {mnesia_overload,
+ {mnesia_tm, message_queue_len, Values}}},
#modstate{iodevice = IOD, timer = Timer} = State) ->
- Line = io_lib:format("~s - Mnesia overload due to message queue length (~p)",
- [timestamp(), Values]),
+ Line =
+ io_lib:format("~s - Mnesia overload due to message "
+ "queue length (~p)",
+ [timestamp(), Values]),
file:write(IOD, Line),
reset_timer(Timer),
-
- {messages, Messages} = process_info(whereis(mnesia_tm), messages),
+ {messages, Messages} = process_info(whereis(mnesia_tm),
+ messages),
log_messages(IOD, Messages, 20),
{noreply, State#modstate{timer = undefined}};
-handle_info({mnesia_system_event,{mnesia_overload, Details}},
+handle_info({mnesia_system_event,
+ {mnesia_overload, Details}},
#modstate{iodevice = IOD, timer = Timer} = State) ->
Line = io_lib:format("~s - Mnesia overload: ~p",
[timestamp(), Details]),
@@ -94,54 +106,45 @@ handle_info({mnesia_system_event,{mnesia_overload, Details}},
reset_timer(Timer),
{noreply, State};
handle_info({mnesia_system_event, _Event}, State) ->
- %% TODO: More event to handle
{noreply, State};
-handle_info(_Info, State) ->
- {noreply, State}.
+handle_info(_Info, State) -> {noreply, State}.
-code_change(_OldVsn, State, _Extra) ->
- {ok, State}.
+code_change(_OldVsn, State, _Extra) -> {ok, State}.
-%% Generate filename
filename(LogDir) ->
Filename = lists:flatten(timestamp()) ++ "-mnesia.log",
filename:join([LogDir, Filename]).
-%% Generate timestamp
timestamp() ->
- {Y,Mo,D} = erlang:date(),
- {H,Mi,S} = erlang:time(),
- io_lib:format("~4.4.0w~2.2.0w~2.2.0w-~2.2.0w~2.2.0w~2.2.0w", [Y,Mo,D,H,Mi,S]).
+ {Y, Mo, D} = erlang:date(),
+ {H, Mi, S} = erlang:time(),
+ io_lib:format("~4.4.0w~2.2.0w~2.2.0w-~2.2.0w~2.2.0w~2.2.0w",
+ [Y, Mo, D, H, Mi, S]).
-%% Create dir recusively
make_dir_rec(Dir) ->
case file:read_file_info(Dir) of
- {ok, _} ->
- ok;
- {error, enoent} ->
- DirS = filename:split(Dir),
- DirR = lists:sublist(DirS, length(DirS)-1),
- make_dir_rec(filename:join(DirR)),
- file:make_dir(Dir)
+ {ok, _} -> ok;
+ {error, enoent} ->
+ DirS = filename:split(Dir),
+ DirR = lists:sublist(DirS, length(DirS) - 1),
+ make_dir_rec(filename:join(DirR)),
+ file:make_dir(Dir)
end.
-%% Write first messages to log file
-log_messages(_IOD, _Messages, 0) ->
- ok;
-log_messages(_IOD, [], _N) ->
- ok;
-log_messages(IOD, [Message|Messages], N) ->
- Line = io_lib:format("** ~w",
- [Message]),
+log_messages(_IOD, _Messages, 0) -> ok;
+log_messages(_IOD, [], _N) -> ok;
+log_messages(IOD, [Message | Messages], N) ->
+ Line = io_lib:format("** ~w", [Message]),
file:write(IOD, Line),
- log_messages(IOD, Messages, N-1).
+ log_messages(IOD, Messages, N - 1).
reset_timer(Timer) ->
cancel_timer(Timer),
- ejabberd_listener:rate_limit([5222, 5223], ?ACCEPT_INTERVAL),
- timer:apply_after(?RATE_LIMIT_DURATION, ejabberd_listener, rate_limit, [[5222, 5223], ?STANDARD_ACCEPT_INTERVAL]).
-
-cancel_timer(undefined) ->
- ok;
-cancel_timer(Timer) ->
- timer:cancel(Timer).
+ ejabberd_listener:rate_limit([5222, 5223],
+ ?ACCEPT_INTERVAL),
+ timer:apply_after(?RATE_LIMIT_DURATION,
+ ejabberd_listener, rate_limit,
+ [[5222, 5223], ?STANDARD_ACCEPT_INTERVAL]).
+
+cancel_timer(undefined) -> ok;
+cancel_timer(Timer) -> timer:cancel(Timer).