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

Signed-off-by: Gary Helmling <garyh@apache.org>
This commit is contained in:
Dustin Pho 2016-09-12 13:25:02 -07:00 committed by Gary Helmling
parent 8ad14bac67
commit 7028a0d889
2 changed files with 44 additions and 1 deletions

View File

@ -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.</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;
}

View File

@ -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");
}
}
}