mirror of
https://github.com/Start9Labs/start-os.git
synced 2026-03-30 12:11:56 +00:00
appmgr: correct locking for running.yaml
This commit is contained in:
committed by
Keagan McClelland
parent
e4cbc38bfd
commit
2b4c456c5d
@@ -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(())
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user