func (r *Runner) runTask(task kit.Task) apperror.Error { spec := r.tasks[task.GetName()] if spec == nil { return apperror.New("unknown_task", fmt.Sprintf("The task %v was not registered with the TaskRunner", task.GetName())) } now := time.Now() task.SetStartedAt(&now) task.SetIsRunning(true) if err := r.backend.Update(task); err != nil { return err } r.activeTasks[task.GetStrId()] = task r.registry.Logger().Debugf("TaskRunner: running task %v (task %v, try %v) (%v tasks running)", task.GetStrId(), task.GetName(), task.GetTryCount()+1, len(r.activeTasks)) go func(task kit.Task) { result, err, canRetry := spec.GetHandler()(r.registry, task, r.progressChan) now := time.Now() task.SetFinishedAt(&now) task.SetTryCount(task.GetTryCount() + 1) task.SetIsRunning(false) if err != nil { task.SetError(err.Error()) if !canRetry || task.GetTryCount() >= spec.GetAllowedRetries() { task.SetIsComplete(true) } else { runAt := time.Now().Add(spec.GetRetryInterval()) task.SetRunAt(&runAt) } } else { task.SetIsComplete(true) task.SetIsSuccess(true) task.SetResult(result) } r.finishedChan <- task }(task) return nil }