diff --git a/src/dht.cpp b/src/dht.cpp
index 72ec2dd14d1076f2da2083ca543b16f27a183b6b..547d9757aab2489efa944e333038bc027983c7e5 100644
--- a/src/dht.cpp
+++ b/src/dht.cpp
@@ -2175,7 +2175,6 @@ Dht::onError(Sp<net::Request> req, net::DhtProtocolException e) {
         if (logger_)
             logger_->e(node->id, "[node %s] token flush", node->toString().c_str());
         node->authError();
-        node->cancelRequest(req);
         for (auto& srp : searches(node->getFamily())) {
             auto& sr = srp.second;
             for (auto& n : sr->nodes) {
diff --git a/src/network_engine.cpp b/src/network_engine.cpp
index ad22b3cf4ded08784f07d2ffda0c9607ef63c537..f83f26108e1f4388183e8e4710b176afc19bb458 100644
--- a/src/network_engine.cpp
+++ b/src/network_engine.cpp
@@ -560,6 +560,7 @@ NetworkEngine::process(std::unique_ptr<ParsedMessage>&& msg, const SockAddr& fro
             {
                 req->last_try = time_point::min();
                 req->reply_time = time_point::min();
+                req->setError();
                 onError(req, DhtProtocolException {msg->error_code});
             } else {
                 if (logIncoming_)
diff --git a/src/request.h b/src/request.h
index 61d2dd4fda5a8d220fe13abb5d21e6fce50f19db..5b862911e7c51cec27661f3961eec6d7994927af 100644
--- a/src/request.h
+++ b/src/request.h
@@ -96,6 +96,12 @@ struct Request {
             clear();
         }
     }
+    void setError() {
+        if (pending()) {
+            state_ = Request::State::COMPLETED;
+            clear();
+        }
+    }
 
     void cancel() {
         if (pending()) {