diff --git a/conmon-rs/server/src/attach.rs b/conmon-rs/server/src/attach.rs index 4605e09a95..441ace5524 100644 --- a/conmon-rs/server/src/attach.rs +++ b/conmon-rs/server/src/attach.rs @@ -90,6 +90,13 @@ impl SharedContainerAttach { .context("receive attach message") } + /// Try to read from all attach endpoints standard input and return the first result. + pub fn try_read(&mut self) -> Result> { + self.read_half_rx + .try_recv() + .context("try to receive attach message") + } + /// Write a buffer to all attach endpoints. pub async fn write(&mut self, m: Message) -> Result<()> { if self.write_half_tx.receiver_count() > 0 { diff --git a/conmon-rs/server/src/container_io.rs b/conmon-rs/server/src/container_io.rs index f585251397..73208381ef 100644 --- a/conmon-rs/server/src/container_io.rs +++ b/conmon-rs/server/src/container_io.rs @@ -335,11 +335,11 @@ impl ContainerIO { } } _ = token.cancelled() => { - debug!("Token cancelled, draining stdin"); - if let Ok(data) = attach.read().await { + // Closing immediately may race with outstanding data on stdin for short lived + // containers. This means we try to read once again. + if let Ok(data) = attach.try_read() { Self::handle_stdin_data(&data, &mut writer).await?; } - return Ok(()); } }