From 7a35befffe52c67c33d485de500754da851dce3d Mon Sep 17 00:00:00 2001 From: Brian Picciano Date: Mon, 3 Jul 2023 13:39:44 +0200 Subject: [PATCH] Don't include Send/Sync in trait requirements --- src/domain/acme/manager.rs | 6 +-- src/domain/acme/store.rs | 2 +- src/domain/config.rs | 2 +- src/domain/manager.rs | 99 ++++++++++++++++++++------------------ src/main.rs | 2 +- src/origin/store.rs | 2 +- 6 files changed, 58 insertions(+), 55 deletions(-) diff --git a/src/domain/acme/manager.rs b/src/domain/acme/manager.rs index 729d3e6..2a93bf9 100644 --- a/src/domain/acme/manager.rs +++ b/src/domain/acme/manager.rs @@ -10,7 +10,7 @@ pub type GetHttp01ChallengeKeyError = acme::store::GetHttp01ChallengeKeyError; pub type GetCertificateError = acme::store::GetCertificateError; #[mockall::automock] -pub trait Manager: Sync + Send { +pub trait Manager { fn sync_domain<'mgr>( &'mgr self, domain: domain::Name, @@ -25,12 +25,12 @@ pub trait Manager: Sync + Send { } pub struct ManagerImpl { - store: Box, + store: Box, account: sync::Arc, } impl ManagerImpl { - pub async fn new( + pub async fn new( store: Store, contact_email: &str, ) -> Result { diff --git a/src/domain/acme/store.rs b/src/domain/acme/store.rs index 986c077..1dd6fa5 100644 --- a/src/domain/acme/store.rs +++ b/src/domain/acme/store.rs @@ -38,7 +38,7 @@ pub enum GetCertificateError { } #[mockall::automock] -pub trait Store: Sync + Send { +pub trait Store { fn set_account_key(&self, k: &PrivateKey) -> Result<(), unexpected::Error>; fn get_account_key(&self) -> Result; diff --git a/src/domain/config.rs b/src/domain/config.rs index 2be2e5d..3022c61 100644 --- a/src/domain/config.rs +++ b/src/domain/config.rs @@ -39,7 +39,7 @@ pub enum SetError { } #[mockall::automock] -pub trait Store: Sync + Send { +pub trait Store { fn get(&self, domain: &domain::Name) -> Result; fn set(&self, domain: &domain::Name, config: &Config) -> Result<(), SetError>; fn all_domains(&self) -> Result, unexpected::Error>; diff --git a/src/domain/manager.rs b/src/domain/manager.rs index c8e6a85..5f2ee0f 100644 --- a/src/domain/manager.rs +++ b/src/domain/manager.rs @@ -145,63 +145,66 @@ pub trait Manager: Sync + Send + rustls::server::ResolvesServerCert { fn all_domains(&self) -> Result, unexpected::Error>; } -struct ManagerImpl { - origin_store: Box, - domain_config_store: Box, +pub struct ManagerImpl { + origin_store: Box, + domain_config_store: Box, domain_checker: checker::DNSChecker, - acme_manager: Option>, + acme_manager: Option>, } -async fn sync_origins(origin_store: &dyn origin::store::Store, canceller: CancellationToken) { - let mut interval = tokio::time::interval(tokio::time::Duration::from_secs(20 * 60)); - loop { - tokio::select! { - _ = interval.tick() => { - match origin_store.all_descrs() { - Ok(iter) => iter.into_iter(), - Err(err) => { - log::error!("Error fetching origin descriptors: {err}"); - return; +impl ManagerImpl { + pub fn new< + OriginStore: origin::store::Store + Send + Sync + 'static, + DomainConfigStore: config::Store + Send + Sync + 'static, + AcmeManager: acme::manager::Manager + Send + Sync + 'static, + >( + task_stack: &mut util::TaskStack, + origin_store: OriginStore, + domain_config_store: DomainConfigStore, + domain_checker: checker::DNSChecker, + acme_manager: Option, + ) -> sync::Arc { + let manager = sync::Arc::new(ManagerImpl { + origin_store: Box::from(origin_store), + domain_config_store: Box::from(domain_config_store), + domain_checker: domain_checker, + acme_manager: acme_manager + .map(|m| Box::new(m) as Box), + }); + + task_stack.push_spawn(|canceller| { + let manager = manager.clone(); + async move { Ok(manager.sync_origins(canceller).await) } + }); + + manager + } + + async fn sync_origins(&self, canceller: CancellationToken) { + let mut interval = tokio::time::interval(tokio::time::Duration::from_secs(20 * 60)); + loop { + tokio::select! { + _ = interval.tick() => { + match self.origin_store.all_descrs() { + Ok(iter) => iter.into_iter(), + Err(err) => { + log::error!("Error fetching origin descriptors: {err}"); + return; + } } + .for_each(|descr| { + if let Err(err) = self.origin_store.sync(descr.clone(), origin::store::Limits {}) { + log::error!("Failed to sync store for {:?}: {err}", descr); + return; + } + }); + }, + _ = canceller.cancelled() => return, } - .for_each(|descr| { - if let Err(err) = origin_store.sync(descr.clone(), origin::store::Limits {}) { - log::error!("Failed to sync store for {:?}: {err}", descr); - return; - } - }); - }, - _ = canceller.cancelled() => return, } } } -pub fn new< - OriginStore: origin::store::Store + 'static, - DomainConfigStore: config::Store + 'static, - AcmeManager: acme::manager::Manager + 'static, ->( - task_stack: &mut util::TaskStack, - origin_store: OriginStore, - domain_config_store: DomainConfigStore, - domain_checker: checker::DNSChecker, - acme_manager: Option, -) -> sync::Arc { - let manager = sync::Arc::new(ManagerImpl { - origin_store: Box::from(origin_store), - domain_config_store: Box::from(domain_config_store), - domain_checker: domain_checker, - acme_manager: acme_manager.map(|m| Box::new(m) as Box), - }); - - task_stack.push_spawn(|canceller| { - let manager = manager.clone(); - async move { Ok(sync_origins(manager.origin_store.as_ref(), canceller).await) } - }); - - manager -} - impl Manager for ManagerImpl { fn get_config(&self, domain: &domain::Name) -> Result { Ok(self.domain_config_store.get(domain)?) diff --git a/src/main.rs b/src/main.rs index e9e78bb..a2ff403 100644 --- a/src/main.rs +++ b/src/main.rs @@ -112,7 +112,7 @@ async fn main() { let mut task_stack = domani::util::TaskStack::new(); - let domain_manager = domani::domain::manager::new( + let domain_manager = domani::domain::manager::ManagerImpl::new( &mut task_stack, origin_store, domain_config_store, diff --git a/src/origin/store.rs b/src/origin/store.rs index a108d98..9070d57 100644 --- a/src/origin/store.rs +++ b/src/origin/store.rs @@ -42,7 +42,7 @@ pub enum AllDescrsError { #[mockall::automock] /// Describes a storage mechanism for Origins. Each Origin is uniquely identified by its Descr. -pub trait Store: Sync + Send { +pub trait Store { /// If the origin is of a kind which can be updated, sync will pull down the latest version of /// the origin into the storage. fn sync(&self, descr: origin::Descr, limits: Limits) -> Result<(), SyncError>;