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  }