aboutsummaryrefslogtreecommitdiffstats
path: root/net/server_epoll.lua
Commit message (Collapse)AuthorAgeFilesLines
...
* | net.server_epoll: Add an (empty) method for setting socket optionsKim Alvefur2021-07-141-0/+6
| |
* | net.server_epoll: Log failures to set socket optionsKim Alvefur2021-07-141-2/+8
| | | | | | | | | | | | | | | | | | Good to know if it fails, especially since the return value doesn't seem to be checked anywhere. Since LuaSec-wrapped sockets don't expose the setoption method, this will likely show when mod_c2s tries to enable keepalives on direct tls connections.
* | net.server_epoll: Call onconnect immediately after TLS handshake completionKim Alvefur2021-07-131-1/+2
| | | | | | | | | | | | Skips a roundtrip through the main loop in case client-first data is available already, if not then :onreadable() will set the appropriate timeout.
* | net.server_epoll: Refactor immediate TLS handshake startKim Alvefur2021-07-131-6/+5
| |
* | net.server_epoll: Keep socket registered in epoll trough TLS wrappingKim Alvefur2021-07-131-2/+1
| | | | | | | | | | There's the theory that the socket isn't the same before/after wrap(), but since epoll operates on FD numbers this shouldn't matter.
* | net.server_epoll: Use TLS handshake timeout after initiating handshakeKim Alvefur2021-07-131-1/+3
| | | | | | | | The :init() method sets a different timeout than the TLS related methods.
* | net.server_epoll: Start TLS handshake immediately on newly accepted connectionsKim Alvefur2021-07-131-0/+1
| | | | | | | | | | | | Since TLS is a client-first protocol there is a chance that the ClientHello message is available already. TLS Fast Open and/or the TCP_DEFER_ACCEPT socket option would increase that chance.
* | net.server_epoll: Factor out TLS initialization into a methodKim Alvefur2021-07-131-45/+51
| | | | | | | | | | | | | | | | | | | | | | So there's :startls(), :inittls() and :tlshandshake() :starttls() prepares for plain -> TLS upgrade and ensures that the (unencrypted) write buffer is drained before proceeding. :inittls() wraps the connection and does things like SNI, DANE etc. :tlshandshake() steps the TLS negotiation forward until it completes
* | net.server_epoll: Fix typoKim Alvefur2021-07-131-1/+1
| |
* | net.server_epoll: Prevent stack overflow of opportunistic writesKim Alvefur2021-07-111-1/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | net.http.files serving a big enough file on a fast enough connection with opportunistic_writes enabled could trigger a stack overflow through repeatedly serving more data that immediately gets sent, draining the buffer and triggering more data to be sent. This also blocked the server on a single task until completion or an error. This change prevents nested opportunistic writes, which should prevent the stack overflow, at the cost of reduced download speed, but this is unlikely to be noticeable outside of Gbit networks. Speed at the cost of blocking other processing is not worth it, especially with the risk of stack overflow.
* | net.server_epoll: Immediately attempt to read from newly accepted connectionsKim Alvefur2021-07-081-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | This may speed up client-first protocols (e.g. XMPP, HTTP and TLS) when the first client data already arrived by the time we accept() it. If LuaSocket supported TCP_DEFER_ACCEPT we could use that to further increase the chance that there's already data to handle. In case no data has arrived, no harm should be done, :onreadable would simply set the read timeout and we'll get back to it once there is something to handle.
* | net.server_epoll: Separate handling of new incoming and outgoing connectionsKim Alvefur2021-07-081-2/+6
| | | | | | | | | | | | | | | | | | | | | | | | The :init method is more suited for new outgoing connections, which is why it uses the connect_timeout setting. Depending on whether a newly accepted connection is to a Direct TLS port or not, it should be handled differently, and was already. The :starttls method sets up timeouts on its own, so the one set in :init was not needed. Newly accepted plain TCP connections don't need a write timeout set, a read timeout is enough.
* | net.server_epoll: Ensure timeout after closingKim Alvefur2020-10-311-0/+1
| | | | | | | | | | | | This should make sure that if there's data left to be written when closing a connection, there's also a timeout so that it doesn't wait forever.
* | net.server_epoll: Add missing method for changing TLS contextKim Alvefur2021-06-101-0/+4
| | | | | | | | | | Supported by the other net.server implementations already, but not used anywhere in Prosody.
* | net.server_epoll: Fix reporting of socket connect timeoutKim Alvefur2021-06-071-0/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | If the underlying TCP connection times out before the write timeout kicks in, end up here with err="timeout", which the following code treats as a minor issue. Then, due to epoll apparently returning the EPOLLOUT (writable) event too, we go on and try to write to the socket (commonly stream headers). This fails because the socket is closed, which becomes the error returned up the stack to the rest of Prosody. This also trips the 'onconnect' signal, which has effects on various things, such as the net.connect state machine. Probably undesirable effects. With this, we instead return "connection timeout", like server_event, and destroy the connection handle properly. And then nothing else happens because the connection has been destroyed.
* | net.server_epoll: Remove unnecessary luacheck annotationsKim Alvefur2021-04-011-3/+3
| | | | | | | | | | Not sure why these were here to begin with, since it does use the 'self' argument and did so since they were added.
* | net.server_epoll: Support for passing DANE TLSA data to LuaSec (0.8 needed)Kim Alvefur2019-09-291-0/+14
| |
* | Merge 0.11->trunkKim Alvefur2021-01-081-2/+18
|\|
| * net.server_epoll: Ensure timers can't run more than once per tickKim Alvefur2021-01-081-2/+18
| | | | | | | | | | | | | | | | This makes sure that a timer that returns 0 (or less) does not prevent runtimers() from completing, as well as making sure a timer added with zero timeout from within a timer does not run until the next tick. Thanks tmolitor
| * net.server: Backport client parts of SNI support from trunk (#409)Kim Alvefur2020-08-171-5/+15
| | | | | | | | | | | | | | | | | | | | Partial backports of the following commits from trunk: 6c804b6b2ca2 net.http: Pass server name along for SNI (fixes #1408) 75d2874502c3 net.server_select: SNI support (#409) 9a905888b96c net.server_event: Add SNI support (#409) adc0672b700e net.server_epoll: Add support for SNI (#409) d4390c427a66 net.server: Handle server name (SNI) as extra argument
| * net.server_epoll: Fix indentationKim Alvefur2020-03-111-3/+3
| | | | | | | | | | | | Some lines seem to have gotten the wrong indentation, possibly caused by Meld which often ignores lines with only whitespace changes and leaves their previous indentation.
| * net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see ↵Kim Alvefur2019-07-081-48/+29
| | | | | | | | | | | | | | #1388) The previous timer handling did not scale well and led to high CPU usage with many connections (each with at least an read timeout).
* | net.server_epoll: Increase log level for error in callbackKim Alvefur2020-12-161-1/+1
| | | | | | | | It's an error, it should be logged at error level.
* | net.server_epoll: Log debug message when a connection errors on readKim Alvefur2020-07-251-0/+5
| | | | | | | | | | | | It's confusingly quiet otherwise, even with maximum verboseness. Thanks perflyst
* | net.server_epoll: Add setting for turning off callback protectionsKim Alvefur2020-06-301-0/+6
| | | | | | | | | | Might improve (CPU) performance at the risk of triggering top level errors.
* | net.server_epoll: Allow setting a custom error handler for listenerKim Alvefur2020-06-301-1/+2
| | | | | | | | This lets plugins handle errors in some custom way, should they wish to.
* | net.server_epoll: ... and include a tracebackKim Alvefur2020-06-301-1/+1
| |
* | net.server_epoll: Report errors in timersKim Alvefur2020-06-301-0/+2
| |
* | net.server_epoll: Expose way to turn monotonic time into wall clock timeKim Alvefur2020-06-301-0/+3
| |
* | net.server_epoll: Optimize away table allocation for timer objectsKim Alvefur2020-06-291-15/+21
| |
* | net.server_epoll: Remove unused time field from timer objectsKim Alvefur2020-06-291-6/+3
| | | | | | | | Unused since the move to util.indexedbheap in c8c3f2eba898
* | net.server_epoll: Signal API-compatibilty with util.timerKim Alvefur2020-06-291-0/+6
| | | | | | | | | | Reduces the overhead of having both util.timer and the timer handling here, since they are very similar and now API-compatible.
* | net.server_epoll: Make API-compatible with util.timerKim Alvefur2020-06-291-3/+3
| |
* | net.server_epoll: Add way to start accepting clients on an arbitrary server ↵Kim Alvefur2020-06-011-4/+9
| | | | | | | | | | | | socket This adds an escape hatch where things like UNIX sockets can be added.
* | net.server_epoll: Handle missing ports from getsock/peername (as in the case ↵Matthew Wild2020-06-011-2/+2
| | | | | | | | of unix sockets)
* | net.server_epoll: Fix typo in internal method nameKim Alvefur2020-05-221-5/+5
| |
* | net.server_epoll: Log some noise before TLS handshake stepKim Alvefur2020-05-221-0/+1
| | | | | | | | | | This would help pinpoint if a crash happens during the handshake, which has occurred a few times, e.g. like https://github.com/brunoos/luasec/issues/75
* | net.server_epoll: Reduce log level of TLS handshake errors to debugKim Alvefur2020-02-151-1/+1
| | | | | | | | | | | | | | These are triggered all the time by random HTTPS connections, so they are mostly just useless noise. When you actually do need them, you probably have debug logging enabled too, since these messages are fairly useless without more context.
* | net.server_epoll: Different error to distinguish connection timeoutKim Alvefur2020-02-011-1/+2
| | | | | | | | This mirrors what server_event does.
* | net.server_epoll: Log error about missing *all* callbacks at 'error' levelKim Alvefur2020-01-121-1/+1
| |
* | net.server_epoll: Log errors caught in listeners on 'error' levelKim Alvefur2020-01-121-1/+1
| |
* | net.server_epoll: Add option for reducing debug loggingKim Alvefur2020-01-121-14/+25
| | | | | | | | | | | | | | Sometimes all these things just drown out the logs you are interested in with low-level socket noise. Enabled since it's still new and experimental.
* | net.server_epoll: Collect full traceback from errors in listenersKim Alvefur2020-01-051-1/+3
| |
* | net.server_epoll: Avoid concatenating buffer with single itemKim Alvefur2019-12-281-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Saves creating a string that'll be identical to buffer[1] anyways, as well as a C function call. Depending on Lua version and length of the string, this could be reusing an interned string, but a longer one would probably be duplicated for no reason. Having exactly one item in the buffer seems like it would be fairly common, but I have not done an extensive study. If opportunistic writes are enabled then it will be even more likely. This special case could be optimized like this in table.concat but it does not look like it is.
* | net.server_epoll: Remove an unused variable [luacheck]Kim Alvefur2019-12-231-1/+1
| |
* | net.server_epoll: Use monotonic time for schedulingKim Alvefur2019-12-081-9/+11
| | | | | | | | Timer API of passing wallclock time remains
* | net.server_epoll: Change timer rescheduling method to match util.timerKim Alvefur2019-12-081-2/+3
| | | | | | | | | | Relative to current time instead of absolute time, in preparation for switching to monotonic time.
* | net.server_epoll: Remove unused function for adding timer at absolute timeKim Alvefur2019-12-081-8/+3
| | | | | | | | This won't make sense if we switch to monotonic time
* | net.server_epoll: Add debug logging for delayed readingKim Alvefur2019-12-071-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In :onreadable, if there is still buffered incoming data after reading from the socket (as indicated by the :dirty method, usually because LuaSocket has an 8k buffer that's full but it read a smaller amount), another attempt to read is scheduled via this :pausefor method. This is also called from some other places where it would be pointless to read because there shouldn't be any data. In the delayed read case, this should report that the socket is "dirty". If it reports that the socket is "clean" then the question is where the buffer contents went? If this doesn't get logged after the scheduled time (0.000001s by default) then this would suggests a problem with timer or scheduling.
* | net.server_epoll: Save log tag in a field on FD watchers tooKim Alvefur2019-11-171-2/+4
| | | | | | | | As with 0e1701197722