add sigterm-timeout (#951)

This commit is contained in:
Aiden McClelland
2021-12-14 13:47:34 -07:00
parent a0d96e6631
commit 8869361eec
2 changed files with 31 additions and 5 deletions

View File

@@ -15,7 +15,7 @@ use tracing::instrument;
use crate::context::RpcContext; use crate::context::RpcContext;
use crate::id::{Id, ImageId}; use crate::id::{Id, ImageId};
use crate::s9pk::manifest::{PackageId, SYSTEM_PACKAGE_ID}; use crate::s9pk::manifest::{PackageId, SYSTEM_PACKAGE_ID};
use crate::util::serde::IoFormat; use crate::util::serde::{Duration as SerdeDuration, IoFormat};
use crate::util::Version; use crate::util::Version;
use crate::volume::{VolumeId, Volumes}; use crate::volume::{VolumeId, Volumes};
use crate::{Error, ResultExt, HOST_IP}; use crate::{Error, ResultExt, HOST_IP};
@@ -39,6 +39,8 @@ pub struct DockerAction {
pub inject: bool, pub inject: bool,
#[serde(default)] #[serde(default)]
pub shm_size_mb: Option<usize>, // TODO: use postfix sizing? like 1k vs 1m vs 1g pub shm_size_mb: Option<usize>, // TODO: use postfix sizing? like 1k vs 1m vs 1g
#[serde(default)]
pub sigterm_timeout: Option<SerdeDuration>,
} }
impl DockerAction { impl DockerAction {
#[instrument(skip(ctx, input))] #[instrument(skip(ctx, input))]
@@ -100,7 +102,12 @@ impl DockerAction {
.with_kind(crate::ErrorKind::Docker)?; .with_kind(crate::ErrorKind::Docker)?;
} }
tokio::time::sleep(Duration::from_secs(30)).await; tokio::time::sleep(
self.sigterm_timeout
.map(|a| *a)
.unwrap_or(Duration::from_secs(30)),
)
.await;
if let Some(id) = id { if let Some(id) = id {
signal::kill(Pid::from_raw(id as i32), signal::SIGKILL) signal::kill(Pid::from_raw(id as i32), signal::SIGKILL)

View File

@@ -19,7 +19,7 @@ use torut::onion::TorSecretKeyV3;
use tracing::instrument; use tracing::instrument;
use crate::action::docker::DockerAction; use crate::action::docker::DockerAction;
use crate::action::NoOutput; use crate::action::{ActionImplementation, NoOutput};
use crate::context::RpcContext; use crate::context::RpcContext;
use crate::manager::sync::synchronizer; use crate::manager::sync::synchronizer;
use crate::net::interface::InterfaceId; use crate::net::interface::InterfaceId;
@@ -384,7 +384,15 @@ impl Manager {
.docker .docker
.stop_container( .stop_container(
&self.shared.container_name, &self.shared.container_name,
Some(StopContainerOptions { t: 30 }), Some(StopContainerOptions {
t: match &self.shared.manifest.main {
ActionImplementation::Docker(a) => a,
}
.sigterm_timeout
.map(|a| *a)
.unwrap_or(Duration::from_secs(30))
.as_secs_f64() as i64,
}),
) )
.await .await
{ {
@@ -505,7 +513,18 @@ async fn stop(shared: &ManagerSharedState) -> Result<(), Error> {
match shared match shared
.ctx .ctx
.docker .docker
.stop_container(&shared.container_name, Some(StopContainerOptions { t: 30 })) .stop_container(
&shared.container_name,
Some(StopContainerOptions {
t: match &shared.manifest.main {
ActionImplementation::Docker(a) => a,
}
.sigterm_timeout
.map(|a| *a)
.unwrap_or(Duration::from_secs(30))
.as_secs_f64() as i64,
}),
)
.await .await
{ {
Err(bollard::errors::Error::DockerResponseNotFoundError { .. }) Err(bollard::errors::Error::DockerResponseNotFoundError { .. })