Skip to content

Commit 3a93b22

Browse files
committed
Teach DownloadState how to download split states
This way, we propagate hardcoding UnsplitStateType one layer up.
1 parent 5a1d271 commit 3a93b22

File tree

4 files changed

+91
-25
lines changed

4 files changed

+91
-25
lines changed

validator/full-node-shard.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -990,8 +990,8 @@ void FullNodeShardImpl::download_persistent_state(BlockIdExt id, BlockIdExt mast
990990
td::Timestamp timeout, td::Promise<td::BufferSlice> promise) {
991991
auto &b = choose_neighbour();
992992
td::actor::create_actor<DownloadState>(PSTRING() << "downloadstatereq" << id.id.to_str(), id, masterchain_block_id,
993-
adnl_id_, overlay_id_, b.adnl_id, priority, timeout, validator_manager_,
994-
rldp2_, overlays_, adnl_, client_, std::move(promise))
993+
UnsplitStateType{}, adnl_id_, overlay_id_, b.adnl_id, priority, timeout,
994+
validator_manager_, rldp2_, overlays_, adnl_, client_, std::move(promise))
995995
.release();
996996
}
997997

validator/interfaces/persistent-state.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,14 @@ auto persistent_state_from_v2_query(auto const &query) {
6161
return std::tuple{block, mc_block, PersistentStateType{SplitAccountStateType{effective_shard}}};
6262
}
6363

64+
inline ShardId persistent_state_to_effective_shard(ShardIdFull const &shard, PersistentStateType const &type) {
65+
ShardId result = 0;
66+
type.visit(td::overloaded([](UnsplitStateType) {},
67+
[&](SplitAccountStateType type) { result = type.effective_shard_id; },
68+
[&](SplitPersistentStateType) { result = shard.shard; }));
69+
return result;
70+
}
71+
6472
inline std::string persistent_state_type_to_string(ShardIdFull const &shard, PersistentStateType const &state) {
6573
std::string result;
6674
state.visit(td::overloaded([&](UnsplitStateType) { result = "unsplit"; },

validator/net/download-state.cpp

Lines changed: 74 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,17 @@ namespace validator {
2828

2929
namespace fullnode {
3030

31-
DownloadState::DownloadState(BlockIdExt block_id, BlockIdExt masterchain_block_id, adnl::AdnlNodeIdShort local_id,
32-
overlay::OverlayIdShort overlay_id, adnl::AdnlNodeIdShort download_from,
33-
td::uint32 priority, td::Timestamp timeout,
31+
DownloadState::DownloadState(BlockIdExt block_id, BlockIdExt masterchain_block_id, PersistentStateType type,
32+
adnl::AdnlNodeIdShort local_id, overlay::OverlayIdShort overlay_id,
33+
adnl::AdnlNodeIdShort download_from, td::uint32 priority, td::Timestamp timeout,
3434
td::actor::ActorId<ValidatorManagerInterface> validator_manager,
3535
td::actor::ActorId<adnl::AdnlSenderInterface> rldp,
3636
td::actor::ActorId<overlay::Overlays> overlays, td::actor::ActorId<adnl::Adnl> adnl,
3737
td::actor::ActorId<adnl::AdnlExtClient> client, td::Promise<td::BufferSlice> promise)
3838
: block_id_(block_id)
3939
, masterchain_block_id_(masterchain_block_id)
40+
, type_(type)
41+
, effective_shard_(persistent_state_to_effective_shard(block_id_.shard_full(), type))
4042
, local_id_(local_id)
4143
, overlay_id_(overlay_id)
4244
, download_from_(download_from)
@@ -48,6 +50,7 @@ DownloadState::DownloadState(BlockIdExt block_id, BlockIdExt masterchain_block_i
4850
, adnl_(adnl)
4951
, client_(client)
5052
, promise_(std::move(promise)) {
53+
CHECK(masterchain_block_id_.is_valid() || effective_shard_ == 0);
5154
}
5255

5356
void DownloadState::abort_query(td::Status reason) {
@@ -74,7 +77,7 @@ void DownloadState::start_up() {
7477
alarm_timestamp() = timeout_;
7578

7679
td::actor::send_closure(validator_manager_, &ValidatorManagerInterface::get_persistent_state, block_id_,
77-
masterchain_block_id_, UnsplitStateType{},
80+
masterchain_block_id_, type_,
7881
[SelfId = actor_id(this), block_id = block_id_](td::Result<td::BufferSlice> R) {
7982
if (R.is_error()) {
8083
td::actor::send_closure(SelfId, &DownloadState::get_block_handle);
@@ -124,22 +127,39 @@ void DownloadState::got_block_handle(BlockHandle handle) {
124127

125128
void DownloadState::got_node_to_download(adnl::AdnlNodeIdShort node) {
126129
download_from_ = node;
127-
LOG(WARNING) << "downloading state " << block_id_.to_str() << " from " << download_from_;
130+
LOG(WARNING) << "downloading state " << block_id_.to_str() << " ("
131+
<< persistent_state_type_to_string(block_id_.shard_full(), type_) << ") from " << download_from_;
128132

129-
auto P = td::PromiseCreator::lambda([SelfId = actor_id(this)](td::Result<td::BufferSlice> R) mutable {
130-
if (R.is_error()) {
131-
td::actor::send_closure(SelfId, &DownloadState::abort_query, R.move_as_error());
133+
td::Promise<td::BufferSlice> P;
134+
td::BufferSlice query;
135+
136+
if (effective_shard_ == 0) {
137+
P = td::PromiseCreator::lambda([SelfId = actor_id(this)](td::Result<td::BufferSlice> R) mutable {
138+
if (R.is_error()) {
139+
td::actor::send_closure(SelfId, &DownloadState::abort_query, R.move_as_error());
140+
} else {
141+
td::actor::send_closure(SelfId, &DownloadState::got_block_state_description, R.move_as_ok());
142+
}
143+
});
144+
145+
if (masterchain_block_id_.is_valid()) {
146+
query = create_serialize_tl_object<ton_api::tonNode_preparePersistentState>(
147+
create_tl_block_id(block_id_), create_tl_block_id(masterchain_block_id_));
132148
} else {
133-
td::actor::send_closure(SelfId, &DownloadState::got_block_state_description, R.move_as_ok());
149+
query = create_serialize_tl_object<ton_api::tonNode_prepareZeroState>(create_tl_block_id(block_id_));
134150
}
135-
});
136-
137-
td::BufferSlice query;
138-
if (masterchain_block_id_.is_valid()) {
139-
query = create_serialize_tl_object<ton_api::tonNode_preparePersistentState>(
140-
create_tl_block_id(block_id_), create_tl_block_id(masterchain_block_id_));
141151
} else {
142-
query = create_serialize_tl_object<ton_api::tonNode_prepareZeroState>(create_tl_block_id(block_id_));
152+
P = td::PromiseCreator::lambda([SelfId = actor_id(this)](td::Result<td::BufferSlice> R) mutable {
153+
if (R.is_error()) {
154+
td::actor::send_closure(SelfId, &DownloadState::abort_query, R.move_as_error());
155+
} else {
156+
td::actor::send_closure(SelfId, &DownloadState::got_state_size, R.move_as_ok());
157+
}
158+
});
159+
160+
query = create_serialize_tl_object<ton_api::tonNode_getPersistentStateSizeV2>(
161+
create_tl_object<ton_api::tonNode_persistentStateIdV2>(
162+
create_tl_block_id(block_id_), create_tl_block_id(masterchain_block_id_), effective_shard_));
143163
}
144164

145165
if (client_.empty()) {
@@ -195,6 +215,25 @@ void DownloadState::got_block_state_description(td::BufferSlice data) {
195215
}));
196216
}
197217

218+
void DownloadState::got_state_size(td::BufferSlice size_or_not_found) {
219+
auto F = fetch_tl_object<ton_api::tonNode_PersistentStateSize>(std::move(size_or_not_found), true);
220+
if (F.is_error()) {
221+
abort_query(F.move_as_error());
222+
return;
223+
}
224+
prev_logged_timer_ = td::Timer();
225+
226+
ton_api::downcast_call(*F.move_as_ok().get(),
227+
td::overloaded(
228+
[&](ton_api::tonNode_persistentStateSizeNotFound &f) {
229+
abort_query(td::Status::Error(ErrorCode::notready, "state not found"));
230+
},
231+
[&](ton_api::tonNode_persistentStateSize &f) {
232+
total_size_ = f.size_;
233+
got_block_state_part(td::BufferSlice{}, 0);
234+
}));
235+
}
236+
198237
void DownloadState::request_total_size() {
199238
auto P = td::PromiseCreator::lambda([SelfId = actor_id(this)](td::Result<td::BufferSlice> R) {
200239
if (R.is_error()) {
@@ -207,8 +246,15 @@ void DownloadState::request_total_size() {
207246
td::actor::send_closure(SelfId, &DownloadState::got_total_size, res.ok()->size_);
208247
});
209248

210-
td::BufferSlice query = create_serialize_tl_object<ton_api::tonNode_getPersistentStateSize>(
211-
create_tl_block_id(block_id_), create_tl_block_id(masterchain_block_id_));
249+
td::BufferSlice query;
250+
if (effective_shard_ == 0) {
251+
query = create_serialize_tl_object<ton_api::tonNode_getPersistentStateSize>(
252+
create_tl_block_id(block_id_), create_tl_block_id(masterchain_block_id_));
253+
} else {
254+
query = create_serialize_tl_object<ton_api::tonNode_getPersistentStateSizeV2>(
255+
create_tl_object<ton_api::tonNode_persistentStateIdV2>(
256+
create_tl_block_id(block_id_), create_tl_block_id(masterchain_block_id_), effective_shard_));
257+
}
212258
if (client_.empty()) {
213259
td::actor::send_closure(overlays_, &overlay::Overlays::send_query_via, download_from_, local_id_, overlay_id_,
214260
"get size", std::move(P), td::Timestamp::in(3.0), std::move(query),
@@ -275,8 +321,16 @@ void DownloadState::got_block_state_part(td::BufferSlice data, td::uint32 reques
275321
}
276322
});
277323

278-
td::BufferSlice query = create_serialize_tl_object<ton_api::tonNode_downloadPersistentStateSlice>(
279-
create_tl_block_id(block_id_), create_tl_block_id(masterchain_block_id_), sum_, part_size);
324+
td::BufferSlice query;
325+
if (effective_shard_ == 0) {
326+
query = create_serialize_tl_object<ton_api::tonNode_downloadPersistentStateSlice>(
327+
create_tl_block_id(block_id_), create_tl_block_id(masterchain_block_id_), sum_, part_size);
328+
} else {
329+
query = create_serialize_tl_object<ton_api::tonNode_downloadPersistentStateSliceV2>(
330+
create_tl_object<ton_api::tonNode_persistentStateIdV2>(
331+
create_tl_block_id(block_id_), create_tl_block_id(masterchain_block_id_), effective_shard_),
332+
sum_, part_size);
333+
}
280334
if (client_.empty()) {
281335
td::actor::send_closure(overlays_, &overlay::Overlays::send_query_via, download_from_, local_id_, overlay_id_,
282336
"download state", std::move(P), td::Timestamp::in(20.0), std::move(query),

validator/net/download-state.hpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,10 @@ namespace fullnode {
3333

3434
class DownloadState : public td::actor::Actor {
3535
public:
36-
DownloadState(BlockIdExt block_id, BlockIdExt masterchain_block_id, adnl::AdnlNodeIdShort local_id,
37-
overlay::OverlayIdShort overlay_id, adnl::AdnlNodeIdShort download_from, td::uint32 priority,
38-
td::Timestamp timeout, td::actor::ActorId<ValidatorManagerInterface> validator_manager,
36+
DownloadState(BlockIdExt block_id, BlockIdExt masterchain_block_id, PersistentStateType type,
37+
adnl::AdnlNodeIdShort local_id, overlay::OverlayIdShort overlay_id, adnl::AdnlNodeIdShort download_from,
38+
td::uint32 priority, td::Timestamp timeout,
39+
td::actor::ActorId<ValidatorManagerInterface> validator_manager,
3940
td::actor::ActorId<adnl::AdnlSenderInterface> rldp, td::actor::ActorId<overlay::Overlays> overlays,
4041
td::actor::ActorId<adnl::Adnl> adnl, td::actor::ActorId<adnl::AdnlExtClient> client,
4142
td::Promise<td::BufferSlice> promise);
@@ -49,6 +50,7 @@ class DownloadState : public td::actor::Actor {
4950
void got_block_handle(BlockHandle handle);
5051
void got_node_to_download(adnl::AdnlNodeIdShort node);
5152
void got_block_state_description(td::BufferSlice data_description);
53+
void got_state_size(td::BufferSlice size_or_not_found);
5254
void request_total_size();
5355
void got_total_size(td::uint64 size);
5456
void got_block_state_part(td::BufferSlice data, td::uint32 requested_size);
@@ -57,6 +59,8 @@ class DownloadState : public td::actor::Actor {
5759
private:
5860
BlockIdExt block_id_;
5961
BlockIdExt masterchain_block_id_;
62+
PersistentStateType type_;
63+
ShardId effective_shard_;
6064
adnl::AdnlNodeIdShort local_id_;
6165
overlay::OverlayIdShort overlay_id_;
6266

0 commit comments

Comments
 (0)