github.com/matrixorigin/matrixone@v0.7.0/pkg/vm/engine/tae/tasks/ops/ops.go (about) 1 // Copyright 2021 Matrix Origin 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package ops 16 17 import ( 18 "time" 19 20 "github.com/matrixorigin/matrixone/pkg/common/moerr" 21 iops "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/tasks/ops/base" 22 iworker "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/tasks/worker/base" 23 ) 24 25 func NewOp(impl iops.IOpInternal, w iworker.IOpWorker) *Op { 26 op := &Op{ 27 Impl: impl, 28 Worker: w, 29 CreateTime: time.Now(), 30 } 31 return op 32 } 33 34 func (op *Op) Push() error { 35 r := op.Worker.SendOp(op) 36 if !r { 37 return moerr.NewInternalErrorNoCtx("send op error") 38 } 39 return nil 40 } 41 42 func (op *Op) GetError() error { 43 return op.Err 44 } 45 46 func (op *Op) SetError(err error) { 47 op.EndTime = time.Now() 48 op.Err = err 49 if op.ErrorC != nil { 50 op.ErrorC <- err 51 } else if op.DoneCB != nil { 52 op.DoneCB(op) 53 } else { 54 panic("logic error") 55 } 56 if op.Observers != nil { 57 for _, observer := range op.Observers { 58 observer.OnExecDone(op.Impl) 59 } 60 } 61 } 62 63 func (op *Op) Waitable() bool { 64 return op.DoneCB == nil 65 } 66 67 func (op *Op) WaitDone() error { 68 err := <-op.ErrorC 69 return err 70 } 71 72 func (op *Op) PreExecute() error { 73 return nil 74 } 75 76 func (op *Op) PostExecute() error { 77 return nil 78 } 79 80 func (op *Op) Execute() error { 81 return nil 82 } 83 84 func (op *Op) OnExec() error { 85 op.StartTime = time.Now() 86 err := op.Impl.PreExecute() 87 if err != nil { 88 return err 89 } 90 err = op.Impl.Execute() 91 if err != nil { 92 return err 93 } 94 err = op.Impl.PostExecute() 95 return err 96 } 97 98 func (op *Op) GetCreateTime() time.Time { 99 return op.CreateTime 100 } 101 102 func (op *Op) GetStartTime() time.Time { 103 return op.StartTime 104 } 105 106 func (op *Op) GetEndTime() time.Time { 107 return op.EndTime 108 } 109 110 func (op *Op) GetExecutTime() int64 { 111 return op.EndTime.Sub(op.StartTime).Microseconds() 112 } 113 114 func (op *Op) AddObserver(o iops.Observer) { 115 if op.Observers == nil { 116 op.Observers = make([]iops.Observer, 0) 117 } 118 op.Observers = append(op.Observers, o) 119 }