{"record":{"id":"839d7c6bd284ded9","repo":"apache/seatunnel","slug":"failed-to-close-io-manager-in-paimon-sink-writer","errorCode":null,"errorMessage":"Failed to close io manager in paimon sink writer.","messagePattern":"Failed to close io manager in paimon sink writer\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"seatunnel-connectors-v2/connector-paimon/src/main/java/org/apache/seatunnel/connectors/seatunnel/paimon/sink/PaimonSinkWriter.java","lineNumber":351,"sourceCode":"    }\n\n    @Override\n    public void abortPrepare() {}\n\n    @Override\n    public void close() throws IOException {\n        try {\n            tableWriteClose(this.tableWrite);\n        } finally {\n            committables.clear();\n            paimonBucketAssignerFactory.clear(paimonTablePath, taskIndex);\n            if (Objects.nonNull(paimonCatalog)) {\n                paimonCatalog.close();\n            }\n            try {\n                ioManager.close();\n            } catch (Exception e) {\n                log.warn(\"Failed to close io manager in paimon sink writer.\", e);\n            }\n        }\n    }\n\n    private void tableWriteClose(TableWrite tableWrite) {\n        if (Objects.nonNull(tableWrite)) {\n            try {\n                tableWrite.close();\n            } catch (Exception e) {\n                log.error(\"Failed to close table writer in paimon sink writer.\", e);\n                throw new SeaTunnelException(e);\n            }\n        }\n    }\n\n    @VisibleForTesting\n    public boolean waitCompaction() {\n        if (JobMode.BATCH.equals(jobContext.getJobMode())) {","sourceCodeStart":333,"sourceCodeEnd":369,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-paimon/src/main/java/org/apache/seatunnel/connectors/seatunnel/paimon/sink/PaimonSinkWriter.java#L333-L369","documentation":"During PaimonSinkWriter.close(), after closing the catalog, ioManager.close() may throw. The writer swallows the exception and logs a warning because the io manager's resources are usually already reclaimed during task shutdown; failure here does not fail the checkpoint/job.","triggerScenarios":"ioManager.close() throws (wrapped IOException from Paimon/FLINK-style IOManager cleanup) while closing the writer after task end or during failure recovery triggered via schema evolution branch handling.","commonSituations":"Task directory already deleted by the framework before writer close; double close after a prior exception path; disk permissions issues on the io temp directories.","solutions":["Usually safe to ignore — this is cleanup-time noise during task shutdown.","If persistent, check the io temp directory permissions/cleanup in the worker's working dir.","Ensure close() is only invoked once by the runtime (avoid custom double-close in wrapped code).","Upgrade SeaTunnel/Paimon plugin version if it's a known double-close bug."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try { ioManager.close(); } catch (Exception e) { log.warn(\"io manager close ignored during shutdown\", e); }","preventionTips":["Treat cleanup-time close failures as non-fatal","Ensure single close invocation by runtime","Keep worker temp dirs writable"],"tags":["paimon","cleanup","io"],"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"}