|
- package exec
-
- import (
- "context"
- "strings"
-
- "gitlink.org.cn/cloudream/common/pkgs/future"
- "gitlink.org.cn/cloudream/common/utils/lo2"
- )
-
- type PlanBuilder struct {
- NextVarID VarID
- WorkerPlans []*WorkerPlanBuilder
- DriverPlan DriverPlanBuilder
- }
-
- func NewPlanBuilder() *PlanBuilder {
- bld := &PlanBuilder{
- NextVarID: VarID(1),
- DriverPlan: DriverPlanBuilder{},
- }
-
- return bld
- }
-
- func (b *PlanBuilder) AtDriver() *DriverPlanBuilder {
- return &b.DriverPlan
- }
-
- func (b *PlanBuilder) AtWorker(worker WorkerInfo) *WorkerPlanBuilder {
- for _, p := range b.WorkerPlans {
- if p.Worker.Equals(worker) {
- return p
- }
- }
-
- p := &WorkerPlanBuilder{
- Worker: worker,
- }
- b.WorkerPlans = append(b.WorkerPlans, p)
-
- return p
- }
-
- func (b *PlanBuilder) NewVar() VarID {
- id := b.NextVarID
- b.NextVarID++
-
- return id
- }
-
- func (b *PlanBuilder) Execute(ctx *ExecContext) *Driver {
- c, cancel := context.WithCancel(ctx.Context)
- ctx.Context = c
-
- planID := genRandomPlanID()
-
- execPlan := Plan{
- ID: planID,
- Ops: b.DriverPlan.Ops,
- }
-
- exec := Driver{
- planID: planID,
- planBlder: b,
- callback: future.NewSetValue[PlanResult](),
- ctx: ctx,
- cancel: cancel,
- driverExec: NewExecutor(execPlan, Location{IsDriver: true}),
- }
- go exec.execute()
-
- return &exec
- }
-
- func (b *PlanBuilder) String() string {
- sb := strings.Builder{}
- sb.WriteString("Driver:\n")
- for _, op := range b.DriverPlan.Ops {
- sb.WriteString(op.String())
- sb.WriteRune('\n')
- }
- sb.WriteRune('\n')
-
- for _, w := range b.WorkerPlans {
- sb.WriteString("Worker(")
- sb.WriteString(w.Worker.String())
- sb.WriteString("):\n")
- for _, op := range w.Ops {
- sb.WriteString(op.String())
- sb.WriteRune('\n')
- }
- sb.WriteRune('\n')
- }
-
- return sb.String()
- }
-
- type WorkerPlanBuilder struct {
- Worker WorkerInfo
- 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
- }
-
- 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)
- }
|