HBASE-23561 acquire lock before update regionsMap (#1263)

Addendum: tie add and delete of regionMap and encodedRegionsMap

Signed-off-by: stack <stack@apache.org>
This commit is contained in:
Minwoo Kang 2020-03-12 08:57:21 +09:00 committed by Nick Dimiduk
parent 5f54d9cbad
commit 13e06c7184
1 changed files with 10 additions and 5 deletions

View File

@ -68,6 +68,8 @@ public class RegionStates {
public final static RegionStateStampComparator REGION_STATE_STAMP_COMPARATOR = public final static RegionStateStampComparator REGION_STATE_STAMP_COMPARATOR =
new RegionStateStampComparator(); new RegionStateStampComparator();
private final Object regionsMapLock = new Object();
// TODO: Replace the ConcurrentSkipListMaps // TODO: Replace the ConcurrentSkipListMaps
/** /**
* RegionName -- i.e. RegionInfo.getRegionName() -- as bytes to {@link RegionStateNode} * RegionName -- i.e. RegionInfo.getRegionName() -- as bytes to {@link RegionStateNode}
@ -121,11 +123,12 @@ public class RegionStates {
// RegionStateNode helpers // RegionStateNode helpers
// ========================================================================== // ==========================================================================
RegionStateNode createRegionStateNode(RegionInfo regionInfo) { RegionStateNode createRegionStateNode(RegionInfo regionInfo) {
return regionsMap.computeIfAbsent(regionInfo.getRegionName(), key -> { synchronized (regionsMapLock) {
final RegionStateNode node = new RegionStateNode(regionInfo, regionInTransition); RegionStateNode node = regionsMap.computeIfAbsent(regionInfo.getRegionName(),
key -> new RegionStateNode(regionInfo, regionInTransition));
encodedRegionsMap.putIfAbsent(regionInfo.getEncodedName(), node); encodedRegionsMap.putIfAbsent(regionInfo.getEncodedName(), node);
return node; return node;
}); }
} }
public RegionStateNode getOrCreateRegionStateNode(RegionInfo regionInfo) { public RegionStateNode getOrCreateRegionStateNode(RegionInfo regionInfo) {
@ -142,8 +145,10 @@ public class RegionStates {
} }
public void deleteRegion(final RegionInfo regionInfo) { public void deleteRegion(final RegionInfo regionInfo) {
regionsMap.remove(regionInfo.getRegionName()); synchronized (regionsMapLock) {
encodedRegionsMap.remove(regionInfo.getEncodedName()); regionsMap.remove(regionInfo.getRegionName());
encodedRegionsMap.remove(regionInfo.getEncodedName());
}
// See HBASE-20860 // See HBASE-20860
// After master restarts, merged regions' RIT state may not be cleaned, // After master restarts, merged regions' RIT state may not be cleaned,
// making sure they are cleaned here // making sure they are cleaned here