1
0
Fork 0
mirror of https://github.com/ton-blockchain/ton synced 2025-03-09 15:40:10 +00:00

End validator session stats

This commit is contained in:
SpyCheese 2024-08-19 19:55:11 +03:00
parent 0ca022cc72
commit 1b4fb42859
15 changed files with 97 additions and 3 deletions

View file

@ -96,6 +96,7 @@ class CatChain : public td::actor::Actor {
virtual void send_query_via(const PublicKeyHash &dst, std::string name, td::Promise<td::BufferSlice> promise, virtual void send_query_via(const PublicKeyHash &dst, std::string name, td::Promise<td::BufferSlice> promise,
td::Timestamp timeout, td::BufferSlice query, td::uint64 max_answer_size, td::Timestamp timeout, td::BufferSlice query, td::uint64 max_answer_size,
td::actor::ActorId<adnl::AdnlSenderInterface> via) = 0; td::actor::ActorId<adnl::AdnlSenderInterface> via) = 0;
virtual void get_source_heights(td::Promise<std::vector<CatChainBlockHeight>> promise) = 0;
virtual void destroy() = 0; virtual void destroy() = 0;
static td::actor::ActorOwn<CatChain> create(std::unique_ptr<Callback> callback, const CatChainOptions &opts, static td::actor::ActorOwn<CatChain> create(std::unique_ptr<Callback> callback, const CatChainOptions &opts,

View file

@ -115,6 +115,15 @@ class CatChainImpl : public CatChain {
td::actor::send_closure(receiver_, &CatChainReceiverInterface::send_custom_query_data_via, dst, name, td::actor::send_closure(receiver_, &CatChainReceiverInterface::send_custom_query_data_via, dst, name,
std::move(promise), timeout, std::move(query), max_answer_size, via); std::move(promise), timeout, std::move(query), max_answer_size, via);
} }
void get_source_heights(td::Promise<std::vector<CatChainBlockHeight>> promise) override {
std::vector<CatChainBlockHeight> heights(top_source_blocks_.size(), 0);
for (size_t i = 0; i < top_source_blocks_.size(); ++i) {
if (top_source_blocks_[i]) {
heights[i] = top_source_blocks_[i]->height();
}
}
promise.set_result(std::move(heights));
}
void destroy() override; void destroy() override;
CatChainImpl(std::unique_ptr<Callback> callback, const CatChainOptions &opts, CatChainImpl(std::unique_ptr<Callback> callback, const CatChainOptions &opts,
td::actor::ActorId<keyring::Keyring> keyring, td::actor::ActorId<adnl::Adnl> adnl, td::actor::ActorId<keyring::Keyring> keyring, td::actor::ActorId<adnl::Adnl> adnl,

View file

@ -796,6 +796,10 @@ validatorSession.newValidatorGroupStats session_id:int256 workchain:int shard:lo
last_key_block_seqno:int timestamp:double last_key_block_seqno:int timestamp:double
self_idx:int nodes:(vector validatorSession.newValidatorGroupStats.node) = validatorSession.NewValidatorGroupStats; self_idx:int nodes:(vector validatorSession.newValidatorGroupStats.node) = validatorSession.NewValidatorGroupStats;
validatorSession.endValidatorGroupStats.node id:int256 catchain_blocks:int = validatorSession.endValidatorGroupStats.Node;
validatorSession.endValidatorGroupStats session_id:int256 timestamp:double
nodes:(vector validatorSession.endValidatorGroupStats.node) = validatorSession.EndValidatorGroupStats;
---functions--- ---functions---
---types--- ---types---

Binary file not shown.

View file

@ -167,6 +167,17 @@ struct NewValidatorGroupStats {
std::vector<Node> nodes; std::vector<Node> nodes;
}; };
struct EndValidatorGroupStats {
struct Node {
PublicKeyHash id = PublicKeyHash::zero();
td::uint32 catchain_blocks = 0;
};
ValidatorSessionId session_id = ValidatorSessionId::zero();
double timestamp = -1.0;
std::vector<Node> nodes;
};
} // namespace validatorsession } // namespace validatorsession
} // namespace ton } // namespace ton

View file

@ -1003,6 +1003,29 @@ void ValidatorSessionImpl::get_current_stats(td::Promise<ValidatorSessionStats>
promise.set_result(cur_stats_); promise.set_result(cur_stats_);
} }
void ValidatorSessionImpl::get_end_stats(td::Promise<EndValidatorGroupStats> promise) {
if (!started_) {
promise.set_error(td::Status::Error(ErrorCode::notready, "not started"));
return;
}
EndValidatorGroupStats stats;
stats.session_id = unique_hash_;
stats.timestamp = td::Clocks::system();
stats.nodes.resize(description().get_total_nodes());
for (size_t i = 0; i < stats.nodes.size(); ++i) {
stats.nodes[i].id = description().get_source_id(i);
}
td::actor::send_closure(catchain_, &catchain::CatChain::get_source_heights,
[promise = std::move(promise),
stats = std::move(stats)](td::Result<std::vector<catchain::CatChainBlockHeight>> R) mutable {
TRY_RESULT_PROMISE(promise, heights, std::move(R));
for (size_t i = 0; i < std::min(heights.size(), stats.nodes.size()); ++i) {
stats.nodes[i].catchain_blocks = heights[i];
}
promise.set_result(std::move(stats));
});
}
void ValidatorSessionImpl::get_validator_group_info_for_litequery( void ValidatorSessionImpl::get_validator_group_info_for_litequery(
td::uint32 cur_round, td::uint32 cur_round,
td::Promise<std::vector<tl_object_ptr<lite_api::liteServer_nonfinal_candidateInfo>>> promise) { td::Promise<std::vector<tl_object_ptr<lite_api::liteServer_nonfinal_candidateInfo>>> promise) {

View file

@ -105,6 +105,7 @@ class ValidatorSession : public td::actor::Actor {
virtual void start() = 0; virtual void start() = 0;
virtual void destroy() = 0; virtual void destroy() = 0;
virtual void get_current_stats(td::Promise<ValidatorSessionStats> promise) = 0; virtual void get_current_stats(td::Promise<ValidatorSessionStats> promise) = 0;
virtual void get_end_stats(td::Promise<EndValidatorGroupStats> promise) = 0;
virtual void get_validator_group_info_for_litequery( virtual void get_validator_group_info_for_litequery(
td::uint32 cur_round, td::uint32 cur_round,
td::Promise<std::vector<tl_object_ptr<lite_api::liteServer_nonfinal_candidateInfo>>> promise) = 0; td::Promise<std::vector<tl_object_ptr<lite_api::liteServer_nonfinal_candidateInfo>>> promise) = 0;

View file

@ -187,6 +187,7 @@ class ValidatorSessionImpl : public ValidatorSession {
void start() override; void start() override;
void destroy() override; void destroy() override;
void get_current_stats(td::Promise<ValidatorSessionStats> promise) override; void get_current_stats(td::Promise<ValidatorSessionStats> promise) override;
void get_end_stats(td::Promise<EndValidatorGroupStats> promise) override;
void get_validator_group_info_for_litequery( void get_validator_group_info_for_litequery(
td::uint32 cur_round, td::uint32 cur_round,
td::Promise<std::vector<tl_object_ptr<lite_api::liteServer_nonfinal_candidateInfo>>> promise) override; td::Promise<std::vector<tl_object_ptr<lite_api::liteServer_nonfinal_candidateInfo>>> promise) override;

View file

@ -4119,6 +4119,8 @@ bool Collator::process_new_messages(bool enqueue_only) {
} else if (res == 3) { } else if (res == 3) {
LOG(INFO) << "All remaining new messages must be enqueued (BLOCK FULL)"; LOG(INFO) << "All remaining new messages must be enqueued (BLOCK FULL)";
enqueue_only = true; enqueue_only = true;
stats_.limits_log += PSTRING() << "NEW_MESSAGES: "
<< block_full_comment(*block_limit_status_, block::ParamLimits::cl_normal) << "\n";
} }
} }
return true; return true;

View file

@ -183,6 +183,7 @@ class ValidatorManager : public ValidatorManagerInterface {
virtual void log_validator_session_stats(BlockIdExt block_id, validatorsession::ValidatorSessionStats stats) = 0; virtual void log_validator_session_stats(BlockIdExt block_id, validatorsession::ValidatorSessionStats stats) = 0;
virtual void log_new_validator_group_stats(validatorsession::NewValidatorGroupStats stats) = 0; virtual void log_new_validator_group_stats(validatorsession::NewValidatorGroupStats stats) = 0;
virtual void log_end_validator_group_stats(validatorsession::EndValidatorGroupStats stats) = 0;
virtual void get_block_handle_for_litequery(BlockIdExt block_id, td::Promise<ConstBlockHandle> promise) = 0; virtual void get_block_handle_for_litequery(BlockIdExt block_id, td::Promise<ConstBlockHandle> promise) = 0;
virtual void get_block_data_for_litequery(BlockIdExt block_id, td::Promise<td::Ref<BlockData>> promise) = 0; virtual void get_block_data_for_litequery(BlockIdExt block_id, td::Promise<td::Ref<BlockData>> promise) = 0;

View file

@ -388,6 +388,9 @@ class ValidatorManagerImpl : public ValidatorManager {
void log_new_validator_group_stats(validatorsession::NewValidatorGroupStats stats) override { void log_new_validator_group_stats(validatorsession::NewValidatorGroupStats stats) override {
UNREACHABLE(); UNREACHABLE();
} }
void log_end_validator_group_stats(validatorsession::EndValidatorGroupStats stats) override {
UNREACHABLE();
}
void get_out_msg_queue_size(BlockIdExt block_id, td::Promise<td::uint64> promise) override { void get_out_msg_queue_size(BlockIdExt block_id, td::Promise<td::uint64> promise) override {
if (queue_size_counter_.empty()) { if (queue_size_counter_.empty()) {
queue_size_counter_ = queue_size_counter_ =

View file

@ -450,6 +450,9 @@ class ValidatorManagerImpl : public ValidatorManager {
void log_new_validator_group_stats(validatorsession::NewValidatorGroupStats stats) override { void log_new_validator_group_stats(validatorsession::NewValidatorGroupStats stats) override {
UNREACHABLE(); UNREACHABLE();
} }
void log_end_validator_group_stats(validatorsession::EndValidatorGroupStats stats) override {
UNREACHABLE();
}
void get_out_msg_queue_size(BlockIdExt block_id, td::Promise<td::uint64> promise) override { void get_out_msg_queue_size(BlockIdExt block_id, td::Promise<td::uint64> promise) override {
if (queue_size_counter_.empty()) { if (queue_size_counter_.empty()) {
queue_size_counter_ = queue_size_counter_ =

View file

@ -2902,7 +2902,31 @@ void ValidatorManagerImpl::log_new_validator_group_stats(validatorsession::NewVa
file << s << "\n"; file << s << "\n";
file.close(); file.close();
LOG(INFO) << "Writing new validator group stats for " << stats.shard.to_str(); LOG(INFO) << "Writing new validator group stats for " << stats.session_id << " shard=" << stats.shard.to_str()
<< " cc_seqno=" << stats.cc_seqno;
}
void ValidatorManagerImpl::log_end_validator_group_stats(validatorsession::EndValidatorGroupStats stats) {
std::string fname = opts_->get_session_logs_file();
if (fname.empty()) {
return;
}
std::vector<tl_object_ptr<ton_api::validatorSession_endValidatorGroupStats_node>> nodes;
for (const auto &node : stats.nodes) {
nodes.push_back(create_tl_object<ton_api::validatorSession_endValidatorGroupStats_node>(node.id.bits256_value(),
node.catchain_blocks));
}
auto obj = create_tl_object<ton_api::validatorSession_endValidatorGroupStats>(stats.session_id, stats.timestamp,
std::move(nodes));
auto s = td::json_encode<std::string>(td::ToJson(*obj.get()), false);
s.erase(std::remove_if(s.begin(), s.end(), [](char c) { return c == '\n' || c == '\r'; }), s.end());
std::ofstream file;
file.open(fname, std::ios_base::app);
file << s << "\n";
file.close();
LOG(INFO) << "Writing end validator group stats for " << stats.session_id;
} }
void ValidatorManagerImpl::get_block_handle_for_litequery(BlockIdExt block_id, td::Promise<ConstBlockHandle> promise) { void ValidatorManagerImpl::get_block_handle_for_litequery(BlockIdExt block_id, td::Promise<ConstBlockHandle> promise) {

View file

@ -590,6 +590,7 @@ class ValidatorManagerImpl : public ValidatorManager {
void log_validator_session_stats(BlockIdExt block_id, validatorsession::ValidatorSessionStats stats) override; void log_validator_session_stats(BlockIdExt block_id, validatorsession::ValidatorSessionStats stats) override;
void log_new_validator_group_stats(validatorsession::NewValidatorGroupStats stats) override; void log_new_validator_group_stats(validatorsession::NewValidatorGroupStats stats) override;
void log_end_validator_group_stats(validatorsession::EndValidatorGroupStats stats) override;
void update_options(td::Ref<ValidatorManagerOptions> opts) override; void update_options(td::Ref<ValidatorManagerOptions> opts) override;

View file

@ -418,6 +418,16 @@ void ValidatorGroup::destroy() {
td::actor::send_closure(manager, &ValidatorManager::log_validator_session_stats, block_id, td::actor::send_closure(manager, &ValidatorManager::log_validator_session_stats, block_id,
std::move(stats)); std::move(stats));
}); });
td::actor::send_closure(session_, &validatorsession::ValidatorSession::get_end_stats,
[manager = manager_](td::Result<validatorsession::EndValidatorGroupStats> R) {
if (R.is_error()) {
LOG(DEBUG) << "Failed to get validator session end stats: " << R.move_as_error();
return;
}
auto stats = R.move_as_ok();
td::actor::send_closure(manager, &ValidatorManager::log_end_validator_group_stats,
std::move(stats));
});
auto ses = session_.release(); auto ses = session_.release();
delay_action([ses]() mutable { td::actor::send_closure(ses, &validatorsession::ValidatorSession::destroy); }, delay_action([ses]() mutable { td::actor::send_closure(ses, &validatorsession::ValidatorSession::destroy); },
td::Timestamp::in(10.0)); td::Timestamp::in(10.0));