{"record":{"id":"b72380977100cfc9","repo":"conductor-oss/conductor","slug":"task-s-s-exceeded-total-timeout-of-d-seconds-e","errorCode":null,"errorMessage":"Task %s/%s exceeded total timeout of %d seconds (elapsed %d seconds across all attempts). No further retries will be attempted.","messagePattern":"Task (.+?)/(.+?) exceeded total timeout of (.+?) seconds \\(elapsed (.+?) seconds across all attempts\\)\\. No further retries will be attempted\\.","errorType":"exception","errorClass":"TerminateWorkflowException","httpStatus":null,"severity":"error","filePath":"core/src/main/java/com/netflix/conductor/core/execution/DeciderService.java","lineNumber":629,"sourceCode":"        if (taskDefinition.getTotalTimeoutSeconds() > 0 && task.getFirstScheduledTime() > 0) {\n            long totalElapsedSeconds =\n                    (System.currentTimeMillis() - task.getFirstScheduledTime()) / 1000;\n            if (totalElapsedSeconds >= taskDefinition.getTotalTimeoutSeconds()) {\n                final String errMsg =\n                        String.format(\n                                \"Task %s/%s exceeded total timeout of %d seconds \"\n                                        + \"(elapsed %d seconds across all attempts). \"\n                                        + \"No further retries will be attempted.\",\n                                task.getTaskId(),\n                                task.getTaskDefName(),\n                                taskDefinition.getTotalTimeoutSeconds(),\n                                totalElapsedSeconds);\n                WorkflowModel.Status totalTimeoutStatus =\n                        task.getStatus() == TaskModel.Status.TIMED_OUT\n                                ? WorkflowModel.Status.TIMED_OUT\n                                : WorkflowModel.Status.FAILED;\n                updateWorkflowOutput(workflow, task);\n                throw new TerminateWorkflowException(errMsg, totalTimeoutStatus, task);\n            }\n        }\n\n        // retry... - but not immediately - put a delay...\n        int startDelay = taskDefinition.getRetryDelaySeconds();\n        switch (taskDefinition.getRetryLogic()) {\n            case FIXED:\n                startDelay = taskDefinition.getRetryDelaySeconds();\n                startDelay = applyMaxRetryDelayCap(startDelay, taskDefinition);\n                break;\n            case LINEAR_BACKOFF:\n                int linearRetryDelaySeconds =\n                        taskDefinition.getRetryDelaySeconds()\n                                * taskDefinition.getBackoffScaleFactor()\n                                * (task.getRetryCount() + 1);\n                // Reset integer overflow to max value\n                startDelay =\n                        linearRetryDelaySeconds < 0 ? Integer.MAX_VALUE : linearRetryDelaySeconds;","sourceCodeStart":611,"sourceCodeEnd":647,"githubUrl":"https://github.com/conductor-oss/conductor/blob/cf7c3e4a8adfb158be778ab1ec525323c363cd3a/core/src/main/java/com/netflix/conductor/core/execution/DeciderService.java#L611-L647","documentation":"Guard inside the retry path: even if individual attempts would still retry, if TaskDef.totalTimeoutSeconds > 0 and the elapsed wall-clock since task.firstScheduledTime has reached that budget, the engine stops retrying and throws a TerminateWorkflowException (status TIMED_OUT if the last attempt was TIMED_OUT, else FAILED). totalTimeoutSeconds is a hard budget spanning all attempts AND retry delays.","triggerScenarios":"A task with totalTimeoutSeconds configured has, across all its attempts and backoff delays, consumed more wall-clock than the configured total budget, and another retry is being considered.","commonSituations":"LINEAR/EXPONENTIAL backoff delays accumulate past the total budget; retries keep failing slowly so the sum of attempt+durations crosses totalTimeoutSeconds; totalTimeoutSeconds set lower than realistic end-to-end time.","solutions":["Raise TaskDef.totalTimeoutSeconds to cover attempts plus backoff, or set it to 0 to disable the total budget.","Tune retryDelaySeconds and backoffScaleFactor so cumulative delay fits the budget.","Fix the underlying task so it succeeds before the budget elapses.","Switch retryLogic to a faster policy if the budget is tight."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// Warn if total budget < sum of (max attempts * typical duration + backoff).\nint attempts = td.getRetryCount() + 1;\nlong est = attempts * typicalAttemptSeconds + estimatedBackoffSeconds(td);\nif (td.getTotalTimeoutSeconds() > 0 && est > td.getTotalTimeoutSeconds()) {\n    LOGGER.warn(\"totalTimeoutSeconds {} likely too low; estimated {}\", td.getTotalTimeoutSeconds(), est);\n}","typeGuard":null,"tryCatchPattern":"try {\n    deciderService.decide(workflow);\n} catch (TerminateWorkflowException e) {\n    if (e.getMessage().contains(\"exceeded total timeout\")) {\n        // raise budget or reduce backoff\n    }\n}","preventionTips":["Size totalTimeoutSeconds to cover attempts AND retry delays.","Cap retryDelaySeconds / backoffScaleFactor so cumulative delay fits the budget.","Set totalTimeoutSeconds=0 to disable the total budget if undesired."],"tags":["conductor","workflow","decider","retry","total-timeout","task-timeout","terminate-workflow"],"backgroundTag":null,"analyzedSha":"cf7c3e4a8adfb158be778ab1ec525323c363cd3a","analyzedAt":"2026-08-14T03:33:19.897Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}