Fix TLS write busy-spin on SSL_ERROR_WANT_READ
A TLS sendData() failing with SSL_ERROR_WANT_READ (mid-handshake application data, or a post-handshake session ticket exchange) has nothing to do with write-readiness, but resetSocket() kept re-arming EPOLLWRNORM anyway - an already-writable TCP socket fires that immediately, so the retry loop spun the CPU as fast as it could until the connection was eventually dropped, without ever reading the peer's first command. Confirmed via a 15GB+ debug log from one stuck connection. sendNeedsRead() lets Socket now tell the difference and wait for a real EPOLLIN instead of busy-retrying.
This commit is contained in:
1 parent
c3e8d70774
commit
2676aaf84c
6 files changed
+68
-1
No files matched your search
@@ -251,15 +251,18 @@ namespace core {
|
||||
|
||||
if((len = ::SSL_write(ssl, data, length)) >= 0) {
|
||||
coreutils::Log(coreutils::LOG_DEBUG_3) << "sendData TLS...len=" << len;
|
||||
lastSendWantedRead = false;
|
||||
return len;
|
||||
}
|
||||
else {
|
||||
lastSendWantedRead = false;
|
||||
switch (SSL_get_error(ssl, len)) {
|
||||
case SSL_ERROR_SSL:
|
||||
coreutils::Log(coreutils::LOG_DEBUG_3) << "ERROR_SSL on ssl_write. error=" << errno;
|
||||
break;
|
||||
case SSL_ERROR_WANT_READ:
|
||||
coreutils::Log(coreutils::LOG_DEBUG_3) << "ERROR_WANT_READ on ssl_write.";
|
||||
lastSendWantedRead = true;
|
||||
break;
|
||||
case SSL_ERROR_WANT_WRITE:
|
||||
coreutils::Log(coreutils::LOG_DEBUG_3) << "ERROR_WANT_WRITE on ssl_write.";
|
||||
|
||||
Reference in new issue
Block a user