Author: liyin
Date: Wed Apr  2 21:03:43 2014
New Revision: 1584183

URL: http://svn.apache.org/r1584183
Log:
[HBASE-9930] Fixing RegionServer OOM Bug.

Author: manukranthk

Summary: Serialization/Deserialization in the Get object missed the setFilter() 
function in the readFields.

Test Plan: Unit tests

Reviewers: gauravm, rshroff, elliott

Reviewed By: gauravm

CC: hbase-eng@, elliott

Differential Revision: https://phabricator.fb.com/D1248185

Modified:
    hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/client/Get.java
    
hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/client/Result.java
    
hbase/branches/0.89-fb/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java

Modified: 
hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/client/Get.java
URL: 
http://svn.apache.org/viewvc/hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/client/Get.java?rev=1584183&r1=1584182&r2=1584183&view=diff
==============================================================================
--- 
hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/client/Get.java 
(original)
+++ 
hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/client/Get.java 
Wed Apr  2 21:03:43 2014
@@ -299,14 +299,17 @@ public class Get extends OperationWithAt
    * @return this for invocation chaining
    */
   public Get setFilter(Filter filter) {
+    if (filter == null) return this;
     try {
       this.tFilter = TFilter.getTFilter(filter);
+    } catch (Exception e) {
+      throw new RuntimeException(e);
+    }
+    try {
+      this.filter = this.tFilter.getFilter();
     } catch (IOException e) {
-      LOG.error("Caught IOException in serializing filter." +
-          " Cannot continue.");
       throw new RuntimeException(e);
     }
-    this.filter = tFilter;
     return this;
   }
 
@@ -561,6 +564,7 @@ public class Get extends OperationWithAt
       this.filter = 
(Filter)createForName(Bytes.toString(Bytes.readByteArray(in)));
       this.filter.readFields(in);
     }
+    setFilter(filter);
     this.tr = new TimeRange();
     tr.readFields(in);
     int numFamilies = in.readInt();

Modified: 
hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/client/Result.java
URL: 
http://svn.apache.org/viewvc/hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/client/Result.java?rev=1584183&r1=1584182&r2=1584183&view=diff
==============================================================================
--- 
hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/client/Result.java 
(original)
+++ 
hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/client/Result.java 
Wed Apr  2 21:03:43 2014
@@ -733,5 +733,13 @@ public class Result implements Writable,
     return true;
   }
 
+  public int getBytesSize() {
+    int ret = 0;
+    for (KeyValue kv : this.kvs) {
+      ret += kv.getLength();
+    }
+    return ret;
+  }
+
 
 }

Modified: 
hbase/branches/0.89-fb/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java
URL: 
http://svn.apache.org/viewvc/hbase/branches/0.89-fb/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java?rev=1584183&r1=1584182&r2=1584183&view=diff
==============================================================================
--- 
hbase/branches/0.89-fb/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java
 (original)
+++ 
hbase/branches/0.89-fb/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java
 Wed Apr  2 21:03:43 2014
@@ -67,6 +67,7 @@ import org.apache.hadoop.hbase.filter.Re
 import org.apache.hadoop.hbase.filter.RowFilter;
 import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
 import org.apache.hadoop.hbase.filter.WhileMatchFilter;
+import org.apache.hadoop.hbase.filter.WritableByteArrayComparable;
 import org.apache.hadoop.hbase.io.hfile.BlockCache;
 import org.apache.hadoop.hbase.io.hfile.CacheConfig;
 import org.apache.hadoop.hbase.io.hfile.CacheTestHelper;
@@ -4496,5 +4497,29 @@ public class TestFromClientSide {
     r = t.get(g);
     assertTrue(r.isEmpty());
   }
+
+  @Test
+  public void testGetWithFilter() throws IOException {
+    final byte [] TABLENAME = Bytes.toBytes("testGetWithFilter");
+    HTable t = TEST_UTIL.createTable(TABLENAME, FAMILY);
+    byte[][] QUALIFIERS = new byte[][] {Bytes.toBytes("a"),
+        Bytes.toBytes("b")
+    };
+    byte[] row = Bytes.toBytes("row");
+    for (int j = 0; j < 2; j++) {
+      Put p = new Put(row);
+      p.add(FAMILY, QUALIFIERS[j], row);
+      t.put(p);
+      t.flushCommits();
+    }
+    Filter f = new QualifierFilter(CompareFilter.CompareOp.EQUAL,
+        new BinaryComparator(QUALIFIERS[0]));
+    Get g = new Get(row);
+    g.setFilter(f);
+    Result result = t.get(g);
+    assertTrue(result.getKvs().size() == 1);
+    assertTrue(Bytes.equals(result.getKvs().iterator().next().getQualifier(),
+        QUALIFIERS[0]));
+  }
 }
 


Reply via email to