HBASE-16540 Adding checks in Scanner's setStartRow and setStopRow for invalid 
row key sizes.

Signed-off-by: Gary Helmling <ga...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/c57acf28
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/c57acf28
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/c57acf28

Branch: refs/heads/hbase-12439
Commit: c57acf28e7cabcfcbce8ae0006080088cdc47f50
Parents: 8855670
Author: Dustin Pho <p...@fb.com>
Authored: Mon Sep 12 13:25:02 2016 -0700
Committer: Gary Helmling <ga...@apache.org>
Committed: Mon Sep 12 23:23:27 2016 -0700

----------------------------------------------------------------------
 .../org/apache/hadoop/hbase/client/Scan.java    | 16 +++++++++++
 .../apache/hadoop/hbase/client/TestScan.java    | 28 ++++++++++++++++++++
 2 files changed, 44 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/c57acf28/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Scan.java
----------------------------------------------------------------------
diff --git 
a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Scan.java 
b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Scan.java
index ee3ed43..22f611a 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Scan.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Scan.java
@@ -373,8 +373,16 @@ public class Scan extends Query {
    * next closest row after the specified row.
    * @param startRow row to start scanner at or after
    * @return this
+   * @throws IllegalArgumentException if startRow does not meet criteria
+   * for a row key (when length exceeds {@link HConstants#MAX_ROW_LENGTH})
    */
   public Scan setStartRow(byte [] startRow) {
+    if (Bytes.len(startRow) > HConstants.MAX_ROW_LENGTH) {
+      throw new IllegalArgumentException(
+        "startRow's length must be less than or equal to " +
+        HConstants.MAX_ROW_LENGTH + " to meet the criteria" +
+        " for a row key.");
+    }
     this.startRow = startRow;
     return this;
   }
@@ -389,8 +397,16 @@ public class Scan extends Query {
    * use {@link #setRowPrefixFilter(byte[])}.
    * The 'trailing 0' will not yield the desired result.</p>
    * @return this
+   * @throws IllegalArgumentException if stopRow does not meet criteria
+   * for a row key (when length exceeds {@link HConstants#MAX_ROW_LENGTH})
    */
   public Scan setStopRow(byte [] stopRow) {
+    if (Bytes.len(stopRow) > HConstants.MAX_ROW_LENGTH) {
+      throw new IllegalArgumentException(
+        "stopRow's length must be less than or equal to " +
+        HConstants.MAX_ROW_LENGTH + " to meet the criteria" +
+        " for a row key.");
+    }
     this.stopRow = stopRow;
     return this;
   }

http://git-wip-us.apache.org/repos/asf/hbase/blob/c57acf28/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestScan.java
----------------------------------------------------------------------
diff --git 
a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestScan.java 
b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestScan.java
index 129914f..16c74df 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestScan.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestScan.java
@@ -25,6 +25,8 @@ import java.io.IOException;
 import java.util.Arrays;
 import java.util.Set;
 
+import org.apache.hadoop.hbase.HConstants;
+import org.apache.hadoop.hbase.exceptions.IllegalArgumentIOException;
 import org.apache.hadoop.hbase.protobuf.ProtobufUtil;
 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos;
 import org.apache.hadoop.hbase.security.visibility.Authorizations;
@@ -132,5 +134,31 @@ public class TestScan {
       fail("should not throw exception");
     }
   }
+
+  @Test
+  public void testSetStartRowAndSetStopRow() {
+    Scan scan = new Scan();
+    scan.setStartRow(null);
+    scan.setStartRow(new byte[1]);
+    scan.setStartRow(new byte[HConstants.MAX_ROW_LENGTH]);
+    try {
+      scan.setStartRow(new byte[HConstants.MAX_ROW_LENGTH+1]);
+      fail("should've thrown exception");
+    } catch (IllegalArgumentException iae) {
+    } catch (Exception e) {
+      fail("expected IllegalArgumentException to be thrown");
+    }
+
+    scan.setStopRow(null);
+    scan.setStopRow(new byte[1]);
+    scan.setStopRow(new byte[HConstants.MAX_ROW_LENGTH]);
+    try {
+      scan.setStopRow(new byte[HConstants.MAX_ROW_LENGTH+1]);
+      fail("should've thrown exception");
+    } catch (IllegalArgumentException iae) {
+    } catch (Exception e) {
+      fail("expected IllegalArgumentException to be thrown");
+    }
+  }
 }
 

Reply via email to