Beispiel #1
0
 private void chooseNeighborsFromMemberTable(
     final Collection<NodeAddress> possibleTargets, final int minLatencyNeighborSizeParam) {
   final Map<NodeAddress, Long /* latency */> latencyMap = new TreeMap<NodeAddress, Long>();
   for (final NodeAddress target : possibleTargets) {
     latencyMap.put(target, network.getEstimatedLatency(target));
   }
   final LinkedHashMap<NodeAddress, Long> sortedMap = Utils.sortByValue(latencyMap);
   int i = 0;
   final Set<NodeAddress> toRemove = new HashSet<NodeAddress>();
   // find minLatencyNeighborSize neighbors with min latency
   for (final NodeAddress neighbor : sortedMap.keySet()) {
     toRemove.add(neighbor);
     if (!network.isUp(neighbor)) {
       continue;
     }
     final MemebrInfo mi = new MemebrInfo();
     mi.aliveTime = alivePeriod;
     mi.gossipTime = gossipPeriod;
     memberTable.put(neighbor, mi);
     if (i < minLatencyNeighborSizeParam) {
       addNeighbor(neighbor);
       sendMessage(
           new ConnectionRequestApprovedMessage<Sizeable>(
               getMessageTag(), network.getAddress(), neighbor));
     }
     i++;
   }
   latencyMap.keySet().removeAll(toRemove);
   // the rest of the neighbors are chosen randomly from the targets
   final ArrayList<NodeAddress> seedNodes = new ArrayList<NodeAddress>(latencyMap.keySet());
   NodeAddress target = null;
   final List<NodeAddress> chosenNodes = new LinkedList<NodeAddress>();
   Collections.shuffle(seedNodes, r);
   while (chosenNodes.size() < neighborSize - i && !seedNodes.isEmpty()) {
     target = seedNodes.get(seedNodes.size() - 1);
     if (network.isUp(target)) {
       chosenNodes.add(target);
     } else {
       memberTable.keySet().remove(target);
     }
     seedNodes.remove(target);
   }
   for (final NodeAddress neighbor : seedNodes) {
     addNeighbor(neighbor);
     network.send(
         new ConnectionRequestApprovedMessage<Sizeable>(
             getMessageTag(), network.getAddress(), neighbor));
   }
 }