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 8855670cd7
commit c57acf28e7
2 changed files with 44 additions and 0 deletions

View File

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

View File

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