aboutsummaryrefslogtreecommitdiffstats
path: root/src/ranch_acceptor.erl
AgeCommit message (Collapse)Author
2016-11-24Update copyright yearLoïc Hoguin
2016-09-19Don't silently drop the accept rateMaas-Maarten Zeeman
2015-08-18Welcome to 2015Loïc Hoguin
2015-03-06Handle Transport:controlling_socket/2 errors and close the socketLoïc Hoguin
2014-06-10Update copyright yearsLoïc Hoguin
2013-12-07Get rid of a ton of pointless commentsLoïc Hoguin
All of it can be found in the manual, which defines what the code must do, and is always up to date unlike the code comments.
2013-11-14Flush any message acceptors may receive and log themLoïc Hoguin
Inspired by what supervisor does.
2013-04-08Wait in the acceptor if we get emfile errorsLoïc Hoguin
This should avoid using all CPU because we keep trying to accept.
2013-03-31Use a custom supervisor for ranch_conns_supLoïc Hoguin
This change was designed so that we don't have this supervisor and ranch_listener performing the same job, namely monitoring connection processes, the first through links and the second through monitors. This change also makes possible various optimizations: * Acceptors don't need to know about options, maximum number of connections, or anything else. They can just accept, pass the socket to the supervisor, and when the supervisor replies continue accepting connections. * The supervisor holds most of the information that will be passed to created processes. This reduces copying. * The supervisor temporarily takes ownership of the socket, then creates the connection process and gives it ownership, streamlining the creation. * The supervisor can hold acceptors in their receive loop if max_connections is reached. When this number gets below the limit it can then send a message to a sleeping acceptor to make it resume its operations. * Because we know that all connection process creations are made from the local Erlang node, we can greatly reduce the number operations to be made when calling the supervisor. * Because all acceptors die if this supervisor dies, we can remove even more operations from the calling code. We do not need to monitor or wait for a timeout. This reduces the call code to two statements: send and receive. (Thanks James Fish for helping with that.) * The supervisor only needs to keep track of a list of pids. There is no children specification to be maintained, we do not need to handle restart strategy (no process can be restarted because the socket dies with it). We are using the process dictionary for storing the pids as it proved to be the simplest and fastest solution. * The supervisor maintains a count of current connections, but also of processes (including the ones that removed themselves from the pool), making any query of these values very fast. The supervisor should still be compatible with OTP principles. It responds to calls from the supervisor module as expected, although some of them are disabled and an error will be returned, for example supervisor:start_child/2. It is also started with proc_lib and handles system messages. sys:get_status/1 can thus be used as expected. We can see a great increase in the number of requests/s, a great improvement in the latency of requests, and we can simply accept requests faster than before. It will probably have a bigger increase under virtualized environments, although that's only a guess. As a result of this, we don't write much anymore in the ranch_server ets table, so the write_concurrency option was removed. Tests were also slightly improved to prevent race conditions.
2013-01-15Ignore tracking of requests when MaxConn = infinityFred Hebert
There is no need to contact the server and track requests unless being asked to do so by the user. It's going to be faster and more efficient to not track anything when being told tracking doesn't matter. Whenever the max connections is set to infinity, the connections counting key is not created, or is deleted if it existed already. When using a numeric value, the connection count is created or maintained if it existed already. Moreover, trying to reduce a listener's counter while the max connection number is set to `infinity` will return 0 and avoid all counting operations as they are meaningless.
2012-12-24Improve max_connections typeLoïc Hoguin
It is non_neg_integer() | infinity. Introduce the type `ranch:max_conns/0` for easier manipulation.
2012-12-24Add ranch:set_max_connections/2 and get_max_connections/1Loïc Hoguin
2012-08-06Check the accept/2 return value for errorsLoïc Hoguin
Distinguish the errors from transport_accept and ssl_accept in ranch_ssl. {error, closed} for the first one means the listening socket got closed; for the second one it means the connection socket was. Ignore all errors except when the listening socket got closed, where we want to crash to allow opening the socket again.
2012-08-06Make accept asynchronousLoïc Hoguin
Ranch now accepts connection asynchronously through a separate process. The accept process is linked to the acceptor, calls accept and does nothing else but send the socket back to the acceptor. This allows us to receive messages in the acceptor to handle upgrades instead of polling. This will also allow us later to make acceptors system processes. Remove support for connection pools in favor of a simpler max_connections setting. Connections can be removed from the count, allowing us to have as many long-lived connections as we want while still limiting the number of short-lived ones. Add max_connections, max_connections with long-lived connections, and upgrade tests.
2012-07-25Make acceptors query the protocol opts on startupLoïc Hoguin
This way, if a crash happens in one of them after a protocol options upgrade has occured, the restarted acceptor will get the upgraded options as expected, and not the initial ones.
2012-07-25Register acceptors through ranch_serverLoïc Hoguin
2012-06-04Add Transport:connect/3 and remove types unneeded by R15B+0.2.1Loïc Hoguin
Also use one export per line to improve future diffs. Bump the version to 0.2.1 to reflect this change.
2012-04-14Import the acceptor code from CowboyLoïc Hoguin
Modules were renamed. The 'cowboy_' prefix became 'ranch_'. At the same time, ranch_ssl_transport became ranch_ssl, and ranch_tcp_transport became ranch_tcp, because appending '_transport' felt a bit redundant considering SSL and TCP clearly are transports. One test has been added to make sure everything is working.