HBASE-10487 Avoid allocating new KeyValue and according bytes-copying for appended kvs which don't have existing values (Honghua)

git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1566981 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Zhihong Yu 2014-02-11 03:58:42 +00:00
parent 89f1d1a051
commit ed423e2deb
2 changed files with 20 additions and 23 deletions

View File

@ -5010,30 +5010,22 @@ public class HRegion implements HeapSize { // , Writable{
newKV.getTagsOffset(), oldKv.getTagsLength());
System.arraycopy(kv.getTagsArray(), kv.getTagsOffset(), newKV.getTagsArray(),
newKV.getTagsOffset() + oldKv.getTagsLength(), kv.getTagsLength());
// copy in row, family, and qualifier
System.arraycopy(kv.getRowArray(), kv.getRowOffset(),
newKV.getRowArray(), newKV.getRowOffset(), kv.getRowLength());
System.arraycopy(kv.getFamilyArray(), kv.getFamilyOffset(),
newKV.getFamilyArray(), newKV.getFamilyOffset(),
kv.getFamilyLength());
System.arraycopy(kv.getQualifierArray(), kv.getQualifierOffset(),
newKV.getQualifierArray(), newKV.getQualifierOffset(),
kv.getQualifierLength());
idx++;
} else {
// allocate an empty kv once
newKV = new KeyValue(row.length, kv.getFamilyLength(),
kv.getQualifierLength(), now, KeyValue.Type.Put,
kv.getValueLength(), kv.getTagsLength());
// copy in the value
System.arraycopy(kv.getValueArray(), kv.getValueOffset(),
newKV.getValueArray(), newKV.getValueOffset(),
kv.getValueLength());
// copy in tags
System.arraycopy(kv.getTagsArray(), kv.getTagsOffset(), newKV.getTagsArray(),
newKV.getTagsOffset(), kv.getTagsLength());
}
// copy in row, family, and qualifier
System.arraycopy(kv.getRowArray(), kv.getRowOffset(),
newKV.getRowArray(), newKV.getRowOffset(), kv.getRowLength());
System.arraycopy(kv.getFamilyArray(), kv.getFamilyOffset(),
newKV.getFamilyArray(), newKV.getFamilyOffset(),
kv.getFamilyLength());
System.arraycopy(kv.getQualifierArray(), kv.getQualifierOffset(),
newKV.getQualifierArray(), newKV.getQualifierOffset(),
kv.getQualifierLength());
newKV = kv;
// Append's KeyValue.Type==Put and ts==HConstants.LATEST_TIMESTAMP,
// so only need to update the timestamp to 'now'
newKV.updateLatestStamp(Bytes.toBytes(now));
}
newKV.setMvccVersion(w.getWriteNumber());
// Give coprocessors a chance to update the new cell
if (coprocessorHost != null) {

View File

@ -4422,7 +4422,7 @@ public class TestFromClientSide {
byte[] v1 = Bytes.toBytes("42");
byte[] v2 = Bytes.toBytes("23");
byte [][] QUALIFIERS = new byte [][] {
Bytes.toBytes("b"), Bytes.toBytes("a")
Bytes.toBytes("b"), Bytes.toBytes("a"), Bytes.toBytes("c")
};
Append a = new Append(ROW);
a.add(FAMILY, QUALIFIERS[0], v1);
@ -4433,9 +4433,14 @@ public class TestFromClientSide {
a = new Append(ROW);
a.add(FAMILY, QUALIFIERS[0], v2);
a.add(FAMILY, QUALIFIERS[1], v1);
a.add(FAMILY, QUALIFIERS[2], v2);
Result r = t.append(a);
assertEquals(0, Bytes.compareTo(Bytes.add(v1,v2), r.getValue(FAMILY, QUALIFIERS[0])));
assertEquals(0, Bytes.compareTo(Bytes.add(v2,v1), r.getValue(FAMILY, QUALIFIERS[1])));
// QUALIFIERS[2] previously not exist, verify both value and timestamp are correct
assertEquals(0, Bytes.compareTo(v2, r.getValue(FAMILY, QUALIFIERS[2])));
assertEquals(r.getColumnLatest(FAMILY, QUALIFIERS[0]).getTimestamp(),
r.getColumnLatest(FAMILY, QUALIFIERS[2]).getTimestamp());
}
@Test