Some checks failed
go: build dev binaries / cleanup (push) Successful in 4s
Codespell / Check for spelling errors (push) Failing after 3s
docker: build dev containers / build-rust-binaries (amd64, x86_64-unknown-linux-musl) (push) Failing after 3s
docker: build dev containers / build-dev-containers (push) Has been skipped
docker: build dev containers / build-rust-binaries (arm64, true, aarch64-unknown-linux-musl) (push) Failing after 3s
End to End / FUSE Mount (push) Failing after 2s
EC Integration Tests / EC Integration Tests (push) Failing after 30s
FUSE DLM Integration Tests / FUSE DLM Integration Tests (push) Failing after 3s
FUSE Volume Server Failover Tests / FUSE Volume Server Failover (push) Failing after 3s
FUSE Integration Tests / FUSE Integration Testing (push) Failing after 2s
FUSE P2P Peer Chunk Sharing Integration Tests / FUSE P2P Peer Chunk Sharing (push) Failing after 3s
go: build binary / Go Vet (push) Failing after 2s
go: build binary / Go Vet 32-bit (push) Failing after 3s
go: build binary / Build (push) Failing after 4s
go: build binary / Build cross-platform (freebsd/amd64) (push) Failing after 3s
go: build binary / Build cross-platform (windows/amd64) (push) Failing after 3s
go: build binary / Build cross-platform (darwin/arm64) (push) Failing after 3s
go: build binary / Build cross-platform (windows/arm64) (push) Failing after 3s
go: build binary / Test (push) Failing after 2s
go: build binary / Test 32-bit (push) Failing after 3s
helm: lint and test charts / lint-test (push) Failing after 3s
Java Client Integration Tests / Java Integration Tests (11) (push) Failing after 3s
Java Client Integration Tests / Java Integration Tests (17) (push) Failing after 3s
go: build dev binaries / build_dev_linux_windows (amd64, linux) (push) Failing after 2s
go: build dev binaries / build_dev_linux_windows (amd64, windows) (push) Failing after 3s
go: build dev binaries / build_dev_darwin (amd64, darwin) (push) Has been skipped
go: build dev binaries / build_dev_darwin (arm64, darwin) (push) Has been skipped
Java Client Unit Tests / Java Unit Tests (11) (push) Failing after 3s
Java Client Unit Tests / Java Unit Tests (17) (push) Failing after 2s
Java Client Unit Tests / Java Unit Tests (21) (push) Failing after 3s
Java Client Unit Tests / Java Unit Tests (8) (push) Failing after 3s
Kafka Quick Test (Load Test with Schema Registry) / Kafka Client Load Test (Quick) (push) Failing after 3s
Kafka Gateway Tests / Kafka Unit Tests (unit-tests-1) (push) Failing after 11s
Kafka Gateway Tests / Kafka Integration Tests (Critical) (integration-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka End-to-End Tests (with SMQ) (e2e-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka Consumer Group Tests (Highly Isolated) (consumer-group-1) (push) Failing after 2s
Kafka Gateway Tests / Kafka Client Compatibility (with SMQ) (client-compat-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka SMQ Integration Tests (Full Stack) (smq-integration-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka Protocol Tests (Isolated) (protocol-1) (push) Failing after 3s
KMS Tests / KMS Provider Integration Tests (push) Failing after 2s
KMS Tests / S3 KMS End-to-End Tests (push) Failing after 3s
Master Cold Start Tests / Master Cold Start Tests (push) Failing after 4s
Metadata Subscribe Integration Tests / Metadata Subscribe Integration Tests (push) Failing after 3s
Multi-Master Tests / Multi-Master Failover Tests (push) Failing after 3s
Performance / CPU and Heap Profile (push) Failing after 2s
Performance / S3 Read/Write Benchmark (rust volume) (push) Failing after 3s
pjdfstest POSIX Compliance / pjdfstest (push) Failing after 2s
Plugin Worker Integration Tests / Plugin Worker: erasure_coding (push) Failing after 3s
Plugin Worker Integration Tests / Plugin Worker: vacuum (push) Failing after 3s
Rust Volume Server Tests / Rust Integration Tests (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (grpc - Shard 1) (push) Failing after 2s
Rust Volume Server Tests / Go Tests with Rust Volume (http - Shard 1) (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (grpc - Shard 2) (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (http - Shard 2) (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (grpc - Shard 3) (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Distributed Tests (push) Failing after 2s
S3 IAM Integration Tests / S3 IAM Performance Tests (push) Failing after 3s
Performance / Throughput Benchmark (go volume) (push) Failing after 3s
Performance / Throughput Benchmark (rust volume) (push) Failing after 2s
Performance / S3 Read/Write Benchmark (go volume) (push) Failing after 3s
Plugin Worker Integration Tests / Plugin Worker: volume_balance (push) Failing after 3s
PostgreSQL Gateway Tests / PostgreSQL Basic Tests (push) Failing after 3s
Rust Volume Server Tests / Rust Unit Tests (push) Failing after 2s
Rust Volume Server Tests / Go Tests with Rust Volume (http - Shard 3) (push) Failing after 3s
Rust Plugin Worker Tests / Rust Plugin Worker Build and Unit Tests (push) Failing after 3s
rust: build dev volume server binaries / cleanup (push) Successful in 3s
S3 ETag and ACL Tests / S3 ETag + ACL Integration Tests (push) Failing after 3s
S3 IAM Integration Tests / IAM Unit Tests (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Integration Tests (advanced) (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Integration Tests (basic) (push) Failing after 2s
S3 IAM Integration Tests / S3 IAM Integration Tests (group) (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Integration Tests (policy-enforcement) (push) Failing after 2s
S3 IAM Integration Tests / S3 IAM Integration Tests (sts) (push) Failing after 4s
S3 Keycloak Integration Tests / S3 Keycloak Integration Tests (push) Failing after 3s
S3 PyArrow Parquet Tests / PyArrow Parquet Tests (Python 3.11) (push) Failing after 3s
S3 PyArrow Parquet Tests / Go Unit Tests (Implicit Directory) (push) Has been cancelled
S3 PyArrow Parquet Tests / PyArrow Parquet Tests (Python 3.12) (push) Has been cancelled
rust: build dev volume server binaries / build-rust-volume-dev-darwin (darwin-amd64, x86_64-apple-darwin) (push) Has been cancelled
rust: build dev volume server binaries / build-rust-volume-dev-darwin (darwin-arm64, aarch64-apple-darwin) (push) Has been cancelled
rust: build dev volume server binaries / build-rust-volume-dev-linux (linux-amd64, x86_64-unknown-linux-gnu) (push) Has been cancelled
S3 PyArrow Parquet Tests / PyArrow Parquet Tests (Python 3.9) (push) Has been cancelled
S3 Proxy Signature Tests / S3 Proxy Signature Verification Tests (push) Has been cancelled
S3 SDK V2 Route Disambiguation Tests / S3 SDK V2 Routing Tests (push) Has been cancelled
S3 SSE Tests / S3 SSE Integration Tests (quick) (push) Has been cancelled
S3 SSE Tests / S3 SSE Compatibility Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Metadata Persistence Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Copy Operations Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Multipart Upload Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Performance Test (push) Has been cancelled
S3 SSE Tests / S3 Volume Encryption Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Integration Tests (comprehensive) (push) Has been cancelled
Spark Integration Tests / Spark Integration Tests (push) Failing after 2s
Telemetry Integration Tests / telemetry-integration-test (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (grpc - Shard 1) (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (http - Shard 1) (push) Failing after 3s
Ceph S3 tests / Basic S3 tests (KV store) (push) Has been cancelled
Ceph S3 tests / S3 Versioning & Object Lock tests (push) Has been cancelled
S3 Policy Integration Tests / S3 Policy Unit Tests (push) Failing after 3s
Ceph S3 tests / S3 CORS tests (push) Has been cancelled
Ceph S3 tests / SeaweedFS Custom S3 Copy tests (push) Has been cancelled
Ceph S3 tests / Basic S3 tests (SQL store) (push) Has been cancelled
test s3 over https using aws-cli / awscli-tests (push) Has been cancelled
TLS Rotation Integration Tests / TLS Rotation Integration Tests (push) Has been cancelled
Vacuum Integration Tests / Vacuum Integration Tests (push) Has been cancelled
S3 Policy Integration Tests / S3 Policy Variables Integration Tests (push) Failing after 3s
S3 Policy Integration Tests / S3 Policy Enforcement Integration Tests (advanced-policy) (push) Failing after 3s
S3 Policy Integration Tests / S3 Policy Enforcement Integration Tests (basic-policy) (push) Failing after 2s
S3 Policy Integration Tests / S3 Policy Enforcement Integration Tests (contextual-policy) (push) Failing after 4s
S3 Policy Integration Tests / Trusted Proxy Detection Tests (push) Failing after 2s
S3 Policy Integration Tests / S3 Policy Shell Integration Tests (push) Failing after 3s
Samba on FUSE Integration / samba-integration (push) Failing after 2s
SFTP Integration Tests / SFTP Integration Testing (push) Failing after 3s
terraform: validate and test modules / fmt, validate, plan-level tests (push) Failing after 3s
terraform: validate and test modules / local cluster smoke test (real weed) (push) Failing after 2s
Volume Server Integration Tests / Volume Server Integration Tests (grpc - Shard 3) (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (grpc - Shard 2) (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (http - Shard 2) (push) Failing after 2s
Volume Server Integration Tests / Volume Server Integration Tests (http - Shard 3) (push) Failing after 5s
mount: windows conformance / WinFsp conformance (push) Has been cancelled
mount: windows / Mount on Windows (push) Has been cancelled
289 lines
12 KiB
Markdown
289 lines
12 KiB
Markdown
# Rust Volume Server — Missing Features Audit
|
|
|
|
Comprehensive line-by-line comparison of Go vs Rust volume server.
|
|
Generated 2026-03-07 from 4 parallel audits covering HTTP, gRPC, storage, and infrastructure.
|
|
|
|
## Executive Summary
|
|
|
|
| Area | Total Features | Implemented | Partial | Missing |
|
|
|------|---------------|-------------|---------|---------|
|
|
| gRPC RPCs | 48 | 43 (90%) | 2 (4%) | 3 (6%) |
|
|
| HTTP Handlers | 31 | 12 (39%) | 10 (32%) | 9 (29%) |
|
|
| Storage Layer | 22 | 6 (27%) | 7 (32%) | 9 (41%) |
|
|
| Infrastructure | 14 | 5 (36%) | 4 (29%) | 5 (36%) |
|
|
|
|
---
|
|
|
|
## Priority 1 — Critical for Production
|
|
|
|
### P1.1 Streaming / Meta-Only Reads
|
|
- **Go**: `ReadNeedleMeta()`, `ReadNeedleData()`, `ReadPagedData()` — reads only metadata or pages of large files
|
|
- **Go**: `streamWriteResponseContent()` streams needle data in chunks
|
|
- **Go**: `AttemptMetaOnly` / `MustMetaOnly` flags in `ReadOption`
|
|
- **Rust**: Reads entire needle into memory always
|
|
- **Impact**: OOM on large files; 8MB file = 8MB heap per request
|
|
- **Files**: `weed/storage/needle/needle_read.go`, `weed/server/volume_server_handlers_read.go`
|
|
- **Effort**: Medium
|
|
|
|
### P1.2 Download Proxy/Redirect Fallback (ReadMode)
|
|
- **Go**: `ReadMode` config: "local" | "proxy" | "redirect"
|
|
- **Go**: `tryProxyToReplica()` probes replicas, `proxyReqToTargetServer()` streams response
|
|
- **Rust**: Always returns 404 for non-local volumes
|
|
- **Impact**: Clients must handle volume placement themselves; breaks transparent replication
|
|
- **Files**: `weed/server/volume_server_handlers_read.go:138-250`
|
|
- **Effort**: Medium
|
|
|
|
### P1.3 TLS/HTTPS Support
|
|
- **Go**: `LoadServerTLS()`, `LoadClientTLS()`, cert/key loading from security.toml
|
|
- **Go**: Applied to both HTTP and gRPC servers
|
|
- **Rust**: No TLS at all — plain TCP only
|
|
- **Impact**: Cannot deploy in secure clusters
|
|
- **Files**: `weed/security/tls.go`, `weed/command/volume.go`
|
|
- **Effort**: Medium (rustls + tokio-rustls already in Cargo.toml)
|
|
|
|
### P1.4 VolumeMarkReadonly/Writable Master Notification
|
|
- **Go**: `notifyMasterVolumeReadonly()` updates master with readonly state
|
|
- **Rust**: Only sets local in-memory flag
|
|
- **Impact**: Master keeps directing writes to readonly volume
|
|
- **Files**: `weed/server/volume_grpc_admin.go`
|
|
- **Effort**: Low
|
|
|
|
### P1.5 Compaction/Maintenance Throttling
|
|
- **Go**: `WriteThrottler` with `MaybeSlowdown()` for MB/s rate limiting
|
|
- **Rust**: Flags parsed but no throttle implementation
|
|
- **Impact**: Compaction/copy operations can saturate disk IO
|
|
- **Files**: `weed/util/throttler.go`
|
|
- **Effort**: Low
|
|
|
|
### P1.6 File Size Limit Enforcement
|
|
- **Go**: `fileSizeLimitBytes` checked on upload, returns 400
|
|
- **Rust**: No enforcement — accepts any size
|
|
- **Impact**: Can write files larger than volume size limit
|
|
- **Files**: `weed/server/volume_server_handlers_write.go`
|
|
- **Effort**: Low
|
|
|
|
---
|
|
|
|
## Priority 2 — Important for Compatibility
|
|
|
|
### P2.1 `ts` Query Param (Custom Timestamps)
|
|
- **Go**: Upload and delete accept `ts` query param for custom Last-Modified time
|
|
- **Rust**: Always uses current time
|
|
- **Impact**: Replication timestamp fidelity; sync from external sources
|
|
- **Files**: `weed/server/volume_server_handlers_write.go`, `volume_server_handlers_admin.go`
|
|
- **Effort**: Low
|
|
|
|
### P2.2 Multipart Form Upload Parsing
|
|
- **Go**: `needle.CreateNeedleFromRequest()` parses multipart forms, extracts MIME type, custom headers/pairs
|
|
- **Rust**: Reads raw body bytes only — no multipart form parsing for metadata
|
|
- **Impact**: MIME type not stored; custom needle pairs not supported
|
|
- **Files**: `weed/storage/needle/needle.go:CreateNeedleFromRequest`
|
|
- **Effort**: Medium
|
|
|
|
### P2.3 JPEG Orientation Auto-Fix
|
|
- **Go**: `images.FixJpgOrientation()` on upload when enabled
|
|
- **Rust**: Not implemented (flag exists but unused)
|
|
- **Impact**: Mobile uploads may display rotated
|
|
- **Files**: `weed/images/orientation.go`
|
|
- **Effort**: Low (exif crate)
|
|
|
|
### P2.4 TTL Expiration Enforcement
|
|
- **Go**: Checks `HasTtl()` + `AppendAtNs` against current time on read path
|
|
- **Rust**: TTL struct exists but no expiration checking
|
|
- **Impact**: Expired needles still served
|
|
- **Files**: `weed/storage/needle/volume_ttl.go`, `weed/storage/volume_read.go`
|
|
- **Effort**: Low
|
|
|
|
### P2.5 Health Check — Master Heartbeat Status
|
|
- **Go**: Returns 503 if not heartbeating (can't reach master)
|
|
- **Rust**: Only checks `is_stopping` flag
|
|
- **Impact**: Load balancers won't detect disconnected volume servers
|
|
- **Files**: `weed/server/volume_server.go`
|
|
- **Effort**: Low
|
|
|
|
### P2.6 Stats Endpoints
|
|
- **Go**: `/stats/counter`, `/stats/memory`, `/stats/disk` (whitelist-guarded)
|
|
- **Rust**: Not implemented
|
|
- **Impact**: No operational visibility
|
|
- **Files**: `weed/server/volume_server.go`
|
|
- **Effort**: Low
|
|
|
|
### P2.7 Webp Image Support
|
|
- **Go**: `.webp` included in resize-eligible extensions
|
|
- **Rust**: Only `.png`, `.jpg`, `.jpeg`, `.gif`
|
|
- **Impact**: Webp images can't be resized on read
|
|
- **Files**: `weed/server/volume_server_handlers_read.go`
|
|
- **Effort**: Low (add webp feature to image crate)
|
|
|
|
### P2.8 preStopSeconds Graceful Drain
|
|
- **Go**: Stops heartbeat, waits N seconds, then shuts down servers
|
|
- **Rust**: Immediate shutdown on signal
|
|
- **Impact**: In-flight requests dropped; Kubernetes readiness race
|
|
- **Files**: `weed/command/volume.go`
|
|
- **Effort**: Low
|
|
|
|
### P2.9 S3 Response Passthrough Headers
|
|
- **Go**: `response-content-encoding`, `response-expires`, `response-content-language` query params
|
|
- **Rust**: Only handles `response-content-type`, `response-cache-control`, `dl`
|
|
- **Impact**: S3-compatible GET requests missing some override headers
|
|
- **Files**: `weed/server/volume_server_handlers_read.go`
|
|
- **Effort**: Low
|
|
|
|
---
|
|
|
|
## Priority 3 — Storage Layer Gaps
|
|
|
|
### P3.1 LevelDB Needle Maps
|
|
- **Go**: 5 needle map variants: memory, LevelDB, LevelDB-medium, LevelDB-large, sorted-file
|
|
- **Rust**: Memory-only needle map
|
|
- **Impact**: Large volumes (millions of needles) require too much RAM
|
|
- **Files**: `weed/storage/needle_map_leveldb.go`
|
|
- **Effort**: High (need LevelDB binding or alternative)
|
|
|
|
### P3.2 Async Request Processing
|
|
- **Go**: `asyncRequestsChan` with 128-entry queue, worker goroutine for batched writes
|
|
- **Rust**: All writes synchronous
|
|
- **Impact**: Write throughput limited by fsync latency
|
|
- **Files**: `weed/storage/needle/async_request.go`
|
|
- **Effort**: Medium
|
|
|
|
### P3.3 Volume Scrubbing (Data Integrity)
|
|
- **Go**: `ScrubIndex()`, `scrubVolumeData()` — full data + index verification
|
|
- **Rust**: Stub only in gRPC (returns OK without actual scrubbing)
|
|
- **Impact**: No way to verify data integrity
|
|
- **Files**: `weed/storage/volume_checking.go`, `weed/storage/idx/check.go`
|
|
- **Effort**: Medium
|
|
|
|
### P3.4 Volume Backup / Sync
|
|
- **Go**: Streaming backup, binary search for last modification, index generation scanner
|
|
- **Rust**: Not implemented
|
|
- **Impact**: No backup/restore capability
|
|
- **Files**: `weed/storage/volume_backup.go`
|
|
- **Effort**: Medium
|
|
|
|
### P3.5 Volume Info (.vif) Persistence
|
|
- **Go**: `.vif` files store tier/remote metadata, readonly state persists across restarts
|
|
- **Rust**: No `.vif` support; readonly is in-memory only
|
|
- **Impact**: Readonly state lost on restart; no tier metadata
|
|
- **Files**: `weed/storage/volume_info/volume_info.go`
|
|
- **Effort**: Low
|
|
|
|
### P3.6 Disk Location Features
|
|
- **Go**: Directory UUID tracking, disk space monitoring, min-free-space enforcement, tag-based grouping
|
|
- **Rust**: Basic directory only
|
|
- **Impact**: No disk-full protection
|
|
- **Files**: `weed/storage/disk_location.go`
|
|
- **Effort**: Medium
|
|
|
|
### P3.7 Compact Map (Memory-Efficient Needle Map)
|
|
- **Go**: `CompactMap` with overflow handling for memory optimization
|
|
- **Rust**: Uses standard HashMap
|
|
- **Impact**: Higher memory usage for index
|
|
- **Files**: `weed/storage/needle_map/compact_map.go`
|
|
- **Effort**: Medium
|
|
|
|
---
|
|
|
|
## Priority 4 — Nice to Have
|
|
|
|
### P4.1 gRPC: VolumeTierMoveDatToRemote / FromRemote
|
|
- **Go**: Full streaming implementation for tiering volumes to/from S3
|
|
- **Rust**: Stub returning error
|
|
- **Files**: `weed/server/volume_grpc_tier_upload.go`, `volume_grpc_tier_download.go`
|
|
- **Effort**: High
|
|
|
|
### P4.2 gRPC: Query (S3 Select)
|
|
- **Go**: JSON/CSV query over needle data (S3 Select compatible)
|
|
- **Rust**: Stub returning error
|
|
- **Files**: `weed/server/volume_grpc_query.go`
|
|
- **Effort**: High
|
|
|
|
### P4.3 FetchAndWriteNeedle — Already Implemented
|
|
- **Note**: The gRPC audit incorrectly flagged this as missing. It was implemented in a prior session with full S3 remote storage support.
|
|
|
|
### P4.4 JSON Pretty Print + JSONP
|
|
- **Go**: `?pretty` query param for indented JSON; `?callback=fn` for JSONP
|
|
- **Rust**: Neither supported
|
|
- **Effort**: Low
|
|
|
|
### P4.5 Request ID Generation
|
|
- **Go**: Generates UUID if `x-amz-request-id` header missing, propagates to gRPC context
|
|
- **Rust**: Only echoes existing header
|
|
- **Effort**: Low
|
|
|
|
### P4.6 UI Status Page
|
|
- **Go**: Full HTML template with volumes, disks, stats, uptime
|
|
- **Rust**: Stub HTML
|
|
- **Effort**: Medium
|
|
|
|
### P4.7 Advanced Prometheus Metrics
|
|
- **Go**: InFlightRequestsGauge, ConcurrentUploadLimit/DownloadLimit gauges, metrics push gateway
|
|
- **Rust**: Basic request counter and histogram only
|
|
- **Effort**: Low
|
|
|
|
### P4.8 Profiling (pprof)
|
|
- **Go**: CPU/memory profiling, /debug/pprof endpoints
|
|
- **Rust**: Flags parsed but not wired
|
|
- **Effort**: Medium (tokio-console or pprof-rs)
|
|
|
|
### P4.9 EC Distribution / Rebalancing
|
|
- **Go**: 17 files for EC operations including placement strategies, recovery, scrubbing
|
|
- **Rust**: 6 files with basic encoder/decoder
|
|
- **Effort**: High
|
|
|
|
### P4.10 Cookie Mismatch Status Code
|
|
- **Go**: Returns 406 Not Acceptable
|
|
- **Rust**: Returns 400 Bad Request
|
|
- **Effort**: Trivial
|
|
|
|
---
|
|
|
|
## Implementation Order Recommendation
|
|
|
|
### Sprint 1 — Quick Wins (Low effort, high impact) ✅ DONE
|
|
1. ✅ P1.4 VolumeMarkReadonly master notification — triggers immediate heartbeat
|
|
2. ✅ P1.5 Compaction throttling — `maybe_throttle_compaction()` method added
|
|
3. ✅ P1.6 File size limit enforcement — checks `file_size_limit_bytes` on upload
|
|
4. ✅ P2.1 `ts` query param — custom timestamps for upload and delete
|
|
5. ✅ P2.4 TTL expiration check — was already implemented
|
|
6. ✅ P2.5 Health check heartbeat status — returns 503 if not heartbeating
|
|
7. ✅ P2.8 preStopSeconds — graceful drain delay before shutdown
|
|
8. ✅ P2.9 S3 passthrough headers — content-encoding, expires, content-language, content-disposition
|
|
9. ✅ P3.5 .vif persistence — readonly state persists across restarts
|
|
10. ✅ P2.7 Webp support — added to image resize-eligible extensions
|
|
11. ~~P4.10 Cookie 406~~ — Go actually uses 404 for HTTP cookie mismatch (406 is gRPC batch delete only)
|
|
|
|
### Sprint 2 — Core Read Path (Medium effort) — Partially Done
|
|
1. P1.1 Streaming / meta-only reads — TODO (medium effort, no test coverage yet)
|
|
2. ✅ P1.2 ReadMode proxy/redirect — was already implemented and tested
|
|
3. ✅ P2.2 Multipart form parsing — MIME type extraction from Content-Type header
|
|
4. P2.3 JPEG orientation fix — TODO (low effort, needs exif crate)
|
|
5. ✅ P2.6 Stats endpoints — /stats/counter, /stats/memory, /stats/disk
|
|
6. ✅ P2.7 Webp support — done in Sprint 1
|
|
7. ✅ P4.4 JSON pretty print + JSONP — ?pretty=y and ?callback=fn
|
|
8. ✅ P4.5 Request ID generation — generates UUID if x-amz-request-id missing
|
|
9. ✅ P4.7 Advanced Prometheus metrics — INFLIGHT_REQUESTS gauge, VOLUME_FILE_COUNT gauge
|
|
|
|
### Sprint 3 — Infrastructure (Medium effort) — Partially Done
|
|
1. ✅ P1.3 TLS/HTTPS — rustls + tokio-rustls for HTTP, tonic ServerTlsConfig for gRPC
|
|
2. P3.2 Async request processing — TODO (medium effort)
|
|
3. ✅ P3.3 Volume scrubbing — CRC checksum verification of all needles
|
|
4. ✅ P3.6 Disk location features — MinFreeSpace enforcement, background disk monitor
|
|
|
|
### Sprint 4 — Storage Advanced (High effort) — Deferred
|
|
No integration test coverage for these items. All existing tests pass.
|
|
1. P3.1 LevelDB needle maps — needed only for volumes with millions of needles
|
|
2. P3.4 Volume backup/sync — streaming backup, binary search
|
|
3. P3.7 Compact map — memory optimization for needle index
|
|
4. P4.1 VolumeTierMoveDat — full S3 tiering (currently error stub)
|
|
5. P4.9 EC distribution — advanced EC placement/rebalancing
|
|
|
|
### Sprint 5 — Polish — Deferred
|
|
No integration test coverage for these items.
|
|
1. P4.2 Query (S3 Select) — JSON/CSV query over needle data
|
|
2. ✅ P4.4 JSON pretty/JSONP — done in Sprint 2
|
|
3. ✅ P4.5 Request ID generation — done in Sprint 2
|
|
4. P4.6 UI status page — HTML template with volume/disk/stats info
|
|
5. ✅ P4.7 Advanced metrics — done in Sprint 2
|
|
6. P4.8 Profiling — pprof-rs or tokio-console
|