On this page

Inspecting every object

Inspecting every object

stado storage ls queue/ --json lists every object under that prefix, sorted by name. There is no implicit display limit. Use --limit <count> to request a bounded result; JSON reports the requested limit, listed, total, and truncated. With no limit, limit is null. An explicit limit equal to the total is not truncated. With no prefix, stado storage ls --json reports counts across the canonical prefixes instead of object rows.

--size adds each object's size as the store's listing states it, which every backend's listing carries, so no body is downloaded for it; size_from is listing. Only an object the listing stated no size for, one removed between the listing and its stat, has its body read (size_from is body): a body that is gone is reported as vanished, and a failed read keeps size_error, never a fabricated zero. A failed prefix listing is an error, not an empty result. Malformed --limit arguments are refused before storage is opened.

In Desktop, open a declared host's Space panel, then Available operations → List objects in the selected API's configured store. Leave Maximum objects blank for all rows. The operation reads the selected API's configured object store, not the selected host's disk. Its receipt retains arguments, output, errors and exit status.

The single-object verbs have Space panel operations of their own, each running the same command with the fields its arguments take: List a namespace's objects (stado storage objects), Read whether an object is present, its size, version and metadata (stat), Print an object's body (cat), Download an object into a local file (get), Upload a local file as an object (put, with its media type and --if-absent), Remove an object (rm) and Discard the staged parts of an interrupted upload (abort, with --dry-run).

Parallel object operations

storage copy, storage backup, and recovery migrate accept an optional positive --concurrency. When omitted, Stado measures the operating system's available parallelism. An unavailable measurement is refused with cannot measure available parallelism for bulk object operations and the OS cause; it does not silently select a worker count. Zero is rejected by the argument parser. Recovery resolves this value before fencing a store, stopping writers or opening a billing window, then reuses it for copy and verification.

A body too large for one request to the object API is stored in parts (<key>.__stado_upload/<upload-id>/<part>) and then composed. The parts are sent as many at once as the same measurement allows, kept in their order, and the first refused part ends the upload; each stored part is printed on stderr with its own time from request to answer (stored part <n> of <total> of <uri>: <bytes> bytes in <time>), so a slow upload says whether its time is the parts' bytes or the wait on the object API.

storage copy resumes from the sentinel it wrote at the destination on an earlier run (its cursor and cumulative counts). A sentinel that is missing or empty starts the copy from scratch; one that is not JSON, or holds a member of the wrong type, is refused naming the member (the copy sentinel at <path> holds <member> = <value>, not a count), since resuming from it would miscount or restart a copy that was far along.

The same measurement and error propagation apply to bulk queue reads, release reports, host software inspection, storage verify, canonical prefix counts and the opt-in storage ls --size body reads. A measurement failure is an operation failure, not an empty listing or a vanished object. Queue read batches also use the measured parallelism, rather than a separate fixed batch size. Every batch is visited unless the caller's explicit job window or scan budget has been filled; batching does not cap the result.

Desktop's Space operations also offer Copy objects between stores, Copy objects to the configured disaster-recovery store, and Compare store names, metadata and bytes. Copy and backup expose Objects in parallel; blank measures it. Mutations require the existing review confirmation. These requests and their complete failure receipts use the selected API.

Listing qualification

From the Stado checkout, run node tests/storage/listing/journey.mjs with STADO_BIN, STADO_TEST_SOURCE_REVISION (full native source hash), STADO_TEST_LIST_COUNT, STADO_TEST_LIST_LIMIT, STADO_TEST_COPY_CONCURRENCY (positive integer), and STADO_TEST_COPY_REFUSED_CONCURRENCY (zero) declared in the run's environment. Use more than 255 objects to exercise the removed byte-width cap, more than the host's measured parallelism to cross queue read batches, and a smaller positive explicit listing limit. A separate run with listing limit zero exercises an intentionally empty selection.

The journey snapshots the executable and refuses a mismatched source revision. It submits real jobs into a private local store and compares every status --json row with the persisted job, across measured read batches. It checks complete JSON and text object listings, explicit truncation, exact-boundary listing, body lengths, invalid arguments and unchanged stored bytes. It copies those objects to isolated local destinations with measured and explicit parallelism, compares every persisted body, runs storage verify, and confirms zero fan-out is refused before the destination is opened. No worker is launched. Its executable identity, commands, exit statuses and before/after digests are retained under .build/storage-listing/.

Source: this website