fix(companion): stop image_exists journal flood that drops the UI websocket
image_exists ran `podman image inspect <image>` via .status() (inherits the service stdout) with no --format, so every hit dumped the image's full ~249-line manifest JSON into the journal — once per companion image, every reconcile pass (.228: 21.6k journal lines / 10 min, 4131 inspect dumps). The service never crashed (NRestarts=0); the sustained journald/IO flood starved the async runtime and dropped the UI /ws/db websocket -> constant "connection lost"/reconnect. Discard the child's stdout/stderr; only the exit status is used. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
c4cd5fdc90
commit
3c36cf1c40
@ -285,7 +285,15 @@ async fn ensure_image_present(spec: &CompanionSpec) -> Result<String> {
|
||||
|
||||
async fn image_exists(image: &str) -> bool {
|
||||
let mut cmd = Command::new("podman");
|
||||
cmd.args(["image", "inspect", image]);
|
||||
// Only the exit status matters. WITHOUT a `--format`, `podman image inspect`
|
||||
// prints the image's full multi-KB manifest JSON; `.status()` inherits the
|
||||
// service's stdout, so on a hit that whole blob lands in the journal — once
|
||||
// per companion image, every reconcile pass. That flood spikes journald +
|
||||
// IO and starves the async runtime (UI websocket then drops → "connection
|
||||
// lost"/reconnect). Discard the child's stdout/stderr; we read neither.
|
||||
cmd.args(["image", "inspect", image])
|
||||
.stdout(std::process::Stdio::null())
|
||||
.stderr(std::process::Stdio::null());
|
||||
match tokio::time::timeout(COMPANION_IMAGE_CHECK_TIMEOUT, cmd.status()).await {
|
||||
Ok(Ok(status)) => status.success(),
|
||||
Ok(Err(err)) => {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user