diff --git a/validator/impl/liteserver-cache.hpp b/validator/impl/liteserver-cache.hpp index 0e58e0517..5318371fc 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 7d25b408d..a7219b727 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 0920c11f3..f2f78d41f 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