Github user ankitsinghal commented on a diff in the pull request:
https://github.com/apache/phoenix/pull/147#discussion_r49932688
--- Diff:
phoenix-core/src/main/java/org/apache/phoenix/iterate/BaseResultIterators.java
---
@@ -490,15 +492,35 @@ private static String toString(List<byte[]> gps) {
}
List<List<Scan>> parallelScans =
Lists.newArrayListWithExpectedSize(stopIndex - regionIndex + 1);
- byte[] currentKey = startKey;
- int guideIndex = currentKey.length == 0 ? 0 :
getIndexContainingInclusive(gps, currentKey);
- int gpsSize = gps.size();
+ ImmutableBytesWritable currentKey = new
ImmutableBytesWritable(startKey, 0, startKey.length);
+
+ int gpsSize = gps.getGuidePostsCount();
int estGuidepostsPerRegion = gpsSize == 0 ? 1 : gpsSize /
regionLocations.size() + 1;
int keyOffset = 0;
+ ImmutableBytesWritable currentGuidePost =
ByteUtil.EMPTY_IMMUTABLE_BYTE_ARRAY;
List<Scan> scans =
Lists.newArrayListWithExpectedSize(estGuidepostsPerRegion);
+ ImmutableBytesWritable guidePosts = gps.getGuidePosts();
+ ByteArrayInputStream stream = null;
+ DataInput input = null;
+ PrefixByteDecoder decoder = null;
+ int guideIndex = 0;
+ if (gpsSize > 0) {
+ stream = new ByteArrayInputStream(guidePosts.get(),
guidePosts.getOffset(), guidePosts.getLength());
+ input = new DataInputStream(stream);
+ decoder = new PrefixByteDecoder(gps.getMaxLength());
+ try {
+ while (currentKey.compareTo(currentGuidePost =
CodecUtils.decode(decoder, input)) >= 0
+ && currentKey.getLength() != 0) {
+ guideIndex++;
+ }
+ } catch (EOFException e) {}
+ }
+ byte[] currentKeyBytes = currentKey.copyBytes();
--- End diff --
But @JamesRTaylor , here the problem is that PrefixByteDecoder reused the
same byte[] for subsequent values too.
public ImmutableBytesWritable decode(DataInput in) throws IOException {
int prefixLen = WritableUtils.readVInt(in);
int suffixLen = WritableUtils.readVInt(in);
int length = prefixLen + suffixLen;
byte[] b;
if (maxLength == -1) { // Allocate new byte array each time
b = new byte[length];
System.arraycopy(previous.get(), previous.getOffset(), b, 0, prefixLen);
} else { // Reuse same buffer each time
b = previous.get();
}
in.readFully(b, prefixLen, suffixLen);
previous.set(b, 0, length);
return previous;
}
And, ByteUtil.copyKeyBytesIfNecessary(currentKey) copies bytes only when
ImmutableByteWritable length is not equal to contained byte[] length.
So ,we need to copyBytes everytime as the subsequent call to decode will
overwrite the same array object.
If you agree on above below comments will follow the same.
---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---