Skip to content

MinIO Client mc cat fails on SynapS3 object downloads #27

Description

@snissn

Problem and current evidence

The documented MinIO Client workflow says mc cat prints an uploaded object, but it failed in the 22 September 2026 MVP validation of v0.1.0-beta.1 (c21017aa36400e2b2c2f92c62b2dc9af0098c136). mc ls, mc stat, and mc cp upload succeeded. mc cat on a 128 KiB object exited 1 with Last-Modified time format is invalid and returned zero bytes. AWS CLI downloaded that same object with the expected SHA-256. rclone also read object bytes correctly, but reported Failed to read last modified.

This is a client compatibility failure on a documented core download path, not evidence of lost object data. The tested MinIO Client was RELEASE.2026-09-19T15-24-59Z; the S3 endpoint was SynapS3, with no AWS S3 service involved.

Reproduce

With a SynapS3 bucket and mc alias configured as in docs/en/getting-started/s3-clients.md, upload an object of at least 127 bytes:

mc cp fixture.bin synaps3/demo/fixture.bin
mc stat synaps3/demo/fixture.bin
mc cat synaps3/demo/fixture.bin > downloaded.bin

Expected: the final command exits 0 and downloaded.bin matches fixture.bin. Observed on the release: it exits 1 with the error above and produces an empty file.

Likely implementation seam

At current main (f9efc927612e348f3e33cf96da6bb29e0502f905), internal/app/runtime.go serves S3 through VersityGW and internal/backend/object.go constructs its GetObjectOutput. That output omits LastModified, while HeadObjectOutput includes it. internal/objectreader/reader.go already supplies the stored version's LastModified for both cache and provider reads. Capture the actual GET and HEAD response headers to confirm the wire-level cause before changing the response.

Scope and completion

  • Add a failing regression check at the S3 HTTP boundary for a valid Last-Modified header on GET, including a specific versionId; compare it with HEAD at HTTP-date precision. Existing backend tests in internal/backend/object_test.go and the tests/system harness are possible places to extend.
  • Correct the shared GET response path so both cached and provider-backed reads return metadata for the version actually served. Keep the existing streaming body and read fallback behavior.
  • Re-run the documented MinIO Client upload and mc cat download with matching SHA-256, including a read after cache eviction. Confirm rclone reads matching bytes without the last-modified warning.
  • Recheck docs/en/getting-started/s3-clients.md, docs/zh/getting-started/s3-clients.md, and the English and Chinese S3 compatibility matrices. Update them only if the verified behavior or instructions differ. Run the relevant Go tests and the repository's make verify-fast PR check.

Out of scope: Filecoin storage or replica repair, unrelated S3 API extensions, and a broader client compatibility audit.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions