mirror of
https://github.com/ton-blockchain/ton
synced 2025-03-09 15:40:10 +00:00
Improve handling backup nodes in dht (#562)
This commit is contained in:
parent
360ef54e6b
commit
dd9cdba587
6 changed files with 100 additions and 47 deletions
|
@ -32,19 +32,39 @@ namespace ton {
|
|||
|
||||
namespace dht {
|
||||
|
||||
static const double PING_INTERVAL_DEFAULT = 60.0;
|
||||
static const double PING_INTERVAL_MULTIPLIER = 1.1;
|
||||
static const double PING_INTERVAL_MAX = 3600.0 * 4;
|
||||
|
||||
DhtRemoteNode::DhtRemoteNode(DhtNode node, td::uint32 max_missed_pings, td::int32 our_network_id)
|
||||
: node_(std::move(node))
|
||||
, max_missed_pings_(max_missed_pings)
|
||||
, our_network_id_(our_network_id)
|
||||
, ping_interval_(PING_INTERVAL_DEFAULT) {
|
||||
failed_from_ = td::Time::now_cached();
|
||||
id_ = node_.get_key();
|
||||
}
|
||||
|
||||
td::Status DhtRemoteNode::receive_ping(DhtNode node, td::actor::ActorId<adnl::Adnl> adnl,
|
||||
adnl::AdnlNodeIdShort self_id) {
|
||||
TRY_STATUS(update_value(std::move(node), adnl, self_id));
|
||||
receive_ping();
|
||||
return td::Status::OK();
|
||||
}
|
||||
|
||||
void DhtRemoteNode::receive_ping() {
|
||||
missed_pings_ = 0;
|
||||
ping_interval_ = PING_INTERVAL_DEFAULT;
|
||||
if (ready_from_ == 0) {
|
||||
ready_from_ = td::Time::now_cached();
|
||||
}
|
||||
return td::Status::OK();
|
||||
}
|
||||
|
||||
td::Status DhtRemoteNode::update_value(DhtNode node, td::actor::ActorId<adnl::Adnl> adnl,
|
||||
adnl::AdnlNodeIdShort self_id) {
|
||||
CHECK(node.adnl_id() == node_.adnl_id());
|
||||
if (node.adnl_id() != node_.adnl_id()) {
|
||||
return td::Status::Error("Wrong adnl id");
|
||||
}
|
||||
if (node.version() <= node_.version()) {
|
||||
return td::Status::OK();
|
||||
}
|
||||
|
@ -58,9 +78,12 @@ td::Status DhtRemoteNode::update_value(DhtNode node, td::actor::ActorId<adnl::Ad
|
|||
void DhtRemoteNode::send_ping(bool client_only, td::actor::ActorId<adnl::Adnl> adnl, td::actor::ActorId<DhtMember> node,
|
||||
adnl::AdnlNodeIdShort src) {
|
||||
missed_pings_++;
|
||||
if (missed_pings_ > max_missed_pings_ && ready_from_ > 0) {
|
||||
ready_from_ = 0;
|
||||
failed_from_ = td::Time::now_cached();
|
||||
if (missed_pings_ > max_missed_pings_) {
|
||||
ping_interval_ = std::min(ping_interval_ * PING_INTERVAL_MULTIPLIER, PING_INTERVAL_MAX);
|
||||
if (ready_from_ > 0) {
|
||||
ready_from_ = 0;
|
||||
failed_from_ = td::Time::now_cached();
|
||||
}
|
||||
}
|
||||
|
||||
last_ping_at_ = td::Time::now_cached();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue