Browse Source

HADOOP-2592 Scanning, a region can let out a row that its not supposed to have

git-svn-id: https://svn.apache.org/repos/asf/lucene/hadoop/trunk@612314 13f79535-47bb-0310-9956-ffa450edef68
Michael Stack 17 years ago
parent
commit
703ec4d9a8

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

@@ -129,6 +129,8 @@ Trunk (unreleased changes)
                previously (Bryan Duxbury via Stack)
    HADOOP-2587 Splits blocked by compactions cause region to be offline for
                duration of compaction. 
+   HADOOP-2592 Scanning, a region can let out a row that its not supposed
+               to have
    
   IMPROVEMENTS
    HADOOP-2401 Add convenience put method that takes writable

+ 37 - 25
src/contrib/hbase/src/java/org/apache/hadoop/hbase/HStoreFile.java

@@ -737,7 +737,7 @@ public class HStoreFile implements HConstants {
   static class HalfMapFileReader extends BloomFilterMapFile.Reader {
     private final boolean top;
     private final WritableComparable midkey;
-    private boolean topFirstNextCall = true;
+    private boolean firstNextCall = true;
     
     HalfMapFileReader(final FileSystem fs, final String dirName, 
         final Configuration conf, final Range r,
@@ -789,17 +789,32 @@ public class HStoreFile implements HConstants {
     @SuppressWarnings("unchecked")
     @Override
     public synchronized WritableComparable getClosest(WritableComparable key,
-        Writable val)
+      Writable val)
     throws IOException {
+      WritableComparable closest = null;
       if (top) {
-        if (key.compareTo(midkey) < 0) {
-          return midkey;
+        // If top, the lowest possible key is midkey.  Do not have to check
+        // what comes back from super getClosest.  Will return exact match or
+        // greater.
+        closest = (key.compareTo(this.midkey) < 0)?
+          this.midkey: super.getClosest(key, val);
+      } else {
+        // We're serving bottom of the file.
+        if (key.compareTo(this.midkey) < 0) {
+          // Check key is within range for bottom.
+          closest = super.getClosest(key, val);
+          // midkey was made against largest store file at time of split. Smaller
+          // store files could have anything in them.  Check return value is
+          // not beyond the midkey (getClosest returns exact match or next
+          // after).
+          if (closest != null && closest.compareTo(this.midkey) >= 0) {
+            // Don't let this value out.
+            closest = null;
+          }
         }
-      } else if (key.compareTo(midkey) >= 0) {
-        // Contract says return null if EOF.
-        return null;
+        // Else, key is > midkey so let out closest = null.
       }
-      return super.getClosest(key, val);
+      return closest;
     }
 
     /** {@inheritDoc} */
@@ -815,9 +830,19 @@ public class HStoreFile implements HConstants {
     @Override
     public synchronized boolean next(WritableComparable key, Writable val)
     throws IOException {
-      if (top && topFirstNextCall) {
-        topFirstNextCall = false;
-        return doFirstNextProcessing(key, val);
+      if (firstNextCall) {
+        firstNextCall = false;
+        if (this.top) {
+          // Seek to midkey.  Midkey may not exist in this file.  That should be
+          // fine.  Then we'll either be positioned at end or start of file.
+          WritableComparable nearest = getClosest(midkey, val);
+          // Now copy the mid key into the passed key.
+          if (nearest != null) {
+            Writables.copyWritable(nearest, key);
+            return true;
+          }
+          return false;
+        }
       }
       boolean result = super.next(key, val);
       if (!top && key.compareTo(midkey) >= 0) {
@@ -825,25 +850,12 @@ public class HStoreFile implements HConstants {
       }
       return result;
     }
-    
-    private boolean doFirstNextProcessing(WritableComparable key, Writable val)
-    throws IOException {
-      // Seek to midkey.  Midkey may not exist in this file.  That should be
-      // fine.  Then we'll either be positioned at end or start of file.
-      WritableComparable nearest = getClosest(midkey, val);
-      // Now copy the mid key into the passed key.
-      if (nearest != null) {
-        Writables.copyWritable(nearest, key);
-        return true;
-      }
-      return false;
-    }
 
     /** {@inheritDoc} */
     @Override
     public synchronized void reset() throws IOException {
       if (top) {
-        topFirstNextCall = true;
+        firstNextCall = true;
         seek(midkey);
         return;
       }