Commit Graph

39 Commits

Author SHA1 Message Date
Lei Xue
a5628f4ec0 add end-to-end IO benchmarks and fix pprof-identified hotspots
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>
2026-03-14 19:41:48 +08:00
Lei Xue
f1cec4f5d4 fix regex, remove unsafe pointer usage, and add graceful HTTP shutdown
- 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>
2026-03-14 18:27:56 +08:00
Lei Xue
36149cd4a9 support more SCSI commands: ReadDefectData, Sanitize, and expanded CI
New SCSI commands implemented:
- READ DEFECT DATA(10/12): returns empty defect list (virtual device)
- SANITIZE: supports OVERWRITE and BLOCK ERASE (zeros all blocks)
- EXTENDED COPY / RECEIVE COPY RESULTS: registered as unsupported

New unit tests for ReadDefectData10/12, Sanitize, and command registration.

New CI libiscsi test cases:
- PersistentReservation (PrinReadKeys, PrinReportCapabilities,
  ProutRegister, ProutReserve)
- ReadDefectData10/12 (Simple)
- CompareAndWrite (Simple)
- OrWrite (Simple, BeyondEol, ZeroBlocks)
- GetLBAStatus (Simple, BeyondEol)
- ReportSupportedOpcodes (OneCommand)

Partial fix for #55

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 13:06:35 +08:00
Lei Xue
3c41cd619b Merge pull request #123 from gostor/fix/unmap-data-corruption
fix UNMAP data corruption by implementing block zeroing
2026-03-14 12:31:48 +08:00
Lei Xue
00d0c3a306 fix UNMAP data corruption by implementing block zeroing
The UNMAP command was a no-op in all backing stores, causing unmapped
blocks to retain stale data instead of returning zeros per SCSI spec.

- Implement Unmap in FileBackingStore to zero out unmapped blocks
- Implement Unmap in IOUringBackingStore to zero out unmapped blocks
- Enable Unmap in RemBackingStore (was commented out)
- Change UnmapBlockDescriptor.TL from uint32 to uint64 to prevent
  integer overflow when converting block count to byte length with
  large block shifts

Fixes #119

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 12:29:12 +08:00
Lei Xue
b2776dc5c2 fix critical bugs and improve iSCSI protocol compliance
- Fix nil pointer dereference in BindISCSISession when existSess is nil
- Fix reversed logic in SPCLuOffline/SPCLuOnline (Online flag was swapped)
- Use negotiated MaxXmitDataSegmentLength for response PDU segmentation (issue #41)
- Fix debug log incorrectly using Warn level in SBCGetLbaStatus

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 12:11:23 +08:00
Lei Xue
00cfac3d24 optimize the perf and support more features 2026-03-14 11:45:35 +08:00
Utkarsh Mani Tripathi
d7891b1f68 Implement stats and resize and fix remote backing store apis
- 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>
2019-11-20 14:34:35 +05:30
Utkarsh Mani Tripathi
d7caf89610 Implement InitSCSILuMap func for jiva
Signed-off-by: Utkarsh Mani Tripathi <utkarsh.tripathi@mayadata.io>
2019-11-19 10:19:58 +05:30
Utkarsh Mani Tripathi
3b8e996a6c Reply with LUN busy when there is a read/write error from backend
Signed-off-by: Utkarsh Mani Tripathi <utkarsh.tripathi@mayadata.io>
2019-11-18 16:30:46 +05:30
Utkarsh Mani Tripathi
e5339f347a Add nil pointer check for InSDBBuffer
- 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>
2019-11-18 15:56:34 +05:30
chessman
0b1ffd5704 provide offset and tl to DataSync 2019-06-27 19:54:16 +03:00
chessman
8d17243b3a update dependencies 2019-06-12 19:10:59 +03:00
Lei Xue
3a9dceae6e Merge pull request #79 from datomia/thin-provisioned-lun
enable UNMAP when LUN is thin provisioned
2019-06-10 18:17:52 +08:00
chessman
e2b7ea4891 rename: Thinprovisioning -> ThinProvisioning 2019-06-10 12:42:21 +03:00
chessman
c8962b89db MODE SENSE: ALLOCATION LENGTH shouldn't affect a size in response 2019-05-31 14:09:32 +03:00
chessman
12b06c21ef UNMAP: propagate request to backing store 2019-05-29 16:14:31 +03:00
chessman
22d47a9212 enable UNMAP when LUN is thin provisioned
- support Block Limits VPD page (0xB0)
 - add UNMAP to REPORT SUPPORTED OPERATION CODES
 - READ CAPACITY(16): set LBPME when Thin provisioning is enabled
 - move Thinprovisioning and BlockShift to config
 - add Unmap to BackingStore
2019-05-28 13:53:06 +03:00
Lei Xue
4ae643e9f8 perf 2017-07-31 21:47:38 +08:00
Lei Xue
eeb30723c8 fix bugs 2017-07-09 09:33:34 +08:00
Lei Xue
8ce8ade3d4 update ModeSense6 function 2017-07-05 21:23:13 +08:00
Lei Xue
a523a583dc fix some issues for SCSI command 2017-06-24 12:09:05 +08:00
Lei Xue
d3c3a96920 delete cit to use new gotgt as main cmd, use logrus instead of glog 2016-11-29 11:21:40 +08:00
Lei Xue
18e1419b06 fix verify and add verify test cases 2016-11-28 16:26:05 +08:00
Lei Xue
05b6f88de4 restruct the backend storage command submit 2016-11-28 11:11:24 +08:00
Lei Xue
bd7193880e basic change for godoc 2016-11-27 13:31:43 +08:00
Le Zhang
82e6d230a2 PR implementation 2016-11-24 23:16:53 +08:00
Lei Xue
f4197d0024 add more comments 2016-11-24 21:02:17 +08:00
Le Zhang
547faf684d iSCSI/SCSI multi port/ALUA support
fix ALUA flag issue
fix NNA flag issue
fix fixed format sense data builder issue
2016-10-18 16:59:25 +08:00
Le Zhang
a51a1d8d00 inquiry page00h page80h page83h 2016-10-10 12:13:51 +08:00
Le Zhang
681f1003b9 bunch of bug fixes with dummy lun0 feature
1) add dummy lun0
2) fix report lun
3) fix inquiry command with correct version
2016-10-08 12:40:24 +08:00
Le Zhang
c9b93c7527 mapping lun and fix portal management 2016-10-04 13:39:55 +08:00
Lei Xue
d6108f0a88 fix several bugs during read/write operations 2016-09-25 18:44:34 +08:00
Lei Xue
aedc09021f fix bugs and make it run basically 2016-08-27 20:07:51 +08:00
Lei Xue
c5d68b38b2 run the basic process with iscsi driver 2016-05-02 22:11:33 +08:00
Lei Xue
d770eb33ac init commit for spc/sbc 2015-12-27 20:44:54 +08:00
Le Zhang
5f197d8035 make it compileable. 2015-12-16 00:04:55 +08:00
Lei Xue
76a5628e98 general framework for SBC/SPC 2015-12-14 22:28:00 +08:00
Lei Xue
a9a7d63c20 init commit 2015-12-14 10:23:35 +08:00