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