.../hadoop/hbase/io/hfile/HFileReaderImpl.java | 28 ++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) 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 6970d27..9ab7b74 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 @@ -943,11 +943,31 @@ public class HFileReaderImpl implements HFile.Reader, Configurable { } } else { ByteBuffer buf = blockBuffer.asSubByteBuffer(cellBufSize); - if (this.curBlock.getMemoryType() == MemoryType.SHARED) { - ret = new ShareableMemoryOffheapKeyValue(buf, buf.position(), cellBufSize, - currTagsLen > 0, seqId); + if (buf.isDirect()) { + if (this.curBlock.getMemoryType() == MemoryType.SHARED) { + ret = new ShareableMemoryOffheapKeyValue(buf, buf.position(), cellBufSize, + currTagsLen > 0, seqId); + } else { + ret = new OffheapKeyValue(buf, buf.position(), cellBufSize, currTagsLen > 0, seqId); + } } else { - ret = new OffheapKeyValue(buf, buf.position(), cellBufSize, currTagsLen > 0, seqId); + if (this.curBlock.getMemoryType() == MemoryType.SHARED) { + if (currTagsLen > 0) { + ret = new ShareableMemoryKeyValue(buf.array(), buf.arrayOffset() + buf.position(), + cellBufSize, seqId); + } else { + ret = new ShareableMemoryNoTagsKeyValue(buf.array(), + buf.arrayOffset() + buf.position(), cellBufSize, seqId); + } + } else { + if (currTagsLen > 0) { + ret = new SizeCachedKeyValue(buf.array(), buf.arrayOffset() + buf.position(), + cellBufSize, seqId); + } else { + ret = new SizeCachedNoTagsKeyValue(buf.array(), buf.arrayOffset() + buf.position(), + cellBufSize, seqId); + } + } } } return ret;