// The executor calls this when it has finished running the runonce (be it success or failure) // stagerBBS will retry this repeatedly if it gets a StoreTimeout error (up to N seconds?) // This really really shouldn't fail. If it does, blog about it and walk away. If it failed in a // consistent way (i.e. key already exists), there's probably a flaw in our design. func (self *executorBBS) CompleteTask(task *models.Task, failed bool, failureReason string, result string) error { originalValue := task.ToJSON() task.UpdatedAt = self.timeProvider.Time().UnixNano() task.State = models.TaskStateCompleted task.Failed = failed task.FailureReason = failureReason task.Result = result return retryIndefinitelyOnStoreTimeout(func() error { err := self.store.CompareAndSwap(storeadapter.StoreNode{ Key: taskSchemaPath(task), Value: originalValue, }, storeadapter.StoreNode{ Key: taskSchemaPath(task), Value: task.ToJSON(), }) if err != nil { return err } self.kicker.Complete(task) return nil }) }
func markTaskFailed(task models.Task, reason string) models.Task { task.State = models.TaskStateCompleted task.Failed = true task.FailureReason = reason return task }