HBASE-16660 ArrayIndexOutOfBounds during the majorCompactionCheck in DateTieredCompaction
Signed-off-by: Andrew Purtell <apurt...@apache.org> Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/96a8e8dc Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/96a8e8dc Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/96a8e8dc Branch: refs/heads/branch-1 Commit: 96a8e8dce4ea65a12af6c14d22ef4d34b52ebb6c Parents: a3485cc Author: Abhishek Singh Chouhan <abhishekchouhan...@gmail.com> Authored: Tue Sep 27 20:32:52 2016 +0530 Committer: Andrew Purtell <apurt...@apache.org> Committed: Tue Sep 27 11:08:00 2016 -0700 ---------------------------------------------------------------------- .../compactions/DateTieredCompactionPolicy.java | 3 +++ .../TestDateTieredCompactionPolicy.java | 16 ++++++++++++++++ 2 files changed, 19 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/96a8e8dc/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/compactions/DateTieredCompactionPolicy.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/compactions/DateTieredCompactionPolicy.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/compactions/DateTieredCompactionPolicy.java index 037bc80..e37a7fe 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/compactions/DateTieredCompactionPolicy.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/compactions/DateTieredCompactionPolicy.java @@ -153,6 +153,9 @@ public class DateTieredCompactionPolicy extends SortedCompactionPolicy { minTimestamp == null ? (Long)Long.MAX_VALUE : minTimestamp); int upperWindowIndex = Collections.binarySearch(boundaries, file.getMaximumTimestamp() == null ? (Long)Long.MAX_VALUE : file.getMaximumTimestamp()); + // Handle boundary conditions and negative values of binarySearch + lowerWindowIndex = (lowerWindowIndex < 0) ? Math.abs(lowerWindowIndex + 2) : lowerWindowIndex; + upperWindowIndex = (upperWindowIndex < 0) ? Math.abs(upperWindowIndex + 2) : upperWindowIndex; if (lowerWindowIndex != upperWindowIndex) { LOG.debug("Major compaction triggered on store " + this + "; because file " + file.getPath() + " has data with timestamps cross window boundaries"); http://git-wip-us.apache.org/repos/asf/hbase/blob/96a8e8dc/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestDateTieredCompactionPolicy.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestDateTieredCompactionPolicy.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestDateTieredCompactionPolicy.java index eb52a84..4f02d8a 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestDateTieredCompactionPolicy.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestDateTieredCompactionPolicy.java @@ -235,6 +235,22 @@ public class TestDateTieredCompactionPolicy extends AbstractTestDateTieredCompac } /** + * Major Compaction to check min max timestamp falling in the same window and also to check + * boundary condition in which case binary sort gives insertion point as length of the array + * @throws IOException + */ + @Test + public void checkMinMaxTimestampSameBoundary() throws IOException { + long[] minTimestamps = new long[] { 0, 26, 50, 90, 98, 122, 145, 151, 158, 166 }; + long[] maxTimestamps = new long[] { 12, 46, 70, 95, 100, 140, 148, 155, 162, 174 }; + long[] sizes = new long[] { 0, 50, 51, 40, 41, 42, 33, 30, 31, 2 }; + + compactEquals(161, sfCreate(minTimestamps, maxTimestamps, sizes), + new long[] { 0, 50, 51, 40, 41, 42, 33, 30, 31, 2 }, + new long[] { Long.MIN_VALUE, 24, 48, 72, 96, 120, 144, 150, 156 }, true, true); + } + + /** * Major compaction with negative numbers * @throws IOException with error */