From 6143b2051f3a1a213ede2f2a3e8dd2c80d6ede11 Mon Sep 17 00:00:00 2001 From: ton Date: Sun, 8 Dec 2019 16:22:48 +0400 Subject: [PATCH] fixed download of an serialized state --- validator/import-db-slice.cpp | 7 +++++++ validator/manager.cpp | 13 ++++++++----- validator/state-serializer.cpp | 4 +++- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/validator/import-db-slice.cpp b/validator/import-db-slice.cpp index 4e404b7e..24618ff5 100644 --- a/validator/import-db-slice.cpp +++ b/validator/import-db-slice.cpp @@ -82,6 +82,10 @@ void ArchiveImporter::start_up() { } auto seqno = masterchain_blocks_.begin()->first; + if (seqno > state_->get_seqno() + 1) { + abort_query(td::Status::Error(ErrorCode::notready, "too big first masterchain seqno")); + return; + } check_masterchain_block(seqno); } @@ -197,6 +201,9 @@ void ArchiveImporter::got_new_materchain_state(td::Ref state) } void ArchiveImporter::checked_all_masterchain_blocks(BlockSeqno seqno) { + if (shard_client_seqno_ > seqno) { + shard_client_seqno_ = seqno; + } check_next_shard_client_seqno(shard_client_seqno_ + 1); } diff --git a/validator/manager.cpp b/validator/manager.cpp index 286baca4..0e7101a4 100644 --- a/validator/manager.cpp +++ b/validator/manager.cpp @@ -1484,8 +1484,9 @@ void ValidatorManagerImpl::download_next_archive() { td::actor::send_closure(SelfId, &ValidatorManagerImpl::downloaded_archive_slice, R.move_as_ok()); } }); - callback_->download_archive(shard_client_handle_->id().seqno() + 1, db_root_ + "/tmp/", td::Timestamp::in(3600.0), - std::move(P)); + + auto seqno = std::min(last_masterchain_seqno_, shard_client_handle_->id().seqno()); + callback_->download_archive(seqno + 1, db_root_ + "/tmp/", td::Timestamp::in(3600.0), std::move(P)); } void ValidatorManagerImpl::downloaded_archive_slice(std::string name) { @@ -1500,8 +1501,10 @@ void ValidatorManagerImpl::downloaded_archive_slice(std::string name) { } }); - td::actor::create_actor("archiveimport", name, last_masterchain_state_, - shard_client_handle_->id().seqno(), opts_, actor_id(this), std::move(P)) + auto seqno = std::min(last_masterchain_seqno_, shard_client_handle_->id().seqno()); + + td::actor::create_actor("archiveimport", name, last_masterchain_state_, seqno, opts_, actor_id(this), + std::move(P)) .release(); } @@ -1509,7 +1512,7 @@ void ValidatorManagerImpl::checked_archive_slice(std::vector seqno) CHECK(seqno.size() == 2); LOG(INFO) << "checked downloaded archive slice: mc_top_seqno=" << seqno[0] << " shard_top_seqno_=" << seqno[1]; CHECK(seqno[0] <= last_masterchain_seqno_); - CHECK(seqno[1] <= seqno[0]); + CHECK(seqno[1] <= last_masterchain_seqno_); BlockIdExt b; if (seqno[1] < last_masterchain_seqno_) { diff --git a/validator/state-serializer.cpp b/validator/state-serializer.cpp index a63f92eb..cc40626f 100644 --- a/validator/state-serializer.cpp +++ b/validator/state-serializer.cpp @@ -94,7 +94,8 @@ void AsyncStateSerializer::next_iteration() { td::actor::send_closure(manager_, &ValidatorManager::get_block_handle, last_block_id_, true, std::move(P)); return; } - if (!masterchain_handle_->inited_unix_time() || !masterchain_handle_->inited_is_key_block()) { + if (!masterchain_handle_->inited_unix_time() || !masterchain_handle_->inited_is_key_block() || + !masterchain_handle_->is_applied()) { return; } CHECK(masterchain_handle_->id() == last_block_id_); @@ -213,6 +214,7 @@ void AsyncStateSerializer::got_shard_state(BlockHandle handle, td::Refid(), masterchain_handle_->id(), std::move(B), std::move(P)); + LOG(INFO) << "storing persistent state for " << masterchain_handle_->id().seqno() << ":" << handle->id().id.shard; next_idx_++; }