From 4d39772e4011788e16d2eef2a5167e090620fac8 Mon Sep 17 00:00:00 2001 From: EmelyanenkoK Date: Mon, 12 Feb 2024 10:42:02 +0300 Subject: [PATCH] Drop only accepted duplicate ext messages, don't cache errors (#902) Co-authored-by: SpyCheese --- validator/impl/liteserver-cache.hpp | 4 ++++ validator/impl/liteserver.cpp | 11 +++++++---- validator/interfaces/liteserver.h | 1 + 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/validator/impl/liteserver-cache.hpp b/validator/impl/liteserver-cache.hpp index 0e58e051..5318371f 100644 --- a/validator/impl/liteserver-cache.hpp +++ b/validator/impl/liteserver-cache.hpp @@ -85,6 +85,10 @@ class LiteServerCacheImpl : public LiteServerCache { } } + void drop_send_message_from_cache(td::Bits256 key) override { + send_message_cache_.erase(key); + } + private: struct CacheEntry : public td::ListNode { explicit CacheEntry(td::Bits256 key, td::BufferSlice value) : key_(key), value_(std::move(value)) { diff --git a/validator/impl/liteserver.cpp b/validator/impl/liteserver.cpp index 7d25b408..a7219b72 100644 --- a/validator/impl/liteserver.cpp +++ b/validator/impl/liteserver.cpp @@ -531,10 +531,13 @@ void LiteQuery::perform_sendMessage(td::BufferSlice data) { auto copy = data.clone(); td::actor::send_closure_later( manager_, &ValidatorManager::check_external_message, std::move(copy), - [Self = actor_id(this), data = std::move(data), manager = manager_](td::Result> res) mutable { - if(res.is_error()) { - td::actor::send_closure(Self, &LiteQuery::abort_query, - res.move_as_error_prefix("cannot apply external message to current state : "s)); + [Self = actor_id(this), data = std::move(data), manager = manager_, cache = cache_, + cache_key = cache_key_](td::Result> res) mutable { + if (res.is_error()) { + // Don't cache errors + td::actor::send_closure(cache, &LiteServerCache::drop_send_message_from_cache, cache_key); + td::actor::send_closure(Self, &LiteQuery::abort_query, + res.move_as_error_prefix("cannot apply external message to current state : "s)); } else { LOG(INFO) << "sending an external message to validator manager"; td::actor::send_closure_later(manager, &ValidatorManager::send_external_message, res.move_as_ok()); diff --git a/validator/interfaces/liteserver.h b/validator/interfaces/liteserver.h index 0920c11f..f2f78d41 100644 --- a/validator/interfaces/liteserver.h +++ b/validator/interfaces/liteserver.h @@ -32,6 +32,7 @@ class LiteServerCache : public td::actor::Actor { virtual void update(td::Bits256 key, td::BufferSlice value) = 0; virtual void process_send_message(td::Bits256 key, td::Promise promise) = 0; + virtual void drop_send_message_from_cache(td::Bits256 key) = 0; }; } // namespace ton::validator \ No newline at end of file