From 21fafaca1566457f7317dc5ae74691a5e186ef60 Mon Sep 17 00:00:00 2001
From: Georgy Moshkin <gmoshkin@picodata.io>
Date: Wed, 31 Jan 2024 20:08:47 +0300
Subject: [PATCH] fix: used to not reconnect after some tarantool errors

---
 src/lib.rs           |  2 +-
 src/traft/network.rs | 32 ++++++++++++++++++--------------
 tarantool            |  2 +-
 3 files changed, 20 insertions(+), 16 deletions(-)

diff --git a/src/lib.rs b/src/lib.rs
index ee5542314a..0aff71d8f6 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -698,7 +698,7 @@ fn start_join(args: &args::Run, instance_address: String) {
             Ok(resp) => {
                 break resp;
             }
-            Err(TntError::Tcp(e)) => {
+            Err(TntError::ConnectionClosed(e)) => {
                 tlog!(Warning, "join request failed: {e}, retrying...");
                 fiber::sleep(timeout.saturating_sub(now.elapsed()));
                 continue;
diff --git a/src/traft/network.rs b/src/traft/network.rs
index e140509cba..6d5307f999 100644
--- a/src/traft/network.rs
+++ b/src/traft/network.rs
@@ -18,7 +18,6 @@ use ::tarantool::fiber::r#async::oneshot;
 use ::tarantool::fiber::r#async::timeout::Error as TOError;
 use ::tarantool::fiber::r#async::timeout::IntoTimeout as _;
 use ::tarantool::fiber::r#async::watch;
-use ::tarantool::network;
 use ::tarantool::network::AsClient as _;
 use ::tarantool::network::Config;
 use ::tarantool::network::Error as NetError;
@@ -34,7 +33,6 @@ use std::collections::VecDeque;
 use std::pin::Pin;
 use std::task::Poll;
 use std::time::Duration;
-use tarantool::fiber::r#async::timeout;
 
 pub const DEFAULT_CALL_TIMEOUT: Duration = Duration::from_secs(3);
 pub const DEFAULT_CUNCURRENT_FUTURES: usize = 10;
@@ -234,10 +232,22 @@ impl PoolWorker {
                     let poll_result = Future::poll(futures[cursor].2.as_mut(), cx);
                     if let Poll::Ready(result) = poll_result {
                         let (client_ver, on_result, _) = futures.remove(cursor).unwrap();
-                        if let Err(timeout::Error::Failed(network::Error::Protocol(_))) | Ok(_) =
-                            result
-                        {
-                        } else {
+
+                        let is_connected;
+                        match result {
+                            Ok(_)
+                            | Err(TOError::Failed(NetError::ErrorResponse(_)))
+                            | Err(TOError::Failed(NetError::RequestEncode(_)))
+                            | Err(TOError::Failed(NetError::ResponseDecode(_))) => {
+                                is_connected = true;
+                            }
+                            Err(TOError::Failed(NetError::ConnectionClosed(_)))
+                            | Err(TOError::Expired) => {
+                                is_connected = false;
+                            }
+                        }
+
+                        if !is_connected {
                             match highest_client_ver {
                                 Some(ref mut ver) => {
                                     if client_ver > *ver {
@@ -247,26 +257,20 @@ impl PoolWorker {
                                 None => highest_client_ver = Some(client_ver),
                             }
                         }
+
                         match on_result {
                             OnRequestResult::Callback(cb) => {
                                 cb(result.map_err(Error::from));
                             }
                             OnRequestResult::ReportUnreachable => {
-                                let mut success = true;
                                 if let Err(e) = result {
                                     tlog!(Warning, "error when sending message to peer: {e}";
                                         "raft_id" => raft_id,
                                     );
-                                    success = !matches!(
-                                        e,
-                                        TOError::Expired
-                                            | TOError::Failed(NetError::Tcp(_))
-                                            | TOError::Failed(NetError::Io(_))
-                                    );
                                 }
                                 instance_reachability
                                     .borrow_mut()
-                                    .report_result(raft_id, success);
+                                    .report_result(raft_id, is_connected);
                             }
                         }
                         has_ready = true;
diff --git a/tarantool b/tarantool
index 9294c99622..5c001ab601 160000
--- a/tarantool
+++ b/tarantool
@@ -1 +1 @@
-Subproject commit 9294c996223d0987753c715d8d1a08b6dc8012c1
+Subproject commit 5c001ab601a9f629a649d32a6038c006e7802d3c
-- 
GitLab