mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-08-22 07:06:51 +00:00
V2 runtime packages: - sw-block/runtime/masterv2: identity authority (desired state, heartbeat handling, promotion arbitration via SelectPromotionCandidate) - sw-block/runtime/volumev2: per-volume micro-cluster shell (node, orchestrator, control session, iSCSI frontend, takeover gate, failover session + driver, replica summary reconstruction) - sw-block/runtime/purev2: RF1 execution shell (engine + store + dispatcher + local boundary observations) - sw-block/runtime/protocolv2: three-channel separation (heartbeat/assignment/query + replica summary) V2 binaries: - sw-block/cmd/v2singleblock: single-node RF1 block server - sw-block/cmd/purev2rf1: minimal RF1 runtime binary Milestone capabilities: - RF1 write/read/sync with engine-driven mode projection - masterv2 ↔ volumev2 heartbeat convergence + assignment reissue - Promotion query with fresh CommittedLSN/WALHeadLSN evidence - Replica summary for bounded takeover reconstruction - Primary-loss reconstruction from peer summaries (fail-closed gate) - In-process failover driver with session observability - Local boundary observations feed engine (Committed/Durable/Checkpoint) Design docs: - v2-two-loop-protocol.md: identity vs data-control separation - v2-automata-ownership-map.md: event/command ownership split - v2-loop1-surface-draft.md: heartbeat/query/assignment field spec - v2-volumev2-single-node-mvp.md: target layering - v2-kernel-closure-review.md: per-volume micro-cluster principle - v2-pure-runtime-rf1-bootstrap.md, v2-capability-map.md, v2-proof-and-retest-pyramid.md Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
84 lines
2.7 KiB
Go
84 lines
2.7 KiB
Go
package volumev2
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/seaweedfs/seaweedfs/sw-block/runtime/purev2"
|
|
"github.com/seaweedfs/seaweedfs/weed/storage/blockvol"
|
|
)
|
|
|
|
// DataPlane is the minimal single-node execution contract for volumev2.
|
|
// It keeps backend mechanics replaceable while volumev2 owns the control shell.
|
|
type DataPlane interface {
|
|
BootstrapPrimary(path string, opts blockvol.CreateOptions, epoch uint64, leaseTTL time.Duration) error
|
|
WriteLBA(path string, lba uint64, data []byte) error
|
|
ReadLBA(path string, lba uint64, length uint32) ([]byte, error)
|
|
SyncCache(path string) error
|
|
Snapshot(path string) (purev2.VolumeDebugSnapshot, error)
|
|
WithVolume(path string, fn func(*blockvol.BlockVol) error) error
|
|
Close()
|
|
}
|
|
|
|
// PureRuntimeDataPlane adapts the current purev2 runtime as a volumev2 data plane.
|
|
type PureRuntimeDataPlane struct {
|
|
runtime *purev2.Runtime
|
|
}
|
|
|
|
// NewPureRuntimeDataPlane wraps one purev2 runtime behind the DataPlane contract.
|
|
func NewPureRuntimeDataPlane(runtime *purev2.Runtime) (*PureRuntimeDataPlane, error) {
|
|
if runtime == nil {
|
|
return nil, fmt.Errorf("volumev2: pure runtime is nil")
|
|
}
|
|
return &PureRuntimeDataPlane{runtime: runtime}, nil
|
|
}
|
|
|
|
func (dp *PureRuntimeDataPlane) BootstrapPrimary(path string, opts blockvol.CreateOptions, epoch uint64, leaseTTL time.Duration) error {
|
|
if dp == nil || dp.runtime == nil {
|
|
return fmt.Errorf("volumev2: data plane is nil")
|
|
}
|
|
return dp.runtime.BootstrapPrimary(path, opts, epoch, leaseTTL)
|
|
}
|
|
|
|
func (dp *PureRuntimeDataPlane) WriteLBA(path string, lba uint64, data []byte) error {
|
|
if dp == nil || dp.runtime == nil {
|
|
return fmt.Errorf("volumev2: data plane is nil")
|
|
}
|
|
return dp.runtime.WriteLBA(path, lba, data)
|
|
}
|
|
|
|
func (dp *PureRuntimeDataPlane) ReadLBA(path string, lba uint64, length uint32) ([]byte, error) {
|
|
if dp == nil || dp.runtime == nil {
|
|
return nil, fmt.Errorf("volumev2: data plane is nil")
|
|
}
|
|
return dp.runtime.ReadLBA(path, lba, length)
|
|
}
|
|
|
|
func (dp *PureRuntimeDataPlane) SyncCache(path string) error {
|
|
if dp == nil || dp.runtime == nil {
|
|
return fmt.Errorf("volumev2: data plane is nil")
|
|
}
|
|
return dp.runtime.SyncCache(path)
|
|
}
|
|
|
|
func (dp *PureRuntimeDataPlane) Snapshot(path string) (purev2.VolumeDebugSnapshot, error) {
|
|
if dp == nil || dp.runtime == nil {
|
|
return purev2.VolumeDebugSnapshot{}, fmt.Errorf("volumev2: data plane is nil")
|
|
}
|
|
return dp.runtime.Snapshot(path)
|
|
}
|
|
|
|
func (dp *PureRuntimeDataPlane) WithVolume(path string, fn func(*blockvol.BlockVol) error) error {
|
|
if dp == nil || dp.runtime == nil {
|
|
return fmt.Errorf("volumev2: data plane is nil")
|
|
}
|
|
return dp.runtime.WithVolume(path, fn)
|
|
}
|
|
|
|
func (dp *PureRuntimeDataPlane) Close() {
|
|
if dp == nil || dp.runtime == nil {
|
|
return
|
|
}
|
|
dp.runtime.Close()
|
|
}
|