diff --git a/validator-engine/validator-engine.cpp b/validator-engine/validator-engine.cpp index c0f85d03..e56dfb7b 100644 --- a/validator-engine/validator-engine.cpp +++ b/validator-engine/validator-engine.cpp @@ -1404,7 +1404,7 @@ td::Status ValidatorEngine::load_global_config() { return td::Status::OK(); } -void ValidatorEngine::init_validator_options() { +void ValidatorEngine::set_shard_check_function() { if (!not_all_shards_) { validator_options_.write().set_shard_check_function([](ton::ShardIdFull shard) -> bool { return true; }); } else { @@ -1711,7 +1711,7 @@ void ValidatorEngine::got_key(ton::PublicKey key) { } void ValidatorEngine::start() { - init_validator_options(); + set_shard_check_function(); read_config_ = true; start_adnl(); } @@ -3412,7 +3412,10 @@ void ValidatorEngine::run_control_query(ton::ton_api::engine_validator_addCollat promise.set_value(ton::serialize_tl_object(ton::create_tl_object(), true)); return; } + set_shard_check_function(); if (!validator_manager_.empty()) { + td::actor::send_closure(validator_manager_, &ton::validator::ValidatorManagerInterface::update_options, + validator_options_); td::actor::send_closure(validator_manager_, &ton::validator::ValidatorManagerInterface::add_collator, ton::adnl::AdnlNodeIdShort(id), shard); } @@ -3443,7 +3446,18 @@ void ValidatorEngine::run_control_query(ton::ton_api::engine_validator_addShard promise.set_value(create_control_query_error(R.move_as_error())); return; } - promise.set_value(ton::serialize_tl_object(ton::create_tl_object(), true)); + set_shard_check_function(); + if (!validator_manager_.empty()) { + td::actor::send_closure(validator_manager_, &ton::validator::ValidatorManagerInterface::update_options, + validator_options_); + } + write_config([promise = std::move(promise)](td::Result R) mutable { + if (R.is_error()) { + promise.set_value(create_control_query_error(R.move_as_error())); + } else { + promise.set_value(ton::serialize_tl_object(ton::create_tl_object(), true)); + } + }); } void ValidatorEngine::process_control_query(td::uint16 port, ton::adnl::AdnlNodeIdShort src, diff --git a/validator-engine/validator-engine.hpp b/validator-engine/validator-engine.hpp index b5d770a4..40a04c70 100644 --- a/validator-engine/validator-engine.hpp +++ b/validator-engine/validator-engine.hpp @@ -283,7 +283,7 @@ class ValidatorEngine : public td::actor::Actor { void load_empty_local_config(td::Promise promise); void load_local_config(td::Promise promise); void load_config(td::Promise promise); - void init_validator_options(); + void set_shard_check_function(); void start(); diff --git a/validator/manager-disk.hpp b/validator/manager-disk.hpp index 53467ff3..ea443d46 100644 --- a/validator/manager-disk.hpp +++ b/validator/manager-disk.hpp @@ -386,6 +386,10 @@ class ValidatorManagerImpl : public ValidatorManager { UNREACHABLE(); } + void update_options(td::Ref opts) override { + opts_ = std::move(opts); + } + private: PublicKeyHash local_id_; diff --git a/validator/manager-hardfork.hpp b/validator/manager-hardfork.hpp index 9aa30226..ce92f8a7 100644 --- a/validator/manager-hardfork.hpp +++ b/validator/manager-hardfork.hpp @@ -445,6 +445,9 @@ class ValidatorManagerImpl : public ValidatorManager { void add_collator(adnl::AdnlNodeIdShort id, ShardIdFull shard) override { UNREACHABLE(); } + void update_options(td::Ref opts) override { + opts_ = std::move(opts); + } private: td::Ref opts_; diff --git a/validator/manager.cpp b/validator/manager.cpp index 10f0ca48..710edec5 100644 --- a/validator/manager.cpp +++ b/validator/manager.cpp @@ -2696,6 +2696,16 @@ void ValidatorManagerImpl::add_collator(adnl::AdnlNodeIdShort id, ShardIdFull sh td::actor::send_closure(it->second, &CollatorNode::add_shard, shard); } +void ValidatorManagerImpl::update_options(td::Ref opts) { + if (!shard_client_.empty()) { + td::actor::send_closure(shard_client_, &ShardClient::update_options, opts); + } + if (!serializer_.empty()) { + td::actor::send_closure(serializer_, &AsyncStateSerializer::update_options, opts); + } + opts_ = std::move(opts); +} + td::actor::ActorOwn ValidatorManagerFactory::create( td::Ref opts, std::string db_root, td::actor::ActorId keyring, td::actor::ActorId adnl, td::actor::ActorId rldp, diff --git a/validator/manager.hpp b/validator/manager.hpp index 15598f4c..d61351f2 100644 --- a/validator/manager.hpp +++ b/validator/manager.hpp @@ -556,6 +556,7 @@ class ValidatorManagerImpl : public ValidatorManager { } void add_collator(adnl::AdnlNodeIdShort id, ShardIdFull shard) override; + void update_options(td::Ref opts) override; private: td::Timestamp resend_shard_blocks_at_; diff --git a/validator/shard-client.cpp b/validator/shard-client.cpp index 65adf34d..eff8aced 100644 --- a/validator/shard-client.cpp +++ b/validator/shard-client.cpp @@ -331,6 +331,10 @@ void ShardClient::force_update_shard_client_ex(BlockHandle handle, td::Ref opts) { + opts_ = std::move(opts); +} + } // namespace validator } // namespace ton diff --git a/validator/shard-client.hpp b/validator/shard-client.hpp index 701a387e..d7330b36 100644 --- a/validator/shard-client.hpp +++ b/validator/shard-client.hpp @@ -97,6 +97,8 @@ class ShardClient : public td::actor::Actor { void force_update_shard_client(BlockHandle handle, td::Promise promise); void force_update_shard_client_ex(BlockHandle handle, td::Ref state, td::Promise promise); + + void update_options(td::Ref opts); }; } // namespace validator diff --git a/validator/state-serializer.hpp b/validator/state-serializer.hpp index e971a3f8..89db2fc6 100644 --- a/validator/state-serializer.hpp +++ b/validator/state-serializer.hpp @@ -91,6 +91,10 @@ class AsyncStateSerializer : public td::actor::Actor { void fail_handler(td::Status reason); void fail_handler_cont(); void success_handler(); + + void update_options(td::Ref opts) { + opts_ = std::move(opts); + } }; } // namespace validator diff --git a/validator/validator.h b/validator/validator.h index 0595949f..0daccc1a 100644 --- a/validator/validator.h +++ b/validator/validator.h @@ -228,6 +228,7 @@ class ValidatorManagerInterface : public td::actor::Actor { td::Promise> promise) = 0; virtual void add_collator(adnl::AdnlNodeIdShort id, ShardIdFull shard) = 0; + virtual void update_options(td::Ref opts) = 0; }; } // namespace validator