|
68 | 68 | -type protocol() :: atom(). |
69 | 69 | -type label() :: string(). |
70 | 70 |
|
71 | | --spec start_tcp_listener(listener_config(), integer()) -> 'ok'. |
72 | | --spec start_ssl_listener |
73 | | - (listener_config(), rabbit_types:infos(), integer()) -> 'ok'. |
| 71 | +-spec start_tcp_listener( |
| 72 | + listener_config(), integer()) -> 'ok' | {'error', term()}. |
| 73 | +-spec start_ssl_listener( |
| 74 | + listener_config(), rabbit_types:infos(), integer()) -> 'ok' | {'error', term()}. |
74 | 75 | -spec stop_tcp_listener(listener_config()) -> 'ok'. |
75 | 76 | -spec active_listeners() -> [rabbit_types:listener()]. |
76 | 77 | -spec node_listeners(node()) -> [rabbit_types:listener()]. |
|
118 | 119 | boot() -> |
119 | 120 | ok = record_distribution_listener(), |
120 | 121 | _ = application:start(ranch), |
121 | | - ok = boot_tcp(application:get_env(rabbit, num_tcp_acceptors, 10)), |
122 | | - ok = boot_ssl(application:get_env(rabbit, num_ssl_acceptors, 1)), |
| 122 | + %% Failures will throw exceptions |
| 123 | + _ = boot_listeners(fun boot_tcp/1, application:get_env(rabbit, num_tcp_acceptors, 10), "TCP"), |
| 124 | + _ = boot_listeners(fun boot_tls/1, application:get_env(rabbit, num_ssl_acceptors, 10), "TLS"), |
123 | 125 | _ = maybe_start_proxy_protocol(), |
124 | 126 | ok. |
125 | 127 |
|
| 128 | +boot_listeners(Fun, NumAcceptors, Type) -> |
| 129 | + case Fun(NumAcceptors) of |
| 130 | + ok -> |
| 131 | + ok; |
| 132 | + {error, {could_not_start_listener, Address, Port, Details}} = Error -> |
| 133 | + rabbit_log:error("Failed to start ~s listener [~s]:~p, error: ~p", |
| 134 | + [Type, Address, Port, Details]), |
| 135 | + throw(Error) |
| 136 | + end. |
| 137 | + |
126 | 138 | boot_tcp(NumAcceptors) -> |
127 | 139 | {ok, TcpListeners} = application:get_env(tcp_listeners), |
128 | | - [ok = start_tcp_listener(Listener, NumAcceptors) || Listener <- TcpListeners], |
129 | | - ok. |
| 140 | + case lists:foldl(fun(Listener, ok) -> |
| 141 | + start_tcp_listener(Listener, NumAcceptors); |
| 142 | + (_Listener, Error) -> |
| 143 | + Error |
| 144 | + end, |
| 145 | + ok, TcpListeners) of |
| 146 | + ok -> ok; |
| 147 | + {error, _} = Error -> Error |
| 148 | + end. |
130 | 149 |
|
131 | | -boot_ssl(NumAcceptors) -> |
| 150 | +boot_tls(NumAcceptors) -> |
132 | 151 | case application:get_env(ssl_listeners) of |
133 | 152 | {ok, []} -> |
134 | 153 | ok; |
@@ -212,26 +231,36 @@ tcp_listener_spec(NamePrefix, {IPAddress, Port, Family}, SocketOpts, |
212 | 231 | transient, infinity, supervisor, [tcp_listener_sup]}. |
213 | 232 |
|
214 | 233 | start_tcp_listener(Listener, NumAcceptors) -> |
215 | | - start_listener(Listener, NumAcceptors, amqp, "TCP Listener", tcp_opts()). |
| 234 | + start_listener(Listener, NumAcceptors, amqp, "TCP listener", tcp_opts()). |
216 | 235 |
|
217 | 236 | start_ssl_listener(Listener, SslOpts, NumAcceptors) -> |
218 | | - start_listener(Listener, NumAcceptors, 'amqp/ssl', "SSL Listener", tcp_opts() ++ SslOpts). |
| 237 | + start_listener(Listener, NumAcceptors, 'amqp/ssl', "TLS (SSL) listener", tcp_opts() ++ SslOpts). |
| 238 | + |
219 | 239 |
|
| 240 | +-spec start_listener( |
| 241 | + listener_config(), integer(), protocol(), label(), list()) -> 'ok' | {'error', term()}. |
220 | 242 | start_listener(Listener, NumAcceptors, Protocol, Label, Opts) -> |
221 | | - [start_listener0(Address, NumAcceptors, Protocol, Label, Opts) || |
222 | | - Address <- tcp_listener_addresses(Listener)], |
223 | | - ok. |
| 243 | + lists:foldl(fun (Address, ok) -> |
| 244 | + start_listener0(Address, NumAcceptors, Protocol, Label, Opts); |
| 245 | + (_Address, {error, _} = Error) -> |
| 246 | + Error |
| 247 | + end, ok, tcp_listener_addresses(Listener)). |
224 | 248 |
|
225 | 249 | start_listener0(Address, NumAcceptors, Protocol, Label, Opts) -> |
226 | 250 | Transport = transport(Protocol), |
227 | 251 | Spec = tcp_listener_spec(rabbit_tcp_listener_sup, Address, Opts, |
228 | 252 | Transport, rabbit_connection_sup, [], Protocol, |
229 | 253 | NumAcceptors, Label), |
230 | 254 | case supervisor:start_child(rabbit_sup, Spec) of |
231 | | - {ok, _} -> ok; |
232 | | - {error, {shutdown, _}} -> {IPAddress, Port, _Family} = Address, |
233 | | - exit({could_not_start_tcp_listener, |
234 | | - {rabbit_misc:ntoa(IPAddress), Port}}) |
| 255 | + {ok, _} -> ok; |
| 256 | + {error, {{shutdown, {failed_to_start_child, _, |
| 257 | + {shutdown, {failed_to_start_child, _, |
| 258 | + {listen_error, _, PosixError}}}}}, _}} -> |
| 259 | + {IPAddress, Port, _Family} = Address, |
| 260 | + {error, {could_not_start_listener, rabbit_misc:ntoa(IPAddress), Port, PosixError}}; |
| 261 | + {error, Other} -> |
| 262 | + {IPAddress, Port, _Family} = Address, |
| 263 | + {error, {could_not_start_listener, rabbit_misc:ntoa(IPAddress), Port, Other}} |
235 | 264 | end. |
236 | 265 |
|
237 | 266 | transport(Protocol) -> |
|
0 commit comments