Refactor the code for the services to do less copying.

This commit is contained in:
r-vdp 2023-03-20 10:49:32 +01:00
parent 93b7c32688
commit 6282ee5357
No known key found for this signature in database
2 changed files with 25 additions and 26 deletions

View file

@ -1,6 +1,6 @@
use anyhow::Result; use anyhow::Result;
use im::{HashMap, HashSet};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::collections::{HashMap, HashSet};
use std::fs::DirBuilder; use std::fs::DirBuilder;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::time::Duration; use std::time::Duration;
@ -70,10 +70,7 @@ pub fn activate(store_path: &StorePath, ephemeral: bool) -> Result<()> {
let linked_services = link_services(services, ephemeral)?; let linked_services = link_services(services, ephemeral)?;
serialise_linked_services(&linked_services)?; serialise_linked_services(&linked_services)?;
let services_to_stop = old_linked_services let services_to_stop = old_linked_services.relative_complement(linked_services.clone());
.into_iter()
.filter(|(name, _)| !linked_services.contains_key(name))
.collect();
let service_manager = systemd::ServiceManager::new_session()?; let service_manager = systemd::ServiceManager::new_session()?;
let timeout = Some(Duration::from_secs(30)); let timeout = Some(Duration::from_secs(30));
@ -126,7 +123,7 @@ fn unlink_services(services: &LinkedServices) -> Result<()> {
fn link_services(services: Services, ephemeral: bool) -> Result<LinkedServices> { fn link_services(services: Services, ephemeral: bool) -> Result<LinkedServices> {
let systemd_system_dir = systemd_system_dir(ephemeral); let systemd_system_dir = systemd_system_dir(ephemeral);
services.iter().try_fold( services.iter().try_fold(
HashMap::with_capacity(services.len()), HashMap::new(),
|mut linked_services, (name, service_config)| { |mut linked_services, (name, service_config)| {
let linked_path = systemd_system_dir.join(name); let linked_path = systemd_system_dir.join(name);
match create_store_link(&service_config.store_path, &linked_path) { match create_store_link(&service_config.store_path, &linked_path) {
@ -229,21 +226,26 @@ where
{ {
let job_monitor = service_manager.monitor_jobs_init()?; let job_monitor = service_manager.monitor_jobs_init()?;
let successful_services = services.keys().fold( let successful_services: HashSet<String> =
HashSet::with_capacity(services.len()), services
|mut set, service| match action(service) { .clone()
Ok(_) => { .into_iter()
log::info!("Service {}: {}...", service, log_action); .fold(HashSet::new(), |mut set, (service, _)| {
set.insert(Box::new(service.to_owned())); match action(&service) {
set Ok(_) => {
} log::info!("Service {}: {}...", service, log_action);
Err(e) => { set.insert(service);
log::error!("Service {service}: error {log_action}, please consult the logs"); set
log::error!("{e}"); }
set Err(e) => {
} log::error!(
}, "Service {service}: error {log_action}, please consult the logs"
); );
log::error!("{e}");
set
}
}
});
if !service_manager.monitor_jobs_finish(job_monitor, timeout, successful_services)? { if !service_manager.monitor_jobs_finish(job_monitor, timeout, successful_services)? {
anyhow::bail!("Timeout waiting for systemd jobs"); anyhow::bail!("Timeout waiting for systemd jobs");

View file

@ -178,14 +178,11 @@ impl ServiceManager {
) -> Result<bool, Error> ) -> Result<bool, Error>
where where
I: IntoIterator, I: IntoIterator,
I::Item: AsRef<String> + Eq + Hash, I::Item: Into<String> + Eq + Hash,
{ {
let start_time = Instant::now(); let start_time = Instant::now();
let mut waiting_for: im::HashSet<String> = services let mut waiting_for: im::HashSet<_> = services.into_iter().map(Into::into).collect();
.into_iter()
.map(|n| String::from(n.as_ref()))
.collect();
let total_jobs = waiting_for.len(); let total_jobs = waiting_for.len();
if total_jobs > 0 { if total_jobs > 0 {