Make number of Ranch acceptors configurable
This commit is contained in:
parent
b54bd04bfc
commit
8f0c62bba4
|
|
@ -28,7 +28,7 @@
|
||||||
%%
|
%%
|
||||||
%% See also tcp_listener_sup and tcp_listener.
|
%% See also tcp_listener_sup and tcp_listener.
|
||||||
|
|
||||||
-export([boot/0, start_tcp_listener/1, start_ssl_listener/2,
|
-export([boot/0, start_tcp_listener/2, start_ssl_listener/3,
|
||||||
stop_tcp_listener/1, on_node_down/1, active_listeners/0,
|
stop_tcp_listener/1, on_node_down/1, active_listeners/0,
|
||||||
node_listeners/1, register_connection/1, unregister_connection/1,
|
node_listeners/1, register_connection/1, unregister_connection/1,
|
||||||
connections/0, connection_info_keys/0,
|
connections/0, connection_info_keys/0,
|
||||||
|
|
@ -37,7 +37,7 @@
|
||||||
close_connection/2, force_connection_event_refresh/1, tcp_host/1]).
|
close_connection/2, force_connection_event_refresh/1, tcp_host/1]).
|
||||||
|
|
||||||
%% Used by TCP-based transports, e.g. STOMP adapter
|
%% Used by TCP-based transports, e.g. STOMP adapter
|
||||||
-export([tcp_listener_addresses/1, tcp_listener_spec/8,
|
-export([tcp_listener_addresses/1, tcp_listener_spec/9,
|
||||||
ensure_ssl/0, fix_ssl_options/1, poodle_check/1]).
|
ensure_ssl/0, fix_ssl_options/1, poodle_check/1]).
|
||||||
|
|
||||||
-export([tcp_listener_started/3, tcp_listener_stopped/3]).
|
-export([tcp_listener_started/3, tcp_listener_stopped/3]).
|
||||||
|
|
@ -99,9 +99,9 @@
|
||||||
|
|
||||||
-spec(on_node_down/1 :: (node()) -> 'ok').
|
-spec(on_node_down/1 :: (node()) -> 'ok').
|
||||||
-spec(tcp_listener_addresses/1 :: (listener_config()) -> [address()]).
|
-spec(tcp_listener_addresses/1 :: (listener_config()) -> [address()]).
|
||||||
-spec(tcp_listener_spec/8 ::
|
-spec(tcp_listener_spec/9 ::
|
||||||
(name_prefix(), address(), [gen_tcp:listen_option()], module(), module(), protocol(), any(),
|
(name_prefix(), address(), [gen_tcp:listen_option()], module(), module(), protocol(), any(),
|
||||||
label()) -> supervisor:child_spec()).
|
non_neg_integer(), label()) -> supervisor:child_spec()).
|
||||||
-spec(ensure_ssl/0 :: () -> rabbit_types:infos()).
|
-spec(ensure_ssl/0 :: () -> rabbit_types:infos()).
|
||||||
-spec(fix_ssl_options/1 :: (rabbit_types:infos()) -> rabbit_types:infos()).
|
-spec(fix_ssl_options/1 :: (rabbit_types:infos()) -> rabbit_types:infos()).
|
||||||
-spec(poodle_check/1 :: (atom()) -> 'ok' | 'danger').
|
-spec(poodle_check/1 :: (atom()) -> 'ok' | 'danger').
|
||||||
|
|
@ -129,22 +129,22 @@
|
||||||
boot() ->
|
boot() ->
|
||||||
ok = record_distribution_listener(),
|
ok = record_distribution_listener(),
|
||||||
_ = application:start(ranch),
|
_ = application:start(ranch),
|
||||||
ok = boot_tcp(),
|
ok = boot_tcp(application:get_env(rabbit, num_tcp_acceptors, 10)),
|
||||||
ok = boot_ssl().
|
ok = boot_ssl(application:get_env(rabbit, num_ssl_acceptors, 1)).
|
||||||
|
|
||||||
boot_tcp() ->
|
boot_tcp(NumAcceptors) ->
|
||||||
{ok, TcpListeners} = application:get_env(tcp_listeners),
|
{ok, TcpListeners} = application:get_env(tcp_listeners),
|
||||||
[ok = start_tcp_listener(Listener) || Listener <- TcpListeners],
|
[ok = start_tcp_listener(Listener, NumAcceptors) || Listener <- TcpListeners],
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
boot_ssl() ->
|
boot_ssl(NumAcceptors) ->
|
||||||
case application:get_env(ssl_listeners) of
|
case application:get_env(ssl_listeners) of
|
||||||
{ok, []} ->
|
{ok, []} ->
|
||||||
ok;
|
ok;
|
||||||
{ok, SslListeners} ->
|
{ok, SslListeners} ->
|
||||||
SslOpts = ensure_ssl(),
|
SslOpts = ensure_ssl(),
|
||||||
case poodle_check('AMQP') of
|
case poodle_check('AMQP') of
|
||||||
ok -> [start_ssl_listener(L, SslOpts) || L <- SslListeners];
|
ok -> [start_ssl_listener(L, SslOpts, NumAcceptors) || L <- SslListeners];
|
||||||
danger -> ok
|
danger -> ok
|
||||||
end,
|
end,
|
||||||
ok
|
ok
|
||||||
|
|
@ -287,33 +287,34 @@ tcp_listener_addresses_auto(Port) ->
|
||||||
Listener <- port_to_listeners(Port)]).
|
Listener <- port_to_listeners(Port)]).
|
||||||
|
|
||||||
tcp_listener_spec(NamePrefix, {IPAddress, Port, Family}, SocketOpts,
|
tcp_listener_spec(NamePrefix, {IPAddress, Port, Family}, SocketOpts,
|
||||||
Transport, ProtoSup, ProtoOpts, Protocol, Label) ->
|
Transport, ProtoSup, ProtoOpts, Protocol, NumAcceptors, Label) ->
|
||||||
{rabbit_misc:tcp_name(NamePrefix, IPAddress, Port),
|
{rabbit_misc:tcp_name(NamePrefix, IPAddress, Port),
|
||||||
{tcp_listener_sup, start_link,
|
{tcp_listener_sup, start_link,
|
||||||
[IPAddress, Port, Transport, [Family | SocketOpts], ProtoSup, ProtoOpts,
|
[IPAddress, Port, Transport, [Family | SocketOpts], ProtoSup, ProtoOpts,
|
||||||
{?MODULE, tcp_listener_started, [Protocol]},
|
{?MODULE, tcp_listener_started, [Protocol]},
|
||||||
{?MODULE, tcp_listener_stopped, [Protocol]},
|
{?MODULE, tcp_listener_stopped, [Protocol]},
|
||||||
Label]},
|
NumAcceptors, Label]},
|
||||||
transient, infinity, supervisor, [tcp_listener_sup]}.
|
transient, infinity, supervisor, [tcp_listener_sup]}.
|
||||||
|
|
||||||
start_tcp_listener(Listener) ->
|
start_tcp_listener(Listener, NumAcceptors) ->
|
||||||
start_listener(Listener, amqp, "TCP Listener", tcp_opts()).
|
start_listener(Listener, NumAcceptors, amqp, "TCP Listener", tcp_opts()).
|
||||||
|
|
||||||
start_ssl_listener(Listener, SslOpts) ->
|
start_ssl_listener(Listener, SslOpts, NumAcceptors) ->
|
||||||
start_listener(Listener, 'amqp/ssl', "SSL Listener", tcp_opts() ++ SslOpts).
|
start_listener(Listener, NumAcceptors, 'amqp/ssl', "SSL Listener", tcp_opts() ++ SslOpts).
|
||||||
|
|
||||||
start_listener(Listener, Protocol, Label, Opts) ->
|
start_listener(Listener, NumAcceptors, Protocol, Label, Opts) ->
|
||||||
[start_listener0(Address, Protocol, Label, Opts) ||
|
[start_listener0(Address, NumAcceptors, Protocol, Label, Opts) ||
|
||||||
Address <- tcp_listener_addresses(Listener)],
|
Address <- tcp_listener_addresses(Listener)],
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
start_listener0(Address, Protocol, Label, Opts) ->
|
start_listener0(Address, NumAcceptors, Protocol, Label, Opts) ->
|
||||||
Transport = case Protocol of
|
Transport = case Protocol of
|
||||||
amqp -> ranch_tcp;
|
amqp -> ranch_tcp;
|
||||||
'amqp/ssl' -> ranch_ssl
|
'amqp/ssl' -> ranch_ssl
|
||||||
end,
|
end,
|
||||||
Spec = tcp_listener_spec(rabbit_tcp_listener_sup, Address, Opts,
|
Spec = tcp_listener_spec(rabbit_tcp_listener_sup, Address, Opts,
|
||||||
Transport, rabbit_connection_sup, [], Protocol, Label),
|
Transport, rabbit_connection_sup, [], Protocol,
|
||||||
|
NumAcceptors, Label),
|
||||||
case supervisor:start_child(rabbit_sup, Spec) of
|
case supervisor:start_child(rabbit_sup, Spec) of
|
||||||
{ok, _} -> ok;
|
{ok, _} -> ok;
|
||||||
{error, {shutdown, _}} -> {IPAddress, Port, _Family} = Address,
|
{error, {shutdown, _}} -> {IPAddress, Port, _Family} = Address,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue