mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-10-20 04:54:24 +02:00
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>
48 lines
1.2 KiB
Go
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)
|