@@ -68,6 +68,8 @@ public int compare(final RegionState l, final RegionState r) {
68
68
public final static RegionStateStampComparator REGION_STATE_STAMP_COMPARATOR =
69
69
new RegionStateStampComparator ();
70
70
71
+ private final Object regionsMapLock = new Object ();
72
+
71
73
// TODO: Replace the ConcurrentSkipListMaps
72
74
/**
73
75
* RegionName -- i.e. RegionInfo.getRegionName() -- as bytes to {@link RegionStateNode}
@@ -121,11 +123,12 @@ public boolean isRegionInRegionStates(final RegionInfo hri) {
121
123
// RegionStateNode helpers
122
124
// ==========================================================================
123
125
RegionStateNode createRegionStateNode (RegionInfo regionInfo ) {
124
- return regionsMap .computeIfAbsent (regionInfo .getRegionName (), key -> {
125
- final RegionStateNode node = new RegionStateNode (regionInfo , regionInTransition );
126
+ synchronized (regionsMapLock ) {
127
+ RegionStateNode node = regionsMap .computeIfAbsent (regionInfo .getRegionName (),
128
+ key -> new RegionStateNode (regionInfo , regionInTransition ));
126
129
encodedRegionsMap .putIfAbsent (regionInfo .getEncodedName (), node );
127
130
return node ;
128
- });
131
+ }
129
132
}
130
133
131
134
public RegionStateNode getOrCreateRegionStateNode (RegionInfo regionInfo ) {
@@ -142,8 +145,10 @@ public RegionStateNode getRegionStateNode(RegionInfo regionInfo) {
142
145
}
143
146
144
147
public void deleteRegion (final RegionInfo regionInfo ) {
145
- regionsMap .remove (regionInfo .getRegionName ());
146
- encodedRegionsMap .remove (regionInfo .getEncodedName ());
148
+ synchronized (regionsMapLock ) {
149
+ regionsMap .remove (regionInfo .getRegionName ());
150
+ encodedRegionsMap .remove (regionInfo .getEncodedName ());
151
+ }
147
152
// See HBASE-20860
148
153
// After master restarts, merged regions' RIT state may not be cleaned,
149
154
// making sure they are cleaned here
0 commit comments