From 073c55fa3b4657bd2d60ea7fbf0d30cb8f9b0aea Mon Sep 17 00:00:00 2001 From: cloudhead Date: Tue, 9 Jan 2024 14:55:39 +0100 Subject: [PATCH] node: Don't panic on initialization error --- radicle-node/src/runtime.rs | 8 ++++++-- radicle-node/src/service.rs | 26 +++++++++++++++++++------- radicle-node/src/wire/protocol.rs | 7 ++----- 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/radicle-node/src/runtime.rs b/radicle-node/src/runtime.rs index c002bb2c..613ec14d 100644 --- a/radicle-node/src/runtime.rs +++ b/radicle-node/src/runtime.rs @@ -53,6 +53,9 @@ pub enum Error { /// An address database error. #[error("address database error: {0}")] Address(#[from] address::Error), + /// A service error. + #[error("service error: {0}")] + Service(#[from] service::Error), /// An I/O error. #[error("i/o error: {0}")] Io(#[from] io::Error), @@ -209,7 +212,7 @@ impl Runtime { } let emitter: Emitter = Default::default(); - let service = service::Service::new( + let mut service = service::Service::new( config, clock, db, @@ -220,9 +223,10 @@ impl Runtime { announcement, emitter.clone(), ); + service.initialize(clock)?; let (worker_send, worker_recv) = chan::unbounded::(); - let mut wire = Wire::new(service, worker_send, signer.clone(), proxy, clock); + let mut wire = Wire::new(service, worker_send, signer.clone(), proxy); let mut local_addrs = Vec::new(); for addr in listen { diff --git a/radicle-node/src/service.rs b/radicle-node/src/service.rs index 2b3ebc47..9ef5a4b2 100644 --- a/radicle-node/src/service.rs +++ b/radicle-node/src/service.rs @@ -362,8 +362,8 @@ pub struct Service { last_prune: LocalTime, /// Last time the service announced its inventory. last_announce: LocalTime, - /// Time when the service was initialized. - start_time: LocalTime, + /// Time when the service was initialized, or `None` if it wasn't initialized. + started_at: Option, /// Publishes events to subscribers. emitter: Emitter, } @@ -421,11 +421,16 @@ where last_sync: LocalTime::default(), last_prune: LocalTime::default(), last_announce: LocalTime::default(), - start_time: LocalTime::default(), + started_at: None, emitter, } } + /// Whether the service was started (initialized) and if so, at what time. + pub fn started(&self) -> Option { + self.started_at + } + /// Return the next i/o action to execute. #[allow(clippy::should_implement_trait)] pub fn next(&mut self) -> Option { @@ -522,7 +527,7 @@ where debug!(target: "service", "Init @{}", time.as_millis()); let nid = self.node_id(); - self.start_time = time; + self.started_at = Some(time); // Ensure that our local node is in our address database. self.db @@ -609,15 +614,22 @@ where } pub fn tick(&mut self, now: LocalTime) { - trace!(target: "service", "Tick +{}", now - self.start_time); - + trace!( + target: "service", + "Tick +{}", + now - self.started_at.expect("Service::tick: service must be initialized") + ); self.clock = now; } pub fn wake(&mut self) { let now = self.clock; - trace!(target: "service", "Wake +{}", now - self.start_time); + trace!( + target: "service", + "Wake +{}", + now - self.started_at.expect("Service::wake: service must be initialized") + ); if now - self.last_idle >= IDLE_INTERVAL { trace!(target: "service", "Running 'idle' task..."); diff --git a/radicle-node/src/wire/protocol.rs b/radicle-node/src/wire/protocol.rs index 7ef30a61..7c15474b 100644 --- a/radicle-node/src/wire/protocol.rs +++ b/radicle-node/src/wire/protocol.rs @@ -338,15 +338,12 @@ where G: Signer + Ecdh, { pub fn new( - mut service: Service, + service: Service, worker: chan::Sender, signer: G, proxy: net::SocketAddr, - clock: LocalTime, ) -> Self { - service - .initialize(clock) - .expect("Wire::new: error initializing service"); + assert!(service.started().is_some(), "Service must be initialized"); Self { service,