From: David Reiss Date: Tue, 9 Mar 2010 05:20:14 +0000 (+0000) Subject: cpp: Add setLowRTO to TSocket X-Git-Tag: 0.3.0~74 X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=1c20c871d218f479e101f6e9fb25231189d1bf72;p=common%2Fthrift.git cpp: Add setLowRTO to TSocket low tcp RTO might mitigate TCP incast problems. Adding the setLowRTO function to TSocket allows us to experiment with a solution. git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@920685 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/lib/cpp/src/server/TNonblockingServer.cpp b/lib/cpp/src/server/TNonblockingServer.cpp index 8c039b97..8f68d744 100644 --- a/lib/cpp/src/server/TNonblockingServer.cpp +++ b/lib/cpp/src/server/TNonblockingServer.cpp @@ -19,6 +19,7 @@ #include "TNonblockingServer.h" #include +#include #include #include @@ -39,6 +40,8 @@ using namespace apache::thrift::protocol; using namespace apache::thrift::transport; using namespace apache::thrift::concurrency; using namespace std; +using apache::thrift::transport::TSocket; +using apache::thrift::transport::TTransportException; class TConnection::Task: public Runnable { public: @@ -706,6 +709,12 @@ void TNonblockingServer::listenSocket(int s) { setsockopt(s, IPPROTO_TCP, TCP_NODELAY, &one, sizeof(one)); #endif + #ifdef TCP_LOW_MIN_RTO + if (TSocket::getUseLowMinRto()) { + setsockopt(s, IPPROTO_TCP, TCP_LOW_MIN_RTO, &one, sizeof(one)); + } + #endif + if (listen(s, LISTEN_BACKLOG) == -1) { close(s); throw TException("TNonblockingServer::serve() listen"); @@ -761,7 +770,7 @@ void TNonblockingServer::registerEvents(event_base* base) { EV_READ | EV_PERSIST, TConnection::taskHandler, this); - + // Attach to the base event_base_set(eventBase_, ¬ificationEvent_); diff --git a/lib/cpp/src/transport/TSocket.cpp b/lib/cpp/src/transport/TSocket.cpp index d27c8681..ce1ddcb1 100644 --- a/lib/cpp/src/transport/TSocket.cpp +++ b/lib/cpp/src/transport/TSocket.cpp @@ -153,6 +153,15 @@ void TSocket::openConnection(struct addrinfo *res) { // No delay setNoDelay(noDelay_); + // Uses a low min RTO if asked to. +#ifdef TCP_LOW_MIN_RTO + if (getUseLowMinRto()) { + int one = 1; + setsockopt(socket_, IPPROTO_TCP, TCP_LOW_MIN_RTO, &one, sizeof(one)); + } +#endif + + // Set the socket to be non blocking for connect if a timeout exists int flags = fcntl(socket_, F_GETFL, 0); if (connTimeout_ > 0) { @@ -589,4 +598,12 @@ int TSocket::getPeerPort() { return peerPort_; } +bool TSocket::useLowMinRto_ = false; +void TSocket::setUseLowMinRto(bool useLowMinRto) { + useLowMinRto_ = useLowMinRto; +} +bool TSocket::getUseLowMinRto() { + return useLowMinRto_; +} + }}} // apache::thrift::transport diff --git a/lib/cpp/src/transport/TSocket.h b/lib/cpp/src/transport/TSocket.h index b0f445aa..b9d1c012 100644 --- a/lib/cpp/src/transport/TSocket.h +++ b/lib/cpp/src/transport/TSocket.h @@ -22,6 +22,7 @@ #include #include +#include #include "TTransport.h" #include "TServerSocket.h" @@ -182,6 +183,15 @@ class TSocket : public TTransport { **/ int getPeerPort(); + /** + * Sets whether to use a low minimum TCP retransmission timeout. + */ + static void setUseLowMinRto(bool useLowMinRto); + + /** + * Gets whether to use a low minimum TCP retransmission timeout. + */ + static bool getUseLowMinRto(); protected: /** @@ -234,6 +244,9 @@ class TSocket : public TTransport { /** Recv timeout timeval */ struct timeval recvTimeval_; + + /** Whether to use low minimum TCP retransmission timeout */ + static bool useLowMinRto_; }; }}} // apache::thrift::transport