{"record":{"id":"94a0e037746969c3","repo":"apache/iceberg","slug":"failed-to-close-current-writer-94a0e0","errorCode":null,"errorMessage":"Failed to close current writer","messagePattern":"Failed to close current writer","errorType":"exception","errorClass":"UncheckedIOException","httpStatus":null,"severity":"error","filePath":"core/src/main/java/org/apache/iceberg/deletes/FileScopedPositionDeleteWriter.java","lineNumber":109,"sourceCode":"  }\n\n  private void openCurrentWriter(CharSequence path) {\n    Preconditions.checkState(!closed, \"Writer has already been closed\");\n    this.currentWriter = writers.get();\n    this.currentPath = path;\n  }\n\n  private void closeCurrentWriter() {\n    if (currentWriter != null) {\n      try {\n        currentWriter.close();\n        DeleteWriteResult result = currentWriter.result();\n        deleteFiles.addAll(result.deleteFiles());\n        referencedDataFiles.addAll(result.referencedDataFiles());\n        this.currentWriter = null;\n        this.currentPath = null;\n      } catch (IOException e) {\n        throw new UncheckedIOException(\"Failed to close current writer\", e);\n      }\n    }\n  }\n}\n","sourceCodeStart":91,"sourceCodeEnd":114,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/core/src/main/java/org/apache/iceberg/deletes/FileScopedPositionDeleteWriter.java#L91-L114","documentation":"When FileScopedPositionDeleteWriter rolls to a new data file or closes, it closes the current wrapped writer and collects its DeleteWriteResult. An IOException during that close is rethrown as UncheckedIOException(\"Failed to close current writer\"), because failing to finalize a delete file means its metadata (result) cannot be trusted.","triggerScenarios":"Calling write() with a new data path (rolls the writer) or close(), where the underlying file writer's close() throws IOException - e.g. failure flushing/uploading the position-delete file to storage.","commonSituations":"S3/HDFS write errors (permissions, quota, network) when finalizing delete files; interrupted uploads during commit preparation; disk-full on local staging directories.","solutions":["Inspect the wrapped cause for the storage error and fix permissions/quota/network","Retry the write job; ensure idempotent staging so partial delete files are discarded","Verify FileIO configuration and storage availability before commit","Check for concurrent cleanup processes removing staging files mid-write"],"exampleFix":"// before\ntry (FileScopedPositionDeleteWriter<R> writer = createWriter()) {\n  writer.write(path, pos, row);\n} // UncheckedIOException on close\n// after\ntry (FileScopedPositionDeleteWriter<R> writer = createWriter()) {\n  writer.write(path, pos, row);\n} catch (UncheckedIOException e) {\n  LOG.error(\"Closing position delete writer failed: {}\", e.getCause().getMessage());\n  abortStagedDeleteFiles();\n  throw e;\n}","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  writer.close();\n} catch (UncheckedIOException e) {\n  LOG.error(\"Delete writer close failed: {}\", e.getCause().getMessage());\n  abort(); // drop staged files, fail the commit\n  throw e;\n}","preventionTips":["Pre-check storage writability (permissions, quota) before starting writes","Configure staging cleanup so partially written delete files never get committed","Retry the whole write task; writer close failures are not resumable","Monitor disk space on local staging and object-store error rates"],"tags":["io","unchecked-ioexception","writer","position-delete"],"backgroundTag":"file-write-failed","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}