You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2020/03/11 23:57:33 UTC

[hbase] branch master updated: HBASE-23561 acquire lock before update regionsMap (#1263)

This is an automated email from the ASF dual-hosted git repository.

stack pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/master by this push:
     new 6f1e8ab  HBASE-23561 acquire lock before update regionsMap (#1263)
6f1e8ab is described below

commit 6f1e8abc30618f5e8dd47b54aa1d749124b18a01
Author: Minwoo Kang <mi...@outlook.com>
AuthorDate: Thu Mar 12 08:57:21 2020 +0900

    HBASE-23561 acquire lock before update regionsMap (#1263)
    
    Addendum: tie add and delete of regionMap and encodedRegionsMap
    
    Signed-off-by: stack <st...@apache.org>
---
 .../hadoop/hbase/master/assignment/RegionStates.java      | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStates.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStates.java
index 6a6e331..dfd0064 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStates.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStates.java
@@ -71,6 +71,8 @@ public class RegionStates {
   public final static RegionStateStampComparator REGION_STATE_STAMP_COMPARATOR =
       new RegionStateStampComparator();
 
+  private final Object regionsMapLock = new Object();
+
   // TODO: Replace the ConcurrentSkipListMaps
   /**
    * RegionName -- i.e. RegionInfo.getRegionName() -- as bytes to {@link RegionStateNode}
@@ -125,11 +127,12 @@ public class RegionStates {
   // ==========================================================================
   @VisibleForTesting
   RegionStateNode createRegionStateNode(RegionInfo regionInfo) {
-    return regionsMap.computeIfAbsent(regionInfo.getRegionName(), key -> {
-      final RegionStateNode node = new RegionStateNode(regionInfo, regionInTransition);
+    synchronized (regionsMapLock) {
+      RegionStateNode node = regionsMap.computeIfAbsent(regionInfo.getRegionName(),
+        key -> new RegionStateNode(regionInfo, regionInTransition));
       encodedRegionsMap.putIfAbsent(regionInfo.getEncodedName(), node);
       return node;
-    });
+    }
   }
 
   public RegionStateNode getOrCreateRegionStateNode(RegionInfo regionInfo) {
@@ -146,8 +149,10 @@ public class RegionStates {
   }
 
   public void deleteRegion(final RegionInfo regionInfo) {
-    regionsMap.remove(regionInfo.getRegionName());
-    encodedRegionsMap.remove(regionInfo.getEncodedName());
+    synchronized (regionsMapLock) {
+      regionsMap.remove(regionInfo.getRegionName());
+      encodedRegionsMap.remove(regionInfo.getEncodedName());
+    }
     // See HBASE-20860
     // After master restarts, merged regions' RIT state may not be cleaned,
     // making sure they are cleaned here