Repository: hbase Updated Branches: refs/heads/branch-2.0 01d94d710 -> a31e71564
HBASE-20973 ArrayIndexOutOfBoundsException when rolling back procedure Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/a31e7156 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/a31e7156 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/a31e7156 Branch: refs/heads/branch-2.0 Commit: a31e71564fd5c276cef7b8381e5285b8703eef13 Parents: 01d94d7 Author: Allan Yang <allan...@apache.org> Authored: Tue Oct 23 16:06:19 2018 +0800 Committer: Allan Yang <allan...@apache.org> Committed: Tue Oct 23 16:06:19 2018 +0800 ---------------------------------------------------------------------- .../procedure2/store/ProcedureStoreTracker.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/a31e7156/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.java ---------------------------------------------------------------------- diff --git a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.java b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.java index 64479b2..9f99e26 100644 --- a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.java +++ b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.java @@ -376,6 +376,24 @@ public class ProcedureStoreTracker { } private BitSetNode getOrCreateNode(long procId) { + // See HBASE-20973, grow or merge can lead to ArrayIndexOutOfBoundsException + // The root cause is not revealed yet, disable grow or merge for now + return getOrCreateNodeNoGrowOrMerge(procId); + } + + private BitSetNode getOrCreateNodeNoGrowOrMerge(long procId) { + Map.Entry<Long, BitSetNode> entry = map.floorEntry(procId); + if (entry != null && entry.getValue().contains(procId)) { + return entry.getValue(); + } else { + BitSetNode node = new BitSetNode(procId, partial); + assert !map.containsKey(node.getStart()); + map.put(node.getStart(), node); + return node; + } + } + + private BitSetNode getOrCreateNodeWithGrowOrMerge(long procId) { // If procId can fit in left node (directly or by growing it) BitSetNode leftNode = null; boolean leftCanGrow = false;