RunTask FIXME ...
( ctx gocontext.Context, basicRes context.BasicRes, progress chan plugin.RunningProgress, taskId uint64, )
| 39 | |
| 40 | // RunTask FIXME ... |
| 41 | func RunTask( |
| 42 | ctx gocontext.Context, |
| 43 | basicRes context.BasicRes, |
| 44 | progress chan plugin.RunningProgress, |
| 45 | taskId uint64, |
| 46 | ) (err errors.Error) { |
| 47 | db := basicRes.GetDal() |
| 48 | task := &models.Task{} |
| 49 | if err := db.First(task, dal.Where("id = ?", taskId)); err != nil { |
| 50 | return err |
| 51 | } |
| 52 | dbPipeline := &models.Pipeline{} |
| 53 | if err := db.First(dbPipeline, dal.Where("id = ? ", task.PipelineId)); err != nil { |
| 54 | return err |
| 55 | } |
| 56 | |
| 57 | logger, err := getTaskLogger(basicRes.GetLogger(), task) |
| 58 | if err != nil { |
| 59 | return err |
| 60 | } |
| 61 | beganAt := time.Now() |
| 62 | if task.BeganAt != nil { |
| 63 | beganAt = *task.BeganAt |
| 64 | } |
| 65 | // make sure task status always correct even if it panicked |
| 66 | defer func() { |
| 67 | if r := recover(); r != nil { |
| 68 | var e error |
| 69 | switch et := r.(type) { |
| 70 | case error: |
| 71 | e = et |
| 72 | default: |
| 73 | e = fmt.Errorf("%v", et) |
| 74 | } |
| 75 | err = errors.Default.Wrap(e, fmt.Sprintf("run task failed with panic (%s)", utils.GatherCallFrames(0))) |
| 76 | logger.Error(err, "run task failed with panic") |
| 77 | } |
| 78 | finishedAt := time.Now() |
| 79 | spentSeconds := finishedAt.Unix() - beganAt.Unix() |
| 80 | if err != nil { |
| 81 | lakeErr := errors.AsLakeErrorType(err) |
| 82 | subTaskName := "unknown" |
| 83 | if lakeErr = lakeErr.As(errors.SubtaskErr); lakeErr != nil { |
| 84 | if meta, ok := lakeErr.GetData().(*plugin.SubTaskMeta); ok { |
| 85 | subTaskName = meta.Name |
| 86 | } |
| 87 | } else { |
| 88 | lakeErr = errors.Convert(err) |
| 89 | } |
| 90 | dbe := db.UpdateColumns(task, []dal.DalSet{ |
| 91 | {ColumnName: "status", Value: models.TASK_FAILED}, |
| 92 | {ColumnName: "message", Value: lakeErr.Error()}, |
| 93 | {ColumnName: "error_name", Value: lakeErr.Messages().Format()}, |
| 94 | {ColumnName: "finished_at", Value: finishedAt}, |
| 95 | {ColumnName: "spent_seconds", Value: spentSeconds}, |
| 96 | {ColumnName: "failed_sub_task", Value: subTaskName}, |
| 97 | }) |
| 98 | if dbe != nil { |
nothing calls this directly
no test coverage detected