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_;