Skip to content

Commit a403b1c

Browse files
authored
Merge pull request #4430 from esl/report-long-tasks
Report long tasks
2 parents 952be3c + 13aa6e0 commit a403b1c

6 files changed

+53
-9
lines changed

src/ejabberd_app.erl

+4-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,10 @@
4040

4141
start(normal, _Args) ->
4242
try
43-
do_start()
43+
%% We want to print the starting progress if starting is too slow
44+
%% (i.e. it would print the current stacktrace each several seconds
45+
%% during the startup)
46+
mongoose_task:run_tracked(#{task => start_mongooseim}, fun do_start/0)
4447
catch Class:Reason:StackTrace ->
4548
%% Log a stacktrace because while proc_lib:crash_report/4 would report a crash reason,
4649
%% it would not report the stacktrace

src/ejabberd_sup.erl

+14-1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@
3232
-export([start_child/1, start_child/2, stop_child/1]).
3333
-export([create_ets_table/2]).
3434

35+
-export([start_linked_child/2]).
36+
-ignore_xref([start_linked_child/2]).
37+
3538
-include("mongoose_logger.hrl").
3639

3740
start_link() ->
@@ -121,7 +124,17 @@ worker_spec(Mod) ->
121124
worker_spec(Mod, []).
122125

123126
worker_spec(Mod, Args) ->
124-
{Mod, {Mod, start_link, Args}, permanent, timer:seconds(5), worker, [Mod]}.
127+
%% We use `start_linked_child' wrapper to log delays
128+
%% in the slow init worker functions.
129+
MFA = {?MODULE, start_linked_child, [Mod, Args]},
130+
{Mod, MFA, permanent, timer:seconds(5), worker, [Mod]}.
131+
132+
%% In case one of the workers takes long time to start
133+
%% we want the logging progress (to know which child got stuck).
134+
%% This could happend on CI during the node restarts.
135+
start_linked_child(Mod, Args) ->
136+
F = fun() -> erlang:apply(Mod, start_link, Args) end,
137+
mongoose_task:run_tracked(#{task => start_linked_child, child_module => Mod}, F).
125138

126139
-spec create_ets_table(atom(), list()) -> ok.
127140
create_ets_table(TableName, TableOpts) ->

src/mongoose_cluster_id.erl

+5-3
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,9 @@ start() ->
2424
PersistentBackend = which_persistent_backend_enabled(),
2525
VolatileBackend = which_volatile_backend_available(),
2626
maybe_prepare_queries(PersistentBackend),
27-
cets_long:run_tracked(#{task => wait_for_any_backend,
28-
backend => PersistentBackend, volatile_backend => VolatileBackend},
27+
mongoose_task:run_tracked(#{task => wait_for_any_backend,
28+
backend => PersistentBackend,
29+
volatile_backend => VolatileBackend},
2930
fun() -> wait_for_any_backend(PersistentBackend, VolatileBackend) end),
3031
CachedRes = get_cached_cluster_id(VolatileBackend),
3132
BackendRes = get_backend_cluster_id(PersistentBackend),
@@ -80,7 +81,8 @@ wait_for_backend_promise(cets, Alias) ->
8081
end)];
8182
wait_for_backend_promise(rdbms, Alias) ->
8283
[spawn(fun() ->
83-
cets_long:run_tracked(#{task => wait_for_rdbms}, fun() -> wait_for_rdbms() end),
84+
mongoose_task:run_tracked(#{task => wait_for_rdbms},
85+
fun wait_for_rdbms/0),
8486
Alias ! {ready, Alias}
8587
end)];
8688
wait_for_backend_promise(_, Alias) ->

src/mongoose_start_node_id.erl

+11-1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ start_link() ->
4141
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
4242

4343
init(_) ->
44+
mongoose_task:run_tracked(#{task => mongoose_start_node_id_init}, fun do_init/0).
45+
46+
do_init() ->
4447
net_kernel:monitor_nodes(true),
4548
StartId = mongoose_bin:gen_from_crypto(),
4649
persistent_term:put(mongoose_start_node_id, StartId),
@@ -93,8 +96,15 @@ code_change(_OldVsn, State, _Extra) ->
9396
{ok, State}.
9497

9598
register_on_remote_node(RemoteNode, StartId) ->
99+
Info = #{task => register_on_remote_node,
100+
remote_node => RemoteNode,
101+
start_id => StartId},
102+
F = fun() -> do_register_on_remote_node(RemoteNode, StartId) end,
103+
mongoose_task:run_tracked(Info, F).
104+
105+
do_register_on_remote_node(RemoteNode, StartId) ->
96106
Res = rpc:call(RemoteNode, ?MODULE, register_on_remote_node_rpc,
97-
[node(), StartId, self()]),
107+
[node(), StartId, self()], timer:seconds(10)),
98108
case Res of
99109
ok ->
100110
ok;

src/mongoose_task.erl

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
%% @doc Helper module for slow tasks.
2+
-module(mongoose_task).
3+
-export([run_tracked/2]).
4+
5+
%% @doc Run a task, log if it takes too long
6+
-spec run_tracked(Info :: map(), F :: fun(() -> Res)) -> Res
7+
when Res :: term().
8+
run_tracked(Info, F) ->
9+
%% Reuse code from CETS.
10+
%% `cets_long' module does not use any CETS functionality and
11+
%% can be used, even if CETS tables are not used.
12+
cets_long:run_tracked(Info, F).

src/wpool/mongoose_wpool_mgr.erl

+7-3
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,10 @@ start_link(Type) ->
7171

7272
start(Type, Host, Tag, PoolOpts, ConnOpts) ->
7373
ok = ensure_started(Type),
74-
gen_server:call(name(Type), {start_pool, Host, Tag, PoolOpts, ConnOpts}).
74+
gen_server:call(name(Type), {start_pool, Host, Tag, PoolOpts, ConnOpts}, timer:seconds(30)).
7575

7676
stop(Type, Host, Tag) ->
77-
gen_server:call(name(Type), {stop_pool, Host, Tag}).
77+
gen_server:call(name(Type), {stop_pool, Host, Tag}, timer:seconds(30)).
7878

7979
-spec name(mongoose_wpool:pool_type()) -> mongoose_wpool:proc_name().
8080
name(Type) ->
@@ -93,7 +93,11 @@ handle_call({start_pool, Host, Tag, WpoolOpts, ConnOpts}, _From,
9393
#state{type = Type, pools = Pools, monitors = Monitors} = State) ->
9494
?LOG_INFO(#{what => pool_starting, pool_type => Type, tag => Tag, server => Host,
9595
pool_opts => WpoolOpts}),
96-
case mongoose_wpool:call_start_callback(Type, [Host, Tag, WpoolOpts, ConnOpts]) of
96+
F = fun() ->
97+
mongoose_wpool:call_start_callback(Type, [Host, Tag, WpoolOpts, ConnOpts])
98+
end,
99+
Info = #{task => start_pool, tag => Tag},
100+
case mongoose_task:run_tracked(Info, F) of
97101
{_, Pid} = OkReply when is_pid(Pid) ->
98102
Ref = erlang:monitor(process, Pid),
99103
Key = {Type, Host, Tag},

0 commit comments

Comments
 (0)