|
- package exec
-
- import (
- "context"
- "sync"
-
- "gitlink.org.cn/cloudream/common/pkgs/future"
- cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
- "gitlink.org.cn/cloudream/common/utils/lo2"
- )
-
- type PlanBuilder struct {
- Vars []Var
- WorkerPlans map[cdssdk.NodeID]*WorkerPlanBuilder
- DriverPlan DriverPlanBuilder
- }
-
- func NewPlanBuilder() *PlanBuilder {
- bld := &PlanBuilder{
- WorkerPlans: make(map[cdssdk.NodeID]*WorkerPlanBuilder),
- DriverPlan: DriverPlanBuilder{
- StoreMap: &sync.Map{},
- },
- }
-
- return bld
- }
-
- func (b *PlanBuilder) AtExecutor() *DriverPlanBuilder {
- return &b.DriverPlan
- }
-
- func (b *PlanBuilder) AtAgent(node cdssdk.Node) *WorkerPlanBuilder {
- agtPlan, ok := b.WorkerPlans[node.NodeID]
- if !ok {
- agtPlan = &WorkerPlanBuilder{
- Node: node,
- }
- b.WorkerPlans[node.NodeID] = agtPlan
- }
-
- return agtPlan
- }
-
- func (b *PlanBuilder) NewStreamVar() *StreamVar {
- v := &StreamVar{
- ID: VarID(len(b.Vars)),
- }
- b.Vars = append(b.Vars, v)
-
- return v
- }
-
- func (b *PlanBuilder) NewIntVar() *IntVar {
- v := &IntVar{
- ID: VarID(len(b.Vars)),
- }
- b.Vars = append(b.Vars, v)
-
- return v
- }
-
- func (b *PlanBuilder) NewStringVar() *StringVar {
- v := &StringVar{
- ID: VarID(len(b.Vars)),
- }
- b.Vars = append(b.Vars, v)
-
- return v
- }
- func (b *PlanBuilder) NewSignalVar() *SignalVar {
- v := &SignalVar{
- ID: VarID(len(b.Vars)),
- }
- b.Vars = append(b.Vars, v)
-
- return v
- }
-
- func (b *PlanBuilder) Execute() *Driver {
- ctx, cancel := context.WithCancel(context.Background())
- planID := genRandomPlanID()
-
- execPlan := Plan{
- ID: planID,
- Ops: b.DriverPlan.Ops,
- }
-
- exec := Driver{
- planID: planID,
- planBlder: b,
- callback: future.NewSetVoid(),
- ctx: ctx,
- cancel: cancel,
- driverExec: NewExecutor(execPlan),
- }
- go exec.execute()
-
- return &exec
- }
-
- type WorkerPlanBuilder struct {
- Node cdssdk.Node
- Ops []Op
- }
-
- func (b *WorkerPlanBuilder) AddOp(op Op) {
- b.Ops = append(b.Ops, op)
- }
-
- func (b *WorkerPlanBuilder) RemoveOp(op Op) {
- b.Ops = lo2.Remove(b.Ops, op)
- }
-
- type DriverPlanBuilder struct {
- Ops []Op
- StoreMap *sync.Map
- }
-
- func (b *DriverPlanBuilder) AddOp(op Op) {
- b.Ops = append(b.Ops, op)
- }
-
- func (b *DriverPlanBuilder) RemoveOp(op Op) {
- b.Ops = lo2.Remove(b.Ops, op)
- }
|