소스 검색

ZOOKEEPER-717. add a preferred list to the instancemanager (breed via mahadev)

git-svn-id: https://svn.apache.org/repos/asf/hadoop/zookeeper/trunk@925345 13f79535-47bb-0310-9956-ffa450edef68
Mahadev Konar 15 년 전
부모
커밋
f8f4ce353d
2개의 변경된 파일28개의 추가작업 그리고 0개의 파일을 삭제
  1. 3 0
      CHANGES.txt
  2. 25 0
      src/java/systest/org/apache/zookeeper/test/system/InstanceManager.java

+ 3 - 0
CHANGES.txt

@@ -310,6 +310,9 @@ BUGFIXES:
 
   ZOOKEEPER-718. the fatjar is missing libraries (ben via mahadev)
 
+  ZOOKEEPER-717.  add a preferred list to the instancemanager (breed via
+  mahadev)
+
 IMPROVEMENTS:
   ZOOKEEPER-473. cleanup junit tests to eliminate false positives due to
   "socket reuse" and failure to close client (phunt via mahadev)

+ 25 - 0
src/java/systest/org/apache/zookeeper/test/system/InstanceManager.java

@@ -18,6 +18,8 @@
 
 package org.apache.zookeeper.test.system;
 
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -67,6 +69,16 @@ public class InstanceManager implements AsyncCallback.ChildrenCallback, Watcher
             this.weight = weight;
         }
     }
+    private static List<String> preferredList = new ArrayList<String>();
+    static {
+        String list = System.getProperty("ic.preferredList");
+        if (list != null) {
+            preferredList = Arrays.asList(list.split(","));
+            System.err.println("Preferred List: " + preferredList);
+        } else {
+            System.err.println("Preferred List is empty");
+        }
+    }
     private HashMap<String, HashSet<Assigned>> assignments = new HashMap<String, HashSet<Assigned>>();
     private HashMap<String, Assigned> instanceToAssignment = new HashMap<String, Assigned>();
     public InstanceManager(ZooKeeper zk, String prefix) throws KeeperException, InterruptedException {
@@ -174,6 +186,19 @@ public class InstanceManager implements AsyncCallback.ChildrenCallback, Watcher
         // find most idle node
         String mostIdle = null;
         int mostIdleWeight = Integer.MAX_VALUE;
+        for(String preferred: preferredList) {
+            HashSet<Assigned> assignmentList = assignments.get(preferred);
+            int w = 0;
+            if (assignmentList != null) {
+                for(Assigned a: assignmentList) {
+                    w += a.weight;
+                }
+                if (w < mostIdleWeight) {
+                    mostIdleWeight = w;
+                    mostIdle = preferred;
+                }
+            }
+        }
         for(Entry<String, HashSet<Assigned>> e: assignments.entrySet()) {
             int w = 0;
             for(Assigned a: e.getValue()) {