From: Ben Craig Date: Wed, 9 Oct 2013 20:18:55 +0000 (-0500) Subject: THRIFT-2031: Make SO_KEEPALIVE configurable for C++ lib X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=19244ed87f7e6e8e997391e5ab7cb862c73449b2;p=common%2Fthrift.git THRIFT-2031: Make SO_KEEPALIVE configurable for C++ lib Client: cpp Patch: Ben Craig --- diff --git a/lib/cpp/src/thrift/transport/TServerSocket.cpp b/lib/cpp/src/thrift/transport/TServerSocket.cpp index 1df719d8..1c5b9de0 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 TServerSocket::acceptImpl() { if (recvTimeout_ > 0) { client->setRecvTimeout(recvTimeout_); } + if (keepAlive_) { + client->setKeepAlive(keepAlive_); + } client->setCachedAddress((sockaddr*) &clientAddress, size); return client; diff --git a/lib/cpp/src/thrift/transport/TServerSocket.h b/lib/cpp/src/thrift/transport/TServerSocket.h index e7b7a821..c30d3e31 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_; diff --git a/lib/cpp/src/thrift/transport/TSocket.cpp b/lib/cpp/src/thrift/transport/TSocket.cpp index 1ea98bd8..381daa21 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; } diff --git a/lib/cpp/src/thrift/transport/TSocket.h b/lib/cpp/src/thrift/transport/TSocket.h index fd5b961f..38d8c7f2 100644 --- a/lib/cpp/src/thrift/transport/TSocket.h +++ b/lib/cpp/src/thrift/transport/TSocket.h @@ -178,6 +178,11 @@ class TSocket : public TVirtualTransport { */ void setMaxRecvRetries(int maxRecvRetries); + /** + * Set SO_KEEPALIVE + */ + void setKeepAlive(bool keepAlive); + /** * Get socket information formated as a string */ @@ -274,6 +279,9 @@ class TSocket : public TVirtualTransport { /** Recv timeout in ms */ int recvTimeout_; + /** Keep alive on */ + bool keepAlive_; + /** Linger on */ bool lingerOn_;