fix agent disk usage reading container-internal state path on the host
This commit is contained in:
parent
68b0894f5b
commit
9a6306540b
1 changed files with 18 additions and 9 deletions
|
|
@ -83,9 +83,10 @@ fn disk_cache() -> &'static RwLock<HashMap<String, u64>> {
|
||||||
/// exactly the per-container-only measure we want. Best-effort: a
|
/// exactly the per-container-only measure we want. Best-effort: a
|
||||||
/// missing/unreadable path (e.g. a stopped container with no rootfs)
|
/// missing/unreadable path (e.g. a stopped container with no rootfs)
|
||||||
/// yields `None`, which the caller treats as 0.
|
/// yields `None`, which the caller treats as 0.
|
||||||
async fn du_bytes(path: &str) -> Option<u64> {
|
async fn du_bytes(path: &std::path::Path) -> Option<u64> {
|
||||||
let out = tokio::process::Command::new("du")
|
let out = tokio::process::Command::new("du")
|
||||||
.args(["-sxb", path])
|
.arg("-sxb")
|
||||||
|
.arg(path)
|
||||||
.output()
|
.output()
|
||||||
.await
|
.await
|
||||||
.ok()?;
|
.ok()?;
|
||||||
|
|
@ -96,14 +97,22 @@ async fn du_bytes(path: &str) -> Option<u64> {
|
||||||
stdout.split_whitespace().next()?.parse::<u64>().ok()
|
stdout.split_whitespace().next()?.parse::<u64>().ok()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Total per-agent disk: state dir (`/agents/<name>/state`, the host
|
/// Total per-agent disk: the agent's host-side state dir
|
||||||
/// bind-mount) plus the container's writable rootfs
|
/// (`/var/lib/hyperhive/agents/<name>/state`) plus the container's writable
|
||||||
/// (`/var/lib/nixos-containers/h-<name>`). Each measured with `du -sxb`
|
/// rootfs (`/var/lib/nixos-containers/h-<name>`). Each measured with `du -sxb`
|
||||||
/// so the shared nix store and other bind mounts are excluded. A path
|
/// so the shared nix store and other bind mounts are excluded. A path that
|
||||||
/// that doesn't exist contributes 0.
|
/// doesn't exist contributes 0.
|
||||||
|
///
|
||||||
|
/// The state dir is resolved via [`Coordinator::agent_notes_dir`] — the same
|
||||||
|
/// host path the dashboard reads agent state from. Hardcoding the
|
||||||
|
/// container-internal bind-mount path (`/agents/<name>/state`) instead made
|
||||||
|
/// `du` fail host-side (that path only exists inside the container), so every
|
||||||
|
/// agent's state-dir contribution was 0; with the writable rootfs nearly empty
|
||||||
|
/// (almost everything is bind-mounted), that surfaced as all agents reporting
|
||||||
|
/// 0 disk.
|
||||||
async fn measure_agent_disk(name: &str) -> u64 {
|
async fn measure_agent_disk(name: &str) -> u64 {
|
||||||
let state_dir = format!("/agents/{name}/state");
|
let state_dir = Coordinator::agent_notes_dir(name);
|
||||||
let rootfs = format!("{NIXOS_CONTAINERS_ROOT}/h-{name}");
|
let rootfs = PathBuf::from(format!("{NIXOS_CONTAINERS_ROOT}/h-{name}"));
|
||||||
let mut total = 0u64;
|
let mut total = 0u64;
|
||||||
for path in [state_dir, rootfs] {
|
for path in [state_dir, rootfs] {
|
||||||
if let Some(bytes) = du_bytes(&path).await {
|
if let Some(bytes) = du_bytes(&path).await {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue