mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-09-20 13:30:46 +02: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>
38 lines
982 B
Go
38 lines
982 B
Go
package volumev2
|
|
|
|
import "fmt"
|
|
|
|
// Orchestrator closes the MVP control loop:
|
|
// heartbeat -> assignments -> local apply.
|
|
type Orchestrator struct {
|
|
node *Node
|
|
session ControlSession
|
|
}
|
|
|
|
// NewOrchestrator creates a small volumev2 control/data orchestrator.
|
|
func NewOrchestrator(node *Node, session ControlSession) (*Orchestrator, error) {
|
|
if node == nil {
|
|
return nil, fmt.Errorf("volumev2: node is nil")
|
|
}
|
|
if session == nil {
|
|
return nil, fmt.Errorf("volumev2: control session is nil")
|
|
}
|
|
return &Orchestrator{node: node, session: session}, nil
|
|
}
|
|
|
|
// SyncOnce reports one heartbeat and applies any returned assignments.
|
|
func (o *Orchestrator) SyncOnce() error {
|
|
if o == nil || o.node == nil || o.session == nil {
|
|
return fmt.Errorf("volumev2: orchestrator is not initialized")
|
|
}
|
|
hb, err := o.node.Heartbeat()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
assignments, err := o.session.Heartbeat(hb)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return o.node.ApplyAssignments(assignments)
|
|
}
|