Author: jesus
Date: Thu Nov 3 02:36:16 2011
New Revision: 1196922
URL: http://svn.apache.org/viewvc?rev=1196922&view=rev
Log:
When you read in SSL it might block because you need the socket
to be writable. This addresses that issue and reschedules the
connection for subsequent activity.
TS-1011
Modified:
trafficserver/traffic/trunk/iocore/net/SSLNetVConnection.cc
Modified: trafficserver/traffic/trunk/iocore/net/SSLNetVConnection.cc
URL:
http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/net/SSLNetVConnection.cc?rev=1196922&r1=1196921&r2=1196922&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/net/SSLNetVConnection.cc (original)
+++ trafficserver/traffic/trunk/iocore/net/SSLNetVConnection.cc Thu Nov 3
02:36:16 2011
@@ -33,6 +33,7 @@
#define SSL_HANDSHAKE_WANT_WRITE 7
#define SSL_HANDSHAKE_WANT_ACCEPT 8
#define SSL_HANDSHAKE_WANT_CONNECT 9
+#define SSL_WRITE_WOULD_BLOCK 10
ClassAllocator<SSLNetVConnection> sslNetVCAllocator("sslNetVCAllocator");
@@ -99,10 +100,13 @@ ssl_read_from_net(NetHandler * nh, UnixN
continue;
case SSL_ERROR_WANT_WRITE:
+ event = SSL_WRITE_WOULD_BLOCK;
+ Debug("ssl", "[SSL_NetVConnection::ssl_read_from_net]
SSL_ERROR_WOULD_BLOCK(write)");
+ break;
case SSL_ERROR_WANT_READ:
case SSL_ERROR_WANT_X509_LOOKUP:
event = SSL_READ_WOULD_BLOCK;
- Debug("ssl", "[SSL_NetVConnection::ssl_read_from_net]
SSL_ERROR_WOULD_BLOCK");
+ Debug("ssl", "[SSL_NetVConnection::ssl_read_from_net]
SSL_ERROR_WOULD_BLOCK(read)");
break;
case SSL_ERROR_SYSCALL:
if (rres != 0) {
@@ -246,10 +250,12 @@ SSLNetVConnection::net_read_io(NetHandle
// how did we exit the while loop above? should never happen.
ink_debug_assert(false);
break;
+ case SSL_WRITE_WOULD_BLOCK:
case SSL_READ_WOULD_BLOCK:
if (lock.m.m_ptr != s->vio.mutex.m_ptr) {
Debug("ssl", "ssl_read_from_net, mutex switched");
- readReschedule(nh);
+ if(ret == SSL_READ_WOULD_BLOCK) readReschedule(nh);
+ else writeReschedule(nh);
return;
}
// reset the tigger and remove from the ready queue
@@ -257,6 +263,10 @@ SSLNetVConnection::net_read_io(NetHandle
read.triggered = 0;
nh->read_ready_list.remove(this);
Debug("ssl", "read_from_net, read finished - would block");
+#ifdef TS_USE_PORT
+ if(ret == SSL_READ_WOULD_BLOCK) readReschedule(nh);
+ else writeReschedule(nh);
+#endif
break;
case SSL_READ_EOS: