Example #1
0
 @Override
 public void nextCycle() {
   super.nextCycle();
   final Set<NodeAddress> toRemove = new HashSet<NodeAddress>();
   // update member table, send alive messages
   for (final NodeAddress member : memberTable.keySet()) {
     final MemebrInfo ni = memberTable.get(member);
     if (Utils.getTime() - ni.lastMessageTime > lifeTimeThreshold) {
       toRemove.add(member);
       continue;
     }
     ni.aliveTime--;
     if (ni.aliveTime == 0) {
       ni.aliveTime = alivePeriod;
       sendMessage(new AliveMessage(getMessageTag(), network.getAddress(), member));
     }
   }
   memberTable.keySet().removeAll(toRemove);
   removeNeighbors(toRemove);
   // gossip
   for (final NodeAddress neighbor : getNeighbors()) {
     final MemebrInfo ni = memberTable.get(neighbor);
     ni.gossipTime--;
     if (ni.gossipTime == 0) {
       ni.gossipTime = gossipPeriod;
       final List<NodeAddress> memberList = new ArrayList<NodeAddress>(memberTable.keySet());
       memberList.remove(neighbor);
       Collections.shuffle(memberList, r);
       final List<NodeAddress> sublist =
           memberList.subList(0, Math.min(gossipSize, memberList.size()));
       sendMessage(
           new PartialMembershipViewMessage<Sizeable>(
               getMessageTag(),
               network.getAddress(),
               neighbor,
               new LinkedList<NodeAddress>(sublist)));
     }
   }
   // replace fallen neighbors from member view
   final Set<NodeAddress> neighbors = getNeighbors();
   if (neighbors.size() < neighborSize && neighborSize < memberTable.size()) {
     final TreeMap<NodeAddress, MemebrInfo> addCandidates =
         new TreeMap<NodeAddress, MemebrInfo>(memberTable);
     addCandidates.keySet().removeAll(getNeighbors());
     final Set<NodeAddress> minVal = Utils.findMinValueKeyGroup(addCandidates);
     for (final NodeAddress n : minVal) {
       if (neighbors.size() < neighborSize) {
         addNeighbor(n);
         network.send(
             new ConnectionRequestApprovedMessage<Sizeable>(
                 getMessageTag(), network.getAddress(), n));
       }
     }
   }
 }
Example #2
0
 @Override
 public void handleMessage(final Message message) {
   if (memberTable.containsKey(message.sourceId)) {
     memberTable.get(message.sourceId).receivedBits += Utils.getSize(message);
     memberTable.get(message.sourceId).lastMessageTime = Utils.getTime();
   }
   super.handleMessage(message);
   if (message instanceof PartialMembershipViewMessage) {
     final Set<NodeAddress> neighborsList =
         ((PartialMembershipViewMessage<?>) message).infoMap.keySet();
     // add the neighbors received in the message
     for (final NodeAddress newNeighbor : neighborsList) {
       final MemebrInfo mi = new MemebrInfo();
       mi.aliveTime = alivePeriod;
       mi.gossipTime = gossipPeriod;
       memberTable.put(newNeighbor, mi);
     }
   } else if (message instanceof SeedNodeMultipleTargetsReplyMessage) {
     handleSeedNodeMultipleTargetsReplyMessage((SeedNodeMultipleTargetsReplyMessage) message);
   } else if (message instanceof ConnectionRequestApprovedMessage) {
     handleConnectionRequestApprovedMessage((ConnectionRequestApprovedMessage<?>) message);
   }
 }