Age | Commit message (Collapse) | Author |
|
Lift the restriction that a listener must be suspended before
transport options can be changed.
* Changes to the `max_connections`, `handshake_timeout` and `shutdown`
options will take effect immediately.
* Changes to the `num_acceptors`, `num_listen_sockets` and `socket_opts`
options will take effect when a listener is suspended and resumed, or
when the acceptors supervisor restarts.
* Changes to the `num_conns_sups` and `connection_type` options will only
take effect when the connections super-supervisor restarts.
* Changes to the `logger` option will never take effect, unless a listener
is stopped and started with fresh transport options.
The fetching and handing down of transport options changes with this
commit, to ensure consistency between the individual components in the
hierarchy.
* The `num_acceptors` option is handed down from the listener supervisor to
the acceptors supervisor in the child spec, while the `num_listen_sockets`
and `socket_opts` options are read inside the acceptors supervisor itself.
This way, the `num_acceptors` option will only take effect when the listener
supervisor restarts, whereas the other two options will take effect
when acceptors supervisor restarts. This commit moves the fetching of
the `num_acceptors` option into the acceptors supervisor as well.
* The `logger` option is read in multiple places throughout the hierarchy.
This way it may happen that processes that suffered a crash and restart
may use a different logger than other processes that did not. This commit
reads the `logger` from the transport options given to the listener supervisor
start function, and hands it down from there.
* The `connection_type` option is read individually by each connection supervisor.
This way, a restart of an individual connection supervisor may cause them
to use a different connection type than the others. This commit reads the
transport options in the connections super-supervisor, and hands them down to
the individual connections supervisors.
* The `num_conns_sups` is handed down from the listener supervisor to the
connections super-supervisor. This way, a change to this option will only
take effect when the listener supervisor restarts. This commit moves
the fetching of this option inside the connections super-supervisor. This
change is merely for structural consistency, it is not necessary for operational
consistency.
|
|
|
|
|
|
|
|
When a protocol fails to start, the socket will not be closed.
|
|
|
|
|
|
The callback `ranch_transport:listen/1` has changed to accept a map
of transport options instead of socket options.
|
|
|
|
|
|
It was working already but the types were wrong and some small
details needed to be corrected.
|
|
|
|
With num_listen_sockets>1 and SO_REUSEPORT disabled, the startup of
ranch_acceptors_sup fails because extra sockets cannot be created.
Because ranch_server:set_addr is called right after the creation
of the first socket succeeded, ranch:get_port etc may still return
an ok tuple until it notices that the listener is in fact down.
|
|
|
|
We now require OTP-21+ therefore there's no need to keep
the default of error_logger.
|
|
|
|
|
|
This makes Ranch require OTP-21+. The function ranch:accept_ack/1
was also removed in this commit.
|
|
|
|
|
|
This new option allows configuring the number of connection
supervisors. The old behavior can be obtained by setting this
value to 1. A value larger than num_acceptors will result in
some connection supervisors not being used as the acceptors
currently only use one connection supervisor.
|
|
With the resolution of the pid of a conns_sup in acceptors_sup and thus in
the child spec, a crash of a conns_sup and subsequent crash of the associated
acceptor causes restarts of the acceptor to fail.
|
|
|
|
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.
|
|
|
|
Due to a typo, repeated calls to ranch:remove_connection/1 from a
worker process would crash the respective ranch_conns_sup.
|
|
* Up until OTP 21.0 it was defined on the ssl_cipher[0] module
* On OTP 21.1 it was moved into ssl_cipher_format[1]
* On OTP 21.3 it was moved into ssl[2]
[0]: https://github.com/erlang/otp/blob/OTP-21.0/lib/ssl/src/ssl_cipher.erl#L56-L60
[1]: https://github.com/erlang/otp/blob/OTP-21.1/lib/ssl/src/ssl_cipher_format.erl#L40-L44
[2]: https://github.com/erlang/otp/blob/OTP-21.3/lib/ssl/src/ssl.erl#L136-L140
|
|
Turns out it wasn't the plain CRC32 algorithm that should have
been used, whoops!
The implementation was adapted from pseudo code from
Thomas Cioppettini.
I've renamed the PROXY header building option value for
checksum from crc32 to crc32c and updated the documentation.
There is no support for plain crc32 checksums.
|
|
|
|
This is the function that should be called regardless of
TCP or TLS being used. The proper usage for this function is:
{ok, ProxyInfo} = ranch:recv_proxy_header(Ref, Timeout),
{ok, Socket} = ranch:handshake(Ref),
...
Ranch takes care of everything else under the hood. Transports
now need to have a Transport:recv_proxy_header/2 function. For
ranch_ssl the function gets the port from the sslsocket() record
and then calls ranch_tcp:recv_proxy_header/2 with it.
This means that two undocumented features are currently used for
this, but the interface is really nice so that's a sacrifice
worth doing. Also worth noting is that OTP 22 should have an
alternative for gen_tcp:unrecv/2 so the only real issue is about
the sslsocket() record at the moment.
|
|
The race condition occurs when the restart is faster than
the cleaning up. With this commit the restart will perform
the cleanup if it was not done beforehand.
|
|
This will avoid some unnecessary logs by default.
SASL can be enabled to log these events.
|
|
This uses the undocumented function gen_tcp:unrecv/2.
Tests have been added for both gen_tcp and ssl connections,
including sending data in the same first packet, at least
for gen_tcp (ssl tests may or may not end up buffering some
of the TLS handshake before the recv call, but there's no
guarantees).
|
|
Also add tests of the type parse(build(Info)), including
for testing the TLVs and the padding/checksum verification
options.
|
|
Using test cases from the spec and tomciopp/proxy_protocol.
Many more tests are needed, especially for the TLV part and
for the error conditions.
|
|
|
|
In addition to cleaning when ranch:stop_listener/1 is called, we
also need to clean when we detect the supervisor is going away
for normal reasons, because the supervisor might be in another
application's supervision tree.
Note that there might be a short delay in this case before the
cleanup is done, due to using monitors for detection.
|
|
This can be used by Cowboy to better deal with the switch
to maps for transport options and avoid the log message
when using lists.
|
|
Ranch is now made for and tested on 18+ only.
|
|
|
|
|
|
|
|
|
|
Also review and update the ranch(7) manual and fix a few specs.
|
|
It can be quite huge and hinders readability.
|
|
I had to use the process dictionary to work around the current
interface for one log call. You have been warned.
|
|
The "normal" errors are still silenced when calling ranch:handshake.
|
|
Based on the work done by @juhlig.
|
|
A map should now be used when specifying transport options
that contain more than just socket options. It is still
possible to pass a list of socket options directly as a
convenience.
The ack_timeout is renamed to handshake_timeout when
specified as a map. This corresponds to the new function
ranch:handshake/1,2 that will be favored in Ranch 2.0.
Specifying Ranch-specific options via the proplist will
no longer be possible starting from Ranch 2.0.
|
|
|