{"record":{"id":"110189706955744d","repo":"prestodb/presto","slug":"java-io-ioexception-wrapped-in-uncheckedioexcepti-110189","errorCode":null,"errorMessage":"java.io.IOException (wrapped in UncheckedIOException)","messagePattern":"java\\.io\\.IOException \\(wrapped in UncheckedIOException\\)","errorType":"exception","errorClass":"UncheckedIOException","httpStatus":null,"severity":"warning","filePath":"presto-orc/src/main/java/com/facebook/presto/orc/reader/LongSelectiveStreamReader.java","lineNumber":126,"sourceCode":"    {\n        return toStringHelper(this)\n                .addValue(context.getStreamDescriptor())\n                .toString();\n    }\n\n    @Override\n    public void close()\n    {\n        try (Closer closer = Closer.create()) {\n            if (directReader != null) {\n                closer.register(directReader::close);\n            }\n            if (dictionaryReader != null) {\n                closer.register(dictionaryReader::close);\n            }\n        }\n        catch (IOException e) {\n            throw new UncheckedIOException(e);\n        }\n    }\n\n    @Override\n    public long getRetainedSizeInBytes()\n    {\n        return INSTANCE_SIZE +\n                (directReader == null ? 0L : directReader.getRetainedSizeInBytes()) +\n                (dictionaryReader == null ? 0L : dictionaryReader.getRetainedSizeInBytes());\n    }\n\n    @Override\n    public int read(int offset, int[] positions, int positionCount)\n            throws IOException\n    {\n        return currentReader.read(offset, positions, positionCount);\n    }\n","sourceCodeStart":108,"sourceCodeEnd":144,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-orc/src/main/java/com/facebook/presto/orc/reader/LongSelectiveStreamReader.java#L108-L144","documentation":"LongSelectiveStreamReader.close registers its child stream readers' close methods with a Guava Closer; if closing an underlying ORC data stream raises IOException, it is rethrown wrapped in UncheckedIOException. This means resource cleanup of the column's underlying streams failed — usually a low-level I/O problem (closed channel, disk error) rather than a data-format issue.","triggerScenarios":"Calling close() on a LongSelectiveStreamReader while its underlying OrcDataSource/InputStream is already closed or a disk/network I/O error occurs during stream teardown.","commonSituations":"Double-closing readers after an aborted query (driver already cancelled and closed the source); transient storage failures on HDFS/local disk during cleanup; custom datasource implementations that throw on repeated close.","solutions":["Log and treat as secondary: this fires during cleanup, so the original query error (if any) is usually more relevant — preserve the first failure with Closer.rethrow semantics.","Ensure the OrcDataSource is not closed before all readers are closed; enforce ordering in your page-source provider.","Make custom stream implementations idempotent on close().","Upgrade Presto if the unwrap reveals a known double-close bug."],"exampleFix":"// before\nreader.close();\ndataSource.close();\n// after — close the source only after all readers\ncloser.register(reader::close);\ncloser.register(dataSource::close); // Closer guarantees LIFO ordering","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n    reader.close();\n}\ncatch (UncheckedIOException e) {\n    LOG.warn(e.getCause(), \"Failed to close long selective reader; source may already be closed\");\n}","preventionTips":["Always close readers before the OrcDataSource.","Use Guava Closer for LIFO cleanup of nested readers.","Make custom stream close() methods idempotent.","Ignore cleanup failures if a primary query error is already being propagated."],"tags":["io","resource-cleanup","orc"],"backgroundTag":"unchecked-io-exception","analyzedSha":"55bb57d202de3b926896fa966c2c4a44c779634e","analyzedAt":"2026-09-04T12:50:26.162Z","contentChangedAt":"2026-09-04T12:50:26.162Z","schemaVersion":2},"datasetVersion":"2026-09-11T21:17:09.523Z"}