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
#include "TNonblockingServer.h"
#include <concurrency/Exception.h>
+#include <transport/TSocket.h>
#include <iostream>
#include <sys/socket.h>
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:
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");
EV_READ | EV_PERSIST,
TConnection::taskHandler,
this);
-
+
// Attach to the base
event_base_set(eventBase_, ¬ificationEvent_);
// 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) {
return peerPort_;
}
+bool TSocket::useLowMinRto_ = false;
+void TSocket::setUseLowMinRto(bool useLowMinRto) {
+ useLowMinRto_ = useLowMinRto;
+}
+bool TSocket::getUseLowMinRto() {
+ return useLowMinRto_;
+}
+
}}} // apache::thrift::transport
#include <string>
#include <sys/time.h>
+#include <netdb.h>
#include "TTransport.h"
#include "TServerSocket.h"
**/
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:
/**
/** Recv timeout timeval */
struct timeval recvTimeval_;
+
+ /** Whether to use low minimum TCP retransmission timeout */
+ static bool useLowMinRto_;
};
}}} // apache::thrift::transport