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);

Reply via email to