Skip to content

Commit bf52aa3

Browse files
authored
Merge pull request #1908 from input-output-hk/djo/1906/reorganize_signer_dependencies
Reorganize signer dependencies
2 parents 29586c4 + 8362c9b commit bf52aa3

27 files changed

+225
-166
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mithril-signer/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mithril-signer"
3-
version = "0.2.174"
3+
version = "0.2.175"
44
description = "A Mithril Signer"
55
authors = { workspace = true }
66
edition = { workspace = true }

mithril-signer/benches/mktree_store_sqlite.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};
22
use mithril_common::crypto_helper::{MKTree, MKTreeNode};
3-
use mithril_signer::MKTreeStoreSqlite;
3+
use mithril_signer::store::MKTreeStoreSqlite;
44

55
// Shortcuts for magnitudes: K for thousand, M for million
66
const K: usize = 1_000;

mithril-signer/src/database/repository/cardano_transaction_repository.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use mithril_common::entities::{
99
use mithril_common::StdResult;
1010
use mithril_persistence::database::repository::CardanoTransactionRepository;
1111

12-
use crate::{HighestTransactionBlockNumberGetter, TransactionPruner, TransactionStore};
12+
use crate::services::{HighestTransactionBlockNumberGetter, TransactionPruner, TransactionStore};
1313

1414
#[async_trait]
1515
impl TransactionStore for CardanoTransactionRepository {

mithril-signer/src/runtime/signer_services.rs renamed to mithril-signer/src/dependency_injection/builder.rs

Lines changed: 54 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -1,78 +1,71 @@
1+
use std::fs;
2+
use std::sync::Arc;
3+
use std::time::Duration;
4+
15
use anyhow::{anyhow, Context};
2-
use async_trait::async_trait;
3-
use std::{fs, sync::Arc, time::Duration};
46
use tokio::sync::Mutex;
57

6-
use mithril_common::{
7-
api_version::APIVersionProvider,
8-
cardano_block_scanner::CardanoBlockScanner,
9-
cardano_transactions_preloader::CardanoTransactionsPreloader,
10-
chain_observer::{CardanoCliRunner, ChainObserver, ChainObserverBuilder, ChainObserverType},
11-
chain_reader::PallasChainReader,
12-
crypto_helper::{OpCert, ProtocolPartyId, SerDeShelleyFileFormat},
13-
digesters::{
14-
cache::{ImmutableFileDigestCacheProvider, JsonImmutableFileDigestCacheProviderBuilder},
15-
CardanoImmutableDigester, ImmutableDigester, ImmutableFileObserver,
16-
ImmutableFileSystemObserver,
17-
},
18-
era::{EraChecker, EraReader},
19-
signable_builder::{
20-
CardanoImmutableFilesFullSignableBuilder, CardanoStakeDistributionSignableBuilder,
21-
CardanoTransactionsSignableBuilder, MithrilSignableBuilderService,
22-
MithrilStakeDistributionSignableBuilder, SignableBuilderService,
23-
},
24-
signed_entity_type_lock::SignedEntityTypeLock,
25-
MithrilTickerService, StdResult, TickerService,
8+
use mithril_common::api_version::APIVersionProvider;
9+
use mithril_common::cardano_block_scanner::CardanoBlockScanner;
10+
use mithril_common::cardano_transactions_preloader::CardanoTransactionsPreloader;
11+
use mithril_common::chain_observer::{
12+
CardanoCliRunner, ChainObserver, ChainObserverBuilder, ChainObserverType,
13+
};
14+
use mithril_common::chain_reader::PallasChainReader;
15+
use mithril_common::crypto_helper::{OpCert, ProtocolPartyId, SerDeShelleyFileFormat};
16+
use mithril_common::digesters::cache::{
17+
ImmutableFileDigestCacheProvider, JsonImmutableFileDigestCacheProviderBuilder,
2618
};
27-
use mithril_persistence::{
28-
database::{repository::CardanoTransactionRepository, ApplicationNodeType, SqlMigration},
29-
sqlite::{ConnectionBuilder, SqliteConnection, SqliteConnectionPool},
30-
store::{adapter::SQLiteAdapter, StakeStore},
19+
use mithril_common::digesters::{
20+
CardanoImmutableDigester, ImmutableFileObserver, ImmutableFileSystemObserver,
3121
};
22+
use mithril_common::era::{EraChecker, EraReader};
23+
use mithril_common::signable_builder::{
24+
CardanoImmutableFilesFullSignableBuilder, CardanoStakeDistributionSignableBuilder,
25+
CardanoTransactionsSignableBuilder, MithrilSignableBuilderService,
26+
MithrilStakeDistributionSignableBuilder,
27+
};
28+
use mithril_common::signed_entity_type_lock::SignedEntityTypeLock;
29+
use mithril_common::{MithrilTickerService, StdResult, TickerService};
3230

33-
use crate::{
34-
aggregator_client::AggregatorClient, metrics::MetricsService, single_signer::SingleSigner,
31+
use mithril_persistence::database::repository::CardanoTransactionRepository;
32+
use mithril_persistence::database::{ApplicationNodeType, SqlMigration};
33+
use mithril_persistence::sqlite::{ConnectionBuilder, SqliteConnection, SqliteConnectionPool};
34+
use mithril_persistence::store::adapter::SQLiteAdapter;
35+
use mithril_persistence::store::StakeStore;
36+
37+
use crate::dependency_injection::SignerDependencyContainer;
38+
use crate::services::{
3539
AggregatorHTTPClient, CardanoTransactionsImporter,
36-
CardanoTransactionsPreloaderActivationSigner, Configuration, MKTreeStoreSqlite,
37-
MithrilSingleSigner, ProtocolInitializerStore, ProtocolInitializerStorer, SignerUpkeepService,
40+
CardanoTransactionsPreloaderActivationSigner, MithrilSingleSigner, SignerUpkeepService,
3841
TransactionsImporterByChunk, TransactionsImporterWithPruner, TransactionsImporterWithVacuum,
39-
UpkeepService, HTTP_REQUEST_TIMEOUT_DURATION, SQLITE_FILE, SQLITE_FILE_CARDANO_TRANSACTION,
42+
};
43+
use crate::store::{MKTreeStoreSqlite, ProtocolInitializerStore};
44+
use crate::{
45+
Configuration, MetricsService, HTTP_REQUEST_TIMEOUT_DURATION, SQLITE_FILE,
46+
SQLITE_FILE_CARDANO_TRANSACTION,
4047
};
4148

42-
type StakeStoreService = Arc<StakeStore>;
43-
type CertificateHandlerService = Arc<dyn AggregatorClient>;
44-
type ChainObserverService = Arc<dyn ChainObserver>;
45-
type DigesterService = Arc<dyn ImmutableDigester>;
46-
type SingleSignerService = Arc<dyn SingleSigner>;
47-
type TimePointProviderService = Arc<dyn TickerService>;
48-
type ProtocolInitializerStoreService = Arc<dyn ProtocolInitializerStorer>;
49-
50-
/// The ServiceBuilder is intended to manage Services instance creation.
49+
/// The `DependenciesBuilder` is intended to manage Services instance creation.
50+
///
5151
/// The goal of this is to put all this code out of the way of business code.
52-
#[async_trait]
53-
pub trait ServiceBuilder {
54-
/// Create a SignerService instance.
55-
async fn build(&self) -> StdResult<SignerServices>;
56-
}
57-
58-
/// Create a SignerService instance for Production environment.
59-
pub struct ProductionServiceBuilder<'a> {
52+
pub struct DependenciesBuilder<'a> {
6053
config: &'a Configuration,
61-
chain_observer_builder: fn(&Configuration) -> StdResult<ChainObserverService>,
54+
chain_observer_builder: fn(&Configuration) -> StdResult<Arc<dyn ChainObserver>>,
6255
immutable_file_observer_builder:
6356
fn(&Configuration) -> StdResult<Arc<dyn ImmutableFileObserver>>,
6457
}
6558

66-
impl<'a> ProductionServiceBuilder<'a> {
67-
/// Create a new production service builder.
59+
impl<'a> DependenciesBuilder<'a> {
60+
/// Create a new `DependenciesBuilder`.
6861
pub fn new(config: &'a Configuration) -> Self {
69-
let chain_observer_builder: fn(&Configuration) -> StdResult<ChainObserverService> =
62+
let chain_observer_builder: fn(&Configuration) -> StdResult<Arc<dyn ChainObserver>> =
7063
|config: &Configuration| {
7164
let chain_observer_type = ChainObserverType::Pallas;
7265
let cardano_cli_path = &config.cardano_cli_path;
7366
let cardano_node_socket_path = &config.cardano_node_socket_path;
7467
let cardano_network = &config.get_network().with_context(|| {
75-
"Production Service Builder can not get Cardano network while building the chain observer"
68+
"Dependencies Builder can not get Cardano network while building the chain observer"
7669
})?;
7770
let cardano_cli_runner = &CardanoCliRunner::new(
7871
cardano_cli_path.to_owned(),
@@ -121,7 +114,7 @@ impl<'a> ProductionServiceBuilder<'a> {
121114
/// Override default chain observer builder.
122115
pub fn override_chain_observer_builder(
123116
&mut self,
124-
builder: fn(&Configuration) -> StdResult<ChainObserverService>,
117+
builder: fn(&Configuration) -> StdResult<Arc<dyn ChainObserver>>,
125118
) -> &mut Self {
126119
self.chain_observer_builder = builder;
127120

@@ -182,12 +175,9 @@ impl<'a> ProductionServiceBuilder<'a> {
182175

183176
Ok(connection)
184177
}
185-
}
186178

187-
#[async_trait]
188-
impl<'a> ServiceBuilder for ProductionServiceBuilder<'a> {
189-
/// Build a Services for the Production environment.
190-
async fn build(&self) -> StdResult<SignerServices> {
179+
/// Build dependencies for the Production environment.
180+
pub async fn build(&self) -> StdResult<SignerDependencyContainer> {
191181
if !self.config.data_stores_directory.exists() {
192182
fs::create_dir_all(self.config.data_stores_directory.clone()).with_context(|| {
193183
format!(
@@ -331,7 +321,7 @@ impl<'a> ServiceBuilder for ProductionServiceBuilder<'a> {
331321
cardano_transactions_builder,
332322
cardano_stake_distribution_signable_builder,
333323
));
334-
let metrics_service = Arc::new(MetricsService::new().unwrap());
324+
let metrics_service = Arc::new(MetricsService::new()?);
335325
let preloader_activation =
336326
CardanoTransactionsPreloaderActivationSigner::new(aggregator_client.clone());
337327
let cardano_transactions_preloader = Arc::new(CardanoTransactionsPreloader::new(
@@ -349,7 +339,7 @@ impl<'a> ServiceBuilder for ProductionServiceBuilder<'a> {
349339
slog_scope::logger(),
350340
));
351341

352-
let services = SignerServices {
342+
let services = SignerDependencyContainer {
353343
ticker_service,
354344
certificate_handler: aggregator_client,
355345
chain_observer,
@@ -371,54 +361,6 @@ impl<'a> ServiceBuilder for ProductionServiceBuilder<'a> {
371361
}
372362
}
373363

374-
/// This structure groups all the services required by the state machine.
375-
pub struct SignerServices {
376-
/// Time point provider service
377-
pub ticker_service: TimePointProviderService,
378-
379-
/// Stake store service
380-
pub stake_store: StakeStoreService,
381-
382-
/// Certificate handler service
383-
pub certificate_handler: CertificateHandlerService,
384-
385-
/// Chain Observer service
386-
pub chain_observer: ChainObserverService,
387-
388-
/// Digester service
389-
pub digester: DigesterService,
390-
391-
/// SingleSigner service
392-
pub single_signer: SingleSignerService,
393-
394-
/// ProtocolInitializer store
395-
pub protocol_initializer_store: ProtocolInitializerStoreService,
396-
397-
/// Era checker service
398-
pub era_checker: Arc<EraChecker>,
399-
400-
/// Era reader service
401-
pub era_reader: Arc<EraReader>,
402-
403-
/// API version provider
404-
pub api_version_provider: Arc<APIVersionProvider>,
405-
406-
/// Signable Builder Service
407-
pub signable_builder_service: Arc<dyn SignableBuilderService>,
408-
409-
/// Metrics service
410-
pub metrics_service: Arc<MetricsService>,
411-
412-
/// Signed entity type lock
413-
pub signed_entity_type_lock: Arc<SignedEntityTypeLock>,
414-
415-
/// Cardano transactions preloader
416-
pub cardano_transactions_preloader: Arc<CardanoTransactionsPreloader>,
417-
418-
/// Upkeep service
419-
pub upkeep_service: Arc<dyn UpkeepService>,
420-
}
421-
422364
#[cfg(test)]
423365
mod tests {
424366
use std::path::PathBuf;
@@ -443,16 +385,16 @@ mod tests {
443385
};
444386

445387
assert!(!stores_dir.exists());
446-
let chain_observer_builder: fn(&Configuration) -> StdResult<ChainObserverService> =
388+
let chain_observer_builder: fn(&Configuration) -> StdResult<Arc<dyn ChainObserver>> =
447389
|_config| Ok(Arc::new(FakeObserver::new(Some(TimePoint::dummy()))));
448390
let immutable_file_observer_builder: fn(
449391
&Configuration,
450392
)
451393
-> StdResult<Arc<dyn ImmutableFileObserver>> =
452394
|_config: &Configuration| Ok(Arc::new(DumbImmutableFileObserver::default()));
453395

454-
let mut service_builder = ProductionServiceBuilder::new(&config);
455-
service_builder
396+
let mut dependencies_builder = DependenciesBuilder::new(&config);
397+
dependencies_builder
456398
.override_chain_observer_builder(chain_observer_builder)
457399
.override_immutable_file_observer_builder(immutable_file_observer_builder)
458400
.build()
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
use std::sync::Arc;
2+
3+
use mithril_common::api_version::APIVersionProvider;
4+
use mithril_common::cardano_transactions_preloader::CardanoTransactionsPreloader;
5+
use mithril_common::chain_observer::ChainObserver;
6+
use mithril_common::digesters::ImmutableDigester;
7+
use mithril_common::era::{EraChecker, EraReader};
8+
use mithril_common::signable_builder::SignableBuilderService;
9+
use mithril_common::signed_entity_type_lock::SignedEntityTypeLock;
10+
use mithril_common::TickerService;
11+
use mithril_persistence::store::StakeStore;
12+
13+
use crate::services::{AggregatorClient, SingleSigner, UpkeepService};
14+
use crate::store::ProtocolInitializerStorer;
15+
use crate::MetricsService;
16+
17+
type StakeStoreService = Arc<StakeStore>;
18+
type CertificateHandlerService = Arc<dyn AggregatorClient>;
19+
type ChainObserverService = Arc<dyn ChainObserver>;
20+
type DigesterService = Arc<dyn ImmutableDigester>;
21+
type SingleSignerService = Arc<dyn SingleSigner>;
22+
type TimePointProviderService = Arc<dyn TickerService>;
23+
type ProtocolInitializerStoreService = Arc<dyn ProtocolInitializerStorer>;
24+
25+
/// This structure groups all the dependencies required by the state machine.
26+
pub struct SignerDependencyContainer {
27+
/// Time point provider service
28+
pub ticker_service: TimePointProviderService,
29+
30+
/// Stake store service
31+
pub stake_store: StakeStoreService,
32+
33+
/// Certificate handler service
34+
pub certificate_handler: CertificateHandlerService,
35+
36+
/// Chain Observer service
37+
pub chain_observer: ChainObserverService,
38+
39+
/// Digester service
40+
pub digester: DigesterService,
41+
42+
/// SingleSigner service
43+
pub single_signer: SingleSignerService,
44+
45+
/// ProtocolInitializer store
46+
pub protocol_initializer_store: ProtocolInitializerStoreService,
47+
48+
/// Era checker service
49+
pub era_checker: Arc<EraChecker>,
50+
51+
/// Era reader service
52+
pub era_reader: Arc<EraReader>,
53+
54+
/// API version provider
55+
pub api_version_provider: Arc<APIVersionProvider>,
56+
57+
/// Signable Builder Service
58+
pub signable_builder_service: Arc<dyn SignableBuilderService>,
59+
60+
/// Metrics service
61+
pub metrics_service: Arc<MetricsService>,
62+
63+
/// Signed entity type lock
64+
pub signed_entity_type_lock: Arc<SignedEntityTypeLock>,
65+
66+
/// Cardano transactions preloader
67+
pub cardano_transactions_preloader: Arc<CardanoTransactionsPreloader>,
68+
69+
/// Upkeep service
70+
pub upkeep_service: Arc<dyn UpkeepService>,
71+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//! Dependency injection module.
2+
//!
3+
//! This module provides tools to initialize and share resources and services
4+
//! amongst different threads.
5+
//!
6+
//! It takes all its inputs from the configuration which should combine inputs from:
7+
//!
8+
//! * environment
9+
//! * command line
10+
//! * configuration files
11+
//! * default values
12+
//!
13+
//! The Builder ensure every service has required dependencies to build and
14+
//! provide services containers for each sub process.
15+
16+
mod builder;
17+
mod containers;
18+
19+
pub use builder::*;
20+
pub use containers::*;

0 commit comments

Comments
 (0)