Skip to content

Commit 09dbf72

Browse files
committed
Pass correct state split depth to DownloadShardState
... and let DownloadShardState do nothing with it. With this commit, we are expecting DownloadShardState to pass correct PersistentStateType from one side and are passing split depth from the other side. So, only state merging in that single actor remains to be done.
1 parent 7164753 commit 09dbf72

File tree

7 files changed

+55
-19
lines changed

7 files changed

+55
-19
lines changed

validator/downloaders/download-state.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,22 @@ namespace ton {
2626

2727
namespace validator {
2828

29-
DownloadShardState::DownloadShardState(BlockIdExt block_id, BlockIdExt masterchain_block_id, td::uint32 priority,
30-
td::actor::ActorId<ValidatorManager> manager, td::Timestamp timeout,
31-
td::Promise<td::Ref<ShardState>> promise)
29+
DownloadShardState::DownloadShardState(BlockIdExt block_id, BlockIdExt masterchain_block_id, td::uint32 split_depth,
30+
td::uint32 priority, td::actor::ActorId<ValidatorManager> manager,
31+
td::Timestamp timeout, td::Promise<td::Ref<ShardState>> promise)
3232
: block_id_(block_id)
3333
, masterchain_block_id_(masterchain_block_id)
34+
, split_depth_(split_depth)
3435
, priority_(priority)
3536
, manager_(manager)
3637
, timeout_(timeout)
3738
, promise_(std::move(promise)) {
39+
CHECK(masterchain_block_id_.is_valid() || split_depth_ == 0);
40+
41+
int shard_prefix_length = shard_pfx_len(block_id_.shard_full().shard);
42+
if (shard_prefix_length >= static_cast<int>(split_depth_)) {
43+
split_depth_ = 0;
44+
}
3845
}
3946

4047
void DownloadShardState::start_up() {

validator/downloaders/download-state.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ namespace validator {
2727

2828
class DownloadShardState : public td::actor::Actor {
2929
public:
30-
DownloadShardState(BlockIdExt block_id, BlockIdExt masterchain_block_id, td::uint32 priority,
30+
DownloadShardState(BlockIdExt block_id, BlockIdExt masterchain_block_id, td::uint32 split_depth, td::uint32 priority,
3131
td::actor::ActorId<ValidatorManager> manager, td::Timestamp timeout,
3232
td::Promise<td::Ref<ShardState>> promise);
3333

@@ -58,6 +58,7 @@ class DownloadShardState : public td::actor::Actor {
5858
private:
5959
BlockIdExt block_id_;
6060
BlockIdExt masterchain_block_id_;
61+
td::uint32 split_depth_;
6162

6263
BlockHandle handle_;
6364
td::uint32 priority_;

validator/downloaders/wait-block-state.cpp

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,10 +117,26 @@ void WaitBlockState::start() {
117117
td::actor::send_closure(SelfId, &WaitBlockState::written_state, R.move_as_ok());
118118
}
119119
});
120+
120121
BlockIdExt masterchain_id = persistent_state_desc_->masterchain_id;
121-
td::actor::create_actor<DownloadShardState>("downloadstate", handle_->id(), masterchain_id, priority_, manager_,
122-
timeout_, std::move(P))
123-
.release();
122+
td::uint32 split_depth = 0;
123+
bool block_found = false;
124+
for (auto const& [block, block_split_depth] : persistent_state_desc_->shard_blocks) {
125+
if (block == handle_->id()) {
126+
split_depth = block_split_depth;
127+
block_found = true;
128+
break;
129+
}
130+
}
131+
if (!block_found) {
132+
LOG(ERROR) << "invalid persistent state description passed to WaitBlockState for block "
133+
<< handle_->id().to_str();
134+
P.set_error(td::Status::Error("invalid persistent state description"));
135+
} else {
136+
td::actor::create_actor<DownloadShardState>("downloadstate", handle_->id(), masterchain_id, split_depth,
137+
priority_, manager_, timeout_, std::move(P))
138+
.release();
139+
}
124140
} else if (!handle_->inited_prev() || (!handle_->inited_proof() && !handle_->inited_proof_link())) {
125141
auto P = td::PromiseCreator::lambda([SelfId = actor_id(this), handle = handle_](td::Result<td::BufferSlice> R) {
126142
if (R.is_error()) {

validator/import-db-slice.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -418,8 +418,10 @@ void ArchiveImporter::apply_shard_block_cont1(BlockHandle handle, BlockIdExt mas
418418
if (handle->id().seqno() == 0) {
419419
auto P = td::PromiseCreator::lambda(
420420
[promise = std::move(promise)](td::Result<td::Ref<ShardState>>) mutable { promise.set_value(td::Unit()); });
421-
td::actor::create_actor<DownloadShardState>("downloadstate", handle->id(), masterchain_block_id, 2, manager_,
422-
td::Timestamp::in(3600), std::move(P))
421+
td::actor::create_actor<DownloadShardState>(
422+
"downloadstate", handle->id(), masterchain_block_id,
423+
start_state_->persistent_state_split_depth(handle->id().shard_full().workchain), 2, manager_,
424+
td::Timestamp::in(3600), std::move(P))
423425
.release();
424426
return;
425427
}

validator/manager-init.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ void ValidatorManagerMasterchainReiniter::got_masterchain_handle(BlockHandle han
6565
R.ensure();
6666
td::actor::send_closure(SelfId, &ValidatorManagerMasterchainReiniter::download_masterchain_state);
6767
});
68-
td::actor::create_actor<DownloadShardState>("downloadstate", handle_->id(), BlockIdExt{}, 2, manager_,
68+
td::actor::create_actor<DownloadShardState>("downloadstate", handle_->id(), BlockIdExt{}, 0, 2, manager_,
6969
td::Timestamp::in(3600), std::move(P))
7070
.release();
7171
return;
@@ -80,7 +80,7 @@ void ValidatorManagerMasterchainReiniter::download_proof_link() {
8080
R.ensure();
8181
td::actor::send_closure(SelfId, &ValidatorManagerMasterchainReiniter::downloaded_zero_state);
8282
});
83-
td::actor::create_actor<DownloadShardState>("downloadstate", handle_->id(), BlockIdExt{}, 2, manager_,
83+
td::actor::create_actor<DownloadShardState>("downloadstate", handle_->id(), BlockIdExt{}, 0, 2, manager_,
8484
td::Timestamp::in(3600), std::move(P))
8585
.release();
8686
} else {
@@ -263,7 +263,7 @@ void ValidatorManagerMasterchainReiniter::download_masterchain_state() {
263263
R.move_as_ok());
264264
}
265265
});
266-
td::actor::create_actor<DownloadShardState>("downloadstate", block_id_, block_id_, 2, manager_,
266+
td::actor::create_actor<DownloadShardState>("downloadstate", block_id_, block_id_, 0, 2, manager_,
267267
td::Timestamp::in(3600 * 3), std::move(P))
268268
.release();
269269
}

validator/shard-client.cpp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,24 +74,29 @@ void ShardClient::got_init_state_from_db(td::Ref<MasterchainState> state) {
7474
}
7575

7676
void ShardClient::start_up_init_mode() {
77-
std::vector<BlockIdExt> shards;
78-
for (const auto& s : masterchain_state_->get_shards()) {
77+
std::vector<DownloadableShard> shards;
78+
for (const auto &s : masterchain_state_->get_shards()) {
7979
if (opts_->need_monitor(s->shard(), masterchain_state_)) {
80-
shards.push_back(s->top_block_id());
80+
auto shard = s->top_block_id();
81+
shards.push_back({
82+
.shard = shard,
83+
.split_depth = masterchain_state_->persistent_state_split_depth(shard.shard_full().workchain),
84+
});
8185
}
8286
}
8387
download_shard_states(masterchain_block_handle_->id(), std::move(shards), 0);
8488
}
8589

86-
void ShardClient::download_shard_states(BlockIdExt masterchain_block_id, std::vector<BlockIdExt> shards, size_t idx) {
90+
void ShardClient::download_shard_states(BlockIdExt masterchain_block_id, std::vector<DownloadableShard> shards,
91+
size_t idx) {
8792
if (idx >= shards.size()) {
8893
LOG(WARNING) << "downloaded all shard states";
8994
applied_all_shards();
9095
return;
9196
}
92-
BlockIdExt block_id = shards[idx];
97+
auto [block_id, split_depth] = shards[idx];
9398
td::actor::create_actor<DownloadShardState>(
94-
"downloadstate", block_id, masterchain_block_handle_->id(), 2, manager_, td::Timestamp::in(3600 * 5),
99+
"downloadstate", block_id, masterchain_block_handle_->id(), split_depth, 2, manager_, td::Timestamp::in(3600 * 5),
95100
[=, SelfId = actor_id(this), shards = std::move(shards)](td::Result<td::Ref<ShardState>> R) {
96101
R.ensure();
97102
td::actor::send_closure(SelfId, &ShardClient::download_shard_states, masterchain_block_id, std::move(shards),

validator/shard-client.hpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ namespace validator {
2727

2828
class ShardClient : public td::actor::Actor {
2929
private:
30+
struct DownloadableShard {
31+
BlockIdExt shard;
32+
td::uint32 split_depth;
33+
};
34+
3035
td::Ref<ValidatorManagerOptions> opts_;
3136

3237
BlockHandle masterchain_block_handle_;
@@ -64,7 +69,7 @@ class ShardClient : public td::actor::Actor {
6469

6570
void start_up() override;
6671
void start_up_init_mode();
67-
void download_shard_states(BlockIdExt masterchain_block_id, std::vector<BlockIdExt> shards, size_t idx);
72+
void download_shard_states(BlockIdExt masterchain_block_id, std::vector<DownloadableShard> shards, size_t idx);
6873
void start();
6974
void got_state_from_db(BlockIdExt masterchain_block_id);
7075
void got_init_handle_from_db(BlockHandle handle);

0 commit comments

Comments
 (0)