Skip to content

Commit

Permalink
update the state machine
Browse files Browse the repository at this point in the history
  • Loading branch information
ghubertpalo committed Feb 6, 2023
1 parent 4b0ef20 commit 75c030f
Show file tree
Hide file tree
Showing 6 changed files with 134 additions and 90 deletions.
2 changes: 1 addition & 1 deletion mithril-signer/src/main.rs
Expand Up @@ -104,7 +104,7 @@ async fn main() -> Result<(), Box<dyn Error>> {
debug!("Started"; "run_mode" => &args.run_mode, "config" => format!("{config:?}"));

let mut state_machine = StateMachine::new(
SignerState::Unregistered { epoch: None },
SignerState::Init,
Box::new(SignerRunner::new(config.clone(), services)),
Duration::from_millis(config.run_interval),
);
Expand Down
2 changes: 1 addition & 1 deletion mithril-signer/src/runtime/runner.rs
Expand Up @@ -443,7 +443,7 @@ impl Runner for SignerRunner {
.era_reader
.read_era_epoch_token(epoch)
.await
.map_err(|e| Box::new(e))?;
.map_err(Box::new)?;

self.services.era_checker.change_era(
era_token.get_current_supported_era()?,
Expand Down
65 changes: 26 additions & 39 deletions mithril-signer/src/runtime/signer_services.rs
@@ -1,9 +1,5 @@
use async_trait::async_trait;
use std::{
error::{Error as StdError, Error},
fs,
sync::Arc,
};
use std::{fs, sync::Arc};

use mithril_common::digesters::{
cache::{ImmutableFileDigestCacheProvider, JsonImmutableFileDigestCacheProviderBuilder},
Expand Down Expand Up @@ -32,26 +28,26 @@ type SingleSignerService = Arc<dyn SingleSigner>;
type BeaconProviderService = Arc<dyn BeaconProvider>;
type ProtocolInitializerStoreService = Arc<dyn ProtocolInitializerStorer>;

type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>;
/// The ServiceBuilder is intended to manage Services instance creation.
/// The goal of this is to put all this code out of the way of business code.
#[async_trait]
pub trait ServiceBuilder {
/// Create a SignerService instance.
async fn build(&self) -> Result<SignerServices, Box<dyn StdError>>;
async fn build(&self) -> Result<SignerServices>;
}

/// Create a SignerService instance for Production environment.
pub struct ProductionServiceBuilder<'a> {
config: &'a Config,
chain_observer_builder: fn(&Config) -> Result<ChainObserverService, Box<dyn StdError>>,
immutable_file_observer_builder:
fn(&Config) -> Result<Arc<dyn ImmutableFileObserver>, Box<dyn StdError>>,
chain_observer_builder: fn(&Config) -> Result<ChainObserverService>,
immutable_file_observer_builder: fn(&Config) -> Result<Arc<dyn ImmutableFileObserver>>,
}

impl<'a> ProductionServiceBuilder<'a> {
/// Create a new production service builder.
pub fn new(config: &'a Config) -> Self {
let chain_observer_builder: fn(&Config) -> Result<ChainObserverService, Box<dyn StdError>> =
let chain_observer_builder: fn(&Config) -> Result<ChainObserverService> =
|config: &Config| {
Ok(Arc::new(CardanoCliChainObserver::new(Box::new(
CardanoCliRunner::new(
Expand All @@ -61,16 +57,12 @@ impl<'a> ProductionServiceBuilder<'a> {
),
))))
};
let immutable_file_observer_builder: fn(
&Config,
) -> Result<
Arc<dyn ImmutableFileObserver>,
Box<dyn StdError>,
> = |config: &Config| {
Ok(Arc::new(ImmutableFileSystemObserver::new(
&config.db_directory,
)))
};
let immutable_file_observer_builder: fn(&Config) -> Result<Arc<dyn ImmutableFileObserver>> =
|config: &Config| {
Ok(Arc::new(ImmutableFileSystemObserver::new(
&config.db_directory,
)))
};

Self {
config,
Expand All @@ -82,7 +74,7 @@ impl<'a> ProductionServiceBuilder<'a> {
/// Override immutable file observer builder.
pub fn override_immutable_file_observer_builder(
&mut self,
builder: fn(&Config) -> Result<Arc<dyn ImmutableFileObserver>, Box<dyn StdError>>,
builder: fn(&Config) -> Result<Arc<dyn ImmutableFileObserver>>,
) -> &mut Self {
self.immutable_file_observer_builder = builder;

Expand All @@ -92,15 +84,15 @@ impl<'a> ProductionServiceBuilder<'a> {
/// Override default chain observer builder.
pub fn override_chain_observer_builder(
&mut self,
builder: fn(&Config) -> Result<ChainObserverService, Box<dyn StdError>>,
builder: fn(&Config) -> Result<ChainObserverService>,
) -> &mut Self {
self.chain_observer_builder = builder;

self
}

/// Compute protocol party id
fn compute_protocol_party_id(&self) -> Result<ProtocolPartyId, Box<dyn StdError>> {
fn compute_protocol_party_id(&self) -> Result<ProtocolPartyId> {
match &self.config.operational_certificate_path {
Some(operational_certificate_path) => {
let opcert: OpCert = OpCert::from_file(operational_certificate_path)
Expand All @@ -119,7 +111,7 @@ impl<'a> ProductionServiceBuilder<'a> {

async fn build_digester_cache_provider(
&self,
) -> Result<Option<Arc<dyn ImmutableFileDigestCacheProvider>>, Box<dyn Error>> {
) -> Result<Option<Arc<dyn ImmutableFileDigestCacheProvider>>> {
if self.config.disable_digests_cache {
return Ok(None);
}
Expand All @@ -139,7 +131,7 @@ impl<'a> ProductionServiceBuilder<'a> {
#[async_trait]
impl<'a> ServiceBuilder for ProductionServiceBuilder<'a> {
/// Build a Services for the Production environment.
async fn build(&self) -> Result<SignerServices, Box<dyn StdError>> {
async fn build(&self) -> Result<SignerServices> {
if !self.config.data_stores_directory.exists() {
fs::create_dir_all(self.config.data_stores_directory.clone())
.map_err(|e| format!("Could not create data stores directory: {e:?}"))?;
Expand Down Expand Up @@ -280,20 +272,15 @@ mod tests {
};

assert!(!stores_dir.exists());
let chain_observer_builder: fn(&Config) -> Result<ChainObserverService, Box<dyn StdError>> =
|_config| {
Ok(Arc::new(FakeObserver::new(Some(Beacon {
epoch: Epoch(1),
immutable_file_number: 1,
network: "devnet".to_string(),
}))))
};
let immutable_file_observer_builder: fn(
&Config,
) -> Result<
Arc<dyn ImmutableFileObserver>,
Box<dyn StdError>,
> = |_config: &Config| Ok(Arc::new(DumbImmutableFileObserver::default()));
let chain_observer_builder: fn(&Config) -> Result<ChainObserverService> = |_config| {
Ok(Arc::new(FakeObserver::new(Some(Beacon {
epoch: Epoch(1),
immutable_file_number: 1,
network: "devnet".to_string(),
}))))
};
let immutable_file_observer_builder: fn(&Config) -> Result<Arc<dyn ImmutableFileObserver>> =
|_config: &Config| Ok(Arc::new(DumbImmutableFileObserver::default()));

let mut service_builder = ProductionServiceBuilder::new(&config);
service_builder
Expand Down

0 comments on commit 75c030f

Please sign in to comment.