gsups_server: Monitor epdg_ue_fsm instead of linking it
We want to be notified about the FSM going down, instead of having the supervisor restart it (and potentially restarting the whole set of children with it...). Change-Id: I96284aa8752d317cfb5f5c4565d7dea09e56171f
This commit is contained in:
parent
6107d8f549
commit
3aaee678e9
|
@ -39,7 +39,7 @@
|
||||||
-include_lib("gtp_utils.hrl").
|
-include_lib("gtp_utils.hrl").
|
||||||
-include("conv.hrl").
|
-include("conv.hrl").
|
||||||
|
|
||||||
-export([start_link/1, stop/1]).
|
-export([start_monitor/1, stop/1]).
|
||||||
-export([init/1,callback_mode/0,terminate/3]).
|
-export([init/1,callback_mode/0,terminate/3]).
|
||||||
-export([get_server_name_by_imsi/1, get_pid_by_imsi/1]).
|
-export([get_server_name_by_imsi/1, get_pid_by_imsi/1]).
|
||||||
-export([auth_request/2, lu_request/1, tunnel_request/2, purge_ms_request/1]).
|
-export([auth_request/2, lu_request/1, tunnel_request/2, purge_ms_request/1]).
|
||||||
|
@ -68,13 +68,18 @@ get_pid_by_imsi(Imsi) ->
|
||||||
ServerName = get_server_name_by_imsi(Imsi),
|
ServerName = get_server_name_by_imsi(Imsi),
|
||||||
whereis(ServerName).
|
whereis(ServerName).
|
||||||
|
|
||||||
start_link(Imsi) ->
|
start_monitor(Imsi) ->
|
||||||
ServerName = get_server_name_by_imsi(Imsi),
|
ServerName = get_server_name_by_imsi(Imsi),
|
||||||
lager:info("ue_fsm start_link(~p)~n", [ServerName]),
|
lager:info("ue_fsm start_monitor(~p)~n", [ServerName]),
|
||||||
gen_statem:start_link({local, ServerName}, ?MODULE, Imsi, [{debug, [trace]}]).
|
gen_statem:start_monitor({local, ServerName}, ?MODULE, Imsi, [{debug, [trace]}]).
|
||||||
|
|
||||||
stop(SrvRef) ->
|
stop(SrvRef) ->
|
||||||
gen_statem:stop(SrvRef).
|
try
|
||||||
|
gen_statem:stop(SrvRef)
|
||||||
|
catch
|
||||||
|
exit:Err ->
|
||||||
|
{error, Err}
|
||||||
|
end.
|
||||||
|
|
||||||
auth_request(Pid, {PdpTypeNr, Apn}) ->
|
auth_request(Pid, {PdpTypeNr, Apn}) ->
|
||||||
lager:info("ue_fsm auth_request~n", []),
|
lager:info("ue_fsm auth_request~n", []),
|
||||||
|
|
|
@ -55,7 +55,8 @@
|
||||||
|
|
||||||
-record(gsups_ue, {
|
-record(gsups_ue, {
|
||||||
imsi :: binary(),
|
imsi :: binary(),
|
||||||
pid :: pid()
|
pid :: pid(),
|
||||||
|
mref :: reference()
|
||||||
}).
|
}).
|
||||||
|
|
||||||
-export([start_link/3]).
|
-export([start_link/3]).
|
||||||
|
@ -246,8 +247,8 @@ handle_info({ipa, Socket, ?IPAC_PROTO_EXT_GSUP, GsupMsgRx = #{message_type := se
|
||||||
cause => ?GSUP_CAUSE_NET_FAIL
|
cause => ?GSUP_CAUSE_NET_FAIL
|
||||||
},
|
},
|
||||||
tx_gsup(Socket, Resp),
|
tx_gsup(Socket, Resp),
|
||||||
epdg_ue_fsm:stop(UE#gsups_ue.pid),
|
State2 = delete_gsups_ue(UE, State1),
|
||||||
State2 = delete_gsups_ue(UE, State1)
|
epdg_ue_fsm:stop(UE#gsups_ue.pid)
|
||||||
end,
|
end,
|
||||||
{noreply, State2};
|
{noreply, State2};
|
||||||
|
|
||||||
|
@ -340,6 +341,11 @@ handle_info({ipa, Socket, ?IPAC_PROTO_EXT_GSUP, GsupMsgRx = #{message_type := lo
|
||||||
end,
|
end,
|
||||||
{noreply, State1};
|
{noreply, State1};
|
||||||
|
|
||||||
|
handle_info({'DOWN', MRef, process, Pid, Reason}, State0) ->
|
||||||
|
lager:notice("GSUP: epdg_ue_fsm ~p exited, reason: ~p~n", [Pid, Reason]),
|
||||||
|
State1 = delete_gsups_ue_by_mref(MRef, State0),
|
||||||
|
{noreply, State1};
|
||||||
|
|
||||||
handle_info(Info, S) ->
|
handle_info(Info, S) ->
|
||||||
error_logger:error_report(["unknown handle_info", {module, ?MODULE}, {info, Info}, {state, S}]),
|
error_logger:error_report(["unknown handle_info", {module, ?MODULE}, {info, Info}, {state, S}]),
|
||||||
{noreply, S}.
|
{noreply, S}.
|
||||||
|
@ -381,8 +387,14 @@ tx_gsup(Socket, Msg) ->
|
||||||
|
|
||||||
|
|
||||||
new_gsups_ue(Imsi, State) ->
|
new_gsups_ue(Imsi, State) ->
|
||||||
{ok, Pid} = epdg_ue_fsm:start_link(Imsi),
|
case epdg_ue_fsm:start_monitor(Imsi) of
|
||||||
UE = #gsups_ue{imsi = Imsi, pid = Pid},
|
{ok, {Pid, MRef}} -> ok;
|
||||||
|
{error,{already_started,PrevPid}} ->
|
||||||
|
lager:notice("epdg_ue_fsm for Imsi ~p already existed, reusing!: ~p~n", [Imsi, PrevPid]),
|
||||||
|
Pid = PrevPid,
|
||||||
|
MRef = erlang:monitor(process, Pid)
|
||||||
|
end,
|
||||||
|
UE = #gsups_ue{imsi = Imsi, pid = Pid, mref = MRef},
|
||||||
NewSt = State#gsups_state{ues = sets:add_element(UE, State#gsups_state.ues)},
|
NewSt = State#gsups_state{ues = sets:add_element(UE, State#gsups_state.ues)},
|
||||||
{UE, NewSt}.
|
{UE, NewSt}.
|
||||||
|
|
||||||
|
@ -396,6 +408,15 @@ find_gsups_ue_by_imsi(Imsi, State) ->
|
||||||
State#gsups_state.ues),
|
State#gsups_state.ues),
|
||||||
Res.
|
Res.
|
||||||
|
|
||||||
|
find_gsups_ue_by_mref(MRef, State) ->
|
||||||
|
{MRef, Res} = sets:fold(
|
||||||
|
fun(SessIt = #gsups_ue{imsi = LookupMRef}, {LookupMRef, _AccIn}) -> {LookupMRef, SessIt};
|
||||||
|
(_, AccIn) -> AccIn
|
||||||
|
end,
|
||||||
|
{MRef, undefined},
|
||||||
|
State#gsups_state.ues),
|
||||||
|
Res.
|
||||||
|
|
||||||
find_or_new_gsups_ue(Imsi, State) ->
|
find_or_new_gsups_ue(Imsi, State) ->
|
||||||
UE = find_gsups_ue_by_imsi(Imsi, State),
|
UE = find_gsups_ue_by_imsi(Imsi, State),
|
||||||
case UE of
|
case UE of
|
||||||
|
@ -406,6 +427,7 @@ find_or_new_gsups_ue(Imsi, State) ->
|
||||||
end.
|
end.
|
||||||
|
|
||||||
delete_gsups_ue(UE, State) ->
|
delete_gsups_ue(UE, State) ->
|
||||||
|
erlang:demonitor(UE#gsups_ue.mref, [flush]),
|
||||||
SetRemoved = sets:del_element(UE, State#gsups_state.ues),
|
SetRemoved = sets:del_element(UE, State#gsups_state.ues),
|
||||||
lager:debug("Removed UE ~p from ~p~n", [UE, SetRemoved]),
|
lager:debug("Removed UE ~p from ~p~n", [UE, SetRemoved]),
|
||||||
State#gsups_state{ues = SetRemoved}.
|
State#gsups_state{ues = SetRemoved}.
|
||||||
|
@ -414,4 +436,10 @@ delete_gsups_ue_by_imsi(Imsi, State) ->
|
||||||
case find_gsups_ue_by_imsi(Imsi, State) of
|
case find_gsups_ue_by_imsi(Imsi, State) of
|
||||||
undefined -> State;
|
undefined -> State;
|
||||||
UE-> delete_gsups_ue(UE, State)
|
UE-> delete_gsups_ue(UE, State)
|
||||||
|
end.
|
||||||
|
|
||||||
|
delete_gsups_ue_by_mref(MRef, State) ->
|
||||||
|
case find_gsups_ue_by_mref(MRef, State) of
|
||||||
|
undefined -> State;
|
||||||
|
UE-> delete_gsups_ue(UE, State)
|
||||||
end.
|
end.
|
Loading…
Reference in New Issue