You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by be...@apache.org on 2013/10/09 22:20:19 UTC

git commit: THRIFT-2031: Make SO_KEEPALIVE configurable for C++ lib Client: cpp Patch: Ben Craig

Updated Branches:
  refs/heads/master 9f9cd10e8 -> 19244ed87


THRIFT-2031: Make SO_KEEPALIVE configurable for C++ lib
Client: cpp
Patch: Ben Craig


Project: http://git-wip-us.apache.org/repos/asf/thrift/repo
Commit: http://git-wip-us.apache.org/repos/asf/thrift/commit/19244ed8
Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/19244ed8
Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/19244ed8

Branch: refs/heads/master
Commit: 19244ed87f7e6e8e997391e5ab7cb862c73449b2
Parents: 9f9cd10
Author: Ben Craig <be...@apache.org>
Authored: Wed Oct 9 15:18:55 2013 -0500
Committer: Ben Craig <be...@apache.org>
Committed: Wed Oct 9 15:18:55 2013 -0500

----------------------------------------------------------------------
 lib/cpp/src/thrift/transport/TServerSocket.cpp | 15 ++++++++++---
 lib/cpp/src/thrift/transport/TServerSocket.h   |  3 +++
 lib/cpp/src/thrift/transport/TSocket.cpp       | 24 +++++++++++++++++++++
 lib/cpp/src/thrift/transport/TSocket.h         |  8 +++++++
 4 files changed, 47 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/thrift/blob/19244ed8/lib/cpp/src/thrift/transport/TServerSocket.cpp
----------------------------------------------------------------------
diff --git a/lib/cpp/src/thrift/transport/TServerSocket.cpp b/lib/cpp/src/thrift/transport/TServerSocket.cpp
index 1df719d..1c5b9de 100755
--- a/lib/cpp/src/thrift/transport/TServerSocket.cpp
+++ b/lib/cpp/src/thrift/transport/TServerSocket.cpp
@@ -86,7 +86,9 @@ TServerSocket::TServerSocket(int port) :
   tcpSendBuffer_(0),
   tcpRecvBuffer_(0),
   intSock1_(THRIFT_INVALID_SOCKET),
-  intSock2_(THRIFT_INVALID_SOCKET) {}
+  intSock2_(THRIFT_INVALID_SOCKET),
+  keepAlive_(false)
+{}
 
 TServerSocket::TServerSocket(int port, int sendTimeout, int recvTimeout) :
   port_(port),
@@ -100,7 +102,9 @@ TServerSocket::TServerSocket(int port, int sendTimeout, int recvTimeout) :
   tcpSendBuffer_(0),
   tcpRecvBuffer_(0),
   intSock1_(THRIFT_INVALID_SOCKET),
-  intSock2_(THRIFT_INVALID_SOCKET) {}
+  intSock2_(THRIFT_INVALID_SOCKET),
+  keepAlive_(false)
+{}
 
 TServerSocket::TServerSocket(string path) :
   port_(0),
@@ -115,7 +119,9 @@ TServerSocket::TServerSocket(string path) :
   tcpSendBuffer_(0),
   tcpRecvBuffer_(0),
   intSock1_(THRIFT_INVALID_SOCKET),
-  intSock2_(THRIFT_INVALID_SOCKET) {}
+  intSock2_(THRIFT_INVALID_SOCKET),
+  keepAlive_(false)
+{}
 
 TServerSocket::~TServerSocket() {
   close();
@@ -480,6 +486,9 @@ shared_ptr<TTransport> TServerSocket::acceptImpl() {
   if (recvTimeout_ > 0) {
     client->setRecvTimeout(recvTimeout_);
   }
+  if (keepAlive_) {
+    client->setKeepAlive(keepAlive_);
+  }
   client->setCachedAddress((sockaddr*) &clientAddress, size);
 
   return client;

http://git-wip-us.apache.org/repos/asf/thrift/blob/19244ed8/lib/cpp/src/thrift/transport/TServerSocket.h
----------------------------------------------------------------------
diff --git a/lib/cpp/src/thrift/transport/TServerSocket.h b/lib/cpp/src/thrift/transport/TServerSocket.h
index e7b7a82..c30d3e3 100644
--- a/lib/cpp/src/thrift/transport/TServerSocket.h
+++ b/lib/cpp/src/thrift/transport/TServerSocket.h
@@ -52,6 +52,8 @@ class TServerSocket : public TServerTransport {
   void setRetryLimit(int retryLimit);
   void setRetryDelay(int retryDelay);
 
+  void setKeepAlive(bool keepAlive) {keepAlive_ = keepAlive;}
+
   void setTcpSendBuffer(int tcpSendBuffer);
   void setTcpRecvBuffer(int tcpRecvBuffer);
 
@@ -77,6 +79,7 @@ class TServerSocket : public TServerTransport {
   int retryDelay_;
   int tcpSendBuffer_;
   int tcpRecvBuffer_;
+  bool keepAlive_;
 
   THRIFT_SOCKET intSock1_;
   THRIFT_SOCKET intSock2_;

http://git-wip-us.apache.org/repos/asf/thrift/blob/19244ed8/lib/cpp/src/thrift/transport/TSocket.cpp
----------------------------------------------------------------------
diff --git a/lib/cpp/src/thrift/transport/TSocket.cpp b/lib/cpp/src/thrift/transport/TSocket.cpp
index 1ea98bd..381daa2 100755
--- a/lib/cpp/src/thrift/transport/TSocket.cpp
+++ b/lib/cpp/src/thrift/transport/TSocket.cpp
@@ -83,6 +83,7 @@ TSocket::TSocket(string host, int port) :
   connTimeout_(0),
   sendTimeout_(0),
   recvTimeout_(0),
+  keepAlive_(false),
   lingerOn_(1),
   lingerVal_(0),
   noDelay_(1),
@@ -99,6 +100,7 @@ TSocket::TSocket(string path) :
   connTimeout_(0),
   sendTimeout_(0),
   recvTimeout_(0),
+  keepAlive_(false),
   lingerOn_(1),
   lingerVal_(0),
   noDelay_(1),
@@ -116,6 +118,7 @@ TSocket::TSocket() :
   connTimeout_(0),
   sendTimeout_(0),
   recvTimeout_(0),
+  keepAlive_(false),
   lingerOn_(1),
   lingerVal_(0),
   noDelay_(1),
@@ -133,6 +136,7 @@ TSocket::TSocket(THRIFT_SOCKET socket) :
   connTimeout_(0),
   sendTimeout_(0),
   recvTimeout_(0),
+  keepAlive_(false),
   lingerOn_(1),
   lingerVal_(0),
   noDelay_(1),
@@ -203,6 +207,10 @@ void TSocket::openConnection(struct addrinfo *res) {
     setRecvTimeout(recvTimeout_);
   }
 
+  if(keepAlive_) {
+    setKeepAlive(keepAlive_);
+  }
+
   // Linger
   setLinger(lingerOn_, lingerVal_);
 
@@ -677,6 +685,22 @@ void TSocket::setSendTimeout(int ms) {
   }
 }
 
+void TSocket::setKeepAlive(bool keepAlive) {
+  keepAlive_ = keepAlive;
+
+  if (socket_ == -1) {
+    return;
+  }
+
+  int value = keepAlive_;
+  int ret = setsockopt(socket_, SOL_SOCKET, SO_KEEPALIVE, const_cast_sockopt(&value), sizeof(value));
+
+  if (ret == -1) {
+    int errno_copy = THRIFT_GET_SOCKET_ERROR;  // Copy THRIFT_GET_SOCKET_ERROR because we're allocating memory.
+    GlobalOutput.perror("TSocket::setKeepAlive() setsockopt() " + getSocketInfo(), errno_copy);
+  }
+}
+
 void TSocket::setMaxRecvRetries(int maxRecvRetries) {
   maxRecvRetries_ = maxRecvRetries;
 }

http://git-wip-us.apache.org/repos/asf/thrift/blob/19244ed8/lib/cpp/src/thrift/transport/TSocket.h
----------------------------------------------------------------------
diff --git a/lib/cpp/src/thrift/transport/TSocket.h b/lib/cpp/src/thrift/transport/TSocket.h
index fd5b961..38d8c7f 100644
--- a/lib/cpp/src/thrift/transport/TSocket.h
+++ b/lib/cpp/src/thrift/transport/TSocket.h
@@ -179,6 +179,11 @@ class TSocket : public TVirtualTransport<TSocket> {
   void setMaxRecvRetries(int maxRecvRetries);
 
   /**
+   * Set SO_KEEPALIVE
+   */
+  void setKeepAlive(bool keepAlive);
+
+  /**
    * Get socket information formated as a string <Host: x Port: x>
    */
   std::string getSocketInfo();
@@ -274,6 +279,9 @@ class TSocket : public TVirtualTransport<TSocket> {
   /** Recv timeout in ms */
   int recvTimeout_;
 
+  /** Keep alive on */
+  bool keepAlive_;
+
   /** Linger on */
   bool lingerOn_;