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;

Reply via email to