Files
seaweedfs/weed/storage/blockvol/adapter.go
T
Ping QiuandClaude Opus 4.6 80801b0fac feat: Phase 3 — performance tuning, iSCSI session refactor, store integration
Phase 3 delivers five checkpoints:

CP1 Engine Tuning: BlockVolConfig tunables, 256-shard DirtyMap, adaptive
group commit (low-watermark immediate flush), WAL pressure handling with
backpressure and ErrWALFull timeout.

CP2 iSCSI Session Refactor: RX/TX goroutine split with respCh (cap 64),
txLoop for serialized response writes, StatSN assignment modes. Login
phase stays single-goroutine; full-duplex after login.

CP3 Store Integration: BlockVolAdapter (iscsi.BlockDevice interface),
BlockVolumeStore management, BlockService in volume_server_block.go,
CLI flags (--block.listen/dir/iqn.prefix), sw-block-attach.sh helper.

CP5 Concurrency Hardening: WAL reuse guard (LSN validation in ReadLBA),
opsOutstanding counter with beginOp/endOp + Close drain, appendWithRetry
shared by WriteLBA and TrimLBA, flusher LSN guard in FlushOnce.

Bug fixes (P3-BUG-2–11): unbounded pending queue cap, Data-Out timeout,
flusher error logging, GroupCommitter panic recovery, Close vs concurrent
ops guard, target shutdown race, WAL-full retry vs Close, WRITE SAME(16)
for XFS, MODE SENSE(10) + VPD 0xB0/0xB2 for Linux kernel compatibility.

797 tests passing (517 engine + 280 iSCSI), go vet clean.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 10:43:34 -08:00

48 lines
1.2 KiB
Go

package blockvol
import (
"github.com/seaweedfs/seaweedfs/weed/storage/blockvol/iscsi"
)
// BlockVolAdapter wraps a *BlockVol to implement the iscsi.BlockDevice interface,
// bridging the BlockVol storage engine to iSCSI target sessions.
type BlockVolAdapter struct {
vol *BlockVol
}
// NewBlockVolAdapter creates a BlockDevice adapter for the given BlockVol.
func NewBlockVolAdapter(vol *BlockVol) *BlockVolAdapter {
return &BlockVolAdapter{vol: vol}
}
func (a *BlockVolAdapter) ReadAt(lba uint64, length uint32) ([]byte, error) {
return a.vol.ReadLBA(lba, length)
}
func (a *BlockVolAdapter) WriteAt(lba uint64, data []byte) error {
return a.vol.WriteLBA(lba, data)
}
func (a *BlockVolAdapter) Trim(lba uint64, length uint32) error {
return a.vol.Trim(lba, length)
}
func (a *BlockVolAdapter) SyncCache() error {
return a.vol.SyncCache()
}
func (a *BlockVolAdapter) BlockSize() uint32 {
return a.vol.Info().BlockSize
}
func (a *BlockVolAdapter) VolumeSize() uint64 {
return a.vol.Info().VolumeSize
}
func (a *BlockVolAdapter) IsHealthy() bool {
return a.vol.Info().Healthy
}
// Compile-time check that BlockVolAdapter implements iscsi.BlockDevice.
var _ iscsi.BlockDevice = (*BlockVolAdapter)(nil)