mirror of
https://github.com/sogou/workflow.git
synced 2026-10-22 23:39:54 +08:00
@@ -95,7 +95,7 @@ public:
|
||||
Upstream *upstream;
|
||||
struct rb_node rb;
|
||||
std::mutex mutex;
|
||||
std::vector<UpstreamAddress *> masters;
|
||||
std::vector<UpstreamAddress *> mains;
|
||||
std::vector<UpstreamAddress *> backups;
|
||||
struct list_head breaker_list;
|
||||
std::atomic<int> nbreak;
|
||||
@@ -134,7 +134,7 @@ public:
|
||||
int set_attr(bool try_another, upstream_route_t rehash_callback);
|
||||
void check_one_breaker(UpstreamGroup *group, int64_t cur_time);
|
||||
void check_all_breaker();
|
||||
void get_all_master(std::vector<std::string>& addr_list);
|
||||
void get_all_main(std::vector<std::string>& addr_list);
|
||||
|
||||
static void notify_unavailable(UpstreamAddress *ua);
|
||||
static void notify_available(UpstreamAddress *ua);
|
||||
@@ -143,7 +143,7 @@ protected:
|
||||
pthread_rwlock_t rwlock_;
|
||||
int total_weight_;
|
||||
int available_weight_;
|
||||
std::vector<UpstreamAddress *> masters_;
|
||||
std::vector<UpstreamAddress *> mains_;
|
||||
std::unordered_map<std::string, std::vector<UpstreamAddress *>> server_map_;
|
||||
struct rb_root group_map_;
|
||||
upstream_route_t select_callback_;
|
||||
@@ -166,11 +166,11 @@ const UpstreamAddress *UpstreamGroup::get_one()
|
||||
|
||||
std::lock_guard<std::mutex> lock(this->mutex);
|
||||
|
||||
std::random_shuffle(this->masters.begin(), this->masters.end());
|
||||
for (const auto *master : this->masters)
|
||||
std::random_shuffle(this->mains.begin(), this->mains.end());
|
||||
for (const auto *main : this->mains)
|
||||
{
|
||||
if (master->fail_count < master->params.max_fails)
|
||||
return master;
|
||||
if (main->fail_count < main->params.max_fails)
|
||||
return main;
|
||||
}
|
||||
|
||||
std::random_shuffle(this->backups.begin(), this->backups.end());
|
||||
@@ -328,7 +328,7 @@ int Upstream::add(UpstreamAddress *ua)
|
||||
if (ua->params.server_type == 0)
|
||||
{
|
||||
total_weight_ += ua->params.weight;
|
||||
masters_.push_back(ua);
|
||||
mains_.push_back(ua);
|
||||
}
|
||||
|
||||
group->mutex.lock();
|
||||
@@ -337,7 +337,7 @@ int Upstream::add(UpstreamAddress *ua)
|
||||
if (ua->params.server_type == 0)
|
||||
{
|
||||
group->weight += ua->params.weight;
|
||||
group->masters.push_back(ua);
|
||||
group->mains.push_back(ua);
|
||||
}
|
||||
else
|
||||
group->backups.push_back(ua);
|
||||
@@ -362,7 +362,7 @@ int Upstream::del(const std::string& address)
|
||||
if (ua->params.server_type == 0)
|
||||
{
|
||||
total_weight_ -= ua->params.weight;
|
||||
vec = &group->masters;
|
||||
vec = &group->mains;
|
||||
}
|
||||
else
|
||||
vec = &group->backups;
|
||||
@@ -389,15 +389,15 @@ int Upstream::del(const std::string& address)
|
||||
server_map_.erase(map_it);
|
||||
}
|
||||
|
||||
int n = (int)masters_.size();
|
||||
int n = (int)mains_.size();
|
||||
int new_n = 0;
|
||||
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
if (masters_[i]->address != address)
|
||||
if (mains_[i]->address != address)
|
||||
{
|
||||
if (new_n != i)
|
||||
masters_[new_n++] = masters_[i];
|
||||
mains_[new_n++] = mains_[i];
|
||||
else
|
||||
new_n++;
|
||||
}
|
||||
@@ -405,7 +405,7 @@ int Upstream::del(const std::string& address)
|
||||
|
||||
if (new_n < n)
|
||||
{
|
||||
masters_.resize(new_n);
|
||||
mains_.resize(new_n);
|
||||
return n - new_n;
|
||||
}
|
||||
|
||||
@@ -454,12 +454,12 @@ void Upstream::enable_server(const std::string& address)
|
||||
}
|
||||
}
|
||||
|
||||
void Upstream::get_all_master(std::vector<std::string>& addr_list)
|
||||
void Upstream::get_all_main(std::vector<std::string>& addr_list)
|
||||
{
|
||||
ReadLock lock(rwlock_);
|
||||
|
||||
for (const auto *master : masters_)
|
||||
addr_list.push_back(master->address);
|
||||
for (const auto *main : mains_)
|
||||
addr_list.push_back(main->address);
|
||||
}
|
||||
|
||||
static inline const UpstreamAddress *__check_get_strong(const UpstreamAddress *ua)
|
||||
@@ -505,12 +505,12 @@ const UpstreamAddress *Upstream::weighted_random_try_another() const
|
||||
int x = rand() % temp_weight;
|
||||
int s = 0;
|
||||
|
||||
for (const auto *master : masters_)
|
||||
for (const auto *main : mains_)
|
||||
{
|
||||
if (__is_alive_or_group_alive(master))
|
||||
if (__is_alive_or_group_alive(main))
|
||||
{
|
||||
ua = master;
|
||||
s += master->params.weight;
|
||||
ua = main;
|
||||
s += main->params.weight;
|
||||
if (s > x)
|
||||
break;
|
||||
}
|
||||
@@ -524,20 +524,20 @@ const UpstreamAddress *Upstream::consistent_hash_select(unsigned int hash) const
|
||||
const UpstreamAddress *ua = NULL;
|
||||
unsigned int min_dis = (unsigned int)-1;
|
||||
|
||||
for (const auto *master : masters_)
|
||||
for (const auto *main : mains_)
|
||||
{
|
||||
if (__is_alive_or_group_alive(master))
|
||||
if (__is_alive_or_group_alive(main))
|
||||
{
|
||||
for (int i = 0; i < VIRTUAL_GROUP_SIZE; i++)
|
||||
{
|
||||
unsigned int dis = std::min<unsigned int>
|
||||
(hash - master->consistent_hash[i],
|
||||
master->consistent_hash[i] - hash);
|
||||
(hash - main->consistent_hash[i],
|
||||
main->consistent_hash[i] - hash);
|
||||
|
||||
if (dis < min_dis)
|
||||
{
|
||||
min_dis = dis;
|
||||
ua = master;
|
||||
ua = main;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -616,7 +616,7 @@ const UpstreamAddress *Upstream::get(const ParsedURI& uri)
|
||||
else
|
||||
{
|
||||
ReadLock lock(rwlock_);
|
||||
unsigned int n = (unsigned int)masters_.size();
|
||||
unsigned int n = (unsigned int)mains_.size();
|
||||
|
||||
if (n == 0)
|
||||
return NULL;
|
||||
@@ -642,7 +642,7 @@ const UpstreamAddress *Upstream::get(const ParsedURI& uri)
|
||||
|
||||
for (idx = 0; idx < n; idx++)
|
||||
{
|
||||
s += masters_[idx]->params.weight;
|
||||
s += mains_[idx]->params.weight;
|
||||
if (s > x)
|
||||
break;
|
||||
}
|
||||
@@ -651,7 +651,7 @@ const UpstreamAddress *Upstream::get(const ParsedURI& uri)
|
||||
idx = n - 1;
|
||||
}
|
||||
|
||||
ua = masters_[idx];
|
||||
ua = mains_[idx];
|
||||
if (ua->fail_count >= ua->params.max_fails)
|
||||
{
|
||||
check_all_breaker();
|
||||
@@ -924,7 +924,7 @@ public:
|
||||
return -1;
|
||||
}
|
||||
|
||||
std::vector<std::string> upstream_master_address_list(const std::string& name)
|
||||
std::vector<std::string> upstream_main_address_list(const std::string& name)
|
||||
{
|
||||
std::vector<std::string> addr_list;
|
||||
Upstream *upstream = NULL;
|
||||
@@ -937,7 +937,7 @@ public:
|
||||
}
|
||||
|
||||
if (upstream)
|
||||
upstream->get_all_master(addr_list);
|
||||
upstream->get_all_main(addr_list);
|
||||
|
||||
return addr_list;
|
||||
}
|
||||
@@ -1109,11 +1109,11 @@ int UpstreamManager::upstream_enable_server(const std::string& name,
|
||||
return manager->upstream_enable_server(name, address);
|
||||
}
|
||||
|
||||
std::vector<std::string> UpstreamManager::upstream_master_address_list(const std::string& name)
|
||||
std::vector<std::string> UpstreamManager::upstream_main_address_list(const std::string& name)
|
||||
{
|
||||
auto *manager = __UpstreamManager::get_instance();
|
||||
|
||||
return manager->upstream_master_address_list(name);
|
||||
return manager->upstream_main_address_list(name);
|
||||
}
|
||||
|
||||
int UpstreamManager::upstream_delete(const std::string& name)
|
||||
|
||||
@@ -84,7 +84,7 @@ static constexpr struct AddressParams ADDRESS_PARAMS_DEFAULT =
|
||||
* 1. Weighted-Random
|
||||
* 2. Consistent-Hash
|
||||
* 3. Manual-Select
|
||||
* - Additional, we support Master-Slave & Group for server and working well in any mode.
|
||||
* - Additional, we support Main-backup & Group for server and working well in any mode.
|
||||
*
|
||||
* @code{.cc}
|
||||
upstream_create_weighted_random("abc.sogou", true); //UPSTREAM_WIGHTED_RANDOM
|
||||
@@ -151,7 +151,7 @@ public:
|
||||
/**
|
||||
* @brief MODE 3: manual select
|
||||
* @param[in] name upstream name
|
||||
* @param[in] select manual select functional, just tell us master-index.
|
||||
* @param[in] select manual select functional, just tell us main-index.
|
||||
* @param[in] try_another when first choice is failed, try another one or not
|
||||
* @param[in] consitent_hash consistent-hash functional
|
||||
* @return success/fail
|
||||
@@ -218,12 +218,12 @@ public:
|
||||
const std::string& address);
|
||||
|
||||
/**
|
||||
* @brief get all master address list from one upstream
|
||||
* @brief get all main servers address list from one upstream
|
||||
* @param[in] name upstream name
|
||||
* @return all master address list
|
||||
* @return all main servers' address list
|
||||
* @warning If server servers has the same address in this upstream, then will appear in the vector multiply times
|
||||
*/
|
||||
static std::vector<std::string> upstream_master_address_list(const std::string& name);
|
||||
static std::vector<std::string> upstream_main_address_list(const std::string& name);
|
||||
|
||||
public:
|
||||
/// @breif for plugin
|
||||
|
||||
Reference in New Issue
Block a user