Add comprehensive benchmark suite (io_bench_test.go):
- BenchmarkEndToEndRead/Write: full SCSI stack (512B to 256KB)
- BenchmarkEndToEndReadParallel/WriteParallel: concurrent IO
- BenchmarkFileBackingStoreRead/Write: isolated backing store
pprof-guided optimizations:
- Guard hot-path log.Debugf with log.GetLevel() check in scsi.go,
sbc.go, backingstore.go — eliminates 22% CPU overhead from logrus
Entry allocation even when debug logging is disabled
- Add FileBackingStore.ReadAt for zero-copy reads directly into
caller's buffer, bypassing Read()'s per-call make([]byte, tl)
- Use ReadAt via interface assertion in bsPerformCommand to read
directly into InSDBBuffer, eliminating allocation + copy
Results (256KB reads): +42% throughput, allocs reduced from 10 to 5
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Fix versionMatcher regex: gorilla/mux does not support (?:) syntax,
and -dirty suffix was required instead of optional
- Replace unsafe.Pointer LUN casts with binary.LittleEndian.Uint64
in sbc.go, scsi.go, and target.go
- Implement graceful HTTP server shutdown with 5s timeout using
srv.Shutdown() instead of raw listener close
- Replace golang.org/x/net/context with standard library context
- Respect existing req.Cancel value in canceler to avoid overwriting
- Add early context cancellation check in Do() to fail fast
Based on review of PR #120 by @orzhang, with fixes applied.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Convert constant to var so that it can be configured from backend
- Add options to disable persistent reservation and ORWrite16 commands
Signed-off-by: Utkarsh Mani Tripathi <utkarsh.tripathi@mayadata.io>
- Gotgt was crashing for few opcodes (sg_inq (sg3-utils)) because InSDBBuffer
was not initialized for such opcodes (Need help)
Signed-off-by: Utkarsh Mani Tripathi <utkarsh.tripathi@mayadata.io>