Files
zeekayandHanzo Dev 3f2bffcfe9 chore: purge MinIO from Hanzo S3
Hanzo S3 is SeaweedFS-derived (Apache-2.0). We run no MinIO. Remove the
MinIO images, the MinIO-authored benchmark, and the stale prose that
described us in MinIO's terms.

Removed:
- docker/compose/local-registry-compose.yml: the `minio` service and the
  `registry2` service it backed. The file was an A/B harness comparing a
  docker registry on Hanzo S3 vs on MinIO; we do not benchmark against a
  store we do not run. registry1-on-Hanzo-S3 remains.
- docker/compose/local-filer-backup-compose.yml: `minio/warp` replaced by
  an aws-cli workload generator. warp was there to produce S3 traffic for
  filer-backup to replicate, not because it was MinIO; the replacement
  keeps 6MB objects (> server-left's -filer.maxMB 5) so the multi-chunk
  backup path is still exercised.
- Makefile: `warp_install`, `benchmark`, `benchmark_with_pprof`. warp is
  MinIO's AGPL-3.0 benchmark. No CI target referenced these. There is now
  no S3 benchmark target; reinstating one needs a deliberate non-MinIO
  choice rather than a worse homegrown substitute.
- README.md: the `## Compared to MinIO` competitive section, its TOC entry
  and its comparison-table row.
- docker/README.md: `mc`-based debugging replaced with aws-cli + the real
  server-side equivalents (-v 9, -s3.auditLogConfig).
- Comments/help text/docs that described behaviour as MinIO's where the
  actual referent is OpenSSH, Ceph RGW, or the AWS S3 spec.

Deliberately kept:
- Apache-2.0 copyright notices on files genuinely copied from MinIO
  (s3err/s3-error.go, s3_constants/header.go, policy/postpolicyform.go,
  policy/post-policy_test.go, chunked_reader_v4.go, auth_signature_v2/v4.go).
  Apache-2.0 s4 requires retaining these, exactly as we retain SeaweedFS
  attribution in NOTICE.
- github.com/minio/crc64nvme. Directly imported by chunked_reader_v4.go to
  implement x-amz-checksum-crc64nvme, part of the AWS S3 additional-checksums
  spec. Removing it breaks S3 compatibility. md5-simd is transitive.
- s3/command/mini.go untouched: its 53 "minio" hits are all `miniOptions`
  ("min" + "iO") and none are real. A case-insensitive purge would have
  destroyed that file.

go build ./... passes. Package tests for the touched packages pass; the
pre-existing TestSignatureV4WithoutProxy IPv6 failure reproduces identically
on pristine HEAD.

Co-authored-by: Hanzo Dev <[email protected]>
2026-08-03 10:00:57 -07:00

5.3 KiB

Rust Volume Server — Dev Plan

Current Status (2026-03-07)

HTTP tests: 53/53 pass (100%) gRPC tests: 56/56 pass (100%) — includes TestVolumeMoveHandlesInFlightWrites with Rust multi-volume cluster Rust integration tests: 8/8 pass S3 remote storage tests: 3/3 pass Total: 117/117 (100%) + 8 Rust + 3 S3 tests Rust unit tests: 137 lib + 7 integration = 144

Completed Features

All phases from the original plan are complete:

  • Phase 1 — HTTP Core: CORS, OPTIONS, unsupported methods, static assets, path routing, cookie validation, conditional headers, range requests, dedup 204, content-encoding, readDeleted, chunk manifests, multipart validation, MD5 check, file size limit, upload/download throttling, image resize/crop, download disposition

  • Phase 2 — JWT/Security: signing keys from security.toml, token source precedence (query > header > cookie), file_id claims, leeway=0

  • Phase 3 — gRPC: maintenance mode, error message parity, ping routing, batch delete, VolumeServerStatus (with real disk stats, data_center, rack), ReadVolumeFileStatus (with timestamps)

  • Phase 4 — Streaming gRPC: VolumeIncrementalCopy, CopyFile, ReceiveFile, ReadAllNeedles, VolumeTailSender, VolumeCopy, VolumeTailReceiver, VacuumVolumeCheck

  • Phase 5 — EC Shards: mount/unmount, delete, read, blob delete, rebuild, shards-to-volume, copy, info

  • Phase 6 — Advanced gRPC: ScrubVolume, ScrubEcVolume, Query, FetchAndWriteNeedle, VolumeTierMoveDat (error paths)

  • Phase 7 — Remote Storage: S3-compatible backend via aws-sdk-s3, FetchAndWriteNeedle reads from any S3-compatible backend and writes locally. Supports all S3-compatible providers (AWS, Wasabi, Backblaze, Aliyun, etc.)

  • Master Heartbeat — Bidirectional streaming SendHeartbeat RPC, volume/EC registration, leader changes, shutdown deregistration. Tested end-to-end with Go master.

  • Production Sprint 1 — Quick wins:

    • VolumeMarkReadonly master notification (triggers immediate heartbeat)
    • Compaction throttling (maybe_throttle_compaction())
    • File size limit enforcement on upload
    • ts query param for custom timestamps (upload + delete)
    • TTL expiration check (was already implemented)
    • Health check heartbeat status (returns 503 if disconnected from master)
    • preStopSeconds graceful drain before shutdown
    • S3 response passthrough headers (content-encoding, expires, content-language, content-disposition)
    • .vif persistence for readonly state across restarts
    • Webp image support for resize
  • Production Sprint 2 — Compatibility:

    • MIME type extraction from Content-Type header
    • Stats endpoints (/stats/counter, /stats/memory, /stats/disk)
    • JSON pretty print (?pretty=y) and JSONP (?callback=fn)
    • Request ID generation (UUID if x-amz-request-id missing)
    • Advanced Prometheus metrics (INFLIGHT_REQUESTS, VOLUME_FILE_COUNT gauges)
  • Production Sprint 3 — Streaming & Multi-node:

    • Streaming reads for large files (>1MB) via http_body::Body trait with spawn_blocking
    • Meta-only needle reads (NeedleStreamInfo) to avoid loading full body for streaming
    • Multi-volume Rust cluster support (RustMultiVolumeCluster test framework)
    • TestVolumeMoveHandlesInFlightWrites now uses Rust volume servers
    • CI skip list cleaned up (all tests pass with Rust)
  • Production Sprint 4 — Advanced Features:

    • BatchDelete EC shard support (ecx index lookup + ecj journal deletion)
    • JPEG EXIF orientation auto-fix on upload (kamadak-exif + image crate)
    • Async batched write processing (mpsc queue, up to 128 entries per batch)
    • VolumeTierMoveDatToRemote/FromRemote (S3 multipart upload/download)
    • S3TierRegistry for managing remote storage backends
    • VolumeInfo (.vif) persistence for remote file references
  • Production Sprint 5 — Upload Compatibility:

    • TTL query parameter extraction during upload (ttl=3m)
    • Auto-compression for compressible file types (text/*, .js, .css, .json, .svg, etc.)
    • Hanzo-* custom metadata headers stored as needle pairs (JSON, max 64KB)
    • Filename extraction from URL path stored in needle name field
    • Upload response includes filename
  • Production Sprint 6 — Storage & Networking:

    • Redb disk-backed needle maps (pure Rust, no C deps) via NeedleMap enum
    • Binary search for VolumeIncrementalCopy with since_ns > 0
    • Proxy/redirect read modes for non-local volumes (master lookup, HTTP proxy, 301 redirect)

Remaining Work (Production Readiness)

No major remaining items. All phases and production sprints are complete.

Test Commands

# Build
cd hanzo-volume && cargo build --release

# Run all Go integration tests with Rust volume server
VOLUME_SERVER_IMPL=rust go test -v -count=1 -timeout 1200s ./test/volume_server/grpc/... ./test/volume_server/http/...

# Run S3 remote storage tests
VOLUME_SERVER_IMPL=rust go test -v -count=1 -timeout 180s -run "TestFetchAndWriteNeedle(FromS3|S3NotFound)" ./test/volume_server/grpc/...

# Run specific test
VOLUME_SERVER_IMPL=rust go test -v -count=1 -timeout 60s -run "TestName" ./test/volume_server/http/...

# Run Rust unit tests
cd hanzo-volume && cargo test

# Test heartbeat with Go master
s3 master -port=9333 &
hanzo-volume --port 8080 --master localhost:9333 --dir /tmp/vol1 --max 7
curl http://localhost:9333/dir/status  # should show Rust volume server registered