diff --git a/crates/runner-shared/src/artifacts/memtrack.rs b/crates/runner-shared/src/artifacts/memtrack.rs index d6562e06..68f64d0f 100644 --- a/crates/runner-shared/src/artifacts/memtrack.rs +++ b/crates/runner-shared/src/artifacts/memtrack.rs @@ -1,6 +1,6 @@ use libc::pid_t; use serde::{Deserialize, Serialize}; -use std::io::{BufWriter, Read, Write}; +use std::io::{BufReader, BufWriter, Read, Write}; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct MemtrackArtifact { @@ -26,6 +26,13 @@ impl MemtrackArtifact { deserializer: rmp_serde::Deserializer::new(decoder), }) } + + pub fn is_empty(reader: R) -> bool { + let Ok(mut stream) = MemtrackArtifact::decode_streamed(BufReader::new(reader)) else { + return true; + }; + stream.next().is_none() + } } #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] @@ -138,4 +145,17 @@ mod tests { Ok(()) } + + #[test] + fn test_artifact_is_empty() -> anyhow::Result<()> { + let artifact = MemtrackArtifact { events: vec![] }; + + let mut buf = Vec::new(); + artifact.encode_to_writer(&mut buf)?; + + let reader = Cursor::new(buf); + assert!(MemtrackArtifact::is_empty(reader)); + + Ok(()) + } } diff --git a/src/executor/memory/executor.rs b/src/executor/memory/executor.rs index 54e4fb34..72ba4a05 100644 --- a/src/executor/memory/executor.rs +++ b/src/executor/memory/executor.rs @@ -128,8 +128,8 @@ impl Executor for MemoryExecutor { .to_string_lossy() .contains(MemtrackArtifact::name()) }) - // Filter empty files: - .filter(|entry| entry.metadata().map(|m| m.len() == 0).unwrap_or_default()) + .flat_map(|f| std::fs::File::open(f.path())) + .filter(|file| !MemtrackArtifact::is_empty(file)) .collect(); if files.is_empty() { bail!(