From 9320a700c1e071d572d124cac88b3dd458e498b1 Mon Sep 17 00:00:00 2001 From: Nelson Vides Date: Tue, 4 Feb 2025 09:03:00 +0100 Subject: [PATCH 1/3] Clean usage of jlib:replace_from_to* Prefer modifying the whole package instead of manually inspecting attributes. Also optimise what is removed and what is replaced. --- .../mongoose_component_connection.erl | 6 ++---- src/jlib.erl | 21 ++++++++++--------- src/mam/mod_mam_muc.erl | 6 +++--- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/component/mongoose_component_connection.erl b/src/component/mongoose_component_connection.erl index e9970600e6e..b701d9c8552 100644 --- a/src/component/mongoose_component_connection.erl +++ b/src/component/mongoose_component_connection.erl @@ -365,10 +365,8 @@ handle_route(StateData = #component_data{}, _, Acc) -> case acl:match_rule(global, Access, From) of allow -> mongoose_hooks:packet_to_component(Acc, From, To), - Attrs2 = jlib:replace_from_to_attrs(jid:to_binary(From), - jid:to_binary(To), - Packet#xmlel.attrs), - send_xml(StateData, Packet#xmlel{attrs = Attrs2}); + Packet2 = jlib:replace_from_to(From, To, Packet), + send_xml(StateData, Packet2); deny -> ejabberd_router:route_error_reply(To, From, Acc, mongoose_xmpp_errors:not_allowed()) end, diff --git a/src/jlib.erl b/src/jlib.erl index 8fdb0ce30fe..84542e7eccd 100644 --- a/src/jlib.erl +++ b/src/jlib.erl @@ -32,7 +32,6 @@ make_error_reply/3, make_invitation/3, make_config_change_message/1, - replace_from_to_attrs/3, replace_from_to/3, remove_attr/2, iq_query_info/1, @@ -160,13 +159,11 @@ make_invitation(From, Password, Reason) -> -spec replace_from_to_attrs(From :: binary(), To :: binary() | undefined, exml:attrs()) -> exml:attrs(). +replace_from_to_attrs(From, undefined, Attrs) -> + Attrs1 = maps:remove(<<"to">>, Attrs), + Attrs1#{<<"from">> => From}; replace_from_to_attrs(From, To, Attrs) -> - Attrs1 = maps:without([<<"from">>, <<"to">>], Attrs), - Attrs2 = case To of - undefined -> Attrs1; - _ -> Attrs1#{<<"to">> => To} - end, - Attrs2#{<<"from">> => From}. + Attrs#{<<"from">> => From, <<"to">> => To}. -spec swap_from_to_attrs(exml:attrs()) -> exml:attrs(). swap_from_to_attrs(#{<<"from">> := From, <<"to">> := To} = Attrs) -> @@ -180,12 +177,16 @@ swap_from_to_attrs(#{<<"to">> := To} = Attrs0) -> swap_from_to_attrs(Attrs) -> Attrs. +%% Replaces from and to, or ensures they are defined to begin with. -spec replace_from_to(From :: jid:simple_jid() | jid:jid(), - To :: jid:simple_jid() | jid:jid(), + To :: undefined | jid:simple_jid() | jid:jid(), XE :: exml:element()) -> exml:element(). -replace_from_to(From, To, XE = #xmlel{attrs = Attrs}) -> +replace_from_to(From, undefined, #xmlel{attrs = Attrs} = Packet) -> + NewAttrs = replace_from_to_attrs(jid:to_binary(From), undefined, Attrs), + Packet#xmlel{attrs = NewAttrs}; +replace_from_to(From, To, #xmlel{attrs = Attrs} = Packet) -> NewAttrs = replace_from_to_attrs(jid:to_binary(From), jid:to_binary(To), Attrs), - XE#xmlel{attrs = NewAttrs}. + Packet#xmlel{attrs = NewAttrs}. -spec remove_attr(binary(), exml:element()) -> exml:element(). remove_attr(Attr, XE = #xmlel{attrs = Attrs}) -> diff --git a/src/mam/mod_mam_muc.erl b/src/mam/mod_mam_muc.erl index 047e9ea53a2..92e41e375f0 100644 --- a/src/mam/mod_mam_muc.erl +++ b/src/mam/mod_mam_muc.erl @@ -587,9 +587,9 @@ maybe_delete_x_user_element(false, _ReceiverJID, Packet) -> %% When sending out the archives to a requesting client, %% the forwarded stanza MUST NOT have a 'to' attribute, and %% the 'from' MUST be the occupant JID of the sender of the archived message. -replace_from_to_attributes(SrcJID, Packet = #xmlel{attrs = Attrs}) -> - NewAttrs = jlib:replace_from_to_attrs(jid:to_binary(SrcJID), undefined, Attrs), - Packet#xmlel{attrs = NewAttrs}. +-spec replace_from_to_attributes(jid:jid(), exml:element()) -> exml:element(). +replace_from_to_attributes(SrcJID, Packet) -> + jlib:replace_from_to(SrcJID, undefined, Packet). -spec message_row_to_ext_id(row()) -> binary(). message_row_to_ext_id(#{id := MessID}) -> From 88952f6fcba0b31842bc849adcbb366b5ca5ca34 Mon Sep 17 00:00:00 2001 From: Nelson Vides Date: Wed, 5 Feb 2025 09:52:14 +0100 Subject: [PATCH 2/3] Optimise gen_servers - introduce hibernation when appropriate, - remove dead `code_change/3` callbacks, - remove dead comments, - improve specs for start_link/ and init/1 callbacks --- src/domain/mongoose_domain_sup.erl | 2 ++ src/ejabberd_local.erl | 41 +++---------------------- src/ejabberd_router.erl | 14 +++------ src/ejabberd_sm.erl | 2 +- src/ejabberd_sm_backend_sup.erl | 32 +++---------------- src/ejabberd_sup.erl | 6 ++-- src/gen_hook.erl | 7 ++--- src/instrument/mongoose_instrument.erl | 11 +++---- src/listeners/mongoose_listener_sup.erl | 11 +++---- src/mod_caps.erl | 3 +- src/mongoose_cleaner.erl | 14 +++------ src/mongoose_start_node_id.erl | 12 +++----- src/muc/mod_muc_iq.erl | 17 ++++------ src/s2s/ejabberd_s2s.erl | 12 +++----- src/vcard/mod_vcard.erl | 10 ++---- src/wpool/mongoose_wpool_sup.erl | 10 +++--- 16 files changed, 56 insertions(+), 148 deletions(-) diff --git a/src/domain/mongoose_domain_sup.erl b/src/domain/mongoose_domain_sup.erl index f1b477d18aa..59ea852bbef 100644 --- a/src/domain/mongoose_domain_sup.erl +++ b/src/domain/mongoose_domain_sup.erl @@ -10,6 +10,7 @@ -export([start_link/2, restart_core/1]). -ignore_xref([start_link/2, restart_core/1]). +-spec start_link() -> supervisor:startlink_ret(). start_link() -> supervisor:start_link({local, ?MODULE}, ?MODULE, []). @@ -21,6 +22,7 @@ restart_core(Args) -> supervisor:delete_child(?MODULE, mongoose_domain_core), supervisor:start_child(?MODULE, worker_spec(mongoose_domain_core, fill_args(Args))). +-spec init(list()) -> {ok, {supervisor:sup_flags(), [supervisor:child_spec()]}}. init(Args) -> DomainCore = worker_spec(mongoose_domain_core, fill_args(Args)), SubdomainCore = worker_spec(mongoose_subdomain_core, []), diff --git a/src/ejabberd_local.erl b/src/ejabberd_local.erl index 41dc2cbf732..c1dad75e215 100644 --- a/src/ejabberd_local.erl +++ b/src/ejabberd_local.erl @@ -57,8 +57,7 @@ -export([disco_local_features/3]). %% 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]). -export([do_route/4]). @@ -89,13 +88,9 @@ %%==================================================================== %% API %%==================================================================== -%%-------------------------------------------------------------------- -%% Function: start_link() -> {ok, Pid} | ignore | {error, Error} -%% Description: Starts the server -%%-------------------------------------------------------------------- --spec start_link() -> 'ignore' | {'error', _} | {'ok', pid()}. +-spec start_link() -> gen_server:start_ret(). start_link() -> - gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). + gen_server:start_link({local, ?MODULE}, ?MODULE, noargs, []). -spec process_iq(Acc :: mongoose_acc:t(), From :: jid:jid(), @@ -261,22 +256,13 @@ disco_local_features(Acc, _, _) -> %% {stop, Reason} %% Description: Initiates the server %%-------------------------------------------------------------------- -init([]) -> +init(noargs) -> catch ets:new(?IQTABLE, [named_table, protected, {read_concurrency, true}]), catch ets:new(?NSTABLE, [named_table, bag, protected, {read_concurrency, true}]), catch ets:new(?IQRESPONSE, [named_table, public]), gen_hook:add_handlers(hooks()), {ok, #state{}}. -%%-------------------------------------------------------------------- -%% Function: %% handle_call(Request, From, State) -> {reply, Reply, State} | -%% {reply, Reply, State, Timeout} | -%% {noreply, State} | -%% {noreply, State, Timeout} | -%% {stop, Reason, Reply, State} | -%% {stop, Reason, State} -%% Description: Handling call messages -%%-------------------------------------------------------------------- handle_call({unregister_host, Host}, _From, State) -> Node = node(), [mongoose_c2s:stop(Pid, host_was_unregistered) @@ -293,21 +279,9 @@ handle_call(_Request, _From, State) -> Reply = ok, {reply, Reply, State}. -%%-------------------------------------------------------------------- -%% Function: handle_cast(Msg, State) -> {noreply, State} | -%% {noreply, State, Timeout} | -%% {stop, Reason, State} -%% Description: Handling cast messages -%%-------------------------------------------------------------------- handle_cast(_Msg, State) -> {noreply, State}. -%%-------------------------------------------------------------------- -%% Function: handle_info(Info, State) -> {noreply, State} | -%% {noreply, State, Timeout} | -%% {stop, Reason, State} -%% Description: Handling all non call/cast messages -%%-------------------------------------------------------------------- handle_info({route, Acc, From, To, El}, State) -> spawn(fun() -> process_packet(Acc, From, To, El, #{}) end), {noreply, State}; @@ -341,13 +315,6 @@ handle_info(_Info, State) -> terminate(_Reason, _State) -> gen_hook:delete_handlers(hooks()). -%%-------------------------------------------------------------------- -%% Func: code_change(OldVsn, State, Extra) -> {ok, NewState} -%% Description: Convert process state when code is changed -%%-------------------------------------------------------------------- -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - %%-------------------------------------------------------------------- %%% Internal functions %%-------------------------------------------------------------------- diff --git a/src/ejabberd_router.erl b/src/ejabberd_router.erl index ece9865eb64..c6cf1ce02b9 100644 --- a/src/ejabberd_router.erl +++ b/src/ejabberd_router.erl @@ -36,7 +36,7 @@ -export([start_link/0]). %% 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]). -ignore_xref([route_error/4, start_link/0]). @@ -49,9 +49,9 @@ %% API %%==================================================================== --spec start_link() -> 'ignore' | {'error', _} | {'ok', pid()}. +-spec start_link() -> gen_server:start_ret(). start_link() -> - gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). + gen_server:start_link({local, ?MODULE}, ?MODULE, noargs, [{hibernate_after, 0}]). %% @doc The main routing function. It puts the message through a chain %% of filtering/routing modules, as defined in config 'routing_modules' @@ -133,13 +133,12 @@ route_error_reply(From, To, Acc, Error) -> %% gen_server callbacks %%==================================================================== -init([]) -> +init(noargs) -> mongoose_component:start(), {ok, #state{}}. handle_call(_Request, _From, State) -> - Reply = ok, - {reply, Reply, State}. + {reply, ok, State}. handle_cast(_Msg, State) -> {noreply, State}. @@ -151,9 +150,6 @@ terminate(_Reason, _State) -> mongoose_component:stop(), ok. -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - %%-------------------------------------------------------------------- %%% Internal functions %%-------------------------------------------------------------------- diff --git a/src/ejabberd_sm.erl b/src/ejabberd_sm.erl index 34b14673919..d83482cd2f1 100644 --- a/src/ejabberd_sm.erl +++ b/src/ejabberd_sm.erl @@ -140,7 +140,7 @@ start() -> Spec = {?MODULE, {?MODULE, start_link, []}, permanent, brutal_kill, worker, [?MODULE]}, {ok, _} = ejabberd_sup:start_child(Spec). --spec start_link() -> 'ignore' | {'error', _} | {'ok', pid()}. +-spec start_link() -> gen_server:start_ret(). start_link() -> gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). diff --git a/src/ejabberd_sm_backend_sup.erl b/src/ejabberd_sm_backend_sup.erl index d7821c74b74..fd5d03bf260 100644 --- a/src/ejabberd_sm_backend_sup.erl +++ b/src/ejabberd_sm_backend_sup.erl @@ -1,9 +1,6 @@ %%%------------------------------------------------------------------- %%% @author Konrad Kaplita %%% @copyright (C) 2011, Konrad Kaplita -%%% @doc -%%% -%%% @end %%% Created : 18 Nov 2011 by Konrad Kaplita %%%------------------------------------------------------------------- -module(ejabberd_sm_backend_sup). @@ -20,32 +17,11 @@ -define(SERVER, ?MODULE). -%%%=================================================================== -%%% API functions -%%%=================================================================== - -%%-------------------------------------------------------------------- -%% @doc -%% Starts the supervisor -%% @end -%%-------------------------------------------------------------------- --spec start_link() -> {ok, Pid :: pid()} | ignore | {error, Reason :: term()}. +-spec start_link() -> supervisor:startlink_ret(). start_link() -> - supervisor:start_link({local, ?SERVER}, ?MODULE, []). - -%%%=================================================================== -%%% Supervisor callbacks -%%%=================================================================== + supervisor:start_link({local, ?SERVER}, ?MODULE, noargs). -%%-------------------------------------------------------------------- %% @private -%% @doc -%% Whenever a supervisor is started using supervisor:start_link/[2, 3], -%% this function is called by the new process to find out about -%% restart strategy, maximum restart frequency and child -%% specifications. -%% @end -%%-------------------------------------------------------------------- --spec init([]) -> {ok, {{one_for_one, 1000, 3600}, []}}. -init([]) -> +-spec init(noargs) -> {ok, {supervisor:sup_flags(), [supervisor:child_spec()]}}. +init(noargs) -> {ok, {{one_for_one, 1000, 3600}, []}}. diff --git a/src/ejabberd_sup.erl b/src/ejabberd_sup.erl index 4cba86f064e..b621c3d767b 100644 --- a/src/ejabberd_sup.erl +++ b/src/ejabberd_sup.erl @@ -37,10 +37,12 @@ -include("mongoose_logger.hrl"). +-spec start_link() -> supervisor:startlink_err(). start_link() -> - supervisor:start_link({local, ?MODULE}, ?MODULE, []). + supervisor:start_link({local, ?MODULE}, ?MODULE, noargs). -init([]) -> +-spec init(noargs) -> {ok, {supervisor:sup_flags(), [supervisor:child_spec()]}}. +init(noargs) -> Hooks = worker_spec(gen_hook), Instrument = worker_spec(mongoose_instrument), Cleaner = worker_spec(mongoose_cleaner), diff --git a/src/gen_hook.erl b/src/gen_hook.erl index 2b76286154f..06a664a8844 100644 --- a/src/gen_hook.erl +++ b/src/gen_hook.erl @@ -15,7 +15,6 @@ -export([init/1, handle_call/3, handle_cast/2, - code_change/3, handle_info/2, terminate/2]). @@ -76,6 +75,7 @@ %%%---------------------------------------------------------------------- %%% API %%%---------------------------------------------------------------------- +-spec start_link() -> gen_server:start_ret(). start_link() -> gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). @@ -200,7 +200,7 @@ handle_call({delete_handler, Key = {Name, Tag}, #hook_handler{} = HookHandler}, {reply, ok, NewState}; handle_call(reload_hooks, _From, State) -> persistent_term:put(?MODULE, State), - {reply, ok, State}; + {reply, ok, State, hibernate}; handle_call(Request, From, State) -> ?UNEXPECTED_CALL(Request, From), {reply, bad_request, State}. @@ -217,9 +217,6 @@ terminate(_Reason, _State) -> persistent_term:erase(?MODULE), ok. -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - %%%---------------------------------------------------------------------- %%% Internal functions %%%---------------------------------------------------------------------- diff --git a/src/instrument/mongoose_instrument.erl b/src/instrument/mongoose_instrument.erl index 931536d8e81..b192795afec 100644 --- a/src/instrument/mongoose_instrument.erl +++ b/src/instrument/mongoose_instrument.erl @@ -14,7 +14,7 @@ -export([add_handler/2, remove_handler/1]). %% gen_server callbacks --export([init/1, handle_call/3, handle_cast/2, code_change/3, handle_info/2, terminate/2]). +-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2]). -ignore_xref([start_link/0, set_up/3, tear_down/2, span/4, add_handler/2, remove_handler/1]). @@ -180,7 +180,8 @@ init([]) -> {ok, #{events => #{}, probe_timers => #{}}}. -spec handle_call(any(), gen_server:from(), state()) -> - {reply, ok | {ok, handlers()} | {error, map()}, state()}. + {reply, ok | {ok, handlers()} | {error, map()}, state()} | + {reply, ok | {ok, handlers()} | {error, map()}, state(), hibernate}. handle_call({set_up, EventName, Labels, Config}, _From, #{events := Events, probe_timers := ProbeTimers} = State) -> case set_up_and_register_event(EventName, Labels, Config, Events) of @@ -226,7 +227,7 @@ handle_call({remove_handler, Key}, _From, State = #{events := Events}) -> end; handle_call(persist, _From, State = #{events := Events}) -> persistent_term:put(?MODULE, Events), - {reply, ok, State}; + {reply, ok, State, hibernate}; handle_call({lookup, EventName, Labels}, _From, State = #{events := Events}) -> {reply, lookup(EventName, Labels, Events), State}; handle_call(Request, From, State) -> @@ -250,10 +251,6 @@ terminate(_Reason, _State) -> || {Key, Opts = #{}} <- maps:to_list(mongoose_config:get_opt(instrumentation))], ok. --spec code_change(any(), state(), any()) -> {ok, state()}. -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - %% Internal functions -spec update_if_persisted(event_map(), event_map()) -> ok. diff --git a/src/listeners/mongoose_listener_sup.erl b/src/listeners/mongoose_listener_sup.erl index b0b6a9f89a6..4c75a347bbd 100644 --- a/src/listeners/mongoose_listener_sup.erl +++ b/src/listeners/mongoose_listener_sup.erl @@ -1,5 +1,4 @@ %% @doc Supervisor for the socket listeners - -module(mongoose_listener_sup). -behaviour(supervisor). @@ -8,13 +7,11 @@ -ignore_xref([start_link/0, init/1]). --include("mongoose_logger.hrl"). - %% API --spec start_link() -> {ok, pid()}. +-spec start_link() -> supervisor:startlink_ret(). start_link() -> - supervisor:start_link({local, ?MODULE}, ?MODULE, []). + supervisor:start_link({local, ?MODULE}, ?MODULE, noargs). -spec start_child(supervisor:child_spec()) -> ok. start_child(ChildSpec) -> @@ -24,8 +21,8 @@ start_child(ChildSpec) -> %% Supervisor callbacks --spec init([]) -> {ok, {supervisor:sup_flags(), []}}. -init([]) -> +-spec init(noargs) -> {ok, {supervisor:sup_flags(), [supervisor:child_spec()]}}. +init(noargs) -> {ok, {#{strategy => one_for_one, intensity => 10, period => 1}, []}}. diff --git a/src/mod_caps.erl b/src/mod_caps.erl index 97264a150ba..f6d6650b987 100644 --- a/src/mod_caps.erl +++ b/src/mod_caps.erl @@ -88,8 +88,7 @@ start_link(HostType, Opts) -> mod_caps_backend:init(HostType, Opts), Proc = gen_mod:get_module_proc(HostType, ?PROCNAME), - gen_server:start_link({local, Proc}, ?MODULE, - [HostType, Opts], []). + gen_server:start_link({local, Proc}, ?MODULE, [HostType, Opts], [{hibernate_after, 0}]). -spec start(mongooseim:host_type(), gen_mod:module_opts()) -> any(). start(HostType, Opts) -> diff --git a/src/mongoose_cleaner.erl b/src/mongoose_cleaner.erl index 5dfe0d594a4..ebb01beec9f 100644 --- a/src/mongoose_cleaner.erl +++ b/src/mongoose_cleaner.erl @@ -10,8 +10,7 @@ handle_call/3, handle_cast/2, handle_info/2, - terminate/2, - code_change/3]). + terminate/2]). -ignore_xref([start_link/0]). @@ -26,14 +25,15 @@ %%% API %%%=================================================================== +-spec start_link() -> gen_server:start_ret(). start_link() -> - gen_server:start_link({local, ?SERVER}, ?MODULE, [], []). + gen_server:start_link({local, ?SERVER}, ?MODULE, noargs, []). %%%=================================================================== %%% gen_server callbacks %%%=================================================================== -init([]) -> +init(noargs) -> case net_kernel:monitor_nodes(true) of ok -> {ok, #state{}}; @@ -45,8 +45,7 @@ init([]) -> end. handle_call(_Request, _From, State) -> - Reply = ok, - {reply, Reply, State}. + {reply, ok, State}. handle_cast(_Msg, State) -> {noreply, State}. @@ -63,9 +62,6 @@ handle_info(_Info, State) -> terminate(_Reason, _State) -> ok. -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - %%%=================================================================== %%% Internal functions %%%=================================================================== diff --git a/src/mongoose_start_node_id.erl b/src/mongoose_start_node_id.erl index 1dd3ba11fe3..18d3ebb87b7 100644 --- a/src/mongoose_start_node_id.erl +++ b/src/mongoose_start_node_id.erl @@ -10,12 +10,10 @@ -export([register_on_remote_node_rpc/3]). %% 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]). -ignore_xref([start_link/0, register_on_remote_node_rpc/3]). --include("mongoose.hrl"). -include("mongoose_logger.hrl"). -type id() :: binary(). @@ -36,11 +34,11 @@ node_id_to_name(ID) -> {ok, Name} end. --spec start_link() -> {ok, pid()}. +-spec start_link() -> gen_server:start_ret(). start_link() -> - gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). + gen_server:start_link({local, ?MODULE}, ?MODULE, noargs, []). -init(_) -> +init(noargs) -> mongoose_task:run_tracked(#{task => mongoose_start_node_id_init}, fun do_init/0). do_init() -> @@ -92,8 +90,6 @@ handle_info(_Info, State) -> terminate(_Reason, _State) -> ok. -code_change(_OldVsn, State, _Extra) -> - {ok, State}. register_on_remote_node(RemoteNode, StartId) -> Info = #{task => register_on_remote_node, diff --git a/src/muc/mod_muc_iq.erl b/src/muc/mod_muc_iq.erl index 85f108d0166..c4bc567c66f 100644 --- a/src/muc/mod_muc_iq.erl +++ b/src/muc/mod_muc_iq.erl @@ -9,15 +9,13 @@ sync/0]). %% 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]). --ignore_xref([code_change/3, handle_call/3, handle_cast/2, handle_info/2, init/1, +-ignore_xref([handle_call/3, handle_cast/2, handle_info/2, init/1, start_link/0, terminate/2]). -compile({inline, [srv_name/0, tbl_name/0]}). --include("mongoose.hrl"). -include("jlib.hrl"). -record(state, {}). @@ -33,9 +31,9 @@ tbl_name() -> %% API %%==================================================================== --spec start_link() -> 'ignore' | {'error', _} | {'ok', pid()}. +-spec start_link() -> gen_server:start_ret(). start_link() -> - gen_server:start_link({local, srv_name()}, ?MODULE, [], []). + gen_server:start_link({local, srv_name()}, ?MODULE, noargs, []). %% @doc Handle custom IQ. %% Called from mod_muc_room. @@ -66,12 +64,12 @@ sync() -> %% gen_server callbacks %%==================================================================== -init([]) -> +init(noargs) -> ets:new(tbl_name(), [named_table, protected]), {ok, #state{}}. handle_call(sync, _From, State) -> - {reply, ok, State}; + {reply, ok, State, hibernate}; handle_call(_Request, _From, State) -> {reply, ok, State}. @@ -95,6 +93,3 @@ handle_info(_Msg, State) -> terminate(_Reason, _State) -> ok. - -code_change(_OldVsn, State, _Extra) -> - {ok, State}. diff --git a/src/s2s/ejabberd_s2s.erl b/src/s2s/ejabberd_s2s.erl index 9c80372b42a..ded1478c8e4 100644 --- a/src/s2s/ejabberd_s2s.erl +++ b/src/s2s/ejabberd_s2s.erl @@ -42,8 +42,7 @@ -export([node_cleanup/3]). %% 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]). -ignore_xref([start_link/0]). @@ -70,9 +69,9 @@ %% API functions %% Starts the server --spec start_link() -> ignore | {error, _} | {ok, pid()}. +-spec start_link() -> gen_server:start_ret(). start_link() -> - gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). + gen_server:start_link({local, ?MODULE}, ?MODULE, noargs, [{hibernate_after, 0}]). filter(From, To, Acc, Packet) -> {From, To, Acc, Packet}. @@ -112,7 +111,7 @@ node_cleanup(Acc, #{node := Node}, _) -> %% gen_server callbacks -init([]) -> +init(noargs) -> internal_database_init(), set_shared_secret(), gen_hook:add_handlers(hooks()), @@ -134,9 +133,6 @@ terminate(_Reason, _State) -> gen_hook:delete_handlers(hooks()), ok. -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - %%% Internal functions -spec hooks() -> [gen_hook:hook_tuple()]. hooks() -> diff --git a/src/vcard/mod_vcard.erl b/src/vcard/mod_vcard.erl index eed0a780225..07c190edfc2 100644 --- a/src/vcard/mod_vcard.erl +++ b/src/vcard/mod_vcard.erl @@ -60,8 +60,7 @@ handle_info/2, handle_call/3, handle_cast/2, - terminate/2, - code_change/3]). + terminate/2]). %% mongoose_packet_handler export -export([process_packet/5]). @@ -318,7 +317,7 @@ handle_route(Acc, From, To) -> %%-------------------------------------------------------------------- start_link(HostType, Opts) -> Proc = gen_mod:get_module_proc(HostType, ?PROCNAME), - gen_server:start_link({local, Proc}, ?MODULE, [HostType, Opts], []). + gen_server:start_link({local, Proc}, ?MODULE, [HostType, Opts], [{hibernate_after, 0}]). init([HostType, Opts]) -> process_flag(trap_exit, true), @@ -326,8 +325,6 @@ init([HostType, Opts]) -> maybe_register_search(Search, HostType, Opts), {ok, #state{host_type = HostType, search = Search}}. -handle_call(get_state, _From, State) -> - {reply, {ok, State}, State}; handle_call(stop, _From, State) -> {stop, normal, ok, State}; handle_call(_Request, _From, State) -> @@ -339,9 +336,6 @@ handle_info(_, State) -> handle_cast(_Request, State) -> {noreply, State}. -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - terminate(_Reason, #state{host_type = HostType, search = Search}) -> maybe_unregister_search(Search, HostType). diff --git a/src/wpool/mongoose_wpool_sup.erl b/src/wpool/mongoose_wpool_sup.erl index 587149134ee..7db063b5e33 100644 --- a/src/wpool/mongoose_wpool_sup.erl +++ b/src/wpool/mongoose_wpool_sup.erl @@ -37,10 +37,9 @@ %% %% @end %%-------------------------------------------------------------------- --spec(start_link() -> - {ok, Pid :: pid()} | ignore | {error, Reason :: term()}). +-spec start_link() -> supervisor:startlink_ret(). start_link() -> - supervisor:start_link({local, ?SERVER}, ?MODULE, []). + supervisor:start_link({local, ?SERVER}, ?MODULE, noargs). %%%=================================================================== %%% Supervisor callbacks @@ -56,9 +55,8 @@ start_link() -> %% %% @end %%-------------------------------------------------------------------- --spec init(Args :: term()) -> {ok, {#{strategy => one_for_one, intensity => 100, period => 5}, - []}}. -init([]) -> +-spec init(noargs) -> {ok, {supervisor:sup_flags(), [supervisor:child_spec()]}}. +init(noargs) -> SupFlags = #{strategy => one_for_one, intensity => 100, period => 5}, From cf0c309ba4b2de09f4b50bf44c260df68cbd9fff Mon Sep 17 00:00:00 2001 From: Nelson Vides Date: Tue, 4 Feb 2025 09:13:24 +0100 Subject: [PATCH 3/3] Add xmpp_router behaviour specs to implementations --- src/mongoose_router_dynamic_domains.erl | 4 ++++ src/mongoose_router_external.erl | 4 ++++ src/mongoose_router_external_localnode.erl | 4 ++++ src/mongoose_router_global.erl | 4 ++++ src/mongoose_router_localdomain.erl | 4 ++++ 5 files changed, 20 insertions(+) diff --git a/src/mongoose_router_dynamic_domains.erl b/src/mongoose_router_dynamic_domains.erl index 85973aa211b..b78142ef2a4 100644 --- a/src/mongoose_router_dynamic_domains.erl +++ b/src/mongoose_router_dynamic_domains.erl @@ -19,9 +19,13 @@ %% xmpp_router callback -export([filter/4, route/4]). +-spec filter(jid:jid(), jid:jid(), mongoose_acc:t(), exml:element()) -> + drop | xmpp_router:filter(). filter(From, To, Acc, Packet) -> {From, To, Acc, Packet}. +-spec route(jid:jid(), jid:jid(), mongoose_acc:t(), exml:element()) -> + {done, mongoose_acc:t()} | xmpp_router:filter(). route(From, To, Acc, Packet) -> LDstDomain = To#jid.lserver, case mongoose_lazy_routing:maybe_add_domain_or_subdomain(LDstDomain) of diff --git a/src/mongoose_router_external.erl b/src/mongoose_router_external.erl index a55a083e705..d0f1683e429 100644 --- a/src/mongoose_router_external.erl +++ b/src/mongoose_router_external.erl @@ -15,9 +15,13 @@ %% xmpp_router callback -export([filter/4, route/4]). +-spec filter(jid:jid(), jid:jid(), mongoose_acc:t(), exml:element()) -> + drop | xmpp_router:filter(). filter(OrigFrom, OrigTo, OrigAcc, OrigPacket) -> {OrigFrom, OrigTo, OrigAcc, OrigPacket}. +-spec route(jid:jid(), jid:jid(), mongoose_acc:t(), exml:element()) -> + {done, mongoose_acc:t()} | xmpp_router:filter(). route(From, To, Acc0, Packet) -> LDstDomain = To#jid.lserver, case mongoose_component:lookup_component(LDstDomain) of diff --git a/src/mongoose_router_external_localnode.erl b/src/mongoose_router_external_localnode.erl index e09441b39cd..10bc3ec9384 100644 --- a/src/mongoose_router_external_localnode.erl +++ b/src/mongoose_router_external_localnode.erl @@ -16,9 +16,13 @@ %% xmpp_router callback -export([filter/4, route/4]). +-spec filter(jid:jid(), jid:jid(), mongoose_acc:t(), exml:element()) -> + drop | xmpp_router:filter(). filter(OrigFrom, OrigTo, OrigAcc, OrigPacket) -> {OrigFrom, OrigTo, OrigAcc, OrigPacket}. +-spec route(jid:jid(), jid:jid(), mongoose_acc:t(), exml:element()) -> + {done, mongoose_acc:t()} | xmpp_router:filter(). route(From, To, Acc0, Packet) -> LDstDomain = To#jid.lserver, case mongoose_component:lookup_component(LDstDomain, node()) of diff --git a/src/mongoose_router_global.erl b/src/mongoose_router_global.erl index d87f7365936..ddf7c740ccd 100644 --- a/src/mongoose_router_global.erl +++ b/src/mongoose_router_global.erl @@ -13,6 +13,8 @@ %% xmpp_router callback -export([filter/4, route/4]). +-spec filter(jid:jid(), jid:jid(), mongoose_acc:t(), exml:element()) -> + drop | xmpp_router:filter(). filter(OrigFrom, OrigTo, OrigAcc, OrigPacket) -> %% Filter globally case mongoose_hooks:filter_packet({OrigFrom, OrigTo, OrigAcc, OrigPacket}) of @@ -22,5 +24,7 @@ filter(OrigFrom, OrigTo, OrigAcc, OrigPacket) -> drop end. +-spec route(jid:jid(), jid:jid(), mongoose_acc:t(), exml:element()) -> + {done, mongoose_acc:t()} | xmpp_router:filter(). route(From, To, Acc, Packet) -> {From, To, Acc, Packet}. diff --git a/src/mongoose_router_localdomain.erl b/src/mongoose_router_localdomain.erl index b41659297e8..c96e323ca30 100644 --- a/src/mongoose_router_localdomain.erl +++ b/src/mongoose_router_localdomain.erl @@ -14,9 +14,13 @@ %% xmpp_router callback -export([filter/4, route/4]). +-spec filter(jid:jid(), jid:jid(), mongoose_acc:t(), exml:element()) -> + drop | xmpp_router:filter(). filter(From, To, Acc, Packet) -> {From, To, Acc, Packet}. +-spec route(jid:jid(), jid:jid(), mongoose_acc:t(), exml:element()) -> + {done, mongoose_acc:t()} | xmpp_router:filter(). route(From, To, Acc0, Packet) -> LDstDomain = To#jid.lserver, case mongoose_router:lookup_route(LDstDomain) of