aboutsummaryrefslogtreecommitdiffstats
path: root/src/ranch_server.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/ranch_server.erl')
-rw-r--r--src/ranch_server.erl27
1 files changed, 24 insertions, 3 deletions
diff --git a/src/ranch_server.erl b/src/ranch_server.erl
index a17e103..c6d7c19 100644
--- a/src/ranch_server.erl
+++ b/src/ranch_server.erl
@@ -27,6 +27,8 @@
-export([add_connection/1]).
-export([count_connections/1]).
-export([remove_connection/1]).
+-export([add_connections_counter/1]).
+-export([remove_connections_counter/1]).
%% gen_server.
-export([init/1]).
@@ -95,7 +97,12 @@ add_connection(ListenerPid) ->
%% @doc Count the number of connections in the connection pool.
-spec count_connections(pid()) -> non_neg_integer().
count_connections(ListenerPid) ->
- ets:update_counter(?TAB, {connections, ListenerPid}, 0).
+ try
+ ets:update_counter(?TAB, {connections, ListenerPid}, 0)
+ catch
+ error:badarg -> % Max conns = infinity
+ 0
+ end.
%% @doc Remove a connection from the connection pool.
%%
@@ -104,6 +111,21 @@ count_connections(ListenerPid) ->
remove_connection(ListenerPid) ->
ets:update_counter(?TAB, {connections, ListenerPid}, -1).
+
+%% @doc Add a connections counter to the connection pool
+%%
+%% Should only be used by ranch listeners when settings regarding the max
+%% number of connections change.
+add_connections_counter(Pid) ->
+ true = ets:insert_new(?TAB, {{connections, Pid}, 0}).
+
+%% @doc remove a connections counter from the connection pool
+%%
+%% Should only be used by ranch listeners when settings regarding the max
+%% number of connections change.
+remove_connections_counter(Pid) ->
+ true = ets:delete(?TAB, {connections, Pid}).
+
%% gen_server.
%% @private
@@ -117,7 +139,6 @@ handle_call(_Request, _From, State) ->
%% @private
handle_cast({insert_listener, Ref, Pid}, State=#state{monitors=Monitors}) ->
true = ets:insert_new(?TAB, {{acceptors, Ref}, []}),
- true = ets:insert_new(?TAB, {{connections, Pid}, 0}),
MonitorRef = erlang:monitor(process, Pid),
{noreply, State#state{
monitors=[{{MonitorRef, Pid}, {listener, Ref}}|Monitors]}};
@@ -157,7 +178,7 @@ code_change(_OldVsn, State, _Extra) ->
remove_process(Key = {listener, Ref}, MonitorRef, Pid, Monitors) ->
true = ets:delete(?TAB, Key),
true = ets:delete(?TAB, {acceptors, Ref}),
- true = ets:delete(?TAB, {connections, Pid}),
+ remove_connections_counter(Pid),
lists:keydelete({MonitorRef, Pid}, 1, Monitors);
remove_process(Key = {acceptors, _}, MonitorRef, Pid, Monitors) ->
try