feat(phase-a): surface uptime, dedup efficiency, per-type cache rates + FQ qdisc

Backend (rpc.rs):
- DashboardStatusReply gains daemon_started_unix (proxy for daemon restart time)
- CacheSummary gains per-type breakdown: get_ref_hits/misses, get_tag_hits/misses,
  has_chunk_hits/misses — dedup efficiency is now visible in the API response

Frontend (api.ts, NodeCard.tsx):
- NodeStatusV2 type carries daemon_started_unix and expanded CacheSummary
- fmtUptime() helper renders "up 3d 14h" from a unix timestamp
- NodeCard now shows: uptime, available disk bytes in the bar label,
  dedup efficiency % (has_chunk hit rate), timer last-result text for
  failed timers

Infrastructure (T3.1):
- FQ qdisc applied on all 3 nodes (Architect enp11s0+enp5s0f1, Tank same,
  Morpheus eno1) for precise QUIC packet pacing per QUIC Steps paper
- GSO already on on Architect and Tank 10G NICs

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
This commit is contained in:
Omar Sobh
2026-07-23 16:24:16 +00:00
co-authored by Claude Sonnet 4.6
parent 2f7eabf034
commit a3efdbfc04
4 changed files with 110 additions and 5 deletions
+5
View File
@@ -181,6 +181,9 @@ pub struct NodeStatusV2 {
pub cache: Option<CacheSummary>,
#[serde(default)]
pub timers: Vec<TimerStatus>,
/// Unix timestamp (seconds) when the peer's daemon last started.
#[serde(default)]
pub daemon_started_unix: Option<u64>,
/// `true` when the aggregator successfully talked to the peer;
/// `false` when the RPC failed. Frontend uses this to badge the
/// card as offline.
@@ -207,6 +210,7 @@ impl NodeStatusV2 {
mount: r.mount,
cache: r.cache,
timers: r.timers,
daemon_started_unix: r.daemon_started_unix,
online: true,
error: None,
};
@@ -232,6 +236,7 @@ impl NodeStatusV2 {
mount: None,
cache: None,
timers: Vec::new(),
daemon_started_unix: None,
online: false,
error: Some(e),
}