From b834de5426a1464246a613a289cbbcc33fe01800 Mon Sep 17 00:00:00 2001 From: Xiang LI Date: Mon, 5 Feb 2018 11:54:57 +0800 Subject: [PATCH] HBASE-19917 Improve RSGroupBasedLoadBalancer#filterServers() to be more efficient --- .../hbase/rsgroup/RSGroupBasedLoadBalancer.java | 24 ++++++++++++++-------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java b/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java index 5c08fb77cd..0994ba00dc 100644 --- a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java +++ b/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java @@ -26,9 +26,9 @@ import com.google.common.collect.LinkedListMultimap; import com.google.common.collect.ListMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; + import java.io.IOException; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -37,6 +37,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeMap; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; @@ -299,16 +300,21 @@ public class RSGroupBasedLoadBalancer implements RSGroupableBalancer, LoadBalanc * List of servers which are online. * @return the list */ - private List filterServers(Collection
servers, - Collection onlineServers) { - ArrayList finalList = new ArrayList(); - for (Address server : servers) { - for(ServerName curr: onlineServers) { - if(curr.getAddress().equals(server)) { - finalList.add(curr); - } + private List filterServers(Set
servers, + List onlineServers) { + /** + * servers is actually a TreeSet (see {@link org.apache.hadoop.hbase.rsgroup.RSGroupInfo}), + * having its contains()'s time complexity as O(logn), which is good enough. + * TODO: consider using HashSet to pursue O(1) for contains() throughout the calling chain + * if needed. + */ + ArrayList finalList = new ArrayList<>(); + for (ServerName onlineServer : onlineServers) { + if (servers.contains(onlineServer.getAddress())) { + finalList.add(onlineServer); } } + return finalList; } -- 2.14.1