{"record":{"id":"7c502de93a18dfd3","repo":"apache/seatunnel","slug":"writer-close-failed","errorCode":"WRITER_CLOSE_FAILED","errorMessage":"Failed to close writer","messagePattern":"Failed to close writer","errorType":"error_code","errorClass":"AerospikeConnectorException","httpStatus":null,"severity":"warning","filePath":"seatunnel-connectors-v2/connector-aerospike/src/main/java/org/apache/seatunnel/connectors/seatunnel/aerospike/sink/AerospikeSinkWriter.java","lineNumber":156,"sourceCode":"\n                default:\n                    throw new IllegalArgumentException(\n                            \"Unsupported data format type: \" + formatType);\n            }\n        } catch (Exception e) {\n            throw new AerospikeConnectorException(\n                    AerospikeErrorCode.WRITER_OPERATION_FAILED, \"Failed to write record\", e);\n        }\n    }\n\n    @Override\n    public void close() throws IOException {\n        try {\n            if (Objects.nonNull(aerospikeClient)) {\n                aerospikeClient.close();\n            }\n        } catch (Exception e) {\n            throw new AerospikeConnectorException(\n                    AerospikeErrorCode.WRITER_CLOSE_FAILED, \"Failed to close writer\", e);\n        }\n    }\n\n    private AerospikeClient buildClient() {\n        ClientPolicy clientPolicy = new ClientPolicy();\n        clientPolicy.user = config.get(AerospikeSinkOptions.USERNAME);\n        clientPolicy.password = config.get(AerospikeSinkOptions.PASSWORD);\n        clientPolicy.timeout = config.get(AerospikeSinkOptions.WRITE_TIMEOUT);\n        clientPolicy.maxConnsPerNode = 300;\n\n        return new AerospikeClient(\n                clientPolicy,\n                config.get(AerospikeSinkOptions.HOST),\n                config.get(AerospikeSinkOptions.PORT));\n    }\n\n    private Object convertValue(Object value, AerospikeDataType dataType) {","sourceCodeStart":138,"sourceCodeEnd":174,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-aerospike/src/main/java/org/apache/seatunnel/connectors/seatunnel/aerospike/sink/AerospikeSinkWriter.java#L138-L174","documentation":"AerospikeSinkWriter.close closes the AerospikeClient; any exception during aerospikeClient.close() is wrapped into AerospikeConnectorException WRITER_CLOSE_FAILED with message 'Failed to close writer'. This occurs during sink teardown and usually reflects an already-failing client/cluster rather than data loss.","triggerScenarios":"Calling close() when aerospikeClient.close() throws — e.g. cluster node drained, client already closed/aborted, or underlying IO errors during shutdown.","commonSituations":"Aerospike cluster shut down before the job finishes; previous write failures left the client in a bad state; repeated close invocations.","solutions":["Verify cluster health at job shutdown; fix the underlying connectivity issue","Check earlier logs for the primary failure that preceded close","Treat as secondary error during cleanup; ensure data integrity from earlier write results","Ensure close() is only called once per writer lifecycle"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try { writer.close(); } catch (AerospikeConnectorException e) { if (e.getErrorCode() == WRITER_CLOSE_FAILED) { log.warn(\"aerospike writer close failed; likely cluster/client already unhealthy\", e); } }","preventionTips":["Ensure cluster health before teardown; check earlier errors","Close each writer exactly once","Use reasonable ClientPolicy timeouts to avoid hangs at close","Monitor cluster maintenance windows relative to job schedules"],"tags":["aerospike","close","cleanup","sink"],"backgroundTag":"connection-refused","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}