SON conn. pool
This commit is contained in:
parent
54a7e5b757
commit
d2cb8cd846
1 changed files with 16 additions and 9 deletions
|
|
@ -311,6 +311,9 @@ void rpc_client::schedule_connection_selection()
|
||||||
void rpc_client::select_connection()
|
void rpc_client::select_connection()
|
||||||
{
|
{
|
||||||
//ilog("n_active_rpc_client=${n}", ("n", n_active_rpc_client));
|
//ilog("n_active_rpc_client=${n}", ("n", n_active_rpc_client));
|
||||||
|
static const int t_limit = 10*1000000, // 10 sec
|
||||||
|
quality_diff_threshold = 10000; // 10 ms
|
||||||
|
|
||||||
FC_ASSERT(connections.size());
|
FC_ASSERT(connections.size());
|
||||||
|
|
||||||
int best_n = -1;
|
int best_n = -1;
|
||||||
|
|
@ -318,6 +321,9 @@ void rpc_client::select_connection()
|
||||||
|
|
||||||
std::vector<uint64_t> head_block_numbers;
|
std::vector<uint64_t> head_block_numbers;
|
||||||
head_block_numbers.resize(connections.size());
|
head_block_numbers.resize(connections.size());
|
||||||
|
|
||||||
|
std::vector<int> qualities;
|
||||||
|
qualities.resize(connections.size());
|
||||||
|
|
||||||
for (size_t n=0; n < connections.size(); n++) {
|
for (size_t n=0; n < connections.size(); n++) {
|
||||||
rpc_connection *conn = connections[n];
|
rpc_connection *conn = connections[n];
|
||||||
|
|
@ -333,7 +339,6 @@ void rpc_client::select_connection()
|
||||||
t += rand() % 10;
|
t += rand() % 10;
|
||||||
FC_ASSERT(t != -1);
|
FC_ASSERT(t != -1);
|
||||||
head_block_numbers[n] = head_block_number;
|
head_block_numbers[n] = head_block_number;
|
||||||
static const int t_limit = 10*1000000; // 10 sec
|
|
||||||
if (t < t_limit)
|
if (t < t_limit)
|
||||||
quality = t_limit - t; // the less time, the higher quality
|
quality = t_limit - t; // the less time, the higher quality
|
||||||
|
|
||||||
|
|
@ -343,15 +348,17 @@ void rpc_client::select_connection()
|
||||||
best_quality = quality;
|
best_quality = quality;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
qualities[n] = quality;
|
||||||
|
}
|
||||||
|
|
||||||
FC_ASSERT(best_n != -1 && best_quality != -1);
|
FC_ASSERT(best_n != -1 && best_quality != -1);
|
||||||
if (best_n != n_active_conn) { // if the best client is not the current one, ...
|
if (best_n != n_active_conn) { // if the best client is not the current one, ...
|
||||||
uint64_t active_head_block_number = head_block_numbers[n_active_conn];
|
uint64_t active_head_block_number = head_block_numbers[n_active_conn];
|
||||||
if (active_head_block_number == std::numeric_limits<uint64_t>::max() // ... and the current one has no known head block...
|
if ((active_head_block_number == std::numeric_limits<uint64_t>::max() // ...and the current one has no known head block...
|
||||||
|| head_block_numbers[best_n] >= active_head_block_number) { // ...or the best client's head is more recent than the current, ...
|
|| head_block_numbers[best_n] >= active_head_block_number) // ...or the best client's head is more recent than the current, ...
|
||||||
n_active_conn = best_n; // ...then select new one
|
&& best_quality > qualities[n_active_conn] + quality_diff_threshold) { // ...and the new client's quality exceeds current more than by threshold
|
||||||
ilog("!!! rpc connection reselected, now ${n}", ("n", n_active_conn));
|
n_active_conn = best_n; // ...then select new one
|
||||||
}
|
ilog("!!! rpc connection reselected, now ${n}", ("n", n_active_conn));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue