using namespace std;
+using boost::shared_ptr;
+
/**
* TSocketPoolServer implementation
*
/**
* 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),
* @author Jason Sobel <jsobel@facebook.com>
*/
+TSocketPool::TSocketPool() : TSocket(),
+ numRetries_(1),
+ retryInterval_(60),
+ maxConsecutiveFailures_(1),
+ randomize_(true),
+ alwaysTryLast_(true) {
+}
+
TSocketPool::TSocketPool(const vector<string> &hosts,
const vector<int> &ports) : TSocket(),
numRetries_(1),
}
}
-TSocketPool::TSocketPool(const std::vector<pair<string, int> >& servers) : TSocket(),
+TSocketPool::TSocketPool(const vector<pair<string, int> >& servers) : TSocket(),
numRetries_(1),
retryInterval_(60),
maxConsecutiveFailures_(1),
}
}
-TSocketPool::TSocketPool(const std::vector<TSocketPoolServer>& servers) : TSocket(),
+TSocketPool::TSocketPool(const vector< shared_ptr<TSocketPoolServer> >& servers) : TSocket(),
servers_(servers),
numRetries_(1),
retryInterval_(60),
}
void TSocketPool::addServer(const string& host, int port) {
- servers_.push_back(TSocketPoolServer(host, port));
+ servers_.push_back(shared_ptr<TSocketPoolServer>(new TSocketPoolServer(host, port)));
+}
+
+void TSocketPool::setServers(const vector< shared_ptr<TSocketPoolServer> >& servers) {
+ servers_ = servers;
}
-std::vector<TSocketPoolServer> TSocketPool::getServers() {
- return servers_;
+void TSocketPool::getServers(vector< shared_ptr<TSocketPoolServer> >& servers) {
+ servers = servers_;
}
void TSocketPool::setNumRetries(int numRetries) {
/* 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;
// 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);
+ }
}
}
class TSocketPool : public TSocket {
public:
+
+ /**
+ * Socket pool constructor
+ */
+ TSocketPool();
+
/**
* Socket pool constructor
*
*
* @param servers list of TSocketPoolServers
*/
- TSocketPool(const std::vector<TSocketPoolServer>& servers);
+ TSocketPool(const std::vector< boost::shared_ptr<TSocketPoolServer> >& servers);
/**
* Socket pool constructor
*/
void addServer(const std::string& host, int port);
+ /**
+ * Set list of servers in this pool
+ */
+ void setServers(const std::vector< boost::shared_ptr<TSocketPoolServer> >& servers);
/**
* Get list of servers in this pool
*/
- std::vector<TSocketPoolServer> getServers();
+ void getServers(std::vector< boost::shared_ptr<TSocketPoolServer> >& servers);
/**
* Sets how many times to keep retrying a host in the connect function.
protected:
/** List of servers to connect to */
- std::vector<TSocketPoolServer> servers_;
+ std::vector< boost::shared_ptr<TSocketPoolServer> > servers_;
/** How many times to retry each host in connect */
int numRetries_;