refactor(#2352): quota show via daemon wire command
This commit is contained in:
parent
e7f8254788
commit
3797177e7f
3 changed files with 116 additions and 30 deletions
|
|
@ -201,6 +201,7 @@ async fn dispatch(req: &HostRequest, coord: Arc<Coordinator>) -> HostResponse {
|
|||
}
|
||||
HostRequest::QuotaEnable => handle_quota_enable().await?,
|
||||
HostRequest::QuotaLimit { name, limit } => handle_quota_limit(name, *limit).await?,
|
||||
HostRequest::QuotaShow { name } => handle_quota_show(name.as_deref()).await?,
|
||||
})
|
||||
}
|
||||
.await;
|
||||
|
|
@ -429,6 +430,45 @@ async fn handle_quota_limit(name: &str, limit: Option<u64>) -> Result<HostRespon
|
|||
Ok(HostResponse::success())
|
||||
}
|
||||
|
||||
async fn handle_quota_show(name: Option<&str>) -> Result<HostResponse> {
|
||||
let agents: Vec<String> = match name {
|
||||
Some(n) => vec![n.to_owned()],
|
||||
None => Coordinator::kept_state_names(),
|
||||
};
|
||||
let mut rows = Vec::with_capacity(agents.len());
|
||||
for agent in &agents {
|
||||
match crate::priv_client::read_subvolume_usage(agent).await {
|
||||
Ok((referenced, exclusive)) => rows.push(hive_host_sock::QuotaRow {
|
||||
agent: agent.clone(),
|
||||
referenced: Some(referenced),
|
||||
exclusive: Some(exclusive),
|
||||
note: None,
|
||||
}),
|
||||
Err(e) => {
|
||||
let msg = format!("{e:#}");
|
||||
// btrfs-progs prints "ERROR: ... quota not enabled" to stderr
|
||||
// when qgroups are off; short-circuit the whole sweep with the
|
||||
// enable hint (case-insensitive fragment match — the wording
|
||||
// varies across btrfs-progs versions).
|
||||
if msg.to_ascii_lowercase().contains("quota not enabled") {
|
||||
return Ok(HostResponse::error(
|
||||
"btrfs quota not enabled — run `hivectl quota enable` first",
|
||||
));
|
||||
}
|
||||
// A plain-dir agent (no subvolume) has no qgroup; note it
|
||||
// inline and keep going rather than aborting the whole sweep.
|
||||
rows.push(hive_host_sock::QuotaRow {
|
||||
agent: agent.clone(),
|
||||
referenced: None,
|
||||
exclusive: None,
|
||||
note: Some(format!("no qgroup data — plain dir or: {msg}")),
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(HostResponse::quota(rows))
|
||||
}
|
||||
|
||||
async fn handle_matrix_sync_admin() -> Result<HostResponse> {
|
||||
require_matrix_present().await?;
|
||||
let register_token =
|
||||
|
|
|
|||
Loading…
Reference in a new issue