@@ -68,6 +68,8 @@ public int compare(final RegionState l, final RegionState r) {
6868 public final static RegionStateStampComparator REGION_STATE_STAMP_COMPARATOR =
6969 new RegionStateStampComparator ();
7070
71+ private final Object regionsMapLock = new Object ();
72+
7173 // TODO: Replace the ConcurrentSkipListMaps
7274 /**
7375 * RegionName -- i.e. RegionInfo.getRegionName() -- as bytes to {@link RegionStateNode}
@@ -121,11 +123,12 @@ public boolean isRegionInRegionStates(final RegionInfo hri) {
121123 // RegionStateNode helpers
122124 // ==========================================================================
123125 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 ));
126129 encodedRegionsMap .putIfAbsent (regionInfo .getEncodedName (), node );
127130 return node ;
128- });
131+ }
129132 }
130133
131134 public RegionStateNode getOrCreateRegionStateNode (RegionInfo regionInfo ) {
@@ -142,8 +145,10 @@ public RegionStateNode getRegionStateNode(RegionInfo regionInfo) {
142145 }
143146
144147 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+ }
147152 // See HBASE-20860
148153 // After master restarts, merged regions' RIT state may not be cleaned,
149154 // making sure they are cleaned here
0 commit comments