From 937fd90779002f6f95fd693a10c39c961186567d Mon Sep 17 00:00:00 2001 From: Markus Rudy Date: Fri, 20 Dec 2024 08:42:38 +0100 Subject: [PATCH] agent: clear log pipes if denied by policy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Container logs are forwarded to the agent through a unix pipe. These pipes have limited capacity and block the writer when full. If reading logs is blocked by policy, a common setup for confidential containers, the pipes fill up and eventually block the container. This commit changes the implementation of ReadStream such that it returns empty log messages instead of a policy failure (in case reading log messages is forbidden by policy). As long as the runtime does not encounter a failure, it keeps pulling logs periodically. In turn, this triggers the agent to flush the pipes. Fixes: #10680 Co-Authored-By: Aurélien Bombo Signed-off-by: Markus Rudy --- src/agent/src/rpc.rs | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/agent/src/rpc.rs b/src/agent/src/rpc.rs index 5f2a3eb955..8dc50ea996 100644 --- a/src/agent/src/rpc.rs +++ b/src/agent/src/rpc.rs @@ -649,11 +649,11 @@ impl AgentService { async fn do_read_stream( &self, - req: protocols::agent::ReadStreamRequest, + req: &protocols::agent::ReadStreamRequest, stdout: bool, ) -> Result { - let cid = req.container_id; - let eid = req.exec_id; + let cid = &req.container_id; + let eid = &req.exec_id; let term_exit_notifier; let reader = { @@ -900,8 +900,12 @@ impl agent_ttrpc::AgentService for AgentService { _ctx: &TtrpcContext, req: protocols::agent::ReadStreamRequest, ) -> ttrpc::Result { - is_allowed(&req).await?; - self.do_read_stream(req, true).await.map_ttrpc_err(same) + let mut response = self.do_read_stream(&req, true).await.map_ttrpc_err(same)?; + if is_allowed(&req).await.is_err() { + // Policy does not allow reading logs, so we redact the log messages. + response.clear_data(); + } + Ok(response) } async fn read_stderr( @@ -909,8 +913,12 @@ impl agent_ttrpc::AgentService for AgentService { _ctx: &TtrpcContext, req: protocols::agent::ReadStreamRequest, ) -> ttrpc::Result { - is_allowed(&req).await?; - self.do_read_stream(req, false).await.map_ttrpc_err(same) + let mut response = self.do_read_stream(&req, false).await.map_ttrpc_err(same)?; + if is_allowed(&req).await.is_err() { + // Policy does not allow reading logs, so we redact the log messages. + response.clear_data(); + } + Ok(response) } async fn close_stdin(