diff --git a/CHANGES.txt b/CHANGES.txt index 74a06ede7cd..2c20370f465 100644 --- a/CHANGES.txt +++ b/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. diff --git a/src/java/org/apache/hadoop/hbase/HStore.java b/src/java/org/apache/hadoop/hbase/HStore.java index 64428535882..a627bede8d3 100644 --- a/src/java/org/apache/hadoop/hbase/HStore.java +++ b/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();