diff --git a/src/nameservice/UpstreamPolicies.cc b/src/nameservice/UpstreamPolicies.cc index 2be7daec..f102185c 100644 --- a/src/nameservice/UpstreamPolicies.cc +++ b/src/nameservice/UpstreamPolicies.cc @@ -187,7 +187,7 @@ const EndpointAddress *EndpointGroup::get_one() const EndpointAddress *addr = NULL; pthread_mutex_lock(&this->mutex); - std::random_shuffle(this->mains.begin(), this->mains.end()); + std::shuffle(this->mains.begin(), this->mains.end(), this->gen); for (size_t i = 0; i < this->mains.size(); i++) { if (this->mains[i]->fail_count < this->mains[i]->params->max_fails) @@ -199,7 +199,7 @@ const EndpointAddress *EndpointGroup::get_one() if (!addr) { - std::random_shuffle(this->backups.begin(), this->backups.end()); + std::shuffle(this->backups.begin(), this->backups.end(), this->gen); for (size_t i = 0; i < this->backups.size(); i++) { if (this->backups[i]->fail_count < this->backups[i]->params->max_fails) @@ -222,7 +222,7 @@ const EndpointAddress *EndpointGroup::get_one_backup() const EndpointAddress *addr = NULL; pthread_mutex_lock(&this->mutex); - std::random_shuffle(this->backups.begin(), this->backups.end()); + std::shuffle(this->backups.begin(), this->backups.end(), this->gen); for (size_t i = 0; i < this->backups.size(); i++) { if (this->backups[i]->fail_count < this->backups[i]->params->max_fails) diff --git a/src/nameservice/UpstreamPolicies.h b/src/nameservice/UpstreamPolicies.h index b9af095a..74598e92 100644 --- a/src/nameservice/UpstreamPolicies.h +++ b/src/nameservice/UpstreamPolicies.h @@ -20,8 +20,10 @@ #define _UPSTREAM_POLICIES_H_ #include +#include #include #include +#include #include "URIParser.h" #include "EndpointParams.h" #include "WFNameService.h" @@ -56,13 +58,16 @@ public: UPSGroupPolicy *policy; struct rb_node rb; pthread_mutex_t mutex; + std::random_device rd; + std::mt19937 gen; std::vector mains; std::vector backups; std::atomic nalives; int weight; EndpointGroup(int group_id, UPSGroupPolicy *policy) : - mutex(PTHREAD_MUTEX_INITIALIZER) + mutex(PTHREAD_MUTEX_INITIALIZER), + gen(rd()) { this->id = group_id; this->policy = policy;