mirror of
https://github.com/ton-blockchain/ton
synced 2025-03-09 15:40:10 +00:00
Fix shard overlays
This commit is contained in:
parent
62ede1851b
commit
7d2110c8b0
2 changed files with 37 additions and 18 deletions
|
@ -206,13 +206,20 @@ void FullNodeImpl::on_new_masterchain_block(td::Ref<MasterchainState> state, std
|
||||||
std::set<ShardIdFull> new_active;
|
std::set<ShardIdFull> new_active;
|
||||||
all_shards.insert(ShardIdFull(masterchainId));
|
all_shards.insert(ShardIdFull(masterchainId));
|
||||||
std::set<WorkchainId> workchains;
|
std::set<WorkchainId> workchains;
|
||||||
|
wc_monitor_min_split_ = state->monitor_min_split_depth(basechainId);
|
||||||
auto cut_shard = [&](ShardIdFull shard) -> ShardIdFull {
|
auto cut_shard = [&](ShardIdFull shard) -> ShardIdFull {
|
||||||
int min_split = state->monitor_min_split_depth(shard.workchain);
|
return wc_monitor_min_split_ < shard.pfx_len() ? shard_prefix(shard, wc_monitor_min_split_) : shard;
|
||||||
return min_split < shard.pfx_len() ? shard_prefix(shard, min_split) : shard;
|
|
||||||
};
|
};
|
||||||
for (auto &info : state->get_shards()) {
|
for (auto &info : state->get_shards()) {
|
||||||
workchains.insert(info->shard().workchain);
|
workchains.insert(info->shard().workchain);
|
||||||
all_shards.insert(cut_shard(info->shard()));
|
ShardIdFull shard = cut_shard(info->shard());
|
||||||
|
while (true) {
|
||||||
|
all_shards.insert(shard);
|
||||||
|
if (shard.pfx_len() == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
shard = shard_parent(shard);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for (const auto &[wc, winfo] : state->get_workchain_list()) {
|
for (const auto &[wc, winfo] : state->get_workchain_list()) {
|
||||||
if (!workchains.contains(wc) && winfo->active && winfo->enabled_since <= state->get_unix_time()) {
|
if (!workchains.contains(wc) && winfo->active && winfo->enabled_since <= state->get_unix_time()) {
|
||||||
|
@ -220,7 +227,14 @@ void FullNodeImpl::on_new_masterchain_block(td::Ref<MasterchainState> state, std
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (ShardIdFull shard : shards_to_monitor) {
|
for (ShardIdFull shard : shards_to_monitor) {
|
||||||
new_active.insert(cut_shard(shard));
|
shard = cut_shard(shard);
|
||||||
|
while (true) {
|
||||||
|
new_active.insert(shard);
|
||||||
|
if (shard.pfx_len() == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
shard = shard_parent(shard);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto it = shards_.begin(); it != shards_.end(); ) {
|
for (auto it = shards_.begin(); it != shards_.end(); ) {
|
||||||
|
@ -478,21 +492,25 @@ void FullNodeImpl::download_out_msg_queue_proof(ShardIdFull dst_shard, std::vect
|
||||||
}
|
}
|
||||||
|
|
||||||
td::actor::ActorId<FullNodeShard> FullNodeImpl::get_shard(ShardIdFull shard) {
|
td::actor::ActorId<FullNodeShard> FullNodeImpl::get_shard(ShardIdFull shard) {
|
||||||
while (true) {
|
if (shard.is_masterchain()) {
|
||||||
auto it = shards_.find(shard);
|
return shards_[ShardIdFull{masterchainId}].actor.get();
|
||||||
if (it != shards_.end()) {
|
|
||||||
if (it->second.actor.empty()) {
|
|
||||||
update_shard_actor(shard, false);
|
|
||||||
}
|
|
||||||
return it->second.actor.get();
|
|
||||||
}
|
|
||||||
if (shard.pfx_len() == 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
shard = shard_parent(shard);
|
|
||||||
}
|
}
|
||||||
update_shard_actor(shard, false);
|
if (shard.workchain != basechainId) {
|
||||||
return shards_[shard].actor.get();
|
return {};
|
||||||
|
}
|
||||||
|
int pfx_len = shard.pfx_len();
|
||||||
|
if (pfx_len > wc_monitor_min_split_) {
|
||||||
|
shard = shard_prefix(shard, wc_monitor_min_split_);
|
||||||
|
}
|
||||||
|
auto it = shards_.find(shard);
|
||||||
|
if (it != shards_.end()) {
|
||||||
|
update_shard_actor(shard, it->second.active);
|
||||||
|
return it->second.actor.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Special case if shards_ was not yet initialized.
|
||||||
|
// This can happen briefly on node startup.
|
||||||
|
return shards_[ShardIdFull{masterchainId}].actor.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
td::actor::ActorId<FullNodeShard> FullNodeImpl::get_shard(AccountIdPrefixFull dst) {
|
td::actor::ActorId<FullNodeShard> FullNodeImpl::get_shard(AccountIdPrefixFull dst) {
|
||||||
|
|
|
@ -124,6 +124,7 @@ class FullNodeImpl : public FullNode {
|
||||||
td::actor::ActorId<FullNodeShard> get_shard(AccountIdPrefixFull dst);
|
td::actor::ActorId<FullNodeShard> get_shard(AccountIdPrefixFull dst);
|
||||||
td::actor::ActorId<FullNodeShard> get_shard(ShardIdFull shard);
|
td::actor::ActorId<FullNodeShard> get_shard(ShardIdFull shard);
|
||||||
std::map<ShardIdFull, ShardInfo> shards_;
|
std::map<ShardIdFull, ShardInfo> shards_;
|
||||||
|
int wc_monitor_min_split_ = 0;
|
||||||
|
|
||||||
td::actor::ActorId<keyring::Keyring> keyring_;
|
td::actor::ActorId<keyring::Keyring> keyring_;
|
||||||
td::actor::ActorId<adnl::Adnl> adnl_;
|
td::actor::ActorId<adnl::Adnl> adnl_;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue