Files
rustfs/docs/superpowers/plans/scheduler-baseline.md
T
Zhengchao An f63af3df63 chore: retire completed-migration scaffolding, wire orphaned boundary check (#4719)
The ecstore/global-state migrations are done (backlog#815, #939, #1052 all
closed). Review of every migration-era test/gate measure found three things
actually retirable or broken — everything else is a live anti-regression
guard and stays.

Remove:
- scripts/check_metrics_migration_refs.sh — guards a migration that
  finished: rustfs_metrics:: has zero hits, the metrics crate no longer
  exists, and the script was never wired into CI or make (only reference
  was one line in config-model-boundary-adr.md, also removed).
- crates/obs init_metrics_collectors — the "backward-compatible alias kept
  during migration" the removed script was guarding. Zero callers; pure
  delegate to init_metrics_runtime.

Archive (docs/superpowers/plans/, continuing the 2026-07 convention,
with the standard archived banner):
- startup-timeline.md, scheduler-baseline.md,
  profiling-numa-capability-inventory.md,
  kms-development-defaults-inventory.md — one-shot snapshots whose only
  consumer is the already-archived migration-progress ledger (their
  same-dir links there start resolving again after the move); zero script
  pins; fed the closed backlog#660/#665 architecture-review ledger.
  Fixed the one outbound link (startup-timeline -> readiness-matrix) that
  the move would have broken — check_doc_paths.sh deliberately does not
  scan plans/, so nothing else would have caught it.

Wire (found orphaned by the same review):
- scripts/check_extension_schema_boundaries.sh guards a live contract
  crate but was never invoked anywhere. Add lint-fmt.mak target, include
  in pre-commit/pre-pr/dev-check, add ci.yml Quick Checks step (job
  already installs ripgrep), sync the CONTRIBUTING.md enumerated list,
  and harden the script against a silently-passing rg probe when src/
  is missing.

Keep (verified live, documented so the next cleanup pass does not repeat
this analysis):
- scripts/check_architecture_migration_rules.sh — added a header stating
  it is a permanent boundary guard, not retirable migration scaffolding;
  'migration' in the name is historical.
- check_migration_gate_count.sh + floor, delete-marker e2e proof, all
  pinned docs, compat-cleanup-register sync, remaining inventories
  (referenced by live docs).

Verification: all 7 guard scripts pass, actionlint clean,
cargo check --workspace (excl e2e) clean, cargo fmt --check clean.
Adversarially reviewed by two independent skeptic passes; their 7
findings (alias left behind, broken outbound link, missing banners,
wrong backlog attribution, CONTRIBUTING drift, rg exit-2 hole, missing
header rationale) are all folded in.
2026-07-11 13:42:56 +08:00

5.2 KiB

Archived migration snapshot — moved from docs/architecture/ (2026-07) when the architecture-review ledger it fed closed out. Kept for history; not maintained.

Scheduler Baseline Inventory

This inventory covers G-011 for rustfs/backlog#675. It is a docs-only snapshot of the current scheduling, backpressure, worker, scanner, heal, and runtime-builder ownership. It does not define new behavior.

Current Owners

Surface Current owner Current responsibility Migration boundary
ConcurrencyManager rustfs/src/storage/concurrency/manager.rs Owns the RustFS S3 read-path disk-read semaphore, I/O metrics, priority queue, storage media detection, access-pattern detection, and buffer strategy. Keep request admission and I/O metrics behavior stable until a controller can consume the same state explicitly.
I/O scheduler core crates/io-core/src/scheduler.rs Owns the reusable buffer-size and priority algorithms consumed by the RustFS S3 read path (rustfs/src/storage/concurrency/io_schedule.rs). The former SchedulerManager facade in rustfs-concurrency was removed as zero-caller dead code (backlog#1025). Treat rustfs-io-core as the reusable algorithm surface; the RustFS S3 read path owns its own scheduling wiring.
RustFS backpressure monitor rustfs/src/storage/backpressure.rs Tracks object-pipe watermark state used by RustFS storage backpressure tests and helpers, using the shared PipeBackpressurePolicy from crates/concurrency/src/backpressure.rs. The former BackpressureManager/BackpressurePipe facade in rustfs-concurrency was removed as zero-caller dead code (backlog#1025). Preserve current state labels and watermark semantics; keep pipe sizing and watermark policy separate from object-read disk semaphore admission.
Workers crates/concurrency/src/workers.rs Provides cooperative worker-slot admission with take, give, and wait; current background workflows use it for bounded set workers. Preserve blocking/wakeup semantics and over-release clamping.
Scanner cycle budget crates/scanner/src/scanner_budget.rs Cancels a child token when runtime, object-count, or directory-count budget is reached. Preserve partial-cycle reason mapping and checkpoint accounting.
Heal admission crates/heal/src/heal/manager.rs, crates/heal/src/heal/channel.rs, rustfs_common::heal_channel Owns priority queue admission, duplicate merge/drop/full results, active-task tracking, retry admission, and channel responses. Preserve low-priority scanner behavior and high-priority escalation gates.
Tokio runtime builder rustfs/src/server/runtime.rs Builds the multi-thread runtime from env/defaults, sets thread counts, stack, queue/event intervals, I/O event cap, thread name, and optional dial9 tracing. Keep runtime defaults and env names stable when later startup phases move ownership.

Current Flow

flowchart TD
    http["HTTP/S3 request"] --> app["app object usecase"]
    app --> guard["ConcurrencyManager::track_request"]
    app --> permit["disk-read semaphore permit"]
    permit --> strategy["I/O queue status and buffer strategy"]
    strategy --> ecstore["ECStore object/read path"]
    ecstore --> setdisks["hashed set disks"]

    scanner["scanner cycle"] --> budget["ScannerCycleBudget"]
    budget --> folder["folder/object scan"]
    folder --> healreq["heal channel request"]
    healreq --> admission["HealManager admission queue"]
    admission --> healworker["heal workers and retries"]

    startup["startup entrypoint"] --> runtime["Tokio runtime builder"]
    runtime --> services["background services"]

Missing State For Later Work

R-015 storage foundation:

  • Needs a stable inventory of endpoint publication, local disk prewarm, lock client setup, and per-set readiness state before any scheduler/controller consumes storage topology.
  • Must not infer set availability only from request-path I/O metrics.

E-011 extension/runtime consumers:

  • Need explicit ownership for runtime admission snapshots before extensions can observe scheduler or backpressure state.
  • Must not receive mutable handles to ConcurrencyManager, heal queues, or scanner budget tokens.

C-011 controller work:

  • Needs desired/current/status snapshots for request admission, scanner budget, and heal queue pressure before any controller can reconcile them.
  • Must keep worker mutation explicit. Read-only status should report None or no-op mutation until a reviewed worker lifecycle PR exists.

Preservation Invariants

  • Request reads must keep the same disk-read semaphore admission and active GET accounting.
  • I/O queue status and congestion metrics must remain derived from the same permit counts.
  • Scanner budget cancellation must keep its reason as runtime, objects, or directories.
  • Scanner inline-heal compatibility must continue to use asynchronous heal admission.
  • Heal duplicate admission must prefer merge semantics before full-queue rejection.
  • High-priority heal admission must still be able to displace lower-priority queued work where the current manager allows it.
  • Tokio runtime env names and fallback defaults must remain unchanged.