From 8690f14a3857876c74bde49731ed57eedca79091 Mon Sep 17 00:00:00 2001 From: SpyCheese Date: Thu, 6 Jun 2024 14:52:34 +0300 Subject: [PATCH] Fix error processing in ArchiveImporter --- validator/import-db-slice.cpp | 17 ++++++++++++++++- validator/import-db-slice.hpp | 2 ++ validator/manager.cpp | 1 - 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/validator/import-db-slice.cpp b/validator/import-db-slice.cpp index b701e6bb6..123dd7e0b 100644 --- a/validator/import-db-slice.cpp +++ b/validator/import-db-slice.cpp @@ -50,7 +50,9 @@ ArchiveImporter::ArchiveImporter(std::string db_root, td::Ref void ArchiveImporter::start_up() { if (use_imported_files_) { + LOG(INFO) << "Importing archive for masterchain seqno #" << start_import_seqno_ << " from disk"; for (const std::string& path : to_import_files_) { + LOG(INFO) << "Importing file from disk " << path; td::Status S = process_package(path, true); if (S.is_error()) { LOG(INFO) << "Error processing package " << path << ": " << S; @@ -60,6 +62,7 @@ void ArchiveImporter::start_up() { processed_mc_archive(); return; } + LOG(INFO) << "Importing archive for masterchain seqno #" << start_import_seqno_ << " from net"; td::actor::send_closure(manager_, &ValidatorManager::send_download_archive_request, start_import_seqno_, ShardIdFull{masterchainId}, db_root_ + "/tmp/", td::Timestamp::in(3600.0), [SelfId = actor_id(this)](td::Result R) { @@ -142,6 +145,8 @@ td::Status ArchiveImporter::process_package(std::string path, bool with_masterch if (b.is_masterchain()) { masterchain_blocks_[b.seqno()] = b; last_masterchain_seqno_ = std::max(last_masterchain_seqno_, b.seqno()); + } else { + have_shard_blocks_; } } return true; @@ -264,6 +269,7 @@ void ArchiveImporter::applied_masterchain_block(BlockHandle handle) { void ArchiveImporter::got_new_materchain_state(td::Ref state) { last_masterchain_state_ = std::move(state); + imported_any_ = true; check_masterchain_block(last_masterchain_state_->get_block_id().seqno() + 1); } @@ -287,7 +293,8 @@ void ArchiveImporter::download_shard_archives(td::Ref start_st start_state_ = start_state; td::uint32 monitor_min_split = start_state->monitor_min_split_depth(basechainId); // If monitor_min_split == 0, we use the old archive format (packages are not separated by shard) - if (monitor_min_split > 0 && !use_imported_files_) { + // If masterchain package has shard blocks then it's old archive format, don't need to download shards + if (monitor_min_split > 0 && !have_shard_blocks_ && !use_imported_files_) { for (td::uint64 i = 0; i < (1ULL << monitor_min_split); ++i) { ShardIdFull shard_prefix{basechainId, (i * 2 + 1) << (64 - monitor_min_split - 1)}; if (opts_->need_monitor(shard_prefix, start_state)) { @@ -371,6 +378,7 @@ void ArchiveImporter::got_masterchain_state(td::Ref state) { void ArchiveImporter::checked_shard_client_seqno(BlockSeqno seqno) { CHECK(shard_client_seqno_ + 1 == seqno); shard_client_seqno_++; + imported_any_ = true; check_next_shard_client_seqno(seqno + 1); } @@ -484,6 +492,13 @@ void ArchiveImporter::check_shard_block_applied(BlockIdExt block_id, td::Promise } void ArchiveImporter::abort_query(td::Status error) { + if (!imported_any_) { + for (const std::string &f : files_to_cleanup_) { + td::unlink(f).ignore(); + } + promise_.set_error(std::move(error)); + return; + } LOG(INFO) << "Archive import: " << error; finish_query(); } diff --git a/validator/import-db-slice.hpp b/validator/import-db-slice.hpp index 2d990d1a0..04f22642d 100644 --- a/validator/import-db-slice.hpp +++ b/validator/import-db-slice.hpp @@ -88,6 +88,8 @@ class ArchiveImporter : public td::actor::Actor { td::Ref start_state_; size_t pending_shard_archives_ = 0; + bool imported_any_ = false; + bool have_shard_blocks_ = false; std::vector files_to_cleanup_; }; diff --git a/validator/manager.cpp b/validator/manager.cpp index 64c85dcd2..aa46e9e80 100644 --- a/validator/manager.cpp +++ b/validator/manager.cpp @@ -1948,7 +1948,6 @@ void ValidatorManagerImpl::download_next_archive() { } auto seqno = std::min(last_masterchain_seqno_, shard_client_handle_->id().seqno()); - // TODO: importing archives from disk std::vector to_import_files; auto it = to_import_.upper_bound(seqno + 1); if (it != to_import_.begin()) {