From 8c5553720c2d8d5d09f90d519643bbe9ad989684 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20G=C3=B6rtler?= Date: Mon, 16 May 2022 16:32:40 +0200 Subject: [PATCH] fix: Make `solidifiers` immutable (#159) --- bin/inx-chronicle/src/collector/mod.rs | 15 +++++++-------- .../src/collector/stardust_inx/mod.rs | 4 ++-- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/bin/inx-chronicle/src/collector/mod.rs b/bin/inx-chronicle/src/collector/mod.rs index 3c5eadeb5..91ba8c910 100644 --- a/bin/inx-chronicle/src/collector/mod.rs +++ b/bin/inx-chronicle/src/collector/mod.rs @@ -6,8 +6,6 @@ pub mod solidifier; #[cfg(all(feature = "stardust", feature = "inx"))] pub(crate) mod stardust_inx; -use std::collections::HashMap; - use async_trait::async_trait; use chronicle::{ db::{bson::DocError, MongoDb}, @@ -44,14 +42,13 @@ impl Collector { #[async_trait] impl Actor for Collector { - type State = HashMap>; + type State = Box<[Addr]>; type Error = CollectorError; async fn init(&mut self, cx: &mut ActorContext) -> Result { - let mut solidifiers = HashMap::new(); + let mut solidifiers = Vec::with_capacity(self.config.solidifier_count); for i in 0..self.config.solidifier_count { - solidifiers.insert( - i, + solidifiers.push( cx.spawn_child(Solidifier::new(i, self.db.clone()).with_registration(false)) .await, ); @@ -59,7 +56,7 @@ impl Actor for Collector { #[cfg(all(feature = "stardust", feature = "inx"))] cx.spawn_child(stardust_inx::InxWorker::new(self.config.inx.clone())) .await; - Ok(solidifiers) + Ok(solidifiers.into_boxed_slice()) } } @@ -79,7 +76,9 @@ impl HandleEvent> for Collector { ActorError::Result(e) => match e { #[cfg(all(feature = "stardust", feature = "inx"))] solidifier::SolidifierError::MissingStardustInxRequester => { - solidifiers.insert(report.actor.id, cx.spawn_child(report.actor).await); + let actor_id = report.actor.id; + // Panic: `Solidifier::id` points to the correct index by construction. + solidifiers[actor_id] = cx.spawn_child(report.actor).await; } // TODO: Maybe map Solidifier errors to Collector errors and return them? _ => { diff --git a/bin/inx-chronicle/src/collector/stardust_inx/mod.rs b/bin/inx-chronicle/src/collector/stardust_inx/mod.rs index 265adbea9..e336ae153 100644 --- a/bin/inx-chronicle/src/collector/stardust_inx/mod.rs +++ b/bin/inx-chronicle/src/collector/stardust_inx/mod.rs @@ -185,8 +185,8 @@ impl HandleEvent for Collector { .extend(Vec::from(rec.payload.essence.parents).into_iter()); solidifiers // Divide solidifiers fairly by milestone - .get(&(rec.milestone_index as usize % self.config.solidifier_count)) - // Unwrap: We never remove solidifiers, so they should always exist + .get(rec.milestone_index as usize % self.config.solidifier_count) + // Unwrap: We can never remove a `Solidifier` from the boxed slice, so they should always exist. .unwrap() .send(state)?; }