mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-22 23:52:03 +00:00
Move some logic to HostResolver::Record methods
This commit is contained in:
parent
22f1c197e5
commit
58c53fa50b
@ -139,10 +139,8 @@ void HostResolver::setSuccess(const Poco::Net::IPAddress & address)
|
|||||||
if (it == records.end())
|
if (it == records.end())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
it->fail_count = 0;
|
|
||||||
|
|
||||||
auto old_weight = it->getWeight();
|
auto old_weight = it->getWeight();
|
||||||
++it->usage;
|
it->setSuccess();
|
||||||
auto new_weight = it->getWeight();
|
auto new_weight = it->getWeight();
|
||||||
|
|
||||||
if (old_weight != new_weight)
|
if (old_weight != new_weight)
|
||||||
@ -160,10 +158,7 @@ void HostResolver::setFail(const Poco::Net::IPAddress & address)
|
|||||||
if (it == records.end())
|
if (it == records.end())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
it->failed = true;
|
it->setFail(now);
|
||||||
it->fail_time = now;
|
|
||||||
if (it->fail_count < RECORD_FAIL_COUNT_LIMIT)
|
|
||||||
++it->fail_count;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ProfileEvents::increment(metrics.failed);
|
ProfileEvents::increment(metrics.failed);
|
||||||
@ -244,8 +239,7 @@ void HostResolver::updateImpl(Poco::Timestamp now, std::vector<Poco::Net::IPAddr
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (auto & rec : merged)
|
for (auto & rec : merged)
|
||||||
if (rec.failed && rec.fail_time < now - Poco::Timespan(history.totalSeconds() * (1ull << (rec.fail_count - 1)), 0))
|
rec.cleanTimeoutedFailedFlag(now, history);
|
||||||
rec.failed = false;
|
|
||||||
|
|
||||||
chassert(std::is_sorted(merged.begin(), merged.end()));
|
chassert(std::is_sorted(merged.begin(), merged.end()));
|
||||||
|
|
||||||
@ -258,6 +252,7 @@ void HostResolver::updateImpl(Poco::Timestamp now, std::vector<Poco::Net::IPAddr
|
|||||||
updateWeights();
|
updateWeights();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
size_t HostResolver::getTotalWeight() const
|
size_t HostResolver::getTotalWeight() const
|
||||||
{
|
{
|
||||||
if (records.empty())
|
if (records.empty())
|
||||||
|
@ -42,7 +42,7 @@ struct HostResolverMetrics
|
|||||||
};
|
};
|
||||||
|
|
||||||
constexpr size_t DEFAULT_RESOLVE_TIME_HISTORY_SECONDS = 2*60;
|
constexpr size_t DEFAULT_RESOLVE_TIME_HISTORY_SECONDS = 2*60;
|
||||||
constexpr size_t RECORD_FAIL_COUNT_LIMIT = 6;
|
constexpr size_t RECORD_CONSECTIVE_FAIL_COUNT_LIMIT = 6;
|
||||||
|
|
||||||
|
|
||||||
class HostResolver : public std::enable_shared_from_this<HostResolver>
|
class HostResolver : public std::enable_shared_from_this<HostResolver>
|
||||||
@ -142,7 +142,7 @@ protected:
|
|||||||
size_t usage = 0;
|
size_t usage = 0;
|
||||||
bool failed = false;
|
bool failed = false;
|
||||||
Poco::Timestamp fail_time = 0;
|
Poco::Timestamp fail_time = 0;
|
||||||
size_t fail_count = 0;
|
size_t consecutive_fail_count = 0;
|
||||||
|
|
||||||
size_t weight_prefix_sum;
|
size_t weight_prefix_sum;
|
||||||
|
|
||||||
@ -168,6 +168,29 @@ protected:
|
|||||||
return 8;
|
return 8;
|
||||||
return 10;
|
return 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cleanTimeoutedFailedFlag(const Poco::Timestamp & now, const Poco::Timespan & keep_history)
|
||||||
|
{
|
||||||
|
if (!failed)
|
||||||
|
return;
|
||||||
|
/// Exponential increased time between flag cleanups
|
||||||
|
if (fail_time < now - Poco::Timespan(keep_history.totalSeconds() * (1ull << (consecutive_fail_count - 1)), 0))
|
||||||
|
failed = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setFail(const Poco::Timestamp & now)
|
||||||
|
{
|
||||||
|
failed = true;
|
||||||
|
fail_time = now;
|
||||||
|
if (consecutive_fail_count < RECORD_CONSECTIVE_FAIL_COUNT_LIMIT)
|
||||||
|
++consecutive_fail_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setSuccess()
|
||||||
|
{
|
||||||
|
consecutive_fail_count = 0;
|
||||||
|
++usage;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
using Records = std::vector<Record>;
|
using Records = std::vector<Record>;
|
||||||
@ -180,6 +203,7 @@ protected:
|
|||||||
void updateWeights() TSA_REQUIRES(mutex);
|
void updateWeights() TSA_REQUIRES(mutex);
|
||||||
void updateWeightsImpl() TSA_REQUIRES(mutex);
|
void updateWeightsImpl() TSA_REQUIRES(mutex);
|
||||||
size_t getTotalWeight() const TSA_REQUIRES(mutex);
|
size_t getTotalWeight() const TSA_REQUIRES(mutex);
|
||||||
|
Poco::Timespan getRecordHistoryTime(const Record&) const;
|
||||||
|
|
||||||
const String host;
|
const String host;
|
||||||
const Poco::Timespan history;
|
const Poco::Timespan history;
|
||||||
|
Loading…
Reference in New Issue
Block a user