Skip to content

Storage insights & benchmarks

CAVS measures your data rather than estimating it. This page explains what each number means and where it comes from, so you can act on it.

Two numbers, everywhere:

Definition What it’s for
Logical bytes The sum of your objects’ nominal sizes. What a naive store would need. “how much data do we have?”
Physical bytes The unique compressed bytes actually stored, after chunk dedup. “what are we paying for?”

The dedup ratio is 1 − physical / logical, shown as a percentage saved.

Quotas and overage are billed on physical managed storage. BYOS physical bytes are not metered by CAVS at all — you pay your provider.

Terminal window
export API=https://cavsnode.com/api/v1
export H="Authorization: Bearer $CAVS_TOKEN"
curl -sS "$API/repositories/$REPO/usage" -H "$H"

Returns logical bytes, physical bytes, object count, egress for the period and the current generation. It reads a reconciled snapshot rather than scanning live, so it’s cheap to poll — and it lags a push by seconds.

Terminal window
curl -sS "$API/repositories/$REPO/storage/series?days=90" -H "$H"
curl -sS "$API/organizations/acme-ai/usage/series?days=90" -H "$H"

days is 1–365 (default 90). Both return daily points of logical bytes, physical bytes and object count. This is the chart that tells you whether growth is linear (expected) or stepped (someone committed a dataset).

Terminal window
# Roll up the indexed tree by directory
curl -sS "$API/repositories/$REPO/storage/folders?depth=2&limit=20" -H "$H"
# Summary: totals, dedup ratio, biggest objects
curl -sS "$API/repositories/$REPO/storage/summary" -H "$H"
# Raw object list, largest first
curl -sS "$API/repositories/$REPO/objects?sort=size&limit=20" -H "$H"
Parameter Range Default
depth 1–5 1
limit 1–100 20
ref any indexed ref default branch

Folder roll-ups need the Git index — the data plane alone has no directories.

Organization-wide, the Storage view ranks repositories by physical size and groups them by storage group, which is usually enough to find the surprise.

When the CAVS transfer agent handles a transfer it reports what it actually did. Those records are your benchmarks — measured, not modelled.

Terminal window
curl -sS "$API/repositories/$REPO/transfers?kind=push&limit=10" -H "$H"
curl -sS "$API/repositories/$REPO/transfers?kind=pull&limit=10" -H "$H"
Field Meaning
kind push or pull
duration_ms Wall clock for the whole transfer
ingest_ms Chunking, hashing and packing (push)
mirror_ms Uploading the static tree (push)
logical_bytes Nominal size of what was transferred
stored_bytes Bytes that actually hit storage (push)
object_count, chunk_count How many objects and chunks were involved
new_chunks / reused_chunks The dedup story for this transfer
files_put / files_skipped Tree files written vs already present

Pull records additionally report wire bytes vs logical bytes, chunks fetched vs reused from cache, and a timing breakdown (metadata, plan, payload, reconstruct).

Signal Healthy Investigate
reused_chunks / chunk_count on a small edit high (> 80%) near zero — your format probably reshuffles on write
stored_bytes / logical_bytes on a re-push small ≈ 1 — nothing deduped; check the agent is actually wired
Pull wire bytes with a warm cache small fraction of logical ≈ logical — cold cache, or the object changed wholesale
ingest_ms share of duration_ms modest dominant — CPU-bound chunking; consider a coarser chunk profile

The dashboard’s Benchmarks tab plots throughput in MB/s, dedup percentage, wire savings and the timing breakdown per transfer.

Terminal window
curl -sS "$API/repositories/$REPO/health" -H "$H"

The worker evaluates each repository periodically and reports findings such as:

  • Stale branches — no commits in over 30 days.
  • Oversized branches — more than 2× the default branch’s footprint.
  • Low dedup ratio — the stored bytes are close to the logical bytes.
  • Unindexed refs — the dashboard can’t show part of the repository.
  • Dominant objects — a single object accounts for most of the repository.

Storage-connection health for BYOS repositories is probed separately; a failing connection raises a notification and marks the connection unhealthy. See Bring Your Own S3.

Actionable suggestions derived from the same analysis:

Terminal window
curl -sS "$API/repositories/$REPO/recommendations?status=open" -H "$H"
curl -sS "$API/organizations/acme-ai/recommendations" -H "$H"
# Dismiss one you've judged and rejected
curl -sS -X POST "$API/repositories/$REPO/recommendations/$REC_ID/dismiss" -H "$H"

status accepts open or dismissed. Dismissing requires repository.update.

The organization dashboard projects storage and egress to the end of the billing period from the current trend, alongside the plan’s included amounts and the overage that would result:

Terminal window
curl -sS "$API/organizations/acme-ai/dashboard" -H "$H"

This is a linear projection from recent usage, not a promise. Treat a forecast that crosses your plan’s limit as a prompt to look at the folder breakdown, not as a bill.

  1. GET /organizations/{org}/dashboard — is total growth expected?
  2. GET /organizations/{org}/usage/series?days=90 — is it linear or stepped?
  3. Rank repositories by physical size in the Storage view. Anything surprising?
  4. For the top repository: GET …/storage/folders?depth=3 — which directory?
  5. GET …/objects?sort=size&limit=20 — which objects specifically?
  6. GET …/artifacts/{oid}/timeline — which commit introduced it, and is it still referenced?
  7. GET …/branches — is a stale branch pinning objects nothing current needs?
  8. GET …/recommendations — has CAVS already spotted it?

Then act: delete the stale branch, retag, and let GC reclaim the unreferenced chunks.