Skip to content

Commit c673c68

Browse files
committed
feat(memtrack): write dropped-event count to sidecar on shutdown
After the tracked command exits, read the eBPF dropped-event counter, log a warning if non-zero, and persist the value as a MemtrackMeta sidecar next to the events file. Lets the backend mark a benchmark as incomplete instead of silently accepting a truncated memory trace. Refs COD-2577.
1 parent 077bb7e commit c673c68

1 file changed

Lines changed: 27 additions & 1 deletion

File tree

crates/memtrack/src/main.rs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ use clap::Parser;
22
use ipc_channel::ipc;
33
use memtrack::prelude::*;
44
use memtrack::{MemtrackIpcMessage, Tracker, handle_ipc_message};
5-
use runner_shared::artifacts::{ArtifactExt, MemtrackArtifact, MemtrackEvent, MemtrackWriter};
5+
use runner_shared::artifacts::{
6+
ArtifactExt, MemtrackArtifact, MemtrackEvent, MemtrackMeta, MemtrackWriter,
7+
};
68
use std::os::unix::process::CommandExt;
79
use std::path::{Path, PathBuf};
810
use std::process::Command;
@@ -200,6 +202,30 @@ fn track_command(
200202
.join()
201203
.map_err(|_| anyhow::anyhow!("Failed to join writer thread"))??;
202204

205+
// Read the eBPF dropped-event counter after the run is complete.
206+
// A non-zero value means the ring buffer overflowed and the trace is
207+
// incomplete; we surface this both in the logs and in a sidecar file
208+
// so the backend can invalidate the benchmark.
209+
let dropped_events = match tracker_arc.lock() {
210+
Ok(t) => t.dropped_events_count().unwrap_or_else(|e| {
211+
warn!("Failed to read memtrack dropped-event counter: {e}");
212+
0
213+
}),
214+
Err(_) => 0,
215+
};
216+
if dropped_events > 0 {
217+
warn!(
218+
"memtrack dropped {dropped_events} events because the ring buffer was full \
219+
— this benchmark's memory trace is incomplete"
220+
);
221+
}
222+
223+
let meta = MemtrackMeta { dropped_events };
224+
let meta_path = out_dir.join(MemtrackMeta::file_name(root_pid));
225+
if let Err(e) = std::fs::write(&meta_path, serde_json::to_vec(&meta)?) {
226+
warn!("Failed to write memtrack meta sidecar to {meta_path:?}: {e}");
227+
}
228+
203229
// IPC thread will exit when channel closes
204230
drop(ipc_handle);
205231

0 commit comments

Comments
 (0)