Bläddra i källkod

HADOOP-1479 Fix NPE in HStore#get if store file only has keys < passed key.

git-svn-id: https://svn.apache.org/repos/asf/lucene/hadoop/trunk@546275 13f79535-47bb-0310-9956-ffa450edef68
Jim Kellerman 18 år sedan
förälder
incheckning
83d835a6f8

+ 1 - 0
src/contrib/hbase/CHANGES.txt

@@ -28,3 +28,4 @@ Trunk (unreleased changes)
  15. HADOOP-1421 Failover detection, split log files.
      For the files modified, also clean up javadoc, class, field and method 
      visibility (HADOOP-1466)
+ 16. HADOOP-1479 Fix NPE in HStore#get if store file only has keys < passed key.

+ 10 - 6
src/contrib/hbase/src/java/org/apache/hadoop/hbase/HStore.java

@@ -835,7 +835,7 @@ class HStore implements HConstants {
    * If 'numVersions' is negative, the method returns all available versions.
    */
   BytesWritable[] get(HStoreKey key, int numVersions) throws IOException {
-    if(numVersions <= 0) {
+    if (numVersions <= 0) {
       throw new IllegalArgumentException("Number of versions must be > 0");
     }
     
@@ -852,15 +852,19 @@ class HStore implements HConstants {
           BytesWritable readval = new BytesWritable();
           map.reset();
           HStoreKey readkey = (HStoreKey)map.getClosest(key, readval);
-          
-          if(readkey.matchesRowCol(key)) {
+          if (readkey == null) {
+            // map.getClosest returns null if the passed key is > than the
+            // last key in the map file.  getClosest is a bit of a misnomer
+            // since it returns exact match or the next closest key AFTER not
+            // BEFORE.
+            continue;
+          }
+          if (readkey.matchesRowCol(key)) {
             results.add(readval);
             readval = new BytesWritable();
-
             while(map.next(readkey, readval) && readkey.matchesRowCol(key)) {
-              if(numVersions > 0 && (results.size() >= numVersions)) {
+              if (numVersions > 0 && (results.size() >= numVersions)) {
                 break;
-                
               }
               results.add(readval);
               readval = new BytesWritable();