Files
rustfs/crates/ecstore/tests/fixtures/minio
Zhengchao An a91d9cefc6 test(interop): add real MinIO read and migration parity tests (#4377)
test(interop): real-MinIO read + migration parity, Phase 1/2 (backlog#580)

Capture authentic on-disk fixtures from MinIO RELEASE.2025-07-23 (a bucket with
versioning, object-lock, lifecycle, tagging, quota, a public policy, SSE-S3
encryption, a webhook notification target, and a replication rule, plus inline /
versioned / multipart objects and a delete marker) and prove RustFS reads and
migrates them losslessly:

- filemeta parses_real_minio_object_xlmeta: small inline, two-object-version +
  delete marker, and multipart object xl.meta parse to the expected FileInfo.
- ecstore parses_real_minio_bucket_metadata_blob_without_loss: the MinIO
  .metadata.bin msgpack decodes via the PascalCase field names and
  parse_all_configs loads all ten config types present (policy, lifecycle incl.
  <ExpiryUpdatedAt>, object-lock, versioning, tagging, quota, notification,
  encryption/SSE-S3, replication incl. DeleteMarkerReplication /
  ExistingObjectReplication) without loss.
- ecstore reads_minio_inline_bucket_metadata_via_bitrot: MinIO inlines an object
  body as [HighwayHash256 32B][body]; RustFS's BitrotReader with HighwayHash256S
  verifies and yields the exact blob (the "inline_data 前缀不同" is that prefix).
- ecstore migrates_real_minio_bucket_metadata_end_to_end: on a throwaway 4-drive
  local ECStore, a real MinIO .metadata.bin seeded under .minio.sys is migrated
  into .rustfs.sys byte-identically for every config, exercising the Phase 2
  source adapter (MIGRATING_META_BUCKET = ".minio.sys") through the object layer.

All four run as ordinary crate tests (nextest CI). Phase 4 (MinIO re-reading a
RustFS drive) is documented as out of scope for one-way migration.

Refs rustfs/backlog#580
2026-07-08 01:12:49 +08:00
..

Real MinIO on-disk fixtures (backlog#580 interop)

Generated by MinIO RELEASE.2025-07-23T15-54-02Z (single-drive, local SSE-S3 KMS + webhook notify target enabled) writing a bucket configured with versioning, object-lock (GOVERNANCE default), lifecycle, tagging, quota, a public-download policy, SSE-S3 encryption, a webhook notification target, and a replication rule (which also seeds a bucket-targets blob), plus inline / versioned / multipart objects and a delete marker.

  • bucket_metadata_full.xlmeta.hex — the .minio.sys/buckets/interop/.metadata.bin object (xl.meta wrapper + inline .metadata.bin blob).
  • bucket_metadata.blob.hex — the raw .metadata.bin object body (4-byte format|version header + msgpack), carved from the object above.

Unencrypted object xl.meta fixtures (clean plaintext sizes) live under crates/filemeta/tests/fixtures/minio/.

These prove RustFS reads and migrates MinIO-written metadata without loss. Not captured here (tooling/scope): CORS, public-access-block, and bucket ACL (the SNSD test binary + mc did not expose CORS; bucket-targets credentials are stored KMS-encrypted and are a documented partial).