ensure that empty entries are not returned from PoolWithFailoverBase [#CLICKHOUSE-2141]

This commit is contained in:
Alexey Zatelepin 2017-04-18 16:37:00 +03:00
parent d29f3c79c3
commit aa62dc354f
2 changed files with 12 additions and 8 deletions

View File

@ -139,6 +139,7 @@ ConnectionPoolWithFailover::tryGetEntry(
if (!table_to_check || !max_allowed_delay || server_revision < DBMS_MIN_REVISION_WITH_TABLES_STATUS)
{
result.entry->forceConnected();
result.is_up_to_date = true;
return result;
}
@ -162,7 +163,9 @@ ConnectionPoolWithFailover::tryGetEntry(
max_delay = std::max(max_delay, status.absolute_delay);
}
if (max_delay >= max_allowed_delay)
if (max_delay < max_allowed_delay)
result.is_up_to_date = true;
else
{
result.is_up_to_date = false;
result.staleness = max_delay;

View File

@ -68,10 +68,10 @@ public:
struct TryResult
{
TryResult() = default;
explicit TryResult(Entry entry_) : entry(std::move(entry)) {}
explicit TryResult(Entry entry_) : entry(std::move(entry)), is_up_to_date(true) {}
Entry entry;
bool is_up_to_date = true; /// If true, the entry is a connection to up-to-date replica.
bool is_up_to_date = false; /// If true, the entry is a connection to up-to-date replica.
double staleness = 0.0; /// Helps choosing the "least stale" option when all replicas are stale.
};
@ -224,6 +224,12 @@ PoolWithFailoverBase<TNestedPool>::getMany(
"All connection tries failed. Log: \n\n" + fail_messages + "\n",
DB::ErrorCodes::ALL_CONNECTION_TRIES_FAILED);
try_results.erase(
std::remove_if(
try_results.begin(), try_results.end(),
[](const TryResult & r) { return r.entry.isNull(); }),
try_results.end());
std::vector<Entry> entries;
if (up_to_date_count >= min_entries)
@ -237,11 +243,6 @@ PoolWithFailoverBase<TNestedPool>::getMany(
}
else if (fallback_to_stale_replicas)
{
try_results.erase(
std::remove_if(
try_results.begin(), try_results.end(),
[](const TryResult & r) { return r.entry.isNull(); }),
try_results.end());
std::stable_sort(
try_results.begin(), try_results.end(),
[](const TryResult & left, const TryResult & right)