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 612a8d0..54cbcf9 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 @@ -135,8 +135,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 @@ -439,8 +439,15 @@ public class ServerManager { */ private ServerName findServerWithSameHostnamePortWithLock( final ServerName serverName) { - for (ServerName sn: this.onlineServers.keySet()) { - if (ServerName.isSameHostnameAndPort(serverName, sn)) return sn; + ServerName end = ServerName.valueOf(serverName.getHostname(), serverName.getPort(), + Long.MAX_VALUE); + + ServerName r = onlineServers.lowerKey(end); + + if (r != null) { + if (ServerName.isSameHostnameAndPort(r, serverName)) { + return r; + } } return null; }