This commit is contained in:
Feng 2015-11-27 22:36:12 +08:00
parent dfbcbf961b
commit e78d4fc39b
1 changed files with 15 additions and 6 deletions

View File

@ -79,6 +79,9 @@
%% Client Pid bind with session %% Client Pid bind with session
client_pid :: pid(), client_pid :: pid(),
%% Old Client Pid that has been kickout
old_client_pid :: pid(),
%% Last packet id of the session %% Last packet id of the session
packet_id = 1, packet_id = 1,
@ -403,11 +406,12 @@ handle_cast({resume, ClientId, ClientPid}, Session = #session{client_id = C
%% Clear awaiting_comp timers %% Clear awaiting_comp timers
[cancel_timer(TRef) || TRef <- maps:values(AwaitingComp)], [cancel_timer(TRef) || TRef <- maps:values(AwaitingComp)],
Session1 = Session#session{client_pid = ClientPid, Session1 = Session#session{client_pid = ClientPid,
clean_sess = false, old_client_pid = OldClientPid,
awaiting_ack = #{}, clean_sess = false,
awaiting_comp = #{}, awaiting_ack = #{},
expired_timer = undefined}, awaiting_comp = #{},
expired_timer = undefined},
%% CleanSess: true -> false? %% CleanSess: true -> false?
if if
@ -561,6 +565,10 @@ handle_info({'EXIT', ClientPid, Reason}, Session = #session{clean_sess = fals
TRef = timer(Expires, expired), TRef = timer(Expires, expired),
hibernate(Session#session{client_pid = undefined, expired_timer = TRef}); hibernate(Session#session{client_pid = undefined, expired_timer = TRef});
handle_info({'EXIT', Pid, _Reason}, Session = #session{old_client_pid = Pid}) ->
%%ignore
hibernate(Session);
handle_info({'EXIT', Pid, Reason}, Session = #session{client_pid = ClientPid}) -> handle_info({'EXIT', Pid, Reason}, Session = #session{client_pid = ClientPid}) ->
?LOG(error, "Unexpected EXIT: client_pid=~p, exit_pid=~p, reason=~p", ?LOG(error, "Unexpected EXIT: client_pid=~p, exit_pid=~p, reason=~p",
@ -595,7 +603,8 @@ kick(_ClientId, Pid, Pid) ->
kick(ClientId, OldPid, Pid) -> kick(ClientId, OldPid, Pid) ->
unlink(OldPid), unlink(OldPid),
OldPid ! {shutdown, conflict, {ClientId, Pid}}, OldPid ! {shutdown, conflict, {ClientId, Pid}},
ok. %% Clean noproc
receive {'EXIT', OldPid, _} -> ok after 0 -> ok end.
%%------------------------------------------------------------------------------ %%------------------------------------------------------------------------------
%% Check inflight and awaiting_rel %% Check inflight and awaiting_rel