fix(rustfs-mirror): a live writer guarantees a residual; gate on corruption, bound the rest #488

Merged
binjovi-bot merged 1 commit from sean/mirror-inflight into trunk 2026-09-09 15:10:17 +00:00 AGit
Owner

The loki mirror copied 53,580 of 53,587 objects and failed five passes on the seven loki wrote while it copied. A differing object is corruption and fails unconditionally; a missing object on a live source is usually in flight, so the residual is bounded at 64 and reported. Zero is still required after the repoint, when MinIO stops receiving writes -- that run is the cutover gate, this one is the bulk transfer. https://claude.ai/code/session_01KZoQin34jeyt6nDGqvJA76

The loki mirror copied 53,580 of 53,587 objects and failed five passes on the seven loki wrote while it copied. A differing object is corruption and fails unconditionally; a missing object on a live source is usually in flight, so the residual is bounded at 64 and reported. Zero is still required after the repoint, when MinIO stops receiving writes -- that run is the cutover gate, this one is the bulk transfer. https://claude.ai/code/session_01KZoQin34jeyt6nDGqvJA76
fix(rustfs-mirror): a live writer guarantees a residual; gate on corruption, bound the rest
All checks were successful
binjovi/ci Binjovi completed the frozen plan
1e1a574ce7
The loki mirror copied 53,580 of 53,587 objects and then failed five passes in
a row on the seven that loki wrote while it was copying. Demanding an empty
missing set demands that loki stop writing to MinIO, which it will not do until
it is repointed -- so the gate could never pass, on a transfer that had
succeeded.

The two halves of a diff are not the same kind of fact.

A DIFFERING object is corruption. No amount of waiting fixes it, so it fails
unconditionally, and the guard now refuses a mirror that compares `differs`
against anything but zero.

A MISSING object, on a source that is still being written, is usually just in
flight. The residual observed here was 7, then 7, then 2, against 53,580
copied. The gate allows 64 -- minutes of this cluster's chunk production, and
far below any real gap -- and reports the number either way, so a stalled
transfer still stands out.

ZERO IS STILL REQUIRED, JUST NOT YET. Once olly reads from RustFS, MinIO stops
receiving writes, this Job runs again on its next reconcile, and the residual
must reach zero. That run is the cutover gate. This one is the bulk transfer,
and conflating the two is what made a completed copy look like a failure.

Claude-Session: https://claude.ai/code/session_01KZoQin34jeyt6nDGqvJA76
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
sean/seanfarm!488
No description provided.