diff --git hbase-common/src/main/java/org/apache/hadoop/hbase/KeyValue.java hbase-common/src/main/java/org/apache/hadoop/hbase/KeyValue.java index a30a24c..4e06f0f 100644 --- hbase-common/src/main/java/org/apache/hadoop/hbase/KeyValue.java +++ hbase-common/src/main/java/org/apache/hadoop/hbase/KeyValue.java @@ -757,6 +757,18 @@ public class KeyValue implements Cell, HeapSize, Cloneable, SettableSequenceId, } /** + * Reset KeyValue to new array (content) + * @param bytes - byte array + * @param offset - offset in byte array + * @param length - length of data + */ + public void reset(final byte [] bytes, final int offset, final int length) { + this.bytes = bytes; + this.offset = offset; + this.length = length; + } + + /** * Create an empty byte[] representing a KeyValue * All lengths are preset and can be filled in later. * @param rlength diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/Segment.java hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/Segment.java index 135def9..42d0267 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/Segment.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/Segment.java @@ -134,9 +134,14 @@ public abstract class Segment { } assert alloc.getBytes() != null; KeyValueUtil.appendToByteArray(cell, alloc.getBytes(), alloc.getOffset()); - KeyValue newKv = new KeyValue(alloc.getBytes(), alloc.getOffset(), len); - newKv.setSequenceId(cell.getSequenceId()); - return newKv; + long seqId = cell.getSequenceId(); + if(cell instanceof KeyValue){ + ((KeyValue)cell).reset(alloc.getBytes(), alloc.getOffset(), len); + } else{ + cell = new KeyValue(alloc.getBytes(), alloc.getOffset(), len); + } + ((KeyValue)cell).setSequenceId(seqId); + return cell; } public boolean shouldSeek(Scan scan, long oldestUnexpiredTS) {