From 8f3bce4153a17dbf6a188bb80f589eadbd0de5e2 Mon Sep 17 00:00:00 2001 From: David Reiss Date: Tue, 18 Mar 2008 18:21:52 +0000 Subject: [PATCH] TSocketPool changes Summary: 1] Added empty constructor 2] Added function to set server list 3] Made getServers return by ref 4] Made list of servers be a list of pointers The last change is so that someone can pass in the list of servers and rely on TSocketPool to change the failure time directly on the TSocketServer object Reviewed By: aditya Test Plan: Ran with a test search server Revert: OK DiffCamp Revision: 9529 git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@665571 13f79535-47bb-0310-9956-ffa450edef68 --- lib/cpp/src/transport/TSocketPool.cpp | 42 ++++++++++++++++++--------- lib/cpp/src/transport/TSocketPool.h | 16 ++++++++-- 2 files changed, 41 insertions(+), 17 deletions(-) diff --git a/lib/cpp/src/transport/TSocketPool.cpp b/lib/cpp/src/transport/TSocketPool.cpp index d1d5bcdc..e22a4b8b 100644 --- a/lib/cpp/src/transport/TSocketPool.cpp +++ b/lib/cpp/src/transport/TSocketPool.cpp @@ -13,6 +13,8 @@ namespace facebook { namespace thrift { namespace transport { using namespace std; +using boost::shared_ptr; + /** * TSocketPoolServer implementation * @@ -27,7 +29,7 @@ TSocketPoolServer::TSocketPoolServer() /** * Constructor for TSocketPool server */ -TSocketPoolServer::TSocketPoolServer(const std::string &host, int port) +TSocketPoolServer::TSocketPoolServer(const string &host, int port) : host_(host), port_(port), lastFailTime_(0), @@ -39,6 +41,14 @@ TSocketPoolServer::TSocketPoolServer(const std::string &host, int port) * @author Jason Sobel */ +TSocketPool::TSocketPool() : TSocket(), + numRetries_(1), + retryInterval_(60), + maxConsecutiveFailures_(1), + randomize_(true), + alwaysTryLast_(true) { +} + TSocketPool::TSocketPool(const vector &hosts, const vector &ports) : TSocket(), numRetries_(1), @@ -57,7 +67,7 @@ TSocketPool::TSocketPool(const vector &hosts, } } -TSocketPool::TSocketPool(const std::vector >& servers) : TSocket(), +TSocketPool::TSocketPool(const vector >& servers) : TSocket(), numRetries_(1), retryInterval_(60), maxConsecutiveFailures_(1), @@ -69,7 +79,7 @@ TSocketPool::TSocketPool(const std::vector >& servers) : TSock } } -TSocketPool::TSocketPool(const std::vector& servers) : TSocket(), +TSocketPool::TSocketPool(const vector< shared_ptr >& servers) : TSocket(), servers_(servers), numRetries_(1), retryInterval_(60), @@ -94,11 +104,15 @@ TSocketPool::~TSocketPool() { } void TSocketPool::addServer(const string& host, int port) { - servers_.push_back(TSocketPoolServer(host, port)); + servers_.push_back(shared_ptr(new TSocketPoolServer(host, port))); +} + +void TSocketPool::setServers(const vector< shared_ptr >& servers) { + servers_ = servers; } -std::vector TSocketPool::getServers() { - return servers_; +void TSocketPool::getServers(vector< shared_ptr >& servers) { + servers = servers_; } void TSocketPool::setNumRetries(int numRetries) { @@ -125,13 +139,13 @@ void TSocketPool::setAlwaysTryLast(bool alwaysTryLast) { /* TODO: without apc we ignore a lot of functionality from the php version */ void TSocketPool::open() { if (randomize_) { - std::random_shuffle(servers_.begin(), servers_.end()); + random_shuffle(servers_.begin(), servers_.end()); } unsigned int numServers = servers_.size(); for (unsigned int i = 0; i < numServers; ++i) { - TSocketPoolServer &server = servers_[i]; + TSocketPoolServer &server = *(servers_[i]); bool retryIntervalPassed = (server.lastFailTime_ == 0); bool isLastServer = alwaysTryLast_ ? (i == (numServers - 1)) : false; @@ -162,13 +176,13 @@ void TSocketPool::open() { // connection failed } } - } - ++server.consecutiveFailures_; - if (server.consecutiveFailures_ > maxConsecutiveFailures_) { - // Mark server as down - server.consecutiveFailures_ = 0; - server.lastFailTime_ = time(NULL); + ++server.consecutiveFailures_; + if (server.consecutiveFailures_ > maxConsecutiveFailures_) { + // Mark server as down + server.consecutiveFailures_ = 0; + server.lastFailTime_ = time(NULL); + } } } diff --git a/lib/cpp/src/transport/TSocketPool.h b/lib/cpp/src/transport/TSocketPool.h index 2d0496bb..6c3b0f75 100644 --- a/lib/cpp/src/transport/TSocketPool.h +++ b/lib/cpp/src/transport/TSocketPool.h @@ -51,6 +51,12 @@ class TSocketPoolServer { class TSocketPool : public TSocket { public: + + /** + * Socket pool constructor + */ + TSocketPool(); + /** * Socket pool constructor * @@ -72,7 +78,7 @@ class TSocketPool : public TSocket { * * @param servers list of TSocketPoolServers */ - TSocketPool(const std::vector& servers); + TSocketPool(const std::vector< boost::shared_ptr >& servers); /** * Socket pool constructor @@ -92,11 +98,15 @@ class TSocketPool : public TSocket { */ void addServer(const std::string& host, int port); + /** + * Set list of servers in this pool + */ + void setServers(const std::vector< boost::shared_ptr >& servers); /** * Get list of servers in this pool */ - std::vector getServers(); + void getServers(std::vector< boost::shared_ptr >& servers); /** * Sets how many times to keep retrying a host in the connect function. @@ -131,7 +141,7 @@ class TSocketPool : public TSocket { protected: /** List of servers to connect to */ - std::vector servers_; + std::vector< boost::shared_ptr > servers_; /** How many times to retry each host in connect */ int numRetries_; -- 2.17.1