You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ji...@apache.org on 2008/06/17 22:49:10 UTC

svn commit: r668822 - in /hadoop/hbase/trunk: CHANGES.txt src/java/org/apache/hadoop/hbase/regionserver/Memcache.java src/test/org/apache/hadoop/hbase/regionserver/TestHMemcache.java

Author: jimk
Date: Tue Jun 17 13:49:10 2008
New Revision: 668822

URL: http://svn.apache.org/viewvc?rev=668822&view=rev
Log:
HBASE-686   MemcacheScanner didn't return the first row(if it exists), because HScannerInterface's output incorrect (LN via Jim Kellerman)

Modified:
    hadoop/hbase/trunk/CHANGES.txt
    hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/Memcache.java
    hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/regionserver/TestHMemcache.java

Modified: hadoop/hbase/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/CHANGES.txt?rev=668822&r1=668821&r2=668822&view=diff
==============================================================================
--- hadoop/hbase/trunk/CHANGES.txt (original)
+++ hadoop/hbase/trunk/CHANGES.txt Tue Jun 17 13:49:10 2008
@@ -52,6 +52,8 @@
                (LN via Stack)
    HBASE-682   Unnecessary iteration in HMemcache.internalGet? got much better
                reading performance after break it (LN via Stack)
+   HBASE-686   MemcacheScanner didn't return the first row(if it exists),
+               because HScannerInterface's output incorrect (LN via Jim Kellerman)
    
   IMPROVEMENTS
    HBASE-559   MR example job to count table rows

Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/Memcache.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/Memcache.java?rev=668822&r1=668821&r2=668822&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/Memcache.java (original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/Memcache.java Tue Jun 17 13:49:10 2008
@@ -421,8 +421,7 @@
           // take note of the row of this candidate so that we'll know when
           // we cross the row boundary into the previous row.
           if (!HLogEdit.isDeleted(headMap.get(thisKey))) {
-            if (ttl == HConstants.FOREVER ||
-                    now < found_key.getTimestamp() + ttl) {
+            if (ttl == HConstants.FOREVER) {
               lastRowFound = thisKey.getRow();
               candidateKeys.put(stripTimestamp(thisKey), 
                 new Long(thisKey.getTimestamp()));
@@ -698,8 +697,7 @@
       if (results.size() > 0) {
         results.clear();
       }
-      while (results.size() <= 0 &&
-          (this.currentRow = getNextRow(this.currentRow)) != null) {
+      while (results.size() <= 0 && this.currentRow != null) {
         if (deletes.size() > 0) {
           deletes.clear();
         }
@@ -727,6 +725,8 @@
           }
           results.put(column, c.getValue());
         }
+        this.currentRow = getNextRow(this.currentRow);
+
       }
       return results.size() > 0;
     }

Modified: hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/regionserver/TestHMemcache.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/regionserver/TestHMemcache.java?rev=668822&r1=668821&r2=668822&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/regionserver/TestHMemcache.java (original)
+++ hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/regionserver/TestHMemcache.java Tue Jun 17 13:49:10 2008
@@ -304,4 +304,42 @@
   private HStoreKey getHSKForRow(byte [] row) {
     return new HStoreKey(row, Bytes.toBytes("test_col:"), HConstants.LATEST_TIMESTAMP);
   }
+
+  /**
+   * Test memcache scanner scanning cached rows, HBASE-686
+   * @throws IOException
+   */
+  public void testScanner_686() throws IOException {
+    addRows(this.hmemcache);
+    long timestamp = System.currentTimeMillis();
+    byte[][] cols = new byte[COLUMNS_COUNT * ROW_COUNT][];
+    for (int i = 0; i < ROW_COUNT; i++) {
+      for (int ii = 0; ii < COLUMNS_COUNT; ii++) {
+        cols[(ii + (i * COLUMNS_COUNT))] = getColumnName(i, ii);
+      }
+    }
+    //starting from each row, validate results should contain the starting row
+    for (int startRowId = 0; startRowId < ROW_COUNT; startRowId++) {
+      InternalScanner scanner = this.hmemcache.getScanner(timestamp,
+          cols, getRowName(startRowId));
+      HStoreKey key = new HStoreKey();
+      TreeMap<byte[], byte[]> results =
+        new TreeMap<byte[], byte[]>(Bytes.BYTES_COMPARATOR);
+      for (int i = 0; scanner.next(key, results); i++) {
+        int rowId = startRowId + i;
+        assertTrue("Row name",
+            key.toString().startsWith(Bytes.toString(getRowName(rowId))));
+        assertEquals("Count of columns", COLUMNS_COUNT, results.size());
+        TreeMap<byte[], Cell> row =
+          new TreeMap<byte[], Cell>(Bytes.BYTES_COMPARATOR);
+        for (Map.Entry<byte[], byte[]> e : results.entrySet()) {
+          row.put(e.getKey(),
+              new Cell(e.getValue(), HConstants.LATEST_TIMESTAMP));
+        }
+        isExpectedRow(rowId, row);
+        // Clear out set.  Otherwise row results accumulate.
+        results.clear();
+      }
+    }
+  }
 }
\ No newline at end of file