diff --git llap-server/src/java/org/apache/hadoop/hive/llap/io/encoded/OrcEncodedDataReader.java llap-server/src/java/org/apache/hadoop/hive/llap/io/encoded/OrcEncodedDataReader.java index 0270e54f18..65b2d34be0 100644 --- llap-server/src/java/org/apache/hadoop/hive/llap/io/encoded/OrcEncodedDataReader.java +++ llap-server/src/java/org/apache/hadoop/hive/llap/io/encoded/OrcEncodedDataReader.java @@ -728,14 +728,21 @@ private OrcStripeMetadata createOrcStripeMetadataObject(int stripeIx, StripeInfo CompressionKind kind = orcReader.getCompressionKind(); boolean isPool = useCodecPool; CompressionCodec codec = isPool ? OrcCodecPool.getCodec(kind) : WriterImpl.createCodec(kind); + boolean isCodecError = true; try { - return buildStripeFooter(Lists.newArrayList(new BufferChunk(bb, 0)), - bb.remaining(), codec, orcReader.getCompressionSize()); + OrcProto.StripeFooter result = buildStripeFooter(Lists.newArrayList( + new BufferChunk(bb, 0)), bb.remaining(), codec, orcReader.getCompressionSize()); + isCodecError = false; + return result; } finally { - if (isPool) { - OrcCodecPool.returnCodec(kind, codec); - } else { - codec.close(); + try { + if (isPool && !isCodecError) { + OrcCodecPool.returnCodec(kind, codec); + } else { + codec.close(); + } + } catch (Exception ex) { + LOG.error("Ignoring codec cleanup error", ex); } } } diff --git ql/src/java/org/apache/hadoop/hive/ql/io/orc/encoded/EncodedReaderImpl.java ql/src/java/org/apache/hadoop/hive/ql/io/orc/encoded/EncodedReaderImpl.java index b4ff1e4b19..9ee1229e04 100644 --- ql/src/java/org/apache/hadoop/hive/ql/io/orc/encoded/EncodedReaderImpl.java +++ ql/src/java/org/apache/hadoop/hive/ql/io/orc/encoded/EncodedReaderImpl.java @@ -132,6 +132,7 @@ public DiskRangeList createCacheChunk(MemoryBuffer buffer, long offset, long end private boolean isDataReaderOpen = false; private final CompressionCodec codec; private final boolean isCodecFromPool; + private boolean isCodecFailure = false; private final boolean isCompressed; private final org.apache.orc.CompressionKind compressionKind; private final int bufferSize; @@ -679,12 +680,17 @@ public void setTracing(boolean isEnabled) { @Override public void close() throws IOException { - if (isCodecFromPool) { - OrcCodecPool.returnCodec(compressionKind, codec); - } else { - codec.close(); + try { + if (isCodecFromPool && !isCodecFailure) { + OrcCodecPool.returnCodec(compressionKind, codec); + } else { + codec.close(); + } + } catch (Exception ex) { + LOG.error("Ignoring error from codec", ex); + } finally { + dataReader.close(); } - dataReader.close(); } /** @@ -872,7 +878,15 @@ public DiskRangeList readEncodedStream(long baseOffset, DiskRangeList start, lon for (ProcCacheChunk chunk : toDecompress) { ByteBuffer dest = chunk.getBuffer().getByteBufferRaw(); if (chunk.isOriginalDataCompressed) { - decompressChunk(chunk.originalData, codec, dest); + boolean isOk = false; + try { + decompressChunk(chunk.originalData, codec, dest); + isOk = true; + } finally { + if (!isOk) { + isCodecFailure = true; + } + } } else { copyUncompressedChunk(chunk.originalData, dest); }