From c7f06abfbcef8355b57fece9001f1bbfeaec67cf Mon Sep 17 00:00:00 2001 From: SpyCheese Date: Wed, 30 Nov 2022 08:38:46 +0300 Subject: [PATCH] Fix finding blocks by lt and ut in archive manager (#536) --- validator/db/archive-manager.cpp | 20 ++++++++++++++++++-- validator/db/archive-manager.hpp | 1 + 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/validator/db/archive-manager.cpp b/validator/db/archive-manager.cpp index e7614154..05fb6ca6 100644 --- a/validator/db/archive-manager.cpp +++ b/validator/db/archive-manager.cpp @@ -441,7 +441,10 @@ void ArchiveManager::get_block_by_unix_time(AccountIdPrefixFull account_id, Unix td::Promise promise) { auto f = get_file_desc_by_unix_time(account_id, ts, false); if (f) { - auto n = get_next_file_desc(f); + auto n = f; + do { + n = get_next_file_desc(n); + } while (n != nullptr && !n->has_account_prefix(account_id)); td::actor::ActorId aid; if (n) { aid = n->file_actor_id(); @@ -464,7 +467,10 @@ void ArchiveManager::get_block_by_lt(AccountIdPrefixFull account_id, LogicalTime td::Promise promise) { auto f = get_file_desc_by_lt(account_id, lt, false); if (f) { - auto n = get_next_file_desc(f); + auto n = f; + do { + n = get_next_file_desc(n); + } while (n != nullptr && !n->has_account_prefix(account_id)); td::actor::ActorId aid; if (n) { aid = n->file_actor_id(); @@ -1232,6 +1238,16 @@ void ArchiveManager::truncate(BlockSeqno masterchain_seqno, ConstBlockHandle han } } +bool ArchiveManager::FileDescription::has_account_prefix(AccountIdPrefixFull account_id) const { + for (int i = 0; i < 60; i++) { + auto shard = shard_prefix(account_id, i); + if (first_blocks.count(shard)) { + return true; + } + } + return false; +} + } // namespace validator } // namespace ton diff --git a/validator/db/archive-manager.hpp b/validator/db/archive-manager.hpp index 31e0e6b6..79e6a2d7 100644 --- a/validator/db/archive-manager.hpp +++ b/validator/db/archive-manager.hpp @@ -97,6 +97,7 @@ class ArchiveManager : public td::actor::Actor { void clear_actor_id() { file.reset(); } + bool has_account_prefix(AccountIdPrefixFull account_id) const; PackageId id; bool deleted;