65 lines
1.7 KiB
Go
65 lines
1.7 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.TargetJobID = evt.Job.JobID
|
|
reJob.TargetJobCCID = norJob.TargetCCID
|
|
reJob.TargetJobOutputPath = norJob.OutputPath
|
|
reJob.ECSInstanceID = norJob.ECSInstanceID
|
|
return nil
|
|
}
|
|
|
|
func (s *WaitTargetComplete) Dump(rtx jobmgr.JobStateRunContext, jo *jobmgr.Job) jobmod.JobStateDump {
|
|
return &jobmod.WaitTargetCompleteDump{}
|
|
}
|