Skip to content

Commit 6f1e8ab

Browse files
authored
HBASE-23561 acquire lock before update regionsMap (#1263)
Addendum: tie add and delete of regionMap and encodedRegionsMap Signed-off-by: stack <stack@apache.org>
1 parent 0b18a7d commit 6f1e8ab

File tree

1 file changed

+10
-5
lines changed
  • hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment

1 file changed

+10
-5
lines changed

hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStates.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ public int compare(final RegionState l, final RegionState r) {
7171
public final static RegionStateStampComparator REGION_STATE_STAMP_COMPARATOR =
7272
new RegionStateStampComparator();
7373

74+
private final Object regionsMapLock = new Object();
75+
7476
// TODO: Replace the ConcurrentSkipListMaps
7577
/**
7678
* RegionName -- i.e. RegionInfo.getRegionName() -- as bytes to {@link RegionStateNode}
@@ -125,11 +127,12 @@ public boolean isRegionInRegionStates(final RegionInfo hri) {
125127
// ==========================================================================
126128
@VisibleForTesting
127129
RegionStateNode createRegionStateNode(RegionInfo regionInfo) {
128-
return regionsMap.computeIfAbsent(regionInfo.getRegionName(), key -> {
129-
final RegionStateNode node = new RegionStateNode(regionInfo, regionInTransition);
130+
synchronized (regionsMapLock) {
131+
RegionStateNode node = regionsMap.computeIfAbsent(regionInfo.getRegionName(),
132+
key -> new RegionStateNode(regionInfo, regionInTransition));
130133
encodedRegionsMap.putIfAbsent(regionInfo.getEncodedName(), node);
131134
return node;
132-
});
135+
}
133136
}
134137

135138
public RegionStateNode getOrCreateRegionStateNode(RegionInfo regionInfo) {
@@ -146,8 +149,10 @@ public RegionStateNode getRegionStateNode(RegionInfo regionInfo) {
146149
}
147150

148151
public void deleteRegion(final RegionInfo regionInfo) {
149-
regionsMap.remove(regionInfo.getRegionName());
150-
encodedRegionsMap.remove(regionInfo.getEncodedName());
152+
synchronized (regionsMapLock) {
153+
regionsMap.remove(regionInfo.getRegionName());
154+
encodedRegionsMap.remove(regionInfo.getEncodedName());
155+
}
151156
// See HBASE-20860
152157
// After master restarts, merged regions' RIT state may not be cleaned,
153158
// making sure they are cleaned here

0 commit comments

Comments
 (0)