From 8a2f7b7a8cd1606916c4a76581b5165fa4baba69 Mon Sep 17 00:00:00 2001 From: Fupan Li Date: Fri, 19 Jul 2024 10:36:31 +0800 Subject: [PATCH] container: fix the issue of missing cleanup container When create container failed, it should cleanup the container thus there's no device/resource left. Fixes: #10044 Signed-off-by: Fupan Li --- .../src/container_manager/container.rs | 12 ++++++++++++ .../src/container_manager/container_inner.rs | 2 +- .../virt_container/src/container_manager/manager.rs | 11 +++++++++-- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/runtime-rs/crates/runtimes/virt_container/src/container_manager/container.rs b/src/runtime-rs/crates/runtimes/virt_container/src/container_manager/container.rs index 0cfc88409a..9b9a360674 100644 --- a/src/runtime-rs/crates/runtimes/virt_container/src/container_manager/container.rs +++ b/src/runtime-rs/crates/runtimes/virt_container/src/container_manager/container.rs @@ -546,6 +546,18 @@ impl Container { pub async fn spec(&self) -> oci::Spec { self.spec.clone() } + + pub async fn cleanup(&mut self) -> Result<()> { + let mut inner = self.inner.write().await; + let device_manager = self.resource_manager.get_device_manager().await; + inner + .cleanup_container( + self.container_id.container_id.as_str(), + true, + &device_manager, + ) + .await + } } fn amend_spec(spec: &mut oci::Spec, disable_guest_seccomp: bool) -> Result<()> { diff --git a/src/runtime-rs/crates/runtimes/virt_container/src/container_manager/container_inner.rs b/src/runtime-rs/crates/runtimes/virt_container/src/container_manager/container_inner.rs index 1b6fcb2aa5..d2f9bb9bb1 100644 --- a/src/runtime-rs/crates/runtimes/virt_container/src/container_manager/container_inner.rs +++ b/src/runtime-rs/crates/runtimes/virt_container/src/container_manager/container_inner.rs @@ -177,7 +177,7 @@ impl ContainerInner { } } - async fn cleanup_container( + pub(crate) async fn cleanup_container( &mut self, cid: &str, force: bool, diff --git a/src/runtime-rs/crates/runtimes/virt_container/src/container_manager/manager.rs b/src/runtime-rs/crates/runtimes/virt_container/src/container_manager/manager.rs index 62d7eae453..131036e31c 100644 --- a/src/runtime-rs/crates/runtimes/virt_container/src/container_manager/manager.rs +++ b/src/runtime-rs/crates/runtimes/virt_container/src/container_manager/manager.rs @@ -70,7 +70,7 @@ impl VirtContainerManager { impl ContainerManager for VirtContainerManager { #[instrument] async fn create_container(&self, config: ContainerConfig, spec: oci::Spec) -> Result { - let container = Container::new( + let mut container = Container::new( self.pid, config.clone(), spec.clone(), @@ -107,7 +107,14 @@ impl ContainerManager for VirtContainerManager { } let mut containers = self.containers.write().await; - container.create(spec).await.context("create")?; + if let Err(e) = container.create(spec).await { + if let Err(inner_e) = container.cleanup().await { + warn!(sl!(), "failed to cleanup container {:?}", inner_e); + } + + return Err(e); + } + containers.insert(container.container_id.to_string(), container); Ok(PID { pid: self.pid }) }