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
				
			
		|  | @ -66,39 +66,66 @@ td::uint32 DhtBucket::active_cnt() { | |||
| } | ||||
| 
 | ||||
| td::Status DhtBucket::add_full_node(DhtKeyId id, DhtNode newnode, td::actor::ActorId<adnl::Adnl> adnl, | ||||
|                                     adnl::AdnlNodeIdShort self_id, td::int32 our_network_id) { | ||||
|                                     adnl::AdnlNodeIdShort self_id, td::int32 our_network_id, bool set_active) { | ||||
|   for (auto &node : active_nodes_) { | ||||
|     if (node && node->get_key() == id) { | ||||
|       return node->update_value(std::move(newnode), adnl, self_id); | ||||
|       if (set_active) { | ||||
|         return node->receive_ping(std::move(newnode), adnl, self_id); | ||||
|       } else { | ||||
|         return node->update_value(std::move(newnode), adnl, self_id); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   for (auto &node : backup_nodes_) { | ||||
|   for (size_t i = 0; i < backup_nodes_.size(); ++i) { | ||||
|     auto &node = backup_nodes_[i]; | ||||
|     if (node && node->get_key() == id) { | ||||
|       return node->update_value(std::move(newnode), adnl, self_id); | ||||
|       if (set_active) { | ||||
|         TRY_STATUS(node->receive_ping(std::move(newnode), adnl, self_id)); | ||||
|         if (node->is_ready()) { | ||||
|           promote_node(i); | ||||
|         } | ||||
|         return td::Status::OK(); | ||||
|       } else { | ||||
|         return node->update_value(std::move(newnode), adnl, self_id); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   TRY_RESULT_PREFIX(N, DhtRemoteNode::create(std::move(newnode), max_missed_pings_, our_network_id), | ||||
|                     "failed to add new node: "); | ||||
| 
 | ||||
|   for (auto &node : backup_nodes_) { | ||||
|     if (node == nullptr) { | ||||
|       node = std::move(N); | ||||
|       return td::Status::OK(); | ||||
|   if (set_active) { | ||||
|     for (auto &node : active_nodes_) { | ||||
|       if (node == nullptr) { | ||||
|         node = std::move(N); | ||||
|         node->receive_ping(); | ||||
|         return td::Status::OK(); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   for (auto &node : backup_nodes_) { | ||||
|     CHECK(node); | ||||
|     if (node->ready_from() == 0 && node->failed_from() + 60 < td::Time::now_cached()) { | ||||
|       node = std::move(N); | ||||
|       return td::Status::OK(); | ||||
|     } | ||||
|   size_t idx = select_backup_node_to_drop(); | ||||
|   if (idx < backup_nodes_.size()) { | ||||
|     backup_nodes_[idx] = std::move(N); | ||||
|   } | ||||
| 
 | ||||
|   return td::Status::OK(); | ||||
| } | ||||
| 
 | ||||
| size_t DhtBucket::select_backup_node_to_drop() const { | ||||
|   size_t result = backup_nodes_.size(); | ||||
|   for (size_t idx = 0; idx < backup_nodes_.size(); ++idx) { | ||||
|     const auto &node = backup_nodes_[idx]; | ||||
|     if (node == nullptr) { | ||||
|       return idx; | ||||
|     } | ||||
|     if (node->ready_from() == 0 && node->failed_from() + 60 < td::Time::now_cached()) { | ||||
|       if (result == backup_nodes_.size() || node->failed_from() < backup_nodes_[result]->failed_from()) { | ||||
|         result = idx; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   return result; | ||||
| } | ||||
| 
 | ||||
| void DhtBucket::receive_ping(DhtKeyId id, DhtNode result, td::actor::ActorId<adnl::Adnl> adnl, | ||||
|                              adnl::AdnlNodeIdShort self_id) { | ||||
|   for (auto &node : active_nodes_) { | ||||
|  | @ -120,17 +147,9 @@ void DhtBucket::receive_ping(DhtKeyId id, DhtNode result, td::actor::ActorId<adn | |||
| } | ||||
| 
 | ||||
| void DhtBucket::demote_node(size_t idx) { | ||||
|   for (auto &node : backup_nodes_) { | ||||
|     if (node == nullptr) { | ||||
|       node = std::move(active_nodes_[idx]); | ||||
|       return; | ||||
|     } | ||||
|   } | ||||
|   for (auto &node : backup_nodes_) { | ||||
|     if (node->ready_from() == 0 && node->failed_from() + 60 < td::Time::now_cached()) { | ||||
|       node = std::move(active_nodes_[idx]); | ||||
|       return; | ||||
|     } | ||||
|   size_t new_idx = select_backup_node_to_drop(); | ||||
|   if (new_idx < backup_nodes_.size()) { | ||||
|     backup_nodes_[new_idx] = std::move(active_nodes_[idx]); | ||||
|   } | ||||
|   active_nodes_[idx] = nullptr; | ||||
| } | ||||
|  | @ -151,7 +170,7 @@ void DhtBucket::check(bool client_only, td::actor::ActorId<adnl::Adnl> adnl, td: | |||
|   size_t have_space = 0; | ||||
|   for (size_t i = 0; i < active_nodes_.size(); i++) { | ||||
|     auto &node = active_nodes_[i]; | ||||
|     if (node && td::Time::now_cached() - node->last_ping_at() > ping_timeout_) { | ||||
|     if (node && td::Time::now_cached() - node->last_ping_at() > node->ping_interval()) { | ||||
|       node->send_ping(client_only, adnl, dht, src); | ||||
|       if (node->ready_from() == 0) { | ||||
|         demote_node(i); | ||||
|  | @ -163,7 +182,7 @@ void DhtBucket::check(bool client_only, td::actor::ActorId<adnl::Adnl> adnl, td: | |||
|   } | ||||
|   for (size_t i = 0; i < backup_nodes_.size(); i++) { | ||||
|     auto &node = backup_nodes_[i]; | ||||
|     if (node && td::Time::now_cached() - node->last_ping_at() > ping_timeout_) { | ||||
|     if (node && td::Time::now_cached() - node->last_ping_at() > node->ping_interval()) { | ||||
|       node->send_ping(client_only, adnl, dht, src); | ||||
|     } | ||||
|     if (node && have_space > 0 && node->is_ready()) { | ||||
|  | @ -201,6 +220,9 @@ DhtNodesList DhtBucket::export_nodes() const { | |||
|       list.push_back(node->get_node()); | ||||
|     } | ||||
|   } | ||||
|   if (list.size() > k_) { | ||||
|     list.list().resize(k_); | ||||
|   } | ||||
|   return list; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue