@@ -28,15 +28,17 @@ namespace validator {
2828
2929namespace 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
5356void 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
125128void 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+
198237void 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),
0 commit comments