@@ -337,7 +337,7 @@ void DownloadShardState::downloaded_split_state_header(td::BufferSlice data) {
337337
338338 auto P = td::PromiseCreator::lambda ([SelfId = actor_id (this )](td::Result<td::Unit> R) {
339339 R.ensure ();
340- td::actor::send_closure (SelfId, &DownloadShardState::written_split_state_file );
340+ td::actor::send_closure (SelfId, &DownloadShardState::download_next_part_or_finish );
341341 });
342342 td::actor::send_closure (manager_, &ValidatorManager::store_persistent_state_file, block_id_, masterchain_block_id_,
343343 SplitPersistentStateType{}, std::move (data), std::move (P));
@@ -347,13 +347,13 @@ namespace {
347347
348348void retry_part_download (td::actor::ActorId<DownloadShardState> SelfId, td::Status error) {
349349 LOG (WARNING) << " failed to download state part : " << error;
350- delay_action ([=]() { td::actor::send_closure (SelfId, &DownloadShardState::written_split_state_file ); },
350+ delay_action ([=]() { td::actor::send_closure (SelfId, &DownloadShardState::download_next_part_or_finish ); },
351351 td::Timestamp::in (1.0 ));
352352}
353353
354354} // namespace
355355
356- void DownloadShardState::written_split_state_file () {
356+ void DownloadShardState::download_next_part_or_finish () {
357357 if (stored_parts_.size () == parts_.size ()) {
358358 auto state_root = deserializer_->merge (stored_parts_);
359359 auto maybe_state = create_shard_state (block_id_, state_root);
@@ -411,7 +411,7 @@ void DownloadShardState::downloaded_state_part(td::BufferSlice data) {
411411
412412 auto P = td::PromiseCreator::lambda ([SelfId = actor_id (this )](td::Result<td::Unit> R) {
413413 R.ensure ();
414- td::actor::send_closure (SelfId, &DownloadShardState::written_split_state_file );
414+ td::actor::send_closure (SelfId, &DownloadShardState::written_state_part_file );
415415 });
416416 td::actor::send_closure (manager_, &ValidatorManager::store_persistent_state_file, block_id_, masterchain_block_id_,
417417 SplitAccountStateType{parts_[idx].effective_shard }, std::move (data), std::move (P));
@@ -421,6 +421,26 @@ void DownloadShardState::downloaded_state_part(td::BufferSlice data) {
421421 << " out of " << parts_.size () << " )" );
422422}
423423
424+ void DownloadShardState::written_state_part_file () {
425+ size_t idx = stored_parts_.size () - 1 ;
426+
427+ auto P = td::PromiseCreator::lambda ([SelfId = actor_id (this )](td::Result<td::Ref<vm::DataCell>> R) {
428+ R.ensure ();
429+ td::actor::send_closure (SelfId, &DownloadShardState::saved_state_part_into_celldb, R.move_as_ok ());
430+ });
431+ td::actor::send_closure (manager_, &ValidatorManager::store_block_state_part,
432+ BlockId{block_id_.shard_full ().workchain , parts_[idx].effective_shard , block_id_.seqno ()},
433+ stored_parts_.back (), std::move (P));
434+ LOG (INFO) << " saving to celldb state part " << idx + 1 << " out of " << parts_.size ();
435+ status_.set_status (PSTRING () << block_id_.id .to_str () << " : saving state part to celldb (part " << idx + 1
436+ << " out of " << parts_.size () << " )" );
437+ }
438+
439+ void DownloadShardState::saved_state_part_into_celldb (td::Ref<vm::DataCell> cell) {
440+ stored_parts_.back () = cell;
441+ download_next_part_or_finish ();
442+ }
443+
424444void DownloadShardState::written_shard_state_file () {
425445 status_.set_status (PSTRING () << block_id_.id .to_str () << " : storing state to celldb" );
426446 LOG (WARNING) << " written shard state file " << block_id_.to_str ();
0 commit comments