{"record":{"id":"7605f5821126acae","repo":"apache/seatunnel","slug":"close-errorhandler-for-transform-stage-failed","errorCode":null,"errorMessage":"Close ErrorHandler for transform stage failed","messagePattern":"Close ErrorHandler for transform stage failed","errorType":"exception","errorClass":"IOException","httpStatus":null,"severity":"error","filePath":"seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/task/flow/TransformFlowLifeCycle.java","lineNumber":370,"sourceCode":"    @Override\n    public void close() throws IOException {\n        for (SeaTunnelTransform<T> t : transform) {\n            try {\n                t.close();\n            } catch (Exception e) {\n                log.error(\n                        \"Close transform: {} failed, cause: {}\",\n                        t.getPluginName(),\n                        e.getMessage(),\n                        e);\n            }\n        }\n        if (errorHandler != null) {\n            try {\n                errorHandler.close();\n            } catch (Exception e) {\n                log.error(\"Close ErrorHandler for transform stage failed\", e);\n                throw new IOException(\"Close ErrorHandler for transform stage failed\", e);\n            }\n        }\n        super.close();\n    }\n\n    private void flushErrorHandler() {\n        flushErrorHandler(null);\n    }\n\n    private void flushErrorHandler(Long checkpointId) {\n        if (errorHandler == null) {\n            return;\n        }\n        try {\n            if (checkpointId == null) {\n                errorHandler.flush();\n            } else {\n                errorHandler.flush(checkpointId);","sourceCodeStart":352,"sourceCodeEnd":388,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/task/flow/TransformFlowLifeCycle.java#L352-L388","documentation":"TransformFlowLifeCycle.close() closes the transform stage's ErrorHandler (error-data sink handler). If errorHandler.close() throws, the IOException is logged and rethrown wrapped with this message, failing the task's close/cleanup phase.","triggerScenarios":"close() invoked during task teardown while the underlying ErrorHandler close (e.g. flushing/closing the error sink writer or its network/client resources) throws any Exception.","commonSituations":"Error-output sink (file/DB/HTTP) is unreachable or already closed; disk full or permission problem writing residual error data; external error-sink connection broken mid-job.","solutions":["Check the wrapped cause 'e' for the real error from the error sink (connectivity, permissions, disk).","Verify the error-collection sink configured for the transform is reachable and writable at job end.","Ensure the error sink is not closed earlier by another component (double-close).","Retry the job; if transient network errors persist, add retries/timeout tuning to the error sink."],"exampleFix":"// before: swallow close errors into task failure\n// after: log and continue close to avoid masking primary failure\ntry {\n    errorHandler.close();\n} catch (Exception e) {\n    log.warn(\"Close ErrorHandler for transform stage failed\", e);\n}","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try { errorHandler.close(); } catch (Exception e) { log.warn(\"error sink close failed\", e); /* do not mask the primary close error */ }","preventionTips":["Verify error-sink reachability before job start","Avoid double-closing the error sink","Provision sufficient disk/permissions on the error output target"],"tags":["io","error-handling","resource-close","transform"],"backgroundTag":"file-write-failed","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}