# Workload Admission Contracts

This document records the `rustfs/backlog#660` PR-05 and PR-07 scheduler
preservation and runtime workload-class contract slice.

## Preservation Coverage

The `rustfs-concurrency` tests pin the current reusable admission-facing
behavior before later snapshot extraction:

- Worker slot over-release remains clamped by the configured worker limit.
- `GetObjectQueueSnapshot` preserves saturated, over-available, and zero-total
  permit semantics.

The former reusable scheduler and backpressure-pipe facades (and their
preservation tests) were removed as zero-caller dead code in backlog#1025;
scheduler buffer/priority behavior is now pinned by `rustfs-io-core` and
`rustfs/src/storage/concurrency` tests.

## Workload Class Contract

`WorkloadClass` defines the required future admission categories:

- Foreground read.
- Foreground write.
- Metadata.
- Scanner.
- Repair.
- Replication.

`AdmissionState`, `WorkloadAdmissionSnapshot`, and
`WorkloadAdmissionRegistrySnapshot` define read-only status shapes for later
runtime owners. They do not replace the current scheduler, request guard,
scanner, heal, replication, or ECStore placement behavior.

## Boundary Rules

- `rustfs-concurrency` owns this reusable contract surface.
- The contract does not depend on `rustfs-ecstore` or RustFS binary runtime
  state.
- No scheduler decision logic, queue capacity, Tokio runtime default, scanner
  admission, heal admission, replication admission, placement, membership, or
  NUMA behavior changes are part of this slice.

## Set-Local Snapshot Extraction

The RustFS storage `ConcurrencyManager` now implements
`WorkloadAdmissionSnapshotProvider` for local foreground-read admission:

- `ForegroundRead` reports local disk-read permit usage through
  `GetObjectQueueSnapshot`.
- `active` is the number of disk-read permits currently in use.
- `limit` is the configured maximum concurrent disk reads.
- `queued` remains `None` because the current semaphore does not expose waiter
  counts.
- Scanner, repair, replication, foreground write, and metadata entries remain
  `Unknown` until their owning runtime components expose read-only status.

This is an observation surface only. Permit acquisition, priority assignment,
buffer sizing, storage media detection, request guards, and queue behavior are
unchanged.

## Heal Repair Snapshot Extraction

The RustFS integration layer now exposes a read-only repair admission snapshot
from the heal runtime counters:

- `Repair` reports the current heal active task count.
- `queued` reports the current heal queue length.
- `limit` remains `None` because the configured heal queue and concurrency
  limits live behind the async heal manager state.
- Other workload classes remain `Unknown` in this provider until their owning
  runtime components expose read-only status.

This is an observation surface only. Heal request admission, queue capacity,
priority merge/drop policy, task scheduling, retry handling, and repair
behavior are unchanged.

## Replication Snapshot Extraction

The RustFS integration layer now exposes a read-only replication admission
snapshot from the existing replication pool and queue statistics:

- `Replication` reports active regular, large-object, and MRF worker counts.
- `queued` reports the current site replication queue count when queue stats
  are immediately observable.
- `limit` remains `None` because replication worker limits remain owned by the
  async replication pool and resize policy.
- If the replication runtime has not initialized, or queue stats are currently
  locked, the snapshot reports `Unknown` instead of blocking or guessing.

This is an observation surface only. Replication admission, queue channel
capacity, worker resize behavior, MRF handling, target dispatch, and resync
behavior are unchanged.

## RustFS Runtime Owner Snapshot Extraction

The RustFS integration layer now extends the workload admission registry with
additional read-only owner mappings:

- `ForegroundRead` reuses the storage `ConcurrencyManager` disk-read permit
  snapshot so the RustFS-level provider exposes the same active and limit
  counts as the storage-local provider.
- `Scanner` reports the existing scanner active work-unit counter. When the
  counter is zero, the snapshot remains `Unknown` because the current counter
  cannot distinguish an idle scanner from a scanner that has not initialized.
- `Metadata` reports `Open` once the bucket metadata runtime handle is
  available, and `Unknown` before initialization.
- `ForegroundWrite` remains `Unknown` until a write-specific admission owner
  exposes a read-only surface.

This is an observation surface only. Disk-read permit acquisition, scanner
cycle scheduling, bucket metadata loading, metadata locks, object write paths,
and queue behavior are unchanged.

## Provider Composition Boundary

`WorkloadAdmissionRegistrySnapshot::overlay` composes provider-owned registry
snapshots without mutating runtime owners:

- The storage concurrency provider remains the source of truth for
  `ForegroundRead`.
- The RustFS runtime owner provider overlays metadata, scanner, repair,
  replication, and foreground-write status on top of the storage registry.
- Matching workload classes are replaced by the later provider snapshot; new
  classes are appended without reordering existing unrelated entries.

This keeps the later controller/status layer consuming a single read-only
registry while preserving the existing storage, scanner, heal, replication, and
metadata ownership boundaries.
