Search in sources :

Example 1 with AbstractRetry

use of io.kestra.core.models.tasks.retrys.AbstractRetry in project kestra by kestra-io.

the class Worker method run.

private void run(WorkerTask workerTask) throws QueueException {
    metricRegistry.counter(MetricRegistry.METRIC_WORKER_STARTED_COUNT, metricRegistry.tags(workerTask)).increment();
    if (workerTask.getTaskRun().getState().getCurrent() == State.Type.CREATED) {
        metricRegistry.timer(MetricRegistry.METRIC_WORKER_QUEUED_DURATION, metricRegistry.tags(workerTask)).record(Duration.between(workerTask.getTaskRun().getState().getStartDate(), now()));
    }
    workerTask.logger().info("[namespace: {}] [flow: {}] [task: {}] [execution: {}] [taskrun: {}] [value: {}] Type {} started", workerTask.getTaskRun().getNamespace(), workerTask.getTaskRun().getFlowId(), workerTask.getTaskRun().getTaskId(), workerTask.getTaskRun().getExecutionId(), workerTask.getTaskRun().getId(), workerTask.getTaskRun().getValue(), workerTask.getTask().getClass().getSimpleName());
    if (workerTask.logger().isDebugEnabled()) {
        workerTask.logger().debug("Variables\n{}", JacksonMapper.log(workerTask.getRunContext().getVariables()));
    }
    workerTask = workerTask.withTaskRun(workerTask.getTaskRun().withState(State.Type.RUNNING));
    this.workerTaskResultQueue.emit(new WorkerTaskResult(workerTask));
    if (workerTask.getTask() instanceof RunnableTask) {
        // killed cased
        if (killedExecution.contains(workerTask.getTaskRun().getExecutionId())) {
            workerTask = workerTask.withTaskRun(workerTask.getTaskRun().withState(State.Type.KILLED));
            this.workerTaskResultQueue.emit(new WorkerTaskResult(workerTask));
            this.logTerminated(workerTask);
            return;
        }
        AtomicReference<WorkerTask> current = new AtomicReference<>(workerTask);
        // run
        WorkerTask finalWorkerTask = Failsafe.with(AbstractRetry.<WorkerTask>retryPolicy(workerTask.getTask().getRetry()).handleResultIf(result -> result.getTaskRun().lastAttempt() != null && Objects.requireNonNull(result.getTaskRun().lastAttempt()).getState().getCurrent() == State.Type.FAILED).onRetry(e -> {
            WorkerTask lastResult = e.getLastResult();
            lastResult = lastResult.getRunContext().cleanup(lastResult);
            current.set(lastResult);
            metricRegistry.counter(MetricRegistry.METRIC_WORKER_RETRYED_COUNT, metricRegistry.tags(current.get(), MetricRegistry.TAG_ATTEMPT_COUNT, String.valueOf(e.getAttemptCount()))).increment();
            this.workerTaskResultQueue.emit(new WorkerTaskResult(lastResult));
        })).get(() -> this.runAttempt(current.get()));
        finalWorkerTask = finalWorkerTask.getRunContext().cleanup(finalWorkerTask);
        // get last state
        TaskRunAttempt lastAttempt = finalWorkerTask.getTaskRun().lastAttempt();
        if (lastAttempt == null) {
            throw new IllegalStateException("Can find lastAttempt on taskRun '" + finalWorkerTask.getTaskRun().toString(true) + "'");
        }
        State.Type state = lastAttempt.getState().getCurrent();
        if (workerTask.getTask().getRetry() != null && workerTask.getTask().getRetry().getWarningOnRetry() && finalWorkerTask.getTaskRun().getAttempts().size() > 0 && state == State.Type.SUCCESS) {
            state = State.Type.WARNING;
        }
        // emit
        finalWorkerTask = finalWorkerTask.withTaskRun(finalWorkerTask.getTaskRun().withState(state));
        // changing status must work in order to finish current task (except if we are near the upper bound size).
        try {
            this.workerTaskResultQueue.emit(new WorkerTaskResult(finalWorkerTask));
        } catch (QueueException e) {
            finalWorkerTask = workerTask.withTaskRun(workerTask.getTaskRun().withState(State.Type.FAILED));
            this.workerTaskResultQueue.emit(new WorkerTaskResult(finalWorkerTask));
        } finally {
            this.logTerminated(finalWorkerTask);
        }
    }
}
Also used : TaskRun(io.kestra.core.models.executions.TaskRun) java.util(java.util) Getter(lombok.Getter) QueueInterface(io.kestra.core.queues.QueueInterface) JacksonMapper(io.kestra.core.serializers.JacksonMapper) ZonedDateTime(java.time.ZonedDateTime) Hashing(com.google.common.hash.Hashing) AtomicReference(java.util.concurrent.atomic.AtomicReference) State(io.kestra.core.models.flows.State) Timeout(net.jodah.failsafe.Timeout) ApplicationContext(io.micronaut.context.ApplicationContext) ImmutableList(com.google.common.collect.ImmutableList) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) TaskRunAttempt(io.kestra.core.models.executions.TaskRunAttempt) Output(io.kestra.core.models.tasks.Output) AbstractRetry(io.kestra.core.models.tasks.retrys.AbstractRetry) Duration(java.time.Duration) ExecutionKilled(io.kestra.core.models.executions.ExecutionKilled) ExecutorService(java.util.concurrent.ExecutorService) Charsets(com.google.common.base.Charsets) Synchronized(lombok.Synchronized) WorkerTaskQueueInterface(io.kestra.core.queues.WorkerTaskQueueInterface) Logger(org.slf4j.Logger) ImmutableMap(com.google.common.collect.ImmutableMap) QueueFactoryInterface(io.kestra.core.queues.QueueFactoryInterface) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Qualifiers(io.micronaut.inject.qualifiers.Qualifiers) IOException(java.io.IOException) Failsafe(net.jodah.failsafe.Failsafe) TimeUnit(java.util.concurrent.TimeUnit) Slf4j(lombok.extern.slf4j.Slf4j) ChronoUnit(java.time.temporal.ChronoUnit) Await(io.kestra.core.utils.Await) ExecutorsUtils(io.kestra.core.utils.ExecutorsUtils) QueueException(io.kestra.core.queues.QueueException) TimeoutExceededException(io.kestra.core.exceptions.TimeoutExceededException) Closeable(java.io.Closeable) MetricRegistry(io.kestra.core.metrics.MetricRegistry) RunnableTask(io.kestra.core.models.tasks.RunnableTask) TaskRunAttempt(io.kestra.core.models.executions.TaskRunAttempt) State(io.kestra.core.models.flows.State) QueueException(io.kestra.core.queues.QueueException) AtomicReference(java.util.concurrent.atomic.AtomicReference) RunnableTask(io.kestra.core.models.tasks.RunnableTask)

Aggregations

Charsets (com.google.common.base.Charsets)1 ImmutableList (com.google.common.collect.ImmutableList)1 ImmutableMap (com.google.common.collect.ImmutableMap)1 Hashing (com.google.common.hash.Hashing)1 TimeoutExceededException (io.kestra.core.exceptions.TimeoutExceededException)1 MetricRegistry (io.kestra.core.metrics.MetricRegistry)1 ExecutionKilled (io.kestra.core.models.executions.ExecutionKilled)1 TaskRun (io.kestra.core.models.executions.TaskRun)1 TaskRunAttempt (io.kestra.core.models.executions.TaskRunAttempt)1 State (io.kestra.core.models.flows.State)1 Output (io.kestra.core.models.tasks.Output)1 RunnableTask (io.kestra.core.models.tasks.RunnableTask)1 AbstractRetry (io.kestra.core.models.tasks.retrys.AbstractRetry)1 QueueException (io.kestra.core.queues.QueueException)1 QueueFactoryInterface (io.kestra.core.queues.QueueFactoryInterface)1 QueueInterface (io.kestra.core.queues.QueueInterface)1 WorkerTaskQueueInterface (io.kestra.core.queues.WorkerTaskQueueInterface)1 JacksonMapper (io.kestra.core.serializers.JacksonMapper)1 Await (io.kestra.core.utils.Await)1 ExecutorsUtils (io.kestra.core.utils.ExecutorsUtils)1