.../main/java/org/apache/hadoop/hbase/io/HalfStoreFileReader.java | 8 ++++++++ .../java/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.java | 8 +++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/HalfStoreFileReader.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/HalfStoreFileReader.java index 0dd7742..067d24c 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/HalfStoreFileReader.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/HalfStoreFileReader.java @@ -314,6 +314,10 @@ public class HalfStoreFileReader extends StoreFile.Reader { } } catch (IOException e) { LOG.warn("Failed seekBefore " + Bytes.toStringBinary(this.splitkey), e); + } finally { + if (scanner != null) { + scanner.close(); + } } return null; } @@ -335,6 +339,10 @@ public class HalfStoreFileReader extends StoreFile.Reader { firstKeySeeked = true; } catch (IOException e) { LOG.warn("Failed seekTo first KV in the file", e); + } finally { + if(scanner != null) { + scanner.close(); + } } } return this.firstKey; diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.java index 4e2ca7d..fcf7b5b 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.java @@ -986,7 +986,13 @@ public class HFileReaderImpl implements HFile.Reader, Configurable { return new KeyValue.KeyOnlyKeyValue(keyBuf.array(), keyBuf.arrayOffset() + keyPair.getSecond(), currKeyLen); } else { - return new ByteBufferedKeyOnlyKeyValue(keyBuf, keyPair.getSecond(), currKeyLen); + // Better to do a copy here instead of holding on to this BB so that + // we could release the blocks referring to this key. This key is specifically used + // in HalfStoreFileReader to get the firstkey and lastkey by creating a new scanner + // every time. So holding onto the BB (incase of DBB) is not advised here. + byte[] key = new byte[currKeyLen]; + ByteBufferUtils.copyFromBufferToArray(key, keyBuf, keyPair.getSecond(), 0, currKeyLen); + return new KeyValue.KeyOnlyKeyValue(key, 0, currKeyLen); } }