diff --git a/appmgr/src/control.rs b/appmgr/src/control.rs index 8934c1d72..0b7f03650 100644 --- a/appmgr/src/control.rs +++ b/appmgr/src/control.rs @@ -28,6 +28,10 @@ pub async fn start_app(name: &str, update_metadata: bool) -> Result<(), Error> { crate::dependencies::update_binds(name).await?; } crate::apps::set_needs_restart(name, false).await?; + let mut running = YamlUpdateHandle::>::new_or_default( + PersistencePath::from_ref("running.yaml"), + ) + .await?; let output = tokio::process::Command::new("docker") .args(&["start", name]) .stdout(std::process::Stdio::null()) @@ -39,10 +43,6 @@ pub async fn start_app(name: &str, update_metadata: bool) -> Result<(), Error> { "Failed to Start Application: {}", std::str::from_utf8(&output.stderr).unwrap_or("Unknown Error") ); - let mut running = YamlUpdateHandle::>::new_or_default( - PersistencePath::from_ref("running.yaml"), - ) - .await?; running.insert(name.to_owned()); running.commit().await?; } else if status == crate::apps::DockerStatus::Paused { @@ -74,6 +74,10 @@ pub async fn stop_app( true, ) .await?; + let mut running = YamlUpdateHandle::>::new_or_default( + PersistencePath::from_ref("running.yaml"), + ) + .await?; log::info!("Stopping {}", name); let output = tokio::process::Command::new("docker") .args(&["stop", "-t", "25", name]) @@ -86,10 +90,6 @@ pub async fn stop_app( "Failed to Stop Application: {}", std::str::from_utf8(&output.stderr).unwrap_or("Unknown Error") ); - let mut running = YamlUpdateHandle::>::new_or_default( - PersistencePath::from_ref("running.yaml"), - ) - .await?; running.remove(name); running.commit().await?; crate::util::unlock(lock).await?; @@ -207,32 +207,32 @@ pub async fn resume_app(name: &str) -> Result<(), Error> { } pub async fn repair_app_status() -> Result<(), Error> { - let lock = crate::util::lock_file( - format!( - "{}", - Path::new(crate::PERSISTENCE_DIR) - .join("apps") - .join(name) - .join("control.lock") - .display() - ), - true, - ) - .await?; - let running: Vec = if let Some(mut f) = PersistencePath::from_ref("running.yaml") + let mut running_file = PersistencePath::from_ref("running.yaml") .maybe_read(false) .await - .transpose()? - { - from_yaml_async_reader(&mut *f).await? + .transpose()?; + let running: Vec = if let Some(f) = running_file.as_mut() { + from_yaml_async_reader::<_, &mut tokio::fs::File>(f).await? } else { Vec::new() }; for name in running { + let lock = crate::util::lock_file( + format!( + "{}", + Path::new(crate::PERSISTENCE_DIR) + .join("apps") + .join(&name) + .join("control.lock") + .display() + ), + true, + ) + .await?; if crate::apps::status(&name, false).await?.status == crate::apps::DockerStatus::Stopped { start_app(&name, true).await?; } + crate::util::unlock(lock).await?; } - crate::util::unlock(lock).await?; Ok(()) }