You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

plan_builder.go 2.1 kB

1 year ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package exec
  2. import (
  3. "context"
  4. "strings"
  5. "gitlink.org.cn/cloudream/common/pkgs/future"
  6. "gitlink.org.cn/cloudream/common/utils/lo2"
  7. )
  8. type PlanBuilder struct {
  9. NextVarID VarID
  10. WorkerPlans []*WorkerPlanBuilder
  11. DriverPlan DriverPlanBuilder
  12. }
  13. func NewPlanBuilder() *PlanBuilder {
  14. bld := &PlanBuilder{
  15. NextVarID: VarID(1),
  16. DriverPlan: DriverPlanBuilder{},
  17. }
  18. return bld
  19. }
  20. func (b *PlanBuilder) AtDriver() *DriverPlanBuilder {
  21. return &b.DriverPlan
  22. }
  23. func (b *PlanBuilder) AtWorker(worker WorkerInfo) *WorkerPlanBuilder {
  24. for _, p := range b.WorkerPlans {
  25. if p.Worker.Equals(worker) {
  26. return p
  27. }
  28. }
  29. p := &WorkerPlanBuilder{
  30. Worker: worker,
  31. }
  32. b.WorkerPlans = append(b.WorkerPlans, p)
  33. return p
  34. }
  35. func (b *PlanBuilder) NewVar() VarID {
  36. id := b.NextVarID
  37. b.NextVarID++
  38. return id
  39. }
  40. func (b *PlanBuilder) Execute(ctx *ExecContext) *Driver {
  41. c, cancel := context.WithCancel(ctx.Context)
  42. ctx.Context = c
  43. planID := genRandomPlanID()
  44. execPlan := Plan{
  45. ID: planID,
  46. Ops: b.DriverPlan.Ops,
  47. }
  48. exec := Driver{
  49. planID: planID,
  50. planBlder: b,
  51. callback: future.NewSetValue[map[string]VarValue](),
  52. ctx: ctx,
  53. cancel: cancel,
  54. driverExec: NewExecutor(execPlan),
  55. }
  56. go exec.execute()
  57. return &exec
  58. }
  59. func (b *PlanBuilder) String() string {
  60. sb := strings.Builder{}
  61. sb.WriteString("Driver:\n")
  62. for _, op := range b.DriverPlan.Ops {
  63. sb.WriteString(op.String())
  64. sb.WriteRune('\n')
  65. }
  66. sb.WriteRune('\n')
  67. for _, w := range b.WorkerPlans {
  68. sb.WriteString("Worker(")
  69. sb.WriteString(w.Worker.String())
  70. sb.WriteString("):\n")
  71. for _, op := range w.Ops {
  72. sb.WriteString(op.String())
  73. sb.WriteRune('\n')
  74. }
  75. sb.WriteRune('\n')
  76. }
  77. return sb.String()
  78. }
  79. type WorkerPlanBuilder struct {
  80. Worker WorkerInfo
  81. Ops []Op
  82. }
  83. func (b *WorkerPlanBuilder) AddOp(op Op) {
  84. b.Ops = append(b.Ops, op)
  85. }
  86. func (b *WorkerPlanBuilder) RemoveOp(op Op) {
  87. b.Ops = lo2.Remove(b.Ops, op)
  88. }
  89. type DriverPlanBuilder struct {
  90. Ops []Op
  91. }
  92. func (b *DriverPlanBuilder) AddOp(op Op) {
  93. b.Ops = append(b.Ops, op)
  94. }
  95. func (b *DriverPlanBuilder) RemoveOp(op Op) {
  96. b.Ops = lo2.Remove(b.Ops, op)
  97. }