appmgr: correct locking for running.yaml

This commit is contained in:
Aiden McClelland
2020-12-07 17:51:22 -07:00
committed by Keagan McClelland
parent e4cbc38bfd
commit 2b4c456c5d

View File

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