From b4b7e8a7a694b3473dcecdbf117e007ad22b8fb1 Mon Sep 17 00:00:00 2001 From: Anders Svensson Date: Sat, 11 Jun 2016 12:05:55 +0200 Subject: Redo transport config server as a gen_server To properly handle system messages. Initially implemented in commit 5ca5fb71. --- lib/diameter/src/base/diameter_config.erl | 59 +++++++++++++------------------ 1 file changed, 24 insertions(+), 35 deletions(-) diff --git a/lib/diameter/src/base/diameter_config.erl b/lib/diameter/src/base/diameter_config.erl index 73b828536b..3074b65e02 100644 --- a/lib/diameter/src/base/diameter_config.erl +++ b/lib/diameter/src/base/diameter_config.erl @@ -61,8 +61,7 @@ code_change/3]). %% callbacks --export([sync/1, %% diameter_sync requests - remove/0]). %% transport server termination +-export([sync/1]). %% diameter_sync requests %% debug -export([state/0, @@ -72,7 +71,8 @@ -include("diameter_internal.hrl"). %% Server state. --record(state, {id = diameter_lib:now()}). +-record(state, {id = diameter_lib:now(), + role :: server | transport}). %% Registered name of the server. -define(SERVER, ?MODULE). @@ -292,7 +292,7 @@ uptime() -> %% ?SERVER start. init([]) -> - {ok, #state{}}; + {ok, #state{role = server}}; %% Child start as a consequence of add_transport. init({SvcName, Type, Opts}) -> @@ -302,31 +302,16 @@ init({SvcName, Type, Opts}) -> ?FAILURE(Reason) -> {error, Reason} end, proc_lib:init_ack({ok, self(), Res}), - sleep(Res). + loop(Res). -%% sleep/1 +%% loop/1 -sleep({ok, _}) -> - sleep(); +loop({ok, _}) -> + gen_server:enter_loop(?MODULE, [], #state{role = transport}); -sleep({error, _}) -> +loop({error, _}) -> ok. %% die -%% sleep/0 - -sleep() -> - proc_lib:hibernate(?MODULE, remove, []). - -%% remove/0 - -remove() -> - receive - {?MODULE, stop} -> - ok; - _ -> - sleep() - end. - %%% ---------------------------------------------------------- %%% # handle_call/2 %%% ---------------------------------------------------------- @@ -334,8 +319,8 @@ remove() -> handle_call(state, _, State) -> {reply, State, State}; -handle_call(uptime, _, #state{id = Time} = State) -> - {reply, diameter_lib:now_diff(Time), State}; +handle_call(uptime, _, #state{id = Time} = S) -> + {reply, diameter_lib:now_diff(Time), S}; handle_call(Req, From, State) -> ?UNEXPECTED([Req, From]), @@ -354,30 +339,34 @@ handle_cast(Msg, State) -> %%% # handle_info/2 %%% ---------------------------------------------------------- +%% remove_transport is telling published child to die. +handle_info(stop, #state{role = transport} = S) -> + {stop, normal, S}; + %% A service process has died. This is most likely a consequence of %% stop_service, in which case the restart will find no config for the %% service and do nothing. The entry keyed on the monitor ref is only %% removed as a result of the 'DOWN' notification however. -handle_info({'DOWN', MRef, process, _, Reason}, State) -> +handle_info({'DOWN', MRef, process, _, Reason}, #state{role = server} = S) -> [#monitor{service = SvcName} = T] = select([{#monitor{mref = MRef, _ = '_'}, [], ['$_']}]), queue_restart(Reason, SvcName), delete_object(T), - {noreply, State}; + {noreply, S}; -handle_info({monitor, SvcName, Pid}, State) -> +handle_info({monitor, SvcName, Pid}, #state{role = server} = S) -> monitor(Pid, SvcName), - {noreply, State}; + {noreply, S}; -handle_info({restart, SvcName}, State) -> +handle_info({restart, SvcName}, #state{role = server} = S) -> restart(SvcName), - {noreply, State}; + {noreply, S}; -handle_info(restart, State) -> +handle_info(restart, #state{role = server} = S) -> restart(), - {noreply, State}; + {noreply, S}; handle_info(Info, State) -> ?UNEXPECTED([Info]), @@ -667,7 +656,7 @@ remove(SvcName, L) -> stop_child(Ref) -> case diameter_reg:match(?TRANSPORT_KEY(Ref)) of [{_, Pid}] -> %% tell the transport-specific child to die - Pid ! {?MODULE, stop}; + Pid ! stop; [] -> %% already removed/dead ok end. -- cgit v1.2.3 From 1e153ca0258c7f14d65c41873b2c2034dc607181 Mon Sep 17 00:00:00 2001 From: Anders Svensson Date: Sat, 11 Jun 2016 14:45:12 +0200 Subject: Remove unnecessary no_auto_import Not difficult to avoid, and better without. --- lib/diameter/src/base/diameter_config.erl | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/lib/diameter/src/base/diameter_config.erl b/lib/diameter/src/base/diameter_config.erl index 3074b65e02..fdbbd412a1 100644 --- a/lib/diameter/src/base/diameter_config.erl +++ b/lib/diameter/src/base/diameter_config.erl @@ -38,8 +38,6 @@ -module(diameter_config). -behaviour(gen_server). --compile({no_auto_import, [monitor/2]}). - -export([start_service/2, stop_service/1, add_transport/2, @@ -357,7 +355,7 @@ handle_info({'DOWN', MRef, process, _, Reason}, #state{role = server} = S) -> {noreply, S}; handle_info({monitor, SvcName, Pid}, #state{role = server} = S) -> - monitor(Pid, SvcName), + insert_monitor(Pid, SvcName), {noreply, S}; handle_info({restart, SvcName}, #state{role = server} = S) -> @@ -480,8 +478,8 @@ startmon(SvcName, {ok, Pid}) -> startmon(_, {error, _}) -> ok. -monitor(Pid, SvcName) -> - MRef = erlang:monitor(process, Pid), +insert_monitor(Pid, SvcName) -> + MRef = monitor(process, Pid), insert(#monitor{mref = MRef, service = SvcName}). %% queue_restart/2 -- cgit v1.2.3 From 010925dd108b560ed86d9e0d8f48beefd677728e Mon Sep 17 00:00:00 2001 From: Anders Svensson Date: Sat, 11 Jun 2016 20:31:39 +0200 Subject: Fix testsuite match blunder That missed comm_up when something like the following was received on FreeBSD (for one): {sctp,#Port<0.599>, {127,0,0,1}, 45455, {[{sctp_sndrcvinfo,0,0,[],0,0,0,0,145060462,3}], {sctp_assoc_change,comm_up,0,10,10,3}}} --- lib/diameter/test/diameter_gen_sctp_SUITE.erl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/diameter/test/diameter_gen_sctp_SUITE.erl b/lib/diameter/test/diameter_gen_sctp_SUITE.erl index cbd7fc8ec5..79db39ca45 100644 --- a/lib/diameter/test/diameter_gen_sctp_SUITE.erl +++ b/lib/diameter/test/diameter_gen_sctp_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2010-2015. All Rights Reserved. +%% Copyright Ericsson AB 2010-2016. All Rights Reserved. %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. @@ -365,8 +365,8 @@ open(Opts) -> assoc(Sock) -> receive - ?SCTP(Sock, {[], #sctp_assoc_change{state = S, - assoc_id = Id}}) -> + ?SCTP(Sock, {_, #sctp_assoc_change{state = S, + assoc_id = Id}}) -> comm_up = S, %% assert Id end. -- cgit v1.2.3