Index: hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java (revision 211c1e8ad439f2dfbbd2f07ce099c0f948e06df3) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java (revision ) @@ -28,6 +28,7 @@ import java.util.Map; import java.util.Set; import java.util.TreeMap; +import java.util.concurrent.ConcurrentHashMap; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -63,24 +64,24 @@ /** * Regions currently in transition. */ - final HashMap regionsInTransition; + final ConcurrentHashMap regionsInTransition; /** * Region encoded name to state map. * All the regions should be in this map. */ - private final Map regionStates; + private final ConcurrentHashMap regionStates; /** * Server to regions assignment map. * Contains the set of regions currently assigned to a given server. */ - private final Map> serverHoldings; + private final ConcurrentHashMap> serverHoldings; /** * Maintains the mapping from the default region to the replica regions. */ - private final Map> defaultReplicaToOtherReplicas; + private final ConcurrentHashMap> defaultReplicaToOtherReplicas; /** * Region to server assignment map. @@ -98,14 +99,14 @@ * is offline while the info in lastAssignments is cleared when * the region is closed or the server is dead and processed. */ - private final HashMap lastAssignments; + private final ConcurrentHashMap lastAssignments; /** * Map a host port pair string to the latest start code * of a region server which is known to be dead. It is dead * to us, but server manager may not know it yet. */ - private final HashMap deadServers; + private final ConcurrentHashMap deadServers; /** * Map a dead servers to the time when log split is done. @@ -114,7 +115,7 @@ * on a configured time. By default, we assume a dead * server should be done with log splitting in two hours. */ - private final HashMap processedServers; + private final ConcurrentHashMap processedServers; private long lastProcessedServerCleanTime; private final TableStateManager tableStateManager; @@ -128,14 +129,14 @@ RegionStates(final Server master, final TableStateManager tableStateManager, final ServerManager serverManager, final RegionStateStore regionStateStore) { - regionStates = new HashMap(); - regionsInTransition = new HashMap(); - serverHoldings = new HashMap>(); - defaultReplicaToOtherReplicas = new HashMap>(); - regionAssignments = new TreeMap(); - lastAssignments = new HashMap(); - processedServers = new HashMap(); - deadServers = new HashMap(); + regionStates = new ConcurrentHashMap<>(); + regionsInTransition = new ConcurrentHashMap<>(); + serverHoldings = new ConcurrentHashMap<>(); + defaultReplicaToOtherReplicas = new ConcurrentHashMap<>(); + regionAssignments = new TreeMap<>(); + lastAssignments = new ConcurrentHashMap<>(); + processedServers = new ConcurrentHashMap<>(); + deadServers = new ConcurrentHashMap<>(); this.tableStateManager = tableStateManager; this.regionStateStore = regionStateStore; this.serverManager = serverManager; @@ -145,7 +146,7 @@ /** * @return an unmodifiable the region assignment map */ - public synchronized Map getRegionAssignments() { + public Map getRegionAssignments() { return Collections.unmodifiableMap(regionAssignments); } @@ -156,7 +157,7 @@ */ synchronized Map> getRegionAssignments( Collection regions) { - Map> map = new HashMap>(); + Map> map = new HashMap<>(); for (HRegionInfo region : regions) { HRegionInfo defaultReplica = RegionReplicaUtil.getRegionInfoForDefaultReplica(region); Set allReplicas = defaultReplicaToOtherReplicas.get(defaultReplica); @@ -166,7 +167,7 @@ if (server != null) { List regionsOnServer = map.get(server); if (regionsOnServer == null) { - regionsOnServer = new ArrayList(1); + regionsOnServer = new ArrayList<>(1); map.put(server, regionsOnServer); } regionsOnServer.add(hri); @@ -177,7 +178,7 @@ return map; } - public synchronized ServerName getRegionServerOfRegion(HRegionInfo hri) { + public ServerName getRegionServerOfRegion(HRegionInfo hri) { return regionAssignments.get(hri); } @@ -185,28 +186,28 @@ * Get regions in transition and their states */ @SuppressWarnings("unchecked") - public synchronized Map getRegionsInTransition() { - return (Map)regionsInTransition.clone(); + public Map getRegionsInTransition() { + return new ConcurrentHashMap(regionsInTransition); } /** * @return True if specified region in transition. */ - public synchronized boolean isRegionInTransition(final HRegionInfo hri) { + public boolean isRegionInTransition(final HRegionInfo hri) { return regionsInTransition.containsKey(hri.getEncodedName()); } /** * @return True if specified region in transition. */ - public synchronized boolean isRegionInTransition(final String encodedName) { + public boolean isRegionInTransition(final String encodedName) { return regionsInTransition.containsKey(encodedName); } /** * @return True if any region in transition. */ - public synchronized boolean isRegionsInTransition() { + public boolean isRegionsInTransition() { return !regionsInTransition.isEmpty(); } @@ -261,8 +262,7 @@ /** * Get region transition state */ - public synchronized RegionState - getRegionTransitionState(final String encodedName) { + public RegionState getRegionTransitionState(final String encodedName) { return regionsInTransition.get(encodedName); } @@ -394,7 +394,7 @@ private void addToServerHoldings(ServerName serverName, HRegionInfo hri) { Set regions = serverHoldings.get(serverName); if (regions == null) { - regions = new HashSet(); + regions = new HashSet<>(); serverHoldings.put(serverName, regions); } regions.add(hri); @@ -405,7 +405,7 @@ Set replicas = defaultReplicaToOtherReplicas.get(defaultReplica); if (replicas == null) { - replicas = new HashSet(); + replicas = new HashSet<>(); defaultReplicaToOtherReplicas.put(defaultReplica, replicas); } replicas.add(hri); @@ -473,7 +473,7 @@ clearLastAssignment(region); } - public synchronized void clearLastAssignment(final HRegionInfo region) { + public void clearLastAssignment(final HRegionInfo region) { lastAssignments.remove(region.getEncodedName()); } @@ -524,14 +524,14 @@ */ public synchronized List serverOffline(final ServerName sn) { // Offline all regions on this server not already in transition. - List rits = new ArrayList(); + List rits = new ArrayList<>(); Set assignedRegions = serverHoldings.get(sn); if (assignedRegions == null) { - assignedRegions = new HashSet(); + assignedRegions = new HashSet<>(); } // Offline regions outside the loop to avoid ConcurrentModificationException - Set regionsToOffline = new HashSet(); + Set regionsToOffline = new HashSet<>(); for (HRegionInfo region : assignedRegions) { // Offline open regions, no need to offline if SPLIT/MERGED/OFFLINE if (isRegionOnline(region)) { @@ -585,7 +585,7 @@ * @return Online regions from tableName */ public synchronized List getRegionsOfTable(TableName tableName) { - List tableRegions = new ArrayList(); + List tableRegions = new ArrayList<>(); // boundary needs to have table's name but regionID 0 so that it is sorted // before all table's regions. HRegionInfo boundary = new HRegionInfo(tableName, null, null, false, 0L); @@ -624,7 +624,7 @@ * We loop through all regions assuming we don't delete tables too much. */ public void tableDeleted(final TableName tableName) { - Set regionsToDelete = new HashSet(); + Set regionsToDelete = new HashSet<>(); synchronized (this) { for (RegionState state: regionStates.values()) { HRegionInfo region = state.getRegion(); @@ -641,10 +641,10 @@ /** * Get a copy of all regions assigned to a server */ - public synchronized Set getServerRegions(ServerName serverName) { + public Set getServerRegions(ServerName serverName) { Set regions = serverHoldings.get(serverName); if (regions == null) return null; - return new HashSet(regions); + return new HashSet<>(regions); } /** @@ -708,22 +708,10 @@ * Get the last region server a region was on for purpose of re-assignment, * i.e. should the re-assignment be held back till log split is done? */ - synchronized ServerName getLastRegionServerOfRegion(final String encodedName) { + ServerName getLastRegionServerOfRegion(final String encodedName) { return lastAssignments.get(encodedName); } - synchronized void setLastRegionServerOfRegions( - final ServerName serverName, final List regionInfos) { - for (HRegionInfo hri: regionInfos) { - setLastRegionServerOfRegion(serverName, hri.getEncodedName()); - } - } - - synchronized void setLastRegionServerOfRegion( - final ServerName serverName, final String encodedName) { - lastAssignments.put(encodedName, serverName); - } - void splitRegion(HRegionInfo p, HRegionInfo a, HRegionInfo b, ServerName sn) throws IOException { regionStateStore.splitRegion(p, a, b, sn); @@ -826,13 +814,13 @@ protected Map>> getAssignmentsByTable() { Map>> result = - new HashMap>>(); + new HashMap<>(); synchronized (this) { if (!server.getConfiguration().getBoolean("hbase.master.loadbalance.bytable", false)) { Map> svrToRegions = new HashMap>(serverHoldings.size()); for (Map.Entry> e: serverHoldings.entrySet()) { - svrToRegions.put(e.getKey(), new ArrayList(e.getValue())); + svrToRegions.put(e.getKey(), new ArrayList<>(e.getValue())); } result.put(TableName.valueOf("ensemble"), svrToRegions); } else { @@ -842,12 +830,12 @@ TableName tablename = hri.getTable(); Map> svrToRegions = result.get(tablename); if (svrToRegions == null) { - svrToRegions = new HashMap>(serverHoldings.size()); + svrToRegions = new HashMap<>(serverHoldings.size()); result.put(tablename, svrToRegions); } List regions = svrToRegions.get(e.getKey()); if (regions == null) { - regions = new ArrayList(); + regions = new ArrayList<>(); svrToRegions.put(e.getKey(), regions); } regions.add(hri); @@ -873,20 +861,7 @@ return getRegionState(hri.getEncodedName()); } - /** - * Returns a clone of region assignments per server - * @return a Map of ServerName to a List of HRegionInfo's - */ - protected synchronized Map> getRegionAssignmentsByServer() { - Map> regionsByServer = - new HashMap>(serverHoldings.size()); - for (Map.Entry> e: serverHoldings.entrySet()) { - regionsByServer.put(e.getKey(), new ArrayList(e.getValue())); - } - return regionsByServer; - } - - protected synchronized RegionState getRegionState(final String encodedName) { + protected RegionState getRegionState(final String encodedName) { return regionStates.get(encodedName); }