63 lines
1.6 KiB
Go
63 lines
1.6 KiB
Go
package state
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
jobmod "gitlink.org.cn/cloudream/scheduler/common/models/job"
|
|
"gitlink.org.cn/cloudream/scheduler/manager/internal/jobmgr"
|
|
"gitlink.org.cn/cloudream/scheduler/manager/internal/jobmgr/event"
|
|
"gitlink.org.cn/cloudream/scheduler/manager/internal/jobmgr/job"
|
|
)
|
|
|
|
type WaitTargetComplete struct {
|
|
}
|
|
|
|
func NewWaitTargetComplete() *WaitTargetComplete {
|
|
return &WaitTargetComplete{}
|
|
}
|
|
|
|
func (s *WaitTargetComplete) Run(rtx jobmgr.JobStateRunContext, jo *jobmgr.Job) {
|
|
err := s.do(rtx, jo)
|
|
if err != nil {
|
|
rtx.Mgr.ChangeState(jo, FailureComplete(err))
|
|
} else {
|
|
rtx.Mgr.ChangeState(jo, NewDataReturnJobReadyToExecute())
|
|
}
|
|
}
|
|
|
|
func (s *WaitTargetComplete) do(rtx jobmgr.JobStateRunContext, jo *jobmgr.Job) error {
|
|
reJob := jo.Body.(*job.DataReturnJob)
|
|
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
defer cancel()
|
|
|
|
go func() {
|
|
event.WaitType[event.Cancel](ctx, rtx.EventSet)
|
|
cancel()
|
|
}()
|
|
|
|
evt, ok := event.WaitTypeAnd[event.JobCompleted](ctx, rtx.EventSet, func(val event.JobCompleted) bool {
|
|
return val.Job.GetInfo().GetLocalJobID() == reJob.Info.TargetLocalJobID
|
|
})
|
|
if !ok {
|
|
return jobmgr.ErrJobCancelled
|
|
}
|
|
if evt.Err != nil {
|
|
return fmt.Errorf("depended job %s was failed", evt.Job.JobID)
|
|
}
|
|
norJob, ok := evt.Job.Body.(*job.NormalJob)
|
|
if !ok {
|
|
return fmt.Errorf("job %s is not a Normal job(which is %T)", evt.Job.JobID, evt.Job)
|
|
}
|
|
|
|
reJob.TargetJobCCID = norJob.TargetCCID
|
|
reJob.TargetJobOutputFullPath = norJob.OutputFullPath
|
|
return nil
|
|
}
|
|
|
|
func (s *WaitTargetComplete) Dump(rtx jobmgr.JobStateRunContext, jo *jobmgr.Job) jobmod.JobStateStatus {
|
|
// TODO
|
|
return nil
|
|
}
|