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/1cdc5acf Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/1cdc5acf Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/1cdc5acf Branch: refs/heads/hbase-12439 Commit: 1cdc5acfd456688f106287c19ae9af62fd03a3af 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 16:54:51 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/1cdc5acf/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/1cdc5acf/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"); + } + } }