Skip to content

Commit

Permalink
Merge 43af862 into e150e09
Browse files Browse the repository at this point in the history
  • Loading branch information
qzhuyan committed Nov 20, 2023
2 parents e150e09 + 43af862 commit cc93781
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 4 deletions.
6 changes: 4 additions & 2 deletions src/esockd_acceptor.erl
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ handle_event(internal, begin_waiting, waiting, State = #state{lsock = LSock}) ->
{error, closed} ->
{stop, normal, State};
{error, Reason} ->
error_logger:error_msg("~p async_accept error: ~p", [?MODULE, Reason]),
{stop, Reason, State}
end;
handle_event(
Expand Down Expand Up @@ -210,8 +211,9 @@ handle_event(Type, Content, StateName, _) ->
),
keep_state_and_data.

terminate(_Reason, _StateName, #state{lsock = LSock}) ->
close(LSock).
terminate(Reason, _StateName, #state{}) ->
error_logger:error_msg("~p terminating due to ~p", [?MODULE, Reason]),
ok.

code_change(_OldVsn, StateName, State, _Extra) ->
{ok, StateName, State}.
Expand Down
4 changes: 2 additions & 2 deletions src/esockd_acceptor_sup.erl
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,8 @@ count_acceptors(AcceptorSup) ->

init([Proto, ListenOn, ConnSup, TuneFun, UpgradeFuns, Limiter]) ->
SupFlags = #{strategy => simple_one_for_one,
intensity => 100,
period => 3600
intensity => 0,
period => 1
},
Acceptor = #{id => acceptor,
start => {esockd_acceptor, start_link,
Expand Down
11 changes: 11 additions & 0 deletions src/esockd_listener.erl
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@

-export([ options/1
, get_port/1
, get_lsock/1
]).

%% gen_server callbacks
Expand Down Expand Up @@ -65,6 +66,10 @@ options(Listener) ->
get_port(Listener) ->
gen_server:call(Listener, get_port).

-spec get_lsock(pid()) -> inet:socket().
get_lsock(Listener) ->
gen_server:call(Listener, get_lsock).

%%--------------------------------------------------------------------
%% gen_server callbacks
%%--------------------------------------------------------------------
Expand Down Expand Up @@ -109,6 +114,9 @@ handle_call(options, _From, State = #state{options = Opts}) ->
handle_call(get_port, _From, State = #state{lport = LPort}) ->
{reply, LPort, State};

handle_call(get_lsock, _From, State = #state{lsock = LSock}) ->
{reply, LSock, State};

handle_call(Req, _From, State) ->
error_logger:error_msg("[~s] Unexpected call: ~p", [?MODULE, Req]),
{noreply, State}.
Expand All @@ -117,6 +125,9 @@ handle_cast(Msg, State) ->
error_logger:error_msg("[~s] Unexpected cast: ~p", [?MODULE, Msg]),
{noreply, State}.

handle_info({'EXIT', LSock, _}, #state{lsock = LSock} = State) ->
error_logger:error_msg("~s Lsocket ~p closed", [?MODULE, LSock]),
{stop, lsock_closed, State};
handle_info(Info, State) ->
error_logger:error_msg("[~s] Unexpected info: ~p", [?MODULE, Info]),
{noreply, State}.
Expand Down
48 changes: 48 additions & 0 deletions test/esockd_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -416,6 +416,54 @@ t_tune_fun_ok(_) ->
?assertEqual(1, proplists:get_value(accepted, Cnts)),
ok = esockd:close(Name, LPort).

t_listener_handle_port_exit(_) ->
LPort = 7005,
Name = ?FUNCTION_NAME,
%% GIVEN: when listener is started
{ok, LSup} = esockd:open(Name, LPort, [],
{echo_server, start_link, []}),

L = esockd_listener_sup:listener(LSup),
PortInUse = esockd_listener:get_port(L),
?assertEqual(LPort, PortInUse),
LSock = esockd_listener:get_lsock(L),
erlang:process_flag(trap_exit, true),
link(L),
Acceptors = get_acceptors(LSup),
?assertNotEqual([], Acceptors),

%% WHEN: when port is closed
erlang:port_close(LSock),
%% THEN: listener process should EXIT, ABNORMALLY
receive
{'EXIT', L, lsock_closed} ->
ok
after 300 ->
ct:fail(listener_still_alive)
end,

%% THEN: listener should be restarted
NewListener = esockd_listener_sup:listener(LSup),
?assertNotEqual(L, NewListener),

%% THEN: listener should be listening on the same port
?assertEqual(PortInUse, esockd_listener:get_port(NewListener)),
?assertMatch({error, eaddrinuse}, gen_tcp:listen(PortInUse, [])),

%% THEN: New acceptors should be started with new LSock to accept,
%% (old acceptors should be terminated due to `closed')
NewAcceptors = get_acceptors(LSup),
?assertNotEqual([], NewAcceptors),
?assert(sets:is_empty(sets:intersection(sets:from_list(Acceptors), sets:from_list(NewAcceptors)))),

ok = esockd:close(Name, LPort).

%% helper
sock_tune_fun(Ret) ->
Ret.

-spec get_acceptors(supervisor:supervisor()) -> [Acceptor::pid()].
get_acceptors(LSup) ->
Children = supervisor:which_children(LSup),
{acceptor_sup, AcceptorSup, _, _} = lists:keyfind(acceptor_sup, 1, Children),
supervisor:which_children(AcceptorSup).

0 comments on commit cc93781

Please sign in to comment.