Updated Branches: refs/heads/trunk 1d850e1a5 -> 417b175fa
fix NPE in index summarization patch by yukim; reviewed by dbrosius for CASSANDRA-4023 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/417b175f Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/417b175f Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/417b175f Branch: refs/heads/trunk Commit: 417b175fa4bfc80994b3d4e85c9f8d93f3d9ab60 Parents: 1d850e1 Author: Jonathan Ellis <[email protected]> Authored: Mon Mar 26 23:44:50 2012 -0500 Committer: Jonathan Ellis <[email protected]> Committed: Mon Mar 26 23:44:50 2012 -0500 ---------------------------------------------------------------------- .../org/apache/cassandra/db/RowIndexEntry.java | 12 +++++++++++ .../apache/cassandra/io/sstable/SSTableReader.java | 16 ++++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/417b175f/src/java/org/apache/cassandra/db/RowIndexEntry.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/RowIndexEntry.java b/src/java/org/apache/cassandra/db/RowIndexEntry.java index 0b910c8..aea3c2f 100644 --- a/src/java/org/apache/cassandra/db/RowIndexEntry.java +++ b/src/java/org/apache/cassandra/db/RowIndexEntry.java @@ -90,6 +90,18 @@ public class RowIndexEntry } } + public RowIndexEntry deserializePositionOnly(DataInput dis, Descriptor descriptor) throws IOException + { + long position = dis.readLong(); + if (descriptor.hasPromotedIndexes) + { + int size = dis.readInt(); + if (size > 0) + FileUtils.skipBytesFully(dis, size); + } + return new RowIndexEntry(position); + } + public RowIndexEntry deserialize(DataInput dis, Descriptor descriptor) throws IOException { long position = dis.readLong(); http://git-wip-us.apache.org/repos/asf/cassandra/blob/417b175f/src/java/org/apache/cassandra/io/sstable/SSTableReader.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableReader.java b/src/java/org/apache/cassandra/io/sstable/SSTableReader.java index 9e92220..9799846 100644 --- a/src/java/org/apache/cassandra/io/sstable/SSTableReader.java +++ b/src/java/org/apache/cassandra/io/sstable/SSTableReader.java @@ -360,23 +360,24 @@ public class SSTableReader extends SSTable DecoratedKey decoratedKey = null; int len = ByteBufferUtil.readShortLength(input); + // when primary index file contains info other than data position, there is noway to determine + // the last key without deserializing index entry boolean firstKey = left == null; - boolean lastKey = indexPosition + DBConstants.SHORT_SIZE + len + DBConstants.LONG_SIZE == indexSize; + boolean lastKeyForUnpromoted = indexPosition + DBConstants.SHORT_SIZE + len + DBConstants.LONG_SIZE == indexSize; boolean shouldAddEntry = indexSummary.shouldAddEntry(); - if (shouldAddEntry || cacheLoading || recreatebloom || firstKey || lastKey) + if (shouldAddEntry || cacheLoading || recreatebloom || firstKey || lastKeyForUnpromoted || descriptor.hasPromotedIndexes) { decoratedKey = decodeKey(partitioner, descriptor, ByteBufferUtil.read(input, len)); if (firstKey) left = decoratedKey; - if (lastKey) - right = decoratedKey; + right = decoratedKey; } else { FileUtils.skipBytesFully(input, len); } - RowIndexEntry indexEntry = RowIndexEntry.serializer.deserialize(input, descriptor); + RowIndexEntry indexEntry = null; if (decoratedKey != null) { if (recreatebloom) @@ -385,8 +386,13 @@ public class SSTableReader extends SSTable indexSummary.addEntry(decoratedKey, indexPosition); // if key cache could be used and we have key already pre-loaded if (cacheLoading && keysToLoadInCache.contains(decoratedKey)) + { + indexEntry = RowIndexEntry.serializer.deserialize(input, descriptor); cacheKey(decoratedKey, indexEntry); + } } + if (indexEntry == null) + indexEntry = RowIndexEntry.serializer.deserializePositionOnly(input, descriptor); indexSummary.incrementRowid(); ibuilder.addPotentialBoundary(indexPosition);
