mirror of
				https://github.com/ton-blockchain/ton
				synced 2025-03-09 15:40:10 +00:00 
			
		
		
		
	Add retries in validator group + bugfix
This commit is contained in:
		
							parent
							
								
									212c07f2f0
								
							
						
					
					
						commit
						5be10b1e6b
					
				
					 3 changed files with 37 additions and 11 deletions
				
			
		| 
						 | 
					@ -407,7 +407,9 @@ void FullNodeImpl::got_key_block_proof(td::Ref<ProofLink> proof) {
 | 
				
			||||||
  CHECK(all_validators_.size() > 0);
 | 
					  CHECK(all_validators_.size() > 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (auto &shard : shards_) {
 | 
					  for (auto &shard : shards_) {
 | 
				
			||||||
    td::actor::send_closure(shard.second.actor, &FullNodeShard::update_validators, all_validators_, sign_cert_by_);
 | 
					    if (!shard.second.actor.empty()) {
 | 
				
			||||||
 | 
					      td::actor::send_closure(shard.second.actor, &FullNodeShard::update_validators, all_validators_, sign_cert_by_);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -263,16 +263,17 @@ void ValidatorGroup::create_session() {
 | 
				
			||||||
    validatorsession::ValidatorSessionNode n;
 | 
					    validatorsession::ValidatorSessionNode n;
 | 
				
			||||||
    n.pub_key = ValidatorFullId{el.key};
 | 
					    n.pub_key = ValidatorFullId{el.key};
 | 
				
			||||||
    n.weight = el.weight;
 | 
					    n.weight = el.weight;
 | 
				
			||||||
    if (n.pub_key.compute_short_id() == local_id_) {
 | 
					 | 
				
			||||||
      CHECK(!found);
 | 
					 | 
				
			||||||
      found = true;
 | 
					 | 
				
			||||||
      local_id_full_ = n.pub_key;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (el.addr.is_zero()) {
 | 
					    if (el.addr.is_zero()) {
 | 
				
			||||||
      n.adnl_id = adnl::AdnlNodeIdShort{n.pub_key.compute_short_id()};
 | 
					      n.adnl_id = adnl::AdnlNodeIdShort{n.pub_key.compute_short_id()};
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      n.adnl_id = adnl::AdnlNodeIdShort{el.addr};
 | 
					      n.adnl_id = adnl::AdnlNodeIdShort{el.addr};
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    if (n.pub_key.compute_short_id() == local_id_) {
 | 
				
			||||||
 | 
					      CHECK(!found);
 | 
				
			||||||
 | 
					      found = true;
 | 
				
			||||||
 | 
					      local_id_full_ = n.pub_key;
 | 
				
			||||||
 | 
					      local_adnl_id_ = n.adnl_id;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    vec.emplace_back(std::move(n));
 | 
					    vec.emplace_back(std::move(n));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  CHECK(found);
 | 
					  CHECK(found);
 | 
				
			||||||
| 
						 | 
					@ -292,6 +293,8 @@ void ValidatorGroup::create_session() {
 | 
				
			||||||
  if (started_) {
 | 
					  if (started_) {
 | 
				
			||||||
    td::actor::send_closure(session_, &validatorsession::ValidatorSession::start);
 | 
					    td::actor::send_closure(session_, &validatorsession::ValidatorSession::start);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  td::actor::send_closure(rldp_, &rldp::Rldp::add_id, local_adnl_id_);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ValidatorGroup::start(std::vector<BlockIdExt> prev, BlockIdExt min_masterchain_block_id) {
 | 
					void ValidatorGroup::start(std::vector<BlockIdExt> prev, BlockIdExt min_masterchain_block_id) {
 | 
				
			||||||
| 
						 | 
					@ -346,7 +349,11 @@ void ValidatorGroup::get_session_info(
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ValidatorGroup::send_collate_query(td::uint32 round_id, td::Timestamp timeout,
 | 
					void ValidatorGroup::send_collate_query(td::uint32 round_id, td::Timestamp timeout,
 | 
				
			||||||
                                        td::Promise<BlockCandidate> promise) {
 | 
					                                        td::Promise<BlockCandidate> promise, unsigned max_retries) {
 | 
				
			||||||
 | 
					  if (round_id < last_known_round_id_) {
 | 
				
			||||||
 | 
					    promise.set_error(td::Status::Error("too old"));
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  adnl::AdnlNodeIdShort collator = adnl::AdnlNodeIdShort::zero();
 | 
					  adnl::AdnlNodeIdShort collator = adnl::AdnlNodeIdShort::zero();
 | 
				
			||||||
  // TODO: some other way for storing and choosing collators for real network
 | 
					  // TODO: some other way for storing and choosing collators for real network
 | 
				
			||||||
  int cnt = 0;
 | 
					  int cnt = 0;
 | 
				
			||||||
| 
						 | 
					@ -356,12 +363,26 @@ void ValidatorGroup::send_collate_query(td::uint32 round_id, td::Timestamp timeo
 | 
				
			||||||
      ++cnt;
 | 
					      ++cnt;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (collator.is_zero()) {
 | 
					  if (collator.is_zero()) {
 | 
				
			||||||
    promise.set_error(td::Status::Error(PSTRING() << "no collator for shard " << shard_.to_str()));
 | 
					    promise.set_error(td::Status::Error(PSTRING() << "no collator for shard " << shard_.to_str()));
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (max_retries > 0) {
 | 
				
			||||||
 | 
					    promise = td::PromiseCreator::lambda(
 | 
				
			||||||
 | 
					        [=, SelfId = actor_id(this), promise = std::move(promise)](td::Result<BlockCandidate> R) mutable {
 | 
				
			||||||
 | 
					          if (R.is_ok()) {
 | 
				
			||||||
 | 
					            promise.set_result(R.move_as_ok());
 | 
				
			||||||
 | 
					          } else if (timeout && timeout.is_in_past()) {
 | 
				
			||||||
 | 
					            promise.set_result(R.move_as_error());
 | 
				
			||||||
 | 
					          } else {
 | 
				
			||||||
 | 
					            LOG(WARNING) << "collate query error, retrying: " << R.move_as_error();
 | 
				
			||||||
 | 
					            td::actor::send_closure(SelfId, &ValidatorGroup::send_collate_query, round_id, timeout, std::move(promise),
 | 
				
			||||||
 | 
					                                    max_retries - 1);
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  std::vector<tl_object_ptr<ton_api::tonNode_blockIdExt>> prev_blocks;
 | 
					  std::vector<tl_object_ptr<ton_api::tonNode_blockIdExt>> prev_blocks;
 | 
				
			||||||
  for (const BlockIdExt &p : prev_block_ids_) {
 | 
					  for (const BlockIdExt &p : prev_block_ids_) {
 | 
				
			||||||
    prev_blocks.push_back(create_tl_block_id(p));
 | 
					    prev_blocks.push_back(create_tl_block_id(p));
 | 
				
			||||||
| 
						 | 
					@ -381,7 +402,9 @@ void ValidatorGroup::send_collate_query(td::uint32 round_id, td::Timestamp timeo
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
  LOG(INFO) << "collate query for " << create_next_block_id_simple().to_str() << ": send query to " << collator;
 | 
					  LOG(INFO) << "collate query for " << create_next_block_id_simple().to_str() << ": send query to " << collator;
 | 
				
			||||||
  size_t max_answer_size = config_.max_block_size + config_.max_collated_data_size + 256;
 | 
					  size_t max_answer_size = config_.max_block_size + config_.max_collated_data_size + 256;
 | 
				
			||||||
  td::actor::send_closure(rldp_, &rldp::Rldp::send_query_ex, adnl::AdnlNodeIdShort(local_id_), collator, "collatequery",
 | 
					  td::Timestamp query_timeout = td::Timestamp::in(10.0);
 | 
				
			||||||
 | 
					  query_timeout.relax(timeout);
 | 
				
			||||||
 | 
					  td::actor::send_closure(rldp_, &rldp::Rldp::send_query_ex, local_adnl_id_, collator, "collatequery",
 | 
				
			||||||
                          std::move(P), timeout, std::move(query), max_answer_size);
 | 
					                          std::move(P), timeout, std::move(query), max_answer_size);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -55,7 +55,6 @@ class ValidatorGroup : public td::actor::Actor {
 | 
				
			||||||
      init_ = false;
 | 
					      init_ = false;
 | 
				
			||||||
      create_session();
 | 
					      create_session();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    td::actor::send_closure(rldp_, &rldp::Rldp::add_id, adnl::AdnlNodeIdShort(local_id_));
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  void get_session_info(td::Promise<tl_object_ptr<ton_api::engine_validator_validatorSessionInfo>> promise);
 | 
					  void get_session_info(td::Promise<tl_object_ptr<ton_api::engine_validator_validatorSessionInfo>> promise);
 | 
				
			||||||
| 
						 | 
					@ -86,7 +85,8 @@ class ValidatorGroup : public td::actor::Actor {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 private:
 | 
					 private:
 | 
				
			||||||
  std::unique_ptr<validatorsession::ValidatorSession::Callback> make_validator_session_callback();
 | 
					  std::unique_ptr<validatorsession::ValidatorSession::Callback> make_validator_session_callback();
 | 
				
			||||||
  void send_collate_query(td::uint32 round_id, td::Timestamp timeout, td::Promise<BlockCandidate> promise);
 | 
					  void send_collate_query(td::uint32 round_id, td::Timestamp timeout, td::Promise<BlockCandidate> promise,
 | 
				
			||||||
 | 
					                          unsigned max_retries = 4);
 | 
				
			||||||
  void receive_collate_query_response(td::uint32 round_id, td::BufferSlice data, td::Promise<BlockCandidate> promise);
 | 
					  void receive_collate_query_response(td::uint32 round_id, td::BufferSlice data, td::Promise<BlockCandidate> promise);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  struct PostponedAccept {
 | 
					  struct PostponedAccept {
 | 
				
			||||||
| 
						 | 
					@ -120,6 +120,7 @@ class ValidatorGroup : public td::actor::Actor {
 | 
				
			||||||
  std::string db_root_;
 | 
					  std::string db_root_;
 | 
				
			||||||
  td::actor::ActorId<ValidatorManager> manager_;
 | 
					  td::actor::ActorId<ValidatorManager> manager_;
 | 
				
			||||||
  td::actor::ActorOwn<validatorsession::ValidatorSession> session_;
 | 
					  td::actor::ActorOwn<validatorsession::ValidatorSession> session_;
 | 
				
			||||||
 | 
					  adnl::AdnlNodeIdShort local_adnl_id_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  bool init_ = false;
 | 
					  bool init_ = false;
 | 
				
			||||||
  bool started_ = false;
 | 
					  bool started_ = false;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue