From 498a5c4e4a07bac289fcfafbad603bbb347dcf79 Mon Sep 17 00:00:00 2001 From: Alexis Sellier Date: Mon, 30 Jan 2023 13:22:33 +0100 Subject: [PATCH] node: Handle `fetched` differently if initiated --- radicle-node/src/service.rs | 85 ++++++++++++++++-------------- radicle-node/src/test/simulator.rs | 2 + radicle-node/src/worker.rs | 1 + radicle/src/node.rs | 1 + 4 files changed, 48 insertions(+), 41 deletions(-) diff --git a/radicle-node/src/service.rs b/radicle-node/src/service.rs index c40017a9..6e971b9c 100644 --- a/radicle-node/src/service.rs +++ b/radicle-node/src/service.rs @@ -512,53 +512,56 @@ where let remote = result.remote; let rid = result.rid; let namespaces = result.namespaces; + let initiated = result.initiated; - log::debug!( - target: "service", - "Fetched {rid} {remote} (error={:?})", result.result.as_ref().err() - ); - - let result = match result.result { - Ok(updated) => { - self.reactor.event(Event::RefsFetched { - remote, - rid, - updated: updated.clone(), - }); - Ok(updated) - } - Err(err) => { - error!(target: "service", "Fetch failed for {rid} from {remote}: {err}"); - - if let FetchError::Io(_) = err { - self.reactor - .disconnect(result.remote, DisconnectReason::Fetch(err)); - return; - } else { - Err(err) + if initiated { + log::debug!( + target: "service", + "Fetched {rid} {remote} (error={:?})", result.result.as_ref().err() + ); + let result = match result.result { + Ok(updated) => { + self.reactor.event(Event::RefsFetched { + remote, + rid, + updated: updated.clone(), + }); + Ok(updated) } - } - }; + Err(err) => { + error!(target: "service", "Fetch failed for {rid} from {remote}: {err}"); - if let Some(results) = self.fetch_reqs.get(&rid) { - log::debug!(target: "service", "Found existing fetch request, sending result.."); + if let FetchError::Io(_) = err { + self.reactor + .disconnect(result.remote, DisconnectReason::Fetch(err)); + return; + } else { + Err(err) + } + } + }; - if results - .send(FetchResult { - rid, - remote, - namespaces, - result, - }) - .is_err() - { - log::error!(target: "service", "Error sending fetch result for {rid}.."); - self.fetch_reqs.remove(&rid); + if let Some(results) = self.fetch_reqs.get(&rid) { + log::debug!(target: "service", "Found existing fetch request, sending result.."); + + if results + .send(FetchResult { + rid, + initiated, + remote, + namespaces, + result, + }) + .is_err() + { + log::error!(target: "service", "Error sending fetch result for {rid}.."); + self.fetch_reqs.remove(&rid); + } else { + log::debug!(target: "service", "Sent fetch result for {rid}.."); + } } else { - log::debug!(target: "service", "Sent fetch result for {rid}.."); + log::debug!(target: "service", "No fetch requests found for {rid}.."); } - } else { - log::debug!(target: "service", "No fetch requests found for {rid}.."); } if let Some(session) = self.sessions.get_mut(&remote) { diff --git a/radicle-node/src/test/simulator.rs b/radicle-node/src/test/simulator.rs index 81efc54c..f2a1e91f 100644 --- a/radicle-node/src/test/simulator.rs +++ b/radicle-node/src/test/simulator.rs @@ -621,6 +621,7 @@ impl Simulation { remote: fetch.remote, input: Input::Fetched(Arc::new(FetchResult { rid: fetch.repo, + initiated: fetch.initiated, remote: fetch.remote, namespaces: fetch.namespaces, result: Err(FetchError::Io(io::ErrorKind::Other.into())), @@ -635,6 +636,7 @@ impl Simulation { remote: fetch.remote, input: Input::Fetched(Arc::new(FetchResult { rid: fetch.repo, + initiated: fetch.initiated, remote: fetch.remote, namespaces: fetch.namespaces, result: Ok(vec![]), diff --git a/radicle-node/src/worker.rs b/radicle-node/src/worker.rs index 93f1935a..0ad46af9 100644 --- a/radicle-node/src/worker.rs +++ b/radicle-node/src/worker.rs @@ -81,6 +81,7 @@ impl Worker { rid: fetch.repo, remote: fetch.remote, namespaces: fetch.namespaces, + initiated: fetch.initiated, result, }; log::debug!(target: "worker", "Sending response back to service.."); diff --git a/radicle/src/node.rs b/radicle/src/node.rs index 93398bdb..2fe9c1b4 100644 --- a/radicle/src/node.rs +++ b/radicle/src/node.rs @@ -61,6 +61,7 @@ impl From for Address { pub struct FetchResult { pub rid: Id, pub remote: NodeId, + pub initiated: bool, pub namespaces: Namespaces, pub result: Result, FetchError>, }