Repository: hbase Updated Branches: refs/heads/branch-2 80ac2f969 -> 1b1dabd1f
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/1b1dabd1 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/1b1dabd1 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/1b1dabd1 Branch: refs/heads/branch-2 Commit: 1b1dabd1f5c09ab75887b84132aa5e766537cb07 Parents: 80ac2f9 Author: Allan Yang <allan...@apache.org> Authored: Tue Oct 23 16:15:35 2018 +0800 Committer: Allan Yang <allan...@apache.org> Committed: Tue Oct 23 16:15:35 2018 +0800 ---------------------------------------------------------------------- .../procedure2/store/ProcedureStoreTracker.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/1b1dabd1/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;