Merge pull request #45 from rabbitmq/rabbitmq-server-528
Make number of Ranch acceptors configurable
This commit is contained in:
		
						commit
						77f017a795
					
				| 
						 | 
				
			
			@ -28,7 +28,7 @@
 | 
			
		|||
%%
 | 
			
		||||
%% 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,
 | 
			
		||||
         node_listeners/1, register_connection/1, unregister_connection/1,
 | 
			
		||||
         connections/0, connection_info_keys/0,
 | 
			
		||||
| 
						 | 
				
			
			@ -37,7 +37,7 @@
 | 
			
		|||
         close_connection/2, force_connection_event_refresh/1, tcp_host/1]).
 | 
			
		||||
 | 
			
		||||
%% 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]).
 | 
			
		||||
 | 
			
		||||
-export([tcp_listener_started/3, tcp_listener_stopped/3]).
 | 
			
		||||
| 
						 | 
				
			
			@ -99,9 +99,9 @@
 | 
			
		|||
 | 
			
		||||
-spec(on_node_down/1 :: (node()) -> 'ok').
 | 
			
		||||
-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(),
 | 
			
		||||
         label()) -> supervisor:child_spec()).
 | 
			
		||||
         non_neg_integer(), label()) -> supervisor:child_spec()).
 | 
			
		||||
-spec(ensure_ssl/0 :: () -> rabbit_types:infos()).
 | 
			
		||||
-spec(fix_ssl_options/1 :: (rabbit_types:infos()) -> rabbit_types:infos()).
 | 
			
		||||
-spec(poodle_check/1 :: (atom()) -> 'ok' | 'danger').
 | 
			
		||||
| 
						 | 
				
			
			@ -129,22 +129,22 @@
 | 
			
		|||
boot() ->
 | 
			
		||||
    ok = record_distribution_listener(),
 | 
			
		||||
    _ = application:start(ranch),
 | 
			
		||||
    ok = boot_tcp(),
 | 
			
		||||
    ok = boot_ssl().
 | 
			
		||||
    ok = boot_tcp(application:get_env(rabbit, num_tcp_acceptors, 10)),
 | 
			
		||||
    ok = boot_ssl(application:get_env(rabbit, num_ssl_acceptors, 1)).
 | 
			
		||||
 | 
			
		||||
boot_tcp() ->
 | 
			
		||||
boot_tcp(NumAcceptors) ->
 | 
			
		||||
    {ok, TcpListeners} = application:get_env(tcp_listeners),
 | 
			
		||||
    [ok = start_tcp_listener(Listener) || Listener <- TcpListeners],
 | 
			
		||||
    [ok = start_tcp_listener(Listener, NumAcceptors) || Listener <- TcpListeners],
 | 
			
		||||
    ok.
 | 
			
		||||
 | 
			
		||||
boot_ssl() ->
 | 
			
		||||
boot_ssl(NumAcceptors) ->
 | 
			
		||||
    case application:get_env(ssl_listeners) of
 | 
			
		||||
        {ok, []} ->
 | 
			
		||||
            ok;
 | 
			
		||||
        {ok, SslListeners} ->
 | 
			
		||||
            SslOpts = ensure_ssl(),
 | 
			
		||||
            case poodle_check('AMQP') of
 | 
			
		||||
                ok     -> [start_ssl_listener(L, SslOpts) || L <- SslListeners];
 | 
			
		||||
                ok     -> [start_ssl_listener(L, SslOpts, NumAcceptors) || L <- SslListeners];
 | 
			
		||||
                danger -> ok
 | 
			
		||||
            end,
 | 
			
		||||
            ok
 | 
			
		||||
| 
						 | 
				
			
			@ -287,33 +287,34 @@ tcp_listener_addresses_auto(Port) ->
 | 
			
		|||
                     Listener <- port_to_listeners(Port)]).
 | 
			
		||||
 | 
			
		||||
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),
 | 
			
		||||
     {tcp_listener_sup, start_link,
 | 
			
		||||
      [IPAddress, Port, Transport, [Family | SocketOpts], ProtoSup, ProtoOpts,
 | 
			
		||||
       {?MODULE, tcp_listener_started, [Protocol]},
 | 
			
		||||
       {?MODULE, tcp_listener_stopped, [Protocol]},
 | 
			
		||||
       Label]},
 | 
			
		||||
       NumAcceptors, Label]},
 | 
			
		||||
     transient, infinity, supervisor, [tcp_listener_sup]}.
 | 
			
		||||
 | 
			
		||||
start_tcp_listener(Listener) ->
 | 
			
		||||
    start_listener(Listener, amqp, "TCP Listener", tcp_opts()).
 | 
			
		||||
start_tcp_listener(Listener, NumAcceptors) ->
 | 
			
		||||
    start_listener(Listener, NumAcceptors, amqp, "TCP Listener", tcp_opts()).
 | 
			
		||||
 | 
			
		||||
start_ssl_listener(Listener, SslOpts) ->
 | 
			
		||||
    start_listener(Listener, 'amqp/ssl', "SSL Listener", tcp_opts() ++ SslOpts).
 | 
			
		||||
start_ssl_listener(Listener, SslOpts, NumAcceptors) ->
 | 
			
		||||
    start_listener(Listener, NumAcceptors, 'amqp/ssl', "SSL Listener", tcp_opts() ++ SslOpts).
 | 
			
		||||
 | 
			
		||||
start_listener(Listener, Protocol, Label, Opts) ->
 | 
			
		||||
    [start_listener0(Address, Protocol, Label, Opts) ||
 | 
			
		||||
start_listener(Listener, NumAcceptors, Protocol, Label, Opts) ->
 | 
			
		||||
    [start_listener0(Address, NumAcceptors, Protocol, Label, Opts) ||
 | 
			
		||||
        Address <- tcp_listener_addresses(Listener)],
 | 
			
		||||
    ok.
 | 
			
		||||
 | 
			
		||||
start_listener0(Address, Protocol, Label, Opts) ->
 | 
			
		||||
start_listener0(Address, NumAcceptors, Protocol, Label, Opts) ->
 | 
			
		||||
    Transport = case Protocol of
 | 
			
		||||
        amqp -> ranch_tcp;
 | 
			
		||||
        'amqp/ssl' -> ranch_ssl
 | 
			
		||||
    end,
 | 
			
		||||
    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
 | 
			
		||||
        {ok, _}                -> ok;
 | 
			
		||||
        {error, {shutdown, _}} -> {IPAddress, Port, _Family} = Address,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue