diff options
author | juhlig <[email protected]> | 2019-04-30 16:13:07 +0200 |
---|---|---|
committer | Loïc Hoguin <[email protected]> | 2019-05-06 10:08:58 +0200 |
commit | f07391b5eb8ef4f6c22d1666105db9856f5f1b66 (patch) | |
tree | d5e0ada912374cbbfed6d78072b7fd4160458e41 /src/ranch_acceptor.erl | |
parent | 7cbc7fed32940a4aa7beedec9cac23376a19a8c0 (diff) | |
download | ranch-f07391b5eb8ef4f6c22d1666105db9856f5f1b66.tar.gz ranch-f07391b5eb8ef4f6c22d1666105db9856f5f1b66.tar.bz2 ranch-f07391b5eb8ef4f6c22d1666105db9856f5f1b66.zip |
Create one ranch_conns_sup per num_acceptor
This gets rid of a bottleneck that occurs when many connections
are handled by a single supervisor. The bigger issue occurred
when many connections were dropped at once and the supervisor
couldn't keep up.
Diffstat (limited to 'src/ranch_acceptor.erl')
-rw-r--r-- | src/ranch_acceptor.erl | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/src/ranch_acceptor.erl b/src/ranch_acceptor.erl index 3e426bd..935ec5c 100644 --- a/src/ranch_acceptor.erl +++ b/src/ranch_acceptor.erl @@ -15,23 +15,25 @@ -module(ranch_acceptor). -export([start_link/4]). --export([loop/4]). +-export([loop/5]). -spec start_link(inet:socket(), module(), module(), pid()) -> {ok, pid()}. start_link(LSocket, Transport, Logger, ConnsSup) -> - Pid = spawn_link(?MODULE, loop, [LSocket, Transport, Logger, ConnsSup]), + MonitorRef = monitor(process, ConnsSup), + Pid = spawn_link(?MODULE, loop, [LSocket, Transport, Logger, ConnsSup, MonitorRef]), {ok, Pid}. --spec loop(inet:socket(), module(), module(), pid()) -> no_return(). -loop(LSocket, Transport, Logger, ConnsSup) -> +-spec loop(inet:socket(), module(), module(), pid(), reference()) -> no_return(). +loop(LSocket, Transport, Logger, ConnsSup, MonitorRef) -> _ = case Transport:accept(LSocket, infinity) of {ok, CSocket} -> case Transport:controlling_process(CSocket, ConnsSup) of ok -> %% This call will not return until process has been started %% AND we are below the maximum number of connections. - ranch_conns_sup:start_protocol(ConnsSup, CSocket); + ranch_conns_sup:start_protocol(ConnsSup, MonitorRef, + CSocket); {error, _} -> Transport:close(CSocket) end; @@ -51,7 +53,7 @@ loop(LSocket, Transport, Logger, ConnsSup) -> ok end, flush(Logger), - ?MODULE:loop(LSocket, Transport, Logger, ConnsSup). + ?MODULE:loop(LSocket, Transport, Logger, ConnsSup, MonitorRef). flush(Logger) -> receive Msg -> |