From 212c07f2f0408c40efd9db442d6f9bb8657a685d Mon Sep 17 00:00:00 2001 From: SpyCheese Date: Wed, 3 Aug 2022 15:15:42 +0300 Subject: [PATCH] Change update_shard_configuration --- create-hardfork/create-hardfork.cpp | 3 +- test/test-ton-collator.cpp | 3 +- validator-engine/validator-engine.cpp | 2 +- validator/full-node.cpp | 74 ++++++++---------------- validator/full-node.h | 15 ++--- validator/full-node.hpp | 9 ++- validator/interfaces/validator-manager.h | 2 +- validator/manager-disk.hpp | 2 +- validator/manager-hardfork.hpp | 2 +- validator/manager.cpp | 16 ++--- validator/manager.hpp | 4 +- validator/shard-client.cpp | 53 ++++++++++++++++- validator/shard-client.hpp | 2 +- validator/validator.h | 3 +- 14 files changed, 106 insertions(+), 84 deletions(-) diff --git a/create-hardfork/create-hardfork.cpp b/create-hardfork/create-hardfork.cpp index 5455a984..a24b7fc1 100644 --- a/create-hardfork/create-hardfork.cpp +++ b/create-hardfork/create-hardfork.cpp @@ -236,7 +236,8 @@ class HardforkCreator : public td::actor::Actor { td::actor::send_closure(id_, &ton::validator::ValidatorManager::sync_complete, td::PromiseCreator::lambda([](td::Unit) {})); } - void update_shard_configuration(td::Ref state) override { + void update_shard_configuration(td::Ref state, + std::set shards_to_monitor) override { } void send_ihr_message(ton::AccountIdPrefixFull dst, td::BufferSlice data) override { } diff --git a/test/test-ton-collator.cpp b/test/test-ton-collator.cpp index a68422d5..d9ec82e5 100644 --- a/test/test-ton-collator.cpp +++ b/test/test-ton-collator.cpp @@ -323,7 +323,8 @@ class TestNode : public td::actor::Actor { td::actor::send_closure(id_, &ton::validator::ValidatorManager::sync_complete, td::PromiseCreator::lambda([](td::Unit) {})); } - void update_shard_configuration(td::Ref state) override { + void update_shard_configuration(td::Ref state, + std::set shards_to_monitor) override { } void send_ihr_message(ton::AccountIdPrefixFull dst, td::BufferSlice data) override { } diff --git a/validator-engine/validator-engine.cpp b/validator-engine/validator-engine.cpp index 1bb820a4..b2617769 100644 --- a/validator-engine/validator-engine.cpp +++ b/validator-engine/validator-engine.cpp @@ -1853,7 +1853,7 @@ void ValidatorEngine::start_full_node() { }); full_node_ = ton::validator::fullnode::FullNode::create( short_id, ton::adnl::AdnlNodeIdShort{config_.full_node}, validator_options_->zero_block_id().file_hash, - validator_options_, keyring_.get(), adnl_.get(), rldp_.get(), + keyring_.get(), adnl_.get(), rldp_.get(), default_dht_node_.is_zero() ? td::actor::ActorId{} : dht_nodes_[default_dht_node_].get(), overlay_manager_.get(), validator_manager_.get(), full_node_client_.get(), db_root_, std::move(P)); for (auto &v : config_.validators) { diff --git a/validator/full-node.cpp b/validator/full-node.cpp index 9194b9a4..63891502 100644 --- a/validator/full-node.cpp +++ b/validator/full-node.cpp @@ -132,52 +132,31 @@ void FullNodeImpl::initial_read_complete(BlockHandle top_handle) { td::actor::send_closure(it->second.actor, &FullNodeShard::set_handle, top_handle, std::move(P)); } -void FullNodeImpl::update_shard_configuration(td::Ref state) { +void FullNodeImpl::update_shard_configuration(td::Ref state, + std::set shards_to_monitor) { std::map new_shards; std::set new_active; new_shards[ShardIdFull(masterchainId)] = state->get_block_id(); - new_active.insert(ShardIdFull(masterchainId)); std::set workchains; - auto cur_time = state->get_unix_time(); - auto set_active = [&](ShardIdFull shard) { while (new_active.insert(shard).second && shard.pfx_len() > 0) { shard = shard_parent(shard); } }; - for (auto &info : state->get_shards()) { - auto shard = info->shard(); - workchains.insert(shard.workchain); - new_shards[shard] = info->top_block_id(); - bool will_split = shard.pfx_len() < max_shard_pfx_len && ((info->fsm_state() == McShardHash::FsmState::fsm_split && - info->fsm_utime() < cur_time + 60) || info->before_split()); - bool will_merge = shard.pfx_len() > 0 && ((info->fsm_state() == McShardHash::FsmState::fsm_merge && - info->fsm_utime() < cur_time + 60) || info->before_merge()); - if (opts_->need_monitor(shard)) { - set_active(shard); - } - if (will_merge && opts_->need_monitor(shard_parent(shard))) { - set_active(shard); - set_active(shard_sibling(shard)); - } - for (int id = 0; id < 2; ++id) { - if (will_split && opts_->need_monitor(shard_child(shard, id))) { - set_active(shard_child(shard, id)); - } - } + workchains.insert(info->shard().workchain); + new_shards[info->shard()] = info->top_block_id(); } for (const auto &wpair : state->get_workchain_list()) { ton::WorkchainId wc = wpair.first; const block::WorkchainInfo *winfo = wpair.second.get(); - if (workchains.count(wc) == 0 && winfo->active && winfo->enabled_since <= cur_time) { - auto shard = ShardIdFull(wc); - new_shards[shard] = BlockIdExt(wc, shard.shard, 0, winfo->zerostate_root_hash, winfo->zerostate_file_hash); - if (opts_->need_monitor(shard)) { - set_active(shard); - } + if (workchains.count(wc) == 0 && winfo->active && winfo->enabled_since <= state->get_unix_time()) { + new_shards[ShardIdFull(wc)] = BlockIdExt(wc, shardIdAll, 0, winfo->zerostate_root_hash, winfo->zerostate_file_hash); } } + for (ShardIdFull shard : shards_to_monitor) { + set_active(shard); + } auto info_set_active = [&](ShardIdFull shard, ShardInfo& info, bool active) { if (info.active == active) { @@ -195,10 +174,6 @@ void FullNodeImpl::update_shard_configuration(td::Ref state) { for (auto shard : new_shards) { auto &info = shards_[shard.first]; info.exists = true; - if (!info.active && new_active.count(shard.first)) { - td::actor::send_closure(validator_manager_, &ValidatorManagerInterface::wait_block_state_short, shard.second, 0, - td::Timestamp::in(60.0), [](td::Result>){}); - } } for (auto& p : shards_) { @@ -511,8 +486,9 @@ void FullNodeImpl::start_up() { void initial_read_complete(BlockHandle handle) override { td::actor::send_closure(id_, &FullNodeImpl::initial_read_complete, handle); } - void update_shard_configuration(td::Ref state) override { - td::actor::send_closure(id_, &FullNodeImpl::update_shard_configuration, std::move(state)); + void update_shard_configuration(td::Ref state, std::set shards_to_monitor) override { + td::actor::send_closure(id_, &FullNodeImpl::update_shard_configuration, std::move(state), + std::move(shards_to_monitor)); } void send_ihr_message(AccountIdPrefixFull dst, td::BufferSlice data) override { td::actor::send_closure(id_, &FullNodeImpl::send_ihr_message, dst, std::move(data)); @@ -580,16 +556,15 @@ void FullNodeImpl::start_up() { } FullNodeImpl::FullNodeImpl(PublicKeyHash local_id, adnl::AdnlNodeIdShort adnl_id, FileHash zero_state_file_hash, - td::Ref opts, td::actor::ActorId keyring, - td::actor::ActorId adnl, td::actor::ActorId rldp, - td::actor::ActorId dht, td::actor::ActorId overlays, + td::actor::ActorId keyring, td::actor::ActorId adnl, + td::actor::ActorId rldp, td::actor::ActorId dht, + td::actor::ActorId overlays, td::actor::ActorId validator_manager, td::actor::ActorId client, std::string db_root, td::Promise started_promise) : local_id_(local_id) , adnl_id_(adnl_id) , zero_state_file_hash_(zero_state_file_hash) - , opts_(opts) , keyring_(keyring) , adnl_(adnl) , rldp_(rldp) @@ -602,17 +577,14 @@ FullNodeImpl::FullNodeImpl(PublicKeyHash local_id, adnl::AdnlNodeIdShort adnl_id add_shard_actor(ShardIdFull{masterchainId}, true); } -td::actor::ActorOwn FullNode::create(ton::PublicKeyHash local_id, adnl::AdnlNodeIdShort adnl_id, - FileHash zero_state_file_hash, td::Ref opts, - td::actor::ActorId keyring, - td::actor::ActorId adnl, td::actor::ActorId rldp, - td::actor::ActorId dht, - td::actor::ActorId overlays, - td::actor::ActorId validator_manager, - td::actor::ActorId client, std::string db_root, - td::Promise started_promise) { - return td::actor::create_actor("fullnode", local_id, adnl_id, zero_state_file_hash, opts, keyring, adnl, - rldp, dht, overlays, validator_manager, client, db_root, +td::actor::ActorOwn FullNode::create( + ton::PublicKeyHash local_id, adnl::AdnlNodeIdShort adnl_id, FileHash zero_state_file_hash, + td::actor::ActorId keyring, td::actor::ActorId adnl, + td::actor::ActorId rldp, td::actor::ActorId dht, + td::actor::ActorId overlays, td::actor::ActorId validator_manager, + td::actor::ActorId client, std::string db_root, td::Promise started_promise) { + return td::actor::create_actor("fullnode", local_id, adnl_id, zero_state_file_hash, keyring, adnl, rldp, + dht, overlays, validator_manager, client, db_root, std::move(started_promise)); } diff --git a/validator/full-node.h b/validator/full-node.h index 7342a822..9f268666 100644 --- a/validator/full-node.h +++ b/validator/full-node.h @@ -72,15 +72,12 @@ class FullNode : public td::actor::Actor { return 4ull << 30; } - static td::actor::ActorOwn create(ton::PublicKeyHash local_id, adnl::AdnlNodeIdShort adnl_id, - FileHash zero_state_file_hash, td::Ref opts, - td::actor::ActorId keyring, - td::actor::ActorId adnl, td::actor::ActorId rldp, - td::actor::ActorId dht, - td::actor::ActorId overlays, - td::actor::ActorId validator_manager, - td::actor::ActorId client, std::string db_root, - td::Promise started_promise); + static td::actor::ActorOwn create( + ton::PublicKeyHash local_id, adnl::AdnlNodeIdShort adnl_id, FileHash zero_state_file_hash, + td::actor::ActorId keyring, td::actor::ActorId adnl, + td::actor::ActorId rldp, td::actor::ActorId dht, + td::actor::ActorId overlays, td::actor::ActorId validator_manager, + td::actor::ActorId client, std::string db_root, td::Promise started_promise); }; } // namespace fullnode diff --git a/validator/full-node.hpp b/validator/full-node.hpp index 49dad3ba..2f825458 100644 --- a/validator/full-node.hpp +++ b/validator/full-node.hpp @@ -52,7 +52,7 @@ class FullNodeImpl : public FullNode { void update_adnl_id(adnl::AdnlNodeIdShort adnl_id, td::Promise promise) override; - void update_shard_configuration(td::Ref state); + void update_shard_configuration(td::Ref state, std::set shards_to_monitor); void sync_completed(); @@ -83,9 +83,9 @@ class FullNodeImpl : public FullNode { void start_up() override; FullNodeImpl(PublicKeyHash local_id, adnl::AdnlNodeIdShort adnl_id, FileHash zero_state_file_hash, - td::Ref opts, td::actor::ActorId keyring, - td::actor::ActorId adnl, td::actor::ActorId rldp, - td::actor::ActorId dht, td::actor::ActorId overlays, + td::actor::ActorId keyring, td::actor::ActorId adnl, + td::actor::ActorId rldp, td::actor::ActorId dht, + td::actor::ActorId overlays, td::actor::ActorId validator_manager, td::actor::ActorId client, std::string db_root, td::Promise started_promise); @@ -96,7 +96,6 @@ class FullNodeImpl : public FullNode { PublicKeyHash local_id_; adnl::AdnlNodeIdShort adnl_id_; FileHash zero_state_file_hash_; - td::Ref opts_; td::actor::ActorId get_shard(AccountIdPrefixFull dst); td::actor::ActorId get_shard(ShardIdFull shard, bool exact = false); diff --git a/validator/interfaces/validator-manager.h b/validator/interfaces/validator-manager.h index 362c259f..345ae679 100644 --- a/validator/interfaces/validator-manager.h +++ b/validator/interfaces/validator-manager.h @@ -134,7 +134,7 @@ class ValidatorManager : public ValidatorManagerInterface { virtual void update_shard_client_state(BlockIdExt masterchain_block_id, td::Promise promise) = 0; virtual void get_shard_client_state(bool from_db, td::Promise promise) = 0; - virtual void update_shard_configuration(td::Ref state) = 0; + virtual void update_shard_configuration(td::Ref state, std::set shards_to_monitor) = 0; virtual void update_async_serializer_state(AsyncSerializerState state, td::Promise promise) = 0; virtual void get_async_serializer_state(td::Promise promise) = 0; diff --git a/validator/manager-disk.hpp b/validator/manager-disk.hpp index d8f75eef..2e331c72 100644 --- a/validator/manager-disk.hpp +++ b/validator/manager-disk.hpp @@ -261,7 +261,7 @@ class ValidatorManagerImpl : public ValidatorManager { void update_shard_client_state(BlockIdExt masterchain_block_id, td::Promise promise) override; void get_shard_client_state(bool from_db, td::Promise promise) override; - void update_shard_configuration(td::Ref state) override { + void update_shard_configuration(td::Ref state, std::set shards_to_monitor) override { } void update_async_serializer_state(AsyncSerializerState state, td::Promise promise) override { diff --git a/validator/manager-hardfork.hpp b/validator/manager-hardfork.hpp index 87ec8c2b..79e742c4 100644 --- a/validator/manager-hardfork.hpp +++ b/validator/manager-hardfork.hpp @@ -329,7 +329,7 @@ class ValidatorManagerImpl : public ValidatorManager { void get_shard_client_state(bool from_db, td::Promise promise) override { UNREACHABLE(); } - void update_shard_configuration(td::Ref state) override { + void update_shard_configuration(td::Ref state, std::set shards_to_monitor) override { UNREACHABLE(); } diff --git a/validator/manager.cpp b/validator/manager.cpp index 64ee3273..44279698 100644 --- a/validator/manager.cpp +++ b/validator/manager.cpp @@ -372,7 +372,7 @@ void ValidatorManagerImpl::new_external_message(td::BufferSlice data) { if (!is_validator()) { return; } - if( ext_messages_.size() > max_mempool_num() ) { + if ((double)ext_messages_.size() > max_mempool_num()) { return; } auto R = create_ext_message(std::move(data)); @@ -453,7 +453,7 @@ void ValidatorManagerImpl::add_shard_block_description(td::Refblock_id().shard_full(), desc->catchain_seqno()}] = desc; VLOG(VALIDATOR_DEBUG) << "new shard block descr for " << desc->block_id(); - if (opts_->need_monitor(desc->block_id().shard_full())) { + if (shards_to_monitor_.count(desc->block_id().shard_full())) { auto P = td::PromiseCreator::lambda([](td::Result> R) { if (R.is_error()) { auto S = R.move_as_error(); @@ -612,7 +612,7 @@ void ValidatorManagerImpl::wait_out_msg_queue_proof(BlockIdExt block_id, ShardId std::move(R)); }); auto id = td::actor::create_actor("waitmsgqueue", block_id, dst_shard, - opts_->need_monitor(block_id.shard_full()), priority, + shards_to_monitor_.count(block_id.shard_full()), priority, actor_id(this), td::Timestamp::in(10.0), std::move(P)) .release(); wait_out_msg_queue_proof_[key].actor_ = id; @@ -1073,8 +1073,8 @@ void ValidatorManagerImpl::finished_wait_msg_queue(BlockIdExt block_id, ShardIdF std::move(R)); }); auto id = td::actor::create_actor("waitmsgqueue", block_id, dst_shard, - opts_->need_monitor(block_id.shard_full()), X.second, - actor_id(this), X.first, std::move(P)) + shards_to_monitor_.count(block_id.shard_full()), + X.second, actor_id(this), X.first, std::move(P)) .release(); it->second.actor_ = id; return; @@ -2425,8 +2425,10 @@ void ValidatorManagerImpl::get_shard_client_state(bool from_db, td::Promise state) { - callback_->update_shard_configuration(state); +void ValidatorManagerImpl::update_shard_configuration(td::Ref state, + std::set shards_to_monitor) { + shards_to_monitor_ = shards_to_monitor; + callback_->update_shard_configuration(std::move(state), std::move(shards_to_monitor)); } void ValidatorManagerImpl::update_async_serializer_state(AsyncSerializerState state, td::Promise promise) { diff --git a/validator/manager.hpp b/validator/manager.hpp index 327aa3c5..6eb192a7 100644 --- a/validator/manager.hpp +++ b/validator/manager.hpp @@ -453,7 +453,7 @@ class ValidatorManagerImpl : public ValidatorManager { void update_shard_client_state(BlockIdExt masterchain_block_id, td::Promise promise) override; void get_shard_client_state(bool from_db, td::Promise promise) override; - void update_shard_configuration(td::Ref state) override; + void update_shard_configuration(td::Ref state, std::set shards_to_monitor) override; void update_async_serializer_state(AsyncSerializerState state, td::Promise promise) override; void get_async_serializer_state(td::Promise promise) override; @@ -619,6 +619,8 @@ class ValidatorManagerImpl : public ValidatorManager { std::map> collator_nodes_; bool collating_masterchain_ = false; + + std::set shards_to_monitor_ = {ShardIdFull(masterchainId)}; }; } // namespace validator diff --git a/validator/shard-client.cpp b/validator/shard-client.cpp index 50c6075d..65adf34d 100644 --- a/validator/shard-client.cpp +++ b/validator/shard-client.cpp @@ -91,7 +91,7 @@ void ShardClient::start_up_init_mode() { auto vec = masterchain_state_->get_shards(); for (auto &shard : vec) { - if (opts_->need_monitor(shard->shard())) { + if (shards_to_monitor_.count(shard->shard())) { auto P = td::PromiseCreator::lambda([promise = ig.get_promise()](td::Result> R) mutable { R.ensure(); promise.set_value(td::Unit()); @@ -192,7 +192,7 @@ void ShardClient::apply_all_shards() { auto vec = masterchain_state_->get_shards(); for (auto &shard : vec) { - if (opts_->need_monitor(shard->shard())) { + if (shards_to_monitor_.count(shard->shard())) { auto Q = td::PromiseCreator::lambda([SelfId = actor_id(this), promise = ig.get_promise(), shard = shard->shard()](td::Result> R) mutable { if (R.is_error()) { @@ -247,7 +247,54 @@ void ShardClient::get_processed_masterchain_block_id(td::Promise pro } void ShardClient::build_shard_overlays() { - td::actor::send_closure(manager_, &ValidatorManager::update_shard_configuration, masterchain_state_); + std::set new_shards_to_monitor; + std::set workchains; + auto cur_time = masterchain_state_->get_unix_time(); + new_shards_to_monitor.insert(ShardIdFull(masterchainId)); + for (const auto &info : masterchain_state_->get_shards()) { + auto shard = info->shard(); + workchains.insert(shard.workchain); + bool will_split = shard.pfx_len() < max_shard_pfx_len && + ((info->fsm_state() == McShardHash::FsmState::fsm_split && info->fsm_utime() < cur_time + 60) || + info->before_split()); + bool will_merge = shard.pfx_len() > 0 && + ((info->fsm_state() == McShardHash::FsmState::fsm_merge && info->fsm_utime() < cur_time + 60) || + info->before_merge()); + if (opts_->need_monitor(shard) || (will_merge && opts_->need_monitor(shard_parent(shard)))) { + new_shards_to_monitor.insert(shard); + } + if (will_merge && opts_->need_monitor(shard_parent(shard))) { + new_shards_to_monitor.insert(shard_parent(shard)); + } + if (will_split) { + for (int id = 0; id < 2; ++id) { + if (opts_->need_monitor(shard_child(shard, id))) { + new_shards_to_monitor.insert(shard_child(shard, id)); + } + } + } + } + + std::vector new_workchains; + for (const auto &wpair : masterchain_state_->get_workchain_list()) { + ton::WorkchainId wc = wpair.first; + const block::WorkchainInfo *winfo = wpair.second.get(); + auto shard = ShardIdFull(wc); + if (workchains.count(wc) == 0 && winfo->active && winfo->enabled_since <= cur_time && opts_->need_monitor(shard)) { + new_shards_to_monitor.insert(shard); + if (shards_to_monitor_.count(shard) == 0) { + new_workchains.push_back(BlockIdExt(wc, shardIdAll, 0, winfo->zerostate_root_hash, winfo->zerostate_file_hash)); + } + } + } + + td::actor::send_closure(manager_, &ValidatorManager::update_shard_configuration, masterchain_state_, + new_shards_to_monitor); + shards_to_monitor_ = std::move(new_shards_to_monitor); + for (BlockIdExt block_id : new_workchains) { + td::actor::send_closure(manager_, &ValidatorManager::wait_block_state_short, block_id, shard_client_priority(), + td::Timestamp::in(60.0), [](td::Result>) {}); + } } void ShardClient::force_update_shard_client(BlockHandle handle, td::Promise promise) { diff --git a/validator/shard-client.hpp b/validator/shard-client.hpp index 455b67e7..701a387e 100644 --- a/validator/shard-client.hpp +++ b/validator/shard-client.hpp @@ -42,7 +42,7 @@ class ShardClient : public td::actor::Actor { td::Promise promise_; - std::set created_overlays_; + std::set shards_to_monitor_ = {ShardIdFull(masterchainId)}; public: ShardClient(td::Ref opts, BlockHandle masterchain_block_handle, diff --git a/validator/validator.h b/validator/validator.h index 6804ae80..c5212abb 100644 --- a/validator/validator.h +++ b/validator/validator.h @@ -112,7 +112,8 @@ class ValidatorManagerInterface : public td::actor::Actor { virtual ~Callback() = default; virtual void initial_read_complete(BlockHandle top_masterchain_blocks) = 0; - virtual void update_shard_configuration(td::Ref state) = 0; + virtual void update_shard_configuration(td::Ref state, + std::set shards_to_monitor) = 0; virtual void send_ihr_message(AccountIdPrefixFull dst, td::BufferSlice data) = 0; virtual void send_ext_message(AccountIdPrefixFull dst, td::BufferSlice data) = 0;