You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by vj...@apache.org on 2020/04/16 13:48:15 UTC
[hbase] branch branch-2 updated: HBASE-24194 : Refactor anonymous
inner classes of BufferedEncodedSeeker to named inner classes (#1522)
This is an automated email from the ASF dual-hosted git repository.
vjasani pushed a commit to branch branch-2
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-2 by this push:
new ca1f7a9 HBASE-24194 : Refactor anonymous inner classes of BufferedEncodedSeeker to named inner classes (#1522)
ca1f7a9 is described below
commit ca1f7a94997305415bdc8e036453c123bb33f788
Author: Viraj Jasani <vj...@apache.org>
AuthorDate: Thu Apr 16 19:16:00 2020 +0530
HBASE-24194 : Refactor anonymous inner classes of BufferedEncodedSeeker to named inner classes (#1522)
Signed-off-by: Peter Somogyi <ps...@apache.org>
Signed-off-by: binlijin <bi...@gmail.com>
---
.../hbase/io/encoding/CopyKeyDataBlockEncoder.java | 67 +++---
.../hbase/io/encoding/DiffKeyDeltaEncoder.java | 253 +++++++++++----------
.../hbase/io/encoding/FastDiffDeltaEncoder.java | 236 +++++++++----------
.../hbase/io/encoding/PrefixKeyDeltaEncoder.java | 62 ++---
4 files changed, 325 insertions(+), 293 deletions(-)
diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/CopyKeyDataBlockEncoder.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/CopyKeyDataBlockEncoder.java
index 02bb843..75f2239 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/CopyKeyDataBlockEncoder.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/CopyKeyDataBlockEncoder.java
@@ -81,35 +81,7 @@ public class CopyKeyDataBlockEncoder extends BufferedDataBlockEncoder {
@Override
public EncodedSeeker createSeeker(final HFileBlockDecodingContext decodingCtx) {
- return new BufferedEncodedSeeker<SeekerState>(decodingCtx) {
- @Override
- protected void decodeNext() {
- current.keyLength = currentBuffer.getInt();
- current.valueLength = currentBuffer.getInt();
- current.ensureSpaceForKey();
- currentBuffer.get(current.keyBuffer, 0, current.keyLength);
- current.valueOffset = currentBuffer.position();
- currentBuffer.skip(current.valueLength);
- if (includesTags()) {
- // Read short as unsigned, high byte first
- current.tagsLength = ((currentBuffer.get() & 0xff) << 8) ^ (currentBuffer.get() & 0xff);
- currentBuffer.skip(current.tagsLength);
- }
- if (includesMvcc()) {
- current.memstoreTS = ByteBufferUtils.readVLong(currentBuffer);
- } else {
- current.memstoreTS = 0;
- }
- current.nextKvOffset = currentBuffer.position();
- }
-
- @Override
- protected void decodeFirst() {
- currentBuffer.skip(Bytes.SIZEOF_INT);
- current.lastCommonPrefix = 0;
- decodeNext();
- }
- };
+ return new SeekerStateBufferedEncodedSeeker(decodingCtx);
}
@Override
@@ -123,4 +95,41 @@ public class CopyKeyDataBlockEncoder extends BufferedDataBlockEncoder {
return buffer;
}
+
+ private static class SeekerStateBufferedEncodedSeeker
+ extends BufferedEncodedSeeker<SeekerState> {
+
+ private SeekerStateBufferedEncodedSeeker(HFileBlockDecodingContext decodingCtx) {
+ super(decodingCtx);
+ }
+
+ @Override
+ protected void decodeNext() {
+ current.keyLength = currentBuffer.getInt();
+ current.valueLength = currentBuffer.getInt();
+ current.ensureSpaceForKey();
+ currentBuffer.get(current.keyBuffer, 0, current.keyLength);
+ current.valueOffset = currentBuffer.position();
+ currentBuffer.skip(current.valueLength);
+ if (includesTags()) {
+ // Read short as unsigned, high byte first
+ current.tagsLength = ((currentBuffer.get() & 0xff) << 8) ^ (currentBuffer.get() & 0xff);
+ currentBuffer.skip(current.tagsLength);
+ }
+ if (includesMvcc()) {
+ current.memstoreTS = ByteBufferUtils.readVLong(currentBuffer);
+ } else {
+ current.memstoreTS = 0;
+ }
+ current.nextKvOffset = currentBuffer.position();
+ }
+
+ @Override
+ protected void decodeFirst() {
+ currentBuffer.skip(Bytes.SIZEOF_INT);
+ current.lastCommonPrefix = 0;
+ decodeNext();
+ }
+ }
+
}
diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/DiffKeyDeltaEncoder.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/DiffKeyDeltaEncoder.java
index afb3e6d..1f179a5 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/DiffKeyDeltaEncoder.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/DiffKeyDeltaEncoder.java
@@ -381,129 +381,7 @@ public class DiffKeyDeltaEncoder extends BufferedDataBlockEncoder {
@Override
public EncodedSeeker createSeeker(HFileBlockDecodingContext decodingCtx) {
- return new BufferedEncodedSeeker<DiffSeekerState>(decodingCtx) {
- private byte[] familyNameWithSize;
- private static final int TIMESTAMP_WITH_TYPE_LENGTH =
- Bytes.SIZEOF_LONG + Bytes.SIZEOF_BYTE;
-
- private void decode(boolean isFirst) {
- byte flag = currentBuffer.get();
- byte type = 0;
- if ((flag & FLAG_SAME_KEY_LENGTH) == 0) {
- if (!isFirst) {
- type = current.keyBuffer[current.keyLength - Bytes.SIZEOF_BYTE];
- }
- current.keyLength = ByteBuff.readCompressedInt(currentBuffer);
- }
- if ((flag & FLAG_SAME_VALUE_LENGTH) == 0) {
- current.valueLength = ByteBuff.readCompressedInt(currentBuffer);
- }
- current.lastCommonPrefix = ByteBuff.readCompressedInt(currentBuffer);
-
- current.ensureSpaceForKey();
-
- if (current.lastCommonPrefix < Bytes.SIZEOF_SHORT) {
- // length of row is different, copy everything except family
-
- // copy the row size
- currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
- Bytes.SIZEOF_SHORT - current.lastCommonPrefix);
- current.rowLengthWithSize = Bytes.toShort(current.keyBuffer, 0) +
- Bytes.SIZEOF_SHORT;
-
- // copy the rest of row
- currentBuffer.get(current.keyBuffer, Bytes.SIZEOF_SHORT,
- current.rowLengthWithSize - Bytes.SIZEOF_SHORT);
-
- // copy the column family
- System.arraycopy(familyNameWithSize, 0, current.keyBuffer,
- current.rowLengthWithSize, familyNameWithSize.length);
-
- // copy the qualifier
- currentBuffer.get(current.keyBuffer,
- current.rowLengthWithSize + familyNameWithSize.length,
- current.keyLength - current.rowLengthWithSize -
- familyNameWithSize.length - TIMESTAMP_WITH_TYPE_LENGTH);
- } else if (current.lastCommonPrefix < current.rowLengthWithSize) {
- // we have to copy part of row and qualifier,
- // but column family is in right place
-
- // before column family (rest of row)
- currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
- current.rowLengthWithSize - current.lastCommonPrefix);
-
- // after column family (qualifier)
- currentBuffer.get(current.keyBuffer,
- current.rowLengthWithSize + familyNameWithSize.length,
- current.keyLength - current.rowLengthWithSize -
- familyNameWithSize.length - TIMESTAMP_WITH_TYPE_LENGTH);
- } else {
- // copy just the ending
- currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
- current.keyLength - TIMESTAMP_WITH_TYPE_LENGTH -
- current.lastCommonPrefix);
- }
-
- // timestamp
- int pos = current.keyLength - TIMESTAMP_WITH_TYPE_LENGTH;
- int timestampFitInBytes = 1 +
- ((flag & MASK_TIMESTAMP_LENGTH) >>> SHIFT_TIMESTAMP_LENGTH);
- long timestampOrDiff = ByteBuff.readLong(currentBuffer, timestampFitInBytes);
- if ((flag & FLAG_TIMESTAMP_SIGN) != 0) {
- timestampOrDiff = -timestampOrDiff;
- }
- if ((flag & FLAG_TIMESTAMP_IS_DIFF) == 0) { // it is timestamp
- current.timestamp = timestampOrDiff;
- } else { // it is diff
- current.timestamp = current.timestamp - timestampOrDiff;
- }
- Bytes.putLong(current.keyBuffer, pos, current.timestamp);
- pos += Bytes.SIZEOF_LONG;
-
- // type
- if ((flag & FLAG_SAME_TYPE) == 0) {
- currentBuffer.get(current.keyBuffer, pos, Bytes.SIZEOF_BYTE);
- } else if ((flag & FLAG_SAME_KEY_LENGTH) == 0) {
- current.keyBuffer[pos] = type;
- }
-
- current.valueOffset = currentBuffer.position();
- currentBuffer.skip(current.valueLength);
-
- if (includesTags()) {
- decodeTags();
- }
- if (includesMvcc()) {
- current.memstoreTS = ByteBufferUtils.readVLong(currentBuffer);
- } else {
- current.memstoreTS = 0;
- }
- current.nextKvOffset = currentBuffer.position();
- }
-
- @Override
- protected void decodeFirst() {
- currentBuffer.skip(Bytes.SIZEOF_INT);
-
- // read column family
- byte familyNameLength = currentBuffer.get();
- familyNameWithSize = new byte[familyNameLength + Bytes.SIZEOF_BYTE];
- familyNameWithSize[0] = familyNameLength;
- currentBuffer.get(familyNameWithSize, Bytes.SIZEOF_BYTE,
- familyNameLength);
- decode(true);
- }
-
- @Override
- protected void decodeNext() {
- decode(false);
- }
-
- @Override
- protected DiffSeekerState createSeekerState() {
- return new DiffSeekerState(this.tmpPair, this.includesTags());
- }
- };
+ return new DiffSeekerStateBufferedEncodedSeeker(decodingCtx);
}
@Override
@@ -525,4 +403,133 @@ public class DiffKeyDeltaEncoder extends BufferedDataBlockEncoder {
return buffer;
}
+
+ private static class DiffSeekerStateBufferedEncodedSeeker
+ extends BufferedEncodedSeeker<DiffSeekerState> {
+ private byte[] familyNameWithSize;
+ private static final int TIMESTAMP_WITH_TYPE_LENGTH =
+ Bytes.SIZEOF_LONG + Bytes.SIZEOF_BYTE;
+
+ private DiffSeekerStateBufferedEncodedSeeker(HFileBlockDecodingContext decodingCtx) {
+ super(decodingCtx);
+ }
+
+ private void decode(boolean isFirst) {
+ byte flag = currentBuffer.get();
+ byte type = 0;
+ if ((flag & FLAG_SAME_KEY_LENGTH) == 0) {
+ if (!isFirst) {
+ type = current.keyBuffer[current.keyLength - Bytes.SIZEOF_BYTE];
+ }
+ current.keyLength = ByteBuff.readCompressedInt(currentBuffer);
+ }
+ if ((flag & FLAG_SAME_VALUE_LENGTH) == 0) {
+ current.valueLength = ByteBuff.readCompressedInt(currentBuffer);
+ }
+ current.lastCommonPrefix = ByteBuff.readCompressedInt(currentBuffer);
+
+ current.ensureSpaceForKey();
+
+ if (current.lastCommonPrefix < Bytes.SIZEOF_SHORT) {
+ // length of row is different, copy everything except family
+
+ // copy the row size
+ currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
+ Bytes.SIZEOF_SHORT - current.lastCommonPrefix);
+ current.rowLengthWithSize = Bytes.toShort(current.keyBuffer, 0) +
+ Bytes.SIZEOF_SHORT;
+
+ // copy the rest of row
+ currentBuffer.get(current.keyBuffer, Bytes.SIZEOF_SHORT,
+ current.rowLengthWithSize - Bytes.SIZEOF_SHORT);
+
+ // copy the column family
+ System.arraycopy(familyNameWithSize, 0, current.keyBuffer,
+ current.rowLengthWithSize, familyNameWithSize.length);
+
+ // copy the qualifier
+ currentBuffer.get(current.keyBuffer,
+ current.rowLengthWithSize + familyNameWithSize.length,
+ current.keyLength - current.rowLengthWithSize -
+ familyNameWithSize.length - TIMESTAMP_WITH_TYPE_LENGTH);
+ } else if (current.lastCommonPrefix < current.rowLengthWithSize) {
+ // we have to copy part of row and qualifier,
+ // but column family is in right place
+
+ // before column family (rest of row)
+ currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
+ current.rowLengthWithSize - current.lastCommonPrefix);
+
+ // after column family (qualifier)
+ currentBuffer.get(current.keyBuffer,
+ current.rowLengthWithSize + familyNameWithSize.length,
+ current.keyLength - current.rowLengthWithSize -
+ familyNameWithSize.length - TIMESTAMP_WITH_TYPE_LENGTH);
+ } else {
+ // copy just the ending
+ currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
+ current.keyLength - TIMESTAMP_WITH_TYPE_LENGTH -
+ current.lastCommonPrefix);
+ }
+
+ // timestamp
+ int pos = current.keyLength - TIMESTAMP_WITH_TYPE_LENGTH;
+ int timestampFitInBytes = 1 +
+ ((flag & MASK_TIMESTAMP_LENGTH) >>> SHIFT_TIMESTAMP_LENGTH);
+ long timestampOrDiff = ByteBuff.readLong(currentBuffer, timestampFitInBytes);
+ if ((flag & FLAG_TIMESTAMP_SIGN) != 0) {
+ timestampOrDiff = -timestampOrDiff;
+ }
+ if ((flag & FLAG_TIMESTAMP_IS_DIFF) == 0) { // it is timestamp
+ current.timestamp = timestampOrDiff;
+ } else { // it is diff
+ current.timestamp = current.timestamp - timestampOrDiff;
+ }
+ Bytes.putLong(current.keyBuffer, pos, current.timestamp);
+ pos += Bytes.SIZEOF_LONG;
+
+ // type
+ if ((flag & FLAG_SAME_TYPE) == 0) {
+ currentBuffer.get(current.keyBuffer, pos, Bytes.SIZEOF_BYTE);
+ } else if ((flag & FLAG_SAME_KEY_LENGTH) == 0) {
+ current.keyBuffer[pos] = type;
+ }
+
+ current.valueOffset = currentBuffer.position();
+ currentBuffer.skip(current.valueLength);
+
+ if (includesTags()) {
+ decodeTags();
+ }
+ if (includesMvcc()) {
+ current.memstoreTS = ByteBufferUtils.readVLong(currentBuffer);
+ } else {
+ current.memstoreTS = 0;
+ }
+ current.nextKvOffset = currentBuffer.position();
+ }
+
+ @Override
+ protected void decodeFirst() {
+ currentBuffer.skip(Bytes.SIZEOF_INT);
+
+ // read column family
+ byte familyNameLength = currentBuffer.get();
+ familyNameWithSize = new byte[familyNameLength + Bytes.SIZEOF_BYTE];
+ familyNameWithSize[0] = familyNameLength;
+ currentBuffer.get(familyNameWithSize, Bytes.SIZEOF_BYTE,
+ familyNameLength);
+ decode(true);
+ }
+
+ @Override
+ protected void decodeNext() {
+ decode(false);
+ }
+
+ @Override
+ protected DiffSeekerState createSeekerState() {
+ return new DiffSeekerState(this.tmpPair, this.includesTags());
+ }
+ }
}
diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/FastDiffDeltaEncoder.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/FastDiffDeltaEncoder.java
index a5774e5..bcac84b 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/FastDiffDeltaEncoder.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/FastDiffDeltaEncoder.java
@@ -396,130 +396,138 @@ public class FastDiffDeltaEncoder extends BufferedDataBlockEncoder {
@Override
public EncodedSeeker createSeeker(final HFileBlockDecodingContext decodingCtx) {
- return new BufferedEncodedSeeker<FastDiffSeekerState>(decodingCtx) {
- private void decode(boolean isFirst) {
- byte flag = currentBuffer.get();
- if ((flag & FLAG_SAME_KEY_LENGTH) == 0) {
- if (!isFirst) {
- System.arraycopy(current.keyBuffer,
- current.keyLength - current.prevTimestampAndType.length,
- current.prevTimestampAndType, 0,
- current.prevTimestampAndType.length);
- }
- current.keyLength = ByteBuff.readCompressedInt(currentBuffer);
- }
- if ((flag & FLAG_SAME_VALUE_LENGTH) == 0) {
- current.valueLength = ByteBuff.readCompressedInt(currentBuffer);
- }
- current.lastCommonPrefix = ByteBuff.readCompressedInt(currentBuffer);
-
- current.ensureSpaceForKey();
-
- if (isFirst) {
- // copy everything
- currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
- current.keyLength - current.prevTimestampAndType.length);
- current.rowLengthWithSize = Bytes.toShort(current.keyBuffer, 0) +
- Bytes.SIZEOF_SHORT;
- current.familyLengthWithSize =
- current.keyBuffer[current.rowLengthWithSize] + Bytes.SIZEOF_BYTE;
- } else if (current.lastCommonPrefix < Bytes.SIZEOF_SHORT) {
- // length of row is different, copy everything except family
-
- // copy the row size
- int oldRowLengthWithSize = current.rowLengthWithSize;
- currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
- Bytes.SIZEOF_SHORT - current.lastCommonPrefix);
- current.rowLengthWithSize = Bytes.toShort(current.keyBuffer, 0) +
- Bytes.SIZEOF_SHORT;
-
- // move the column family
- System.arraycopy(current.keyBuffer, oldRowLengthWithSize,
- current.keyBuffer, current.rowLengthWithSize,
- current.familyLengthWithSize);
-
- // copy the rest of row
- currentBuffer.get(current.keyBuffer, Bytes.SIZEOF_SHORT,
- current.rowLengthWithSize - Bytes.SIZEOF_SHORT);
-
- // copy the qualifier
- currentBuffer.get(current.keyBuffer, current.rowLengthWithSize
- + current.familyLengthWithSize, current.keyLength
- - current.rowLengthWithSize - current.familyLengthWithSize
- - current.prevTimestampAndType.length);
- } else if (current.lastCommonPrefix < current.rowLengthWithSize) {
- // We have to copy part of row and qualifier, but the column family
- // is in the right place.
-
- // before column family (rest of row)
- currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
- current.rowLengthWithSize - current.lastCommonPrefix);
-
- // after column family (qualifier)
- currentBuffer.get(current.keyBuffer, current.rowLengthWithSize
- + current.familyLengthWithSize, current.keyLength
- - current.rowLengthWithSize - current.familyLengthWithSize
- - current.prevTimestampAndType.length);
- } else {
- // copy just the ending
- currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
- current.keyLength - current.prevTimestampAndType.length
- - current.lastCommonPrefix);
- }
+ return new FastDiffSeekerStateBufferedEncodedSeeker(decodingCtx);
+ }
- // timestamp
- int pos = current.keyLength - current.prevTimestampAndType.length;
- int commonTimestampPrefix = (flag & MASK_TIMESTAMP_LENGTH) >>>
- SHIFT_TIMESTAMP_LENGTH;
- if ((flag & FLAG_SAME_KEY_LENGTH) == 0) {
- System.arraycopy(current.prevTimestampAndType, 0, current.keyBuffer,
- pos, commonTimestampPrefix);
- }
- pos += commonTimestampPrefix;
- currentBuffer.get(current.keyBuffer, pos,
- Bytes.SIZEOF_LONG - commonTimestampPrefix);
- pos += Bytes.SIZEOF_LONG - commonTimestampPrefix;
-
- // type
- if ((flag & FLAG_SAME_TYPE) == 0) {
- currentBuffer.get(current.keyBuffer, pos, Bytes.SIZEOF_BYTE);
- } else if ((flag & FLAG_SAME_KEY_LENGTH) == 0) {
- current.keyBuffer[pos] =
- current.prevTimestampAndType[Bytes.SIZEOF_LONG];
- }
+ private static class FastDiffSeekerStateBufferedEncodedSeeker
+ extends BufferedEncodedSeeker<FastDiffSeekerState> {
- // handle value
- if ((flag & FLAG_SAME_VALUE) == 0) {
- current.valueOffset = currentBuffer.position();
- currentBuffer.skip(current.valueLength);
- }
+ private FastDiffSeekerStateBufferedEncodedSeeker(HFileBlockDecodingContext decodingCtx) {
+ super(decodingCtx);
+ }
- if (includesTags()) {
- decodeTags();
- }
- if (includesMvcc()) {
- current.memstoreTS = ByteBufferUtils.readVLong(currentBuffer);
- } else {
- current.memstoreTS = 0;
+ private void decode(boolean isFirst) {
+ byte flag = currentBuffer.get();
+ if ((flag & FLAG_SAME_KEY_LENGTH) == 0) {
+ if (!isFirst) {
+ System.arraycopy(current.keyBuffer,
+ current.keyLength - current.prevTimestampAndType.length,
+ current.prevTimestampAndType, 0,
+ current.prevTimestampAndType.length);
}
- current.nextKvOffset = currentBuffer.position();
+ current.keyLength = ByteBuff.readCompressedInt(currentBuffer);
+ }
+ if ((flag & FLAG_SAME_VALUE_LENGTH) == 0) {
+ current.valueLength = ByteBuff.readCompressedInt(currentBuffer);
}
+ current.lastCommonPrefix = ByteBuff.readCompressedInt(currentBuffer);
+
+ current.ensureSpaceForKey();
+
+ if (isFirst) {
+ // copy everything
+ currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
+ current.keyLength - current.prevTimestampAndType.length);
+ current.rowLengthWithSize = Bytes.toShort(current.keyBuffer, 0) +
+ Bytes.SIZEOF_SHORT;
+ current.familyLengthWithSize =
+ current.keyBuffer[current.rowLengthWithSize] + Bytes.SIZEOF_BYTE;
+ } else if (current.lastCommonPrefix < Bytes.SIZEOF_SHORT) {
+ // length of row is different, copy everything except family
+
+ // copy the row size
+ int oldRowLengthWithSize = current.rowLengthWithSize;
+ currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
+ Bytes.SIZEOF_SHORT - current.lastCommonPrefix);
+ current.rowLengthWithSize = Bytes.toShort(current.keyBuffer, 0) +
+ Bytes.SIZEOF_SHORT;
+
+ // move the column family
+ System.arraycopy(current.keyBuffer, oldRowLengthWithSize,
+ current.keyBuffer, current.rowLengthWithSize,
+ current.familyLengthWithSize);
- @Override
- protected void decodeFirst() {
- currentBuffer.skip(Bytes.SIZEOF_INT);
- decode(true);
+ // copy the rest of row
+ currentBuffer.get(current.keyBuffer, Bytes.SIZEOF_SHORT,
+ current.rowLengthWithSize - Bytes.SIZEOF_SHORT);
+
+ // copy the qualifier
+ currentBuffer.get(current.keyBuffer, current.rowLengthWithSize
+ + current.familyLengthWithSize, current.keyLength
+ - current.rowLengthWithSize - current.familyLengthWithSize
+ - current.prevTimestampAndType.length);
+ } else if (current.lastCommonPrefix < current.rowLengthWithSize) {
+ // We have to copy part of row and qualifier, but the column family
+ // is in the right place.
+
+ // before column family (rest of row)
+ currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
+ current.rowLengthWithSize - current.lastCommonPrefix);
+
+ // after column family (qualifier)
+ currentBuffer.get(current.keyBuffer, current.rowLengthWithSize
+ + current.familyLengthWithSize, current.keyLength
+ - current.rowLengthWithSize - current.familyLengthWithSize
+ - current.prevTimestampAndType.length);
+ } else {
+ // copy just the ending
+ currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
+ current.keyLength - current.prevTimestampAndType.length
+ - current.lastCommonPrefix);
}
- @Override
- protected void decodeNext() {
- decode(false);
+ // timestamp
+ int pos = current.keyLength - current.prevTimestampAndType.length;
+ int commonTimestampPrefix = (flag & MASK_TIMESTAMP_LENGTH) >>>
+ SHIFT_TIMESTAMP_LENGTH;
+ if ((flag & FLAG_SAME_KEY_LENGTH) == 0) {
+ System.arraycopy(current.prevTimestampAndType, 0, current.keyBuffer,
+ pos, commonTimestampPrefix);
}
+ pos += commonTimestampPrefix;
+ currentBuffer.get(current.keyBuffer, pos,
+ Bytes.SIZEOF_LONG - commonTimestampPrefix);
+ pos += Bytes.SIZEOF_LONG - commonTimestampPrefix;
- @Override
- protected FastDiffSeekerState createSeekerState() {
- return new FastDiffSeekerState(this.tmpPair, this.includesTags());
+ // type
+ if ((flag & FLAG_SAME_TYPE) == 0) {
+ currentBuffer.get(current.keyBuffer, pos, Bytes.SIZEOF_BYTE);
+ } else if ((flag & FLAG_SAME_KEY_LENGTH) == 0) {
+ current.keyBuffer[pos] =
+ current.prevTimestampAndType[Bytes.SIZEOF_LONG];
}
- };
+
+ // handle value
+ if ((flag & FLAG_SAME_VALUE) == 0) {
+ current.valueOffset = currentBuffer.position();
+ currentBuffer.skip(current.valueLength);
+ }
+
+ if (includesTags()) {
+ decodeTags();
+ }
+ if (includesMvcc()) {
+ current.memstoreTS = ByteBufferUtils.readVLong(currentBuffer);
+ } else {
+ current.memstoreTS = 0;
+ }
+ current.nextKvOffset = currentBuffer.position();
+ }
+
+ @Override
+ protected void decodeFirst() {
+ currentBuffer.skip(Bytes.SIZEOF_INT);
+ decode(true);
+ }
+
+ @Override
+ protected void decodeNext() {
+ decode(false);
+ }
+
+ @Override
+ protected FastDiffSeekerState createSeekerState() {
+ return new FastDiffSeekerState(this.tmpPair, this.includesTags());
+ }
}
}
diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/PrefixKeyDeltaEncoder.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/PrefixKeyDeltaEncoder.java
index 7af0c8c..0f4fbc8 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/PrefixKeyDeltaEncoder.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/PrefixKeyDeltaEncoder.java
@@ -194,34 +194,42 @@ public class PrefixKeyDeltaEncoder extends BufferedDataBlockEncoder {
@Override
public EncodedSeeker createSeeker(final HFileBlockDecodingContext decodingCtx) {
- return new BufferedEncodedSeeker<SeekerState>(decodingCtx) {
- @Override
- protected void decodeNext() {
- current.keyLength = ByteBuff.readCompressedInt(currentBuffer);
- current.valueLength = ByteBuff.readCompressedInt(currentBuffer);
- current.lastCommonPrefix = ByteBuff.readCompressedInt(currentBuffer);
- current.keyLength += current.lastCommonPrefix;
- current.ensureSpaceForKey();
- currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
- current.keyLength - current.lastCommonPrefix);
- current.valueOffset = currentBuffer.position();
- currentBuffer.skip(current.valueLength);
- if (includesTags()) {
- decodeTags();
- }
- if (includesMvcc()) {
- current.memstoreTS = ByteBufferUtils.readVLong(currentBuffer);
- } else {
- current.memstoreTS = 0;
- }
- current.nextKvOffset = currentBuffer.position();
- }
+ return new SeekerStateBufferedEncodedSeeker(decodingCtx);
+ }
+
+ private static class SeekerStateBufferedEncodedSeeker
+ extends BufferedEncodedSeeker<SeekerState> {
+
+ private SeekerStateBufferedEncodedSeeker(HFileBlockDecodingContext decodingCtx) {
+ super(decodingCtx);
+ }
- @Override
- protected void decodeFirst() {
- currentBuffer.skip(Bytes.SIZEOF_INT);
- decodeNext();
+ @Override
+ protected void decodeNext() {
+ current.keyLength = ByteBuff.readCompressedInt(currentBuffer);
+ current.valueLength = ByteBuff.readCompressedInt(currentBuffer);
+ current.lastCommonPrefix = ByteBuff.readCompressedInt(currentBuffer);
+ current.keyLength += current.lastCommonPrefix;
+ current.ensureSpaceForKey();
+ currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
+ current.keyLength - current.lastCommonPrefix);
+ current.valueOffset = currentBuffer.position();
+ currentBuffer.skip(current.valueLength);
+ if (includesTags()) {
+ decodeTags();
+ }
+ if (includesMvcc()) {
+ current.memstoreTS = ByteBufferUtils.readVLong(currentBuffer);
+ } else {
+ current.memstoreTS = 0;
}
- };
+ current.nextKvOffset = currentBuffer.position();
+ }
+
+ @Override
+ protected void decodeFirst() {
+ currentBuffer.skip(Bytes.SIZEOF_INT);
+ decodeNext();
+ }
}
}