feat(rustfs): mirror buckets off MinIO, starting with tempo #455
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/rustfs-mirror"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Bulk object movement, one Job per bucket, plus the shared read-only source identity.
platform-tempo-tracesfirst: 8.8 MiB, 268 objects — the smallest and most survivable bucket. The MinIO copy is left untouched and stays the rollback until MinIO retires.Neither side uses root
The obvious implementation points
mcat MinIO root on one side and RustFS root on the other. A mirror needs exactly two rights — read the source, write the destination — so this supplies both at that grade:migration-readerGetObject+ListBucketon the 8 migrating buckets, nothing elseplatform-tempo-tracesonlyRoot on either side would put a credential able to delete every bucket in the cluster into a Job whose only purpose is bulk copying — the exact credential a mistake in this directory would leak.
The reader proves it is read-only rather than asserting it: it lists a source bucket, then fails if a write succeeds, and fails if it can reach
cnpg-backups, which is not migrating.Both endpoints are the stable ClusterIP Services
A bulk transfer is precisely the case the headless Service breaks: it hands out individual server addresses, and a transfer that loses its server mid-flight fails with HTTP 499. That happened twice during the 2026-09-02 node roll, and
sean/zotcarries a guard forbidding it. MinIO's own consumers still useminio-hl; this does not.The parity gate is the output, not the exit status
mc diffexits 0 whether or not the buckets differ. A Job that trusted the exit code would report a half-copied bucket as a success. The gate is[ -s /tmp/diff.out ].One race, named rather than hidden
Tempo keeps writing to MinIO until it is repointed, so an object written between the mirror and the diff shows as missing and fails the Job — which then retries and picks it up. At 268 objects that converges immediately. The same pattern on
binjovi-logs(207k objects) will need the consumer paused or a final incremental pass after the repoint, and that is called out in the manifest for whoever does it.Guard
tests/rustfs-mirror.shiterates the directory so later buckets are covered when their file lands. It pins: no root credential on either side, ClusterIP on both, and a diff gate that actually gates.upstream-inventory.txt7 → 9 for the two newminio/mcpins.bash tests/check.shexits 0. Server-side dry run applies all 10 objects clean.https://claude.ai/code/session_01KZoQin34jeyt6nDGqvJA76