mirror of
				https://github.com/ton-blockchain/ton
				synced 2025-03-09 15:40:10 +00:00 
			
		
		
		
	Add getvalidatorsessions query to validator-engine-console
This commit is contained in:
		
							parent
							
								
									9465fd866a
								
							
						
					
					
						commit
						849d995346
					
				
					 21 changed files with 181 additions and 4 deletions
				
			
		|  | @ -367,6 +367,10 @@ class ValidatorManagerImpl : public ValidatorManager { | |||
|   void log_validator_session_stats(BlockIdExt block_id, validatorsession::ValidatorSessionStats stats) override { | ||||
|     UNREACHABLE(); | ||||
|   } | ||||
|   void get_validator_sessions_info( | ||||
|       td::Promise<tl_object_ptr<ton_api::engine_validator_validatorSessionsInfo>> promise) override { | ||||
|     UNREACHABLE(); | ||||
|   } | ||||
| 
 | ||||
|  private: | ||||
|   PublicKeyHash local_id_; | ||||
|  |  | |||
|  | @ -426,6 +426,10 @@ class ValidatorManagerImpl : public ValidatorManager { | |||
|   void log_validator_session_stats(BlockIdExt block_id, validatorsession::ValidatorSessionStats stats) override { | ||||
|     UNREACHABLE(); | ||||
|   } | ||||
|   void get_validator_sessions_info( | ||||
|       td::Promise<tl_object_ptr<ton_api::engine_validator_validatorSessionsInfo>> promise) override { | ||||
|     UNREACHABLE(); | ||||
|   } | ||||
| 
 | ||||
|  private: | ||||
|   td::Ref<ValidatorManagerOptions> opts_; | ||||
|  |  | |||
|  | @ -2539,7 +2539,7 @@ void ValidatorManagerImpl::log_validator_session_stats(BlockIdExt block_id, | |||
|       stats.creator.bits256_value(), stats.total_validators, stats.total_weight, stats.signatures, | ||||
|       stats.signatures_weight, stats.approve_signatures, stats.approve_signatures_weight, stats.first_round, | ||||
|       std::move(rounds)); | ||||
|   std::string s = td::json_encode<std::string>(td::ToJson(*obj.get()), false); | ||||
|   std::string s = td::json_encode<std::string>(td::ToJson(*obj), false); | ||||
|   s.erase(std::remove_if(s.begin(), s.end(), [](char c) { return c == '\n' || c == '\r'; }), s.end()); | ||||
| 
 | ||||
|   std::ofstream file; | ||||
|  | @ -2550,6 +2550,39 @@ void ValidatorManagerImpl::log_validator_session_stats(BlockIdExt block_id, | |||
|   LOG(INFO) << "Writing validator session stats for " << block_id.id; | ||||
| } | ||||
| 
 | ||||
| void ValidatorManagerImpl::get_validator_sessions_info( | ||||
|     td::Promise<tl_object_ptr<ton_api::engine_validator_validatorSessionsInfo>> promise) { | ||||
|   std::vector<td::actor::ActorId<ValidatorGroup>> groups; | ||||
|   for (const auto& g : validator_groups_) { | ||||
|     groups.push_back(g.second.get()); | ||||
|   } | ||||
|   struct IntermediateData { | ||||
|     std::vector<td::actor::ActorId<ValidatorGroup>> groups; | ||||
|     std::vector<tl_object_ptr<ton_api::engine_validator_validatorSessionInfo>> result; | ||||
|     td::Promise<tl_object_ptr<ton_api::engine_validator_validatorSessionsInfo>> promise; | ||||
| 
 | ||||
|     static void step(IntermediateData data) { | ||||
|       if (data.groups.empty()) { | ||||
|         data.promise.set_result( | ||||
|             create_tl_object<ton_api::engine_validator_validatorSessionsInfo>(std::move(data.result))); | ||||
|         return; | ||||
|       } | ||||
|       auto group = std::move(data.groups.back()); | ||||
|       data.groups.pop_back(); | ||||
|       auto P = td::PromiseCreator::lambda( | ||||
|           [data = | ||||
|                std::move(data)](td::Result<tl_object_ptr<ton_api::engine_validator_validatorSessionInfo>> R) mutable { | ||||
|             if (R.is_ok()) { | ||||
|               data.result.push_back(R.move_as_ok()); | ||||
|             } | ||||
|             step(std::move(data)); | ||||
|           }); | ||||
|       td::actor::send_closure(group, &ValidatorGroup::get_session_info, std::move(P)); | ||||
|     } | ||||
|   }; | ||||
|   IntermediateData::step({std::move(groups), {}, std::move(promise)}); | ||||
| } | ||||
| 
 | ||||
| td::actor::ActorOwn<ValidatorManagerInterface> ValidatorManagerFactory::create( | ||||
|     td::Ref<ValidatorManagerOptions> opts, std::string db_root, td::actor::ActorId<keyring::Keyring> keyring, | ||||
|     td::actor::ActorId<adnl::Adnl> adnl, td::actor::ActorId<rldp::Rldp> rldp, | ||||
|  |  | |||
|  | @ -531,8 +531,10 @@ class ValidatorManagerImpl : public ValidatorManager { | |||
|   void wait_shard_client_state(BlockSeqno seqno, td::Timestamp timeout, td::Promise<td::Unit> promise) override; | ||||
| 
 | ||||
|   void log_validator_session_stats(BlockIdExt block_id, validatorsession::ValidatorSessionStats stats) override; | ||||
|   void get_validator_sessions_info( | ||||
|       td::Promise<tl_object_ptr<ton_api::engine_validator_validatorSessionsInfo>> promise) override; | ||||
| 
 | ||||
|  private: | ||||
|     private: | ||||
|   td::Timestamp resend_shard_blocks_at_; | ||||
|   td::Timestamp check_waiters_at_; | ||||
|   td::Timestamp check_shard_clients_; | ||||
|  |  | |||
|  | @ -21,6 +21,7 @@ | |||
| #include "ton/ton-io.hpp" | ||||
| #include "td/utils/overloaded.h" | ||||
| #include "common/delay.h" | ||||
| #include "ton/ton-tl.hpp" | ||||
| 
 | ||||
| namespace ton { | ||||
| 
 | ||||
|  | @ -159,14 +160,18 @@ void ValidatorGroup::get_approved_candidate(PublicKey source, RootHash root_hash | |||
|                           std::move(promise)); | ||||
| } | ||||
| 
 | ||||
| BlockIdExt ValidatorGroup::create_next_block_id(RootHash root_hash, FileHash file_hash) const { | ||||
| BlockId ValidatorGroup::create_next_block_id_simple() const { | ||||
|   BlockSeqno seqno = 0; | ||||
|   for (auto &p : prev_block_ids_) { | ||||
|     if (seqno < p.id.seqno) { | ||||
|       seqno = p.id.seqno; | ||||
|     } | ||||
|   } | ||||
|   return BlockIdExt{shard_.workchain, shard_.shard, seqno + 1, root_hash, file_hash}; | ||||
|   return BlockId{shard_.workchain, shard_.shard, seqno + 1}; | ||||
| } | ||||
| 
 | ||||
| BlockIdExt ValidatorGroup::create_next_block_id(RootHash root_hash, FileHash file_hash) const { | ||||
|   return BlockIdExt{create_next_block_id_simple(), root_hash, file_hash}; | ||||
| } | ||||
| 
 | ||||
| std::unique_ptr<validatorsession::ValidatorSession::Callback> ValidatorGroup::make_validator_session_callback() { | ||||
|  | @ -307,6 +312,25 @@ void ValidatorGroup::destroy() { | |||
|   stop(); | ||||
| } | ||||
| 
 | ||||
| void ValidatorGroup::get_session_info( | ||||
|     td::Promise<tl_object_ptr<ton_api::engine_validator_validatorSessionInfo>> promise) { | ||||
|   if (session_.empty() || !started_) { | ||||
|     promise.set_error(td::Status::Error(ErrorCode::notready, "session not started")); | ||||
|   } | ||||
|   auto P = td::PromiseCreator::lambda( | ||||
|       [promise = std::move(promise), block_id = create_next_block_id_simple()]( | ||||
|           td::Result<tl_object_ptr<ton_api::engine_validator_validatorSessionInfo>> R) mutable { | ||||
|         if (R.is_error()) { | ||||
|           promise.set_error(R.move_as_error()); | ||||
|           return; | ||||
|         } | ||||
|         auto info = R.move_as_ok(); | ||||
|         info->current_block_ = create_tl_block_id_simple(block_id); | ||||
|         promise.set_result(std::move(info)); | ||||
|       }); | ||||
|   td::actor::send_closure(session_, &validatorsession::ValidatorSession::get_session_info, std::move(P)); | ||||
| } | ||||
| 
 | ||||
| }  // namespace validator
 | ||||
| 
 | ||||
| }  // namespace ton
 | ||||
|  |  | |||
|  | @ -44,6 +44,7 @@ class ValidatorGroup : public td::actor::Actor { | |||
|                                 td::Promise<td::Unit> promise); | ||||
|   void get_approved_candidate(PublicKey source, RootHash root_hash, FileHash file_hash, | ||||
|                               FileHash collated_data_file_hash, td::Promise<BlockCandidate> promise); | ||||
|   BlockId create_next_block_id_simple() const; | ||||
|   BlockIdExt create_next_block_id(RootHash root_hash, FileHash file_hash) const; | ||||
| 
 | ||||
|   void start(std::vector<BlockIdExt> prev, BlockIdExt min_masterchain_block_id, UnixTime min_ts); | ||||
|  | @ -56,6 +57,8 @@ class ValidatorGroup : public td::actor::Actor { | |||
|     } | ||||
|   } | ||||
| 
 | ||||
|   void get_session_info(td::Promise<tl_object_ptr<ton_api::engine_validator_validatorSessionInfo>> promise); | ||||
| 
 | ||||
|   ValidatorGroup(ShardIdFull shard, PublicKeyHash local_id, ValidatorSessionId session_id, | ||||
|                  td::Ref<ValidatorSet> validator_set, validatorsession::ValidatorSessionOptions config, | ||||
|                  td::actor::ActorId<keyring::Keyring> keyring, td::actor::ActorId<adnl::Adnl> adnl, | ||||
|  |  | |||
|  | @ -214,6 +214,8 @@ class ValidatorManagerInterface : public td::actor::Actor { | |||
| 
 | ||||
|   virtual void run_ext_query(td::BufferSlice data, td::Promise<td::BufferSlice> promise) = 0; | ||||
|   virtual void prepare_stats(td::Promise<std::vector<std::pair<std::string, std::string>>> promise) = 0; | ||||
|   virtual void get_validator_sessions_info( | ||||
|       td::Promise<tl_object_ptr<ton_api::engine_validator_validatorSessionsInfo>> promise) = 0; | ||||
| }; | ||||
| 
 | ||||
| }  // namespace validator
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue