From e7bca62c32fbab982b2f1032b6c6b0b099cd4a77 Mon Sep 17 00:00:00 2001 From: Yushuo Date: Wed, 8 Mar 2023 17:16:26 +0800 Subject: [PATCH] bugfix: modify tty_win info in runtime when handling ResizePtyRequest Currently, we only create the new exec process in runtime, this will cause error when the following requests needing to be handled: - Task: exec process - Task: resize process pty - ... The agent do not do_exec_process when we handle ExecProcess, thus we can not find any process information in the guest when we handle ResizeProcessPty. This will report an error. In this commit, the handling process is modified to the: * Modify process tty_win information in runtime * If the exec process is not running, we just return. And the truly pty_resize will happen when start_process Fixes: #6248 Signed-off-by: Yushuo --- .../src/container_manager/container.rs | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 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 501002e42d..2f9f03b0e8 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 @@ -344,20 +344,33 @@ impl Container { height: u32, ) -> Result<()> { let logger = logger_with_process(process); - let inner = self.inner.read().await; + let mut inner = self.inner.write().await; if inner.init_process.get_status().await != ProcessStatus::Running { warn!(logger, "container is not running"); return Ok(()); } - self.agent - .tty_win_resize(agent::TtyWinResizeRequest { - process_id: process.clone().into(), - row: height, - column: width, - }) - .await - .context("resize pty")?; - Ok(()) + + if process.exec_id.is_empty() { + inner.init_process.height = height; + inner.init_process.width = width; + } else if let Some(exec) = inner.exec_processes.get_mut(&process.exec_id) { + exec.process.height = height; + exec.process.width = width; + + // for some case, resize_pty request should be handled while the process has not been started in agent + // just return here, and truly resize_pty will happen in start_process + if exec.process.get_status().await != ProcessStatus::Running { + return Ok(()); + } + } else { + return Err(anyhow!( + "could not find process {} in container {}", + process.exec_id(), + process.container_id() + )); + } + + inner.win_resize_process(process, height, width).await } pub async fn stats(&self) -> Result> {