Files
Andrey VasnetsovandClaude Opus 5.5 aefcb71b0f Meter remote requests and expose IO statistics to edge shard users (#10769)
* Meter remote requests and expose IO statistics to edge shard users

Generalize the disk cache statistics from #10637 into a shared OpStats
primitive and add a second layer counting every remote request issued
through BlobFs and BlobFile, reads and writes alike. One helper at each
call site drives the uio_trace request and the stats guard together, so
the trace also gains the write operations.

CachedBlobFs exposes both halves through stats(), DiskCacheFs exposes
its remote filesystem, and both edge shards expose their filesystem, so
an application can read cumulative totals. shard_update logs the IO
counters moved by each phase; shard_query prints the combined dump.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Drop DiskCacheStats in favor of remote request stats

Every disk-cache fetch is exactly one BlobFile read already metered by
RemoteIoStats, so the cache half duplicated the remote Read/ReadFrom
counters. CachedBlobFs::stats() now returns RemoteIoStats directly.

The remote stats dump now includes per-op latency histograms, which
were previously only printed for cache fetches.

edge-shard-query and edge-shard-update initialize serverless_compatible
feature flags instead of running with uninitialized ones.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Sample uio-trace CPU usage every 10ms instead of 2ms

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Address review: not-found bucket, empty-tail reads, strum Op

- OpStats counts "not found" answers separately from errors, and the
  trace records them as a `not_found` outcome, so length and existence
  probes of absent objects no longer read as failures.
- A read_from tail at or past EOF is settled after the len probe and
  counts as a completed empty read; a not-found error skips the probe,
  which could only repeat the answer.
- Op derives strum EnumCount/EnumIter/IntoStaticStr instead of a
  hand-maintained ALL array.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-25 13:57:30 +02:00
..
2026-03-11 17:13:46 +00:00
2026-04-08 10:14:04 +02:00
2026-03-11 17:13:46 +00:00

crates.io PyPI

This dir contains a Justfile with recipes to build/check/run examples for edge packages. Install https://github.com/casey/just to use it.

Rust Qdrant Edge package

Rust Qdrant Edge workspace lives in the publish directory. It's a separate workspace, not tied to the main workspace.

The qdrant-edge package is autogenerated by the amalgamate.py script and placed in the ./publish/qdrant-edge directory (gitignored).

If you need to make changes in the qdrant-edge package, edit the original packages in this repo (/lib in the repo root).

just rs-examples
# Or, manually:
./amalgamate.py
cargo check -p examples
cargo run -p examples --bin demo
cargo run -p examples --bin …

(see full binary list in publish/examples/src/bin)

How to publish Rust Package to crates.io

  1. Update the VERSION in publish/amalgamate.py.
  2. Run Qdrant Edge Rust Release workflow.

Python Qdrant Edge package

It's in the python directory. It's part of the main workspace, unlike the Rust package.

just py-build
just py-examples

Or, manually:

# Setup environment
cd lib/edge/python
python -m venv .venv
source .venv/bin/activate

pip install --user maturin

# Build and install the package:
cd lib/edge/python
maturin develop --no-default-features

# Run example:
python examples/demo.py