{"record":{"id":"c4ff050fa6fa0804","repo":"pentaho/pentaho-kettle","slug":"abstractfileerrorhandler-exception-couldnotclosefile","errorCode":"AbstractFileErrorHandler.Exception.CouldNotCloseFile","errorMessage":"AbstractFileErrorHandler.Exception.CouldNotCloseFile","messagePattern":"AbstractFileErrorHandler\\.Exception\\.CouldNotCloseFile","errorType":"error_code","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/step/errorhandling/AbstractFileErrorHandler.java","lineNumber":157,"sourceCode":"      close( iter.next() );\n    }\n    writers = new HashMap<Object, Writer>();\n\n  }\n\n  private void close( Writer outputStreamWriter ) throws KettleException {\n    if ( outputStreamWriter != null ) {\n      try {\n        outputStreamWriter.flush();\n      } catch ( IOException exception ) {\n        baseStep.logError(\n          BaseMessages.getString( PKG, \"AbstractFileErrorHandler.Log.CouldNotFlushContentToFile\" ), exception\n            .getLocalizedMessage() );\n      }\n      try {\n        outputStreamWriter.close();\n      } catch ( IOException exception ) {\n        throw new KettleException( BaseMessages.getString(\n          PKG, \"AbstractFileErrorHandler.Exception.CouldNotCloseFile\" ), exception );\n      } finally {\n        outputStreamWriter = null;\n      }\n    }\n  }\n\n  public void handleFile( FileObject file ) throws KettleException {\n    close();\n    this.processingFilename = file.getName().getBaseName();\n  }\n\n}\n","sourceCodeStart":139,"sourceCodeEnd":171,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/step/errorhandling/AbstractFileErrorHandler.java#L139-L171","documentation":"KettleException thrown by AbstractFileErrorHandler.close() when closing one of the cached output writers throws IOException. The error content may not have been fully flushed to the error file, so lineage data can be incomplete.","triggerScenarios":"close() iterates writers and calls outputStreamWriter.close(); the underlying stream throws IOException — disk full during final flush, file handle closed externally, network storage dropped mid-session.","commonSituations":"Error-lineage files written to a full disk or to a network share that dropped during transformation execution; long-running transformations where file handles were reclaimed.","solutions":["Check disk space on the volume holding the error files (flush failures are usually ENOSPC)","Inspect the chained IOException cause for the exact OS error","Write error files to local reliable storage instead of network mounts for long transformations","Retry the transformation after fixing storage; verify error lineage files were completely written"],"exampleFix":"// before: error dir on full disk\n/mnt/data/err\n// after: free space or redirect\n$ df -h /mnt/data; errorTargetDir = \"/var/tmp/err\"","handlingStrategy":"try-catch","validationCode":"// Before run: ensure enough free space for potential error-lineage output\njava.io.File dir = new java.io.File(errorDirLocalPath);\nlong usable = dir.getFreeSpace();\nlong expectedMax = rowsEstimate * 128; // rough bytes/lineage-line\nif (usable < expectedMax) {\n  log.warn(\"Low disk for error lineage: \" + usable + \" < \" + expectedMax);\n}","typeGuard":null,"tryCatchPattern":"try {\n  errorHandler.close();\n} catch (KettleException e) {\n  log.error(\"Error lineage file not closed cleanly: \" + e.getMessage(), e);\n  // verify lineage file completeness before trusting it\n  if (e.getCause() instanceof java.io.IOException\n      && e.getCause().getMessage().contains(\"No space left\")) {\n    alertOps(\"Disk full on error lineage volume\");\n  }\n}","preventionTips":["Monitor free disk space on lineage volumes; alert before thresholds","Always call close() in a finally block so partial data is at least flushed","Prefer local disks over network mounts for error files","Call errorHandler.close() even when the transformation fails mid-run"],"tags":["file-io","close","flush"],"backgroundTag":"file-write-failed","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}