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 1d9b1302a72..a518ffb58cd 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 @@ -362,8 +362,16 @@ public class Scan extends Query { * @param startRow row to start scan on (inclusive) * Note: In order to make startRow exclusive add a trailing 0 byte * @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; } @@ -376,8 +384,16 @@ public class Scan extends Query { * use {@link #setRowPrefixFilter(byte[])}. * The 'trailing 0' will not yield the desired result.

* @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; } 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 d843723e0fe..5f771cd66c1 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,10 +25,11 @@ import java.io.IOException; import java.util.Arrays; import java.util.Set; -import org.apache.hadoop.hbase.testclassification.SmallTests; +import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.protobuf.generated.ClientProtos; import org.apache.hadoop.hbase.security.visibility.Authorizations; +import org.apache.hadoop.hbase.testclassification.SmallTests; import org.apache.hadoop.hbase.util.Bytes; import org.junit.Assert; import org.junit.Test; @@ -131,5 +132,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"); + } + } }