diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java index 37659f8..8e9053bb 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java @@ -29,6 +29,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.NoSuchElementException; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentNavigableMap; import java.util.concurrent.ConcurrentSkipListMap; @@ -136,8 +137,8 @@ public class ServerManager { new ConcurrentSkipListMap>(Bytes.BYTES_COMPARATOR); /** Map of registered servers to their current load */ - private final ConcurrentHashMap onlineServers = - new ConcurrentHashMap(); + private final ConcurrentNavigableMap onlineServers = + new ConcurrentSkipListMap(); /** * Map of admin interfaces per registered regionserver; these interfaces we use to control @@ -445,9 +446,17 @@ public class ServerManager { */ private ServerName findServerWithSameHostnamePortWithLock( final ServerName serverName) { - for (ServerName sn: this.onlineServers.keySet()) { - if (ServerName.isSameHostnameAndPort(serverName, sn)) return sn; + ServerName start = ServerName.valueOf(serverName.getHostname(), serverName.getPort(), 0); + ServerName end = ServerName.valueOf(serverName.getHostname(), serverName.getPort(), + Long.MAX_VALUE); + try { + ConcurrentNavigableMap servers = + onlineServers.subMap(start, true, end, true); + return servers.firstKey(); + } catch (NoSuchElementException nse) { + // No key with the same Hostname and port exists } + return null; }