Refactor the code for the services to do less copying.
This commit is contained in:
parent
93b7c32688
commit
6282ee5357
2 changed files with 25 additions and 26 deletions
|
|
@ -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");
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue