# 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 S3/MinIO/SeaweedFS S3 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.)
  - Seaweed-* 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

```bash
# Build
cd seaweed-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 seaweed-volume && cargo test

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