示例#1
0
 /**
  * This method returns peers that are over sized. The peers that have been seen latest stay.
  *
  * @return True if we could remove an oversized peer
  */
 private PeerAddress removeLatestEntryExceedingBagSize() {
   for (int classMember = Number160.BITS - 1; classMember >= 0; classMember--) {
     final Map<Number160, PeerAddress> map = peerMap.get(classMember);
     if (map.size() > bagSize) {
       long maxValue = Long.MAX_VALUE;
       PeerAddress removePeerAddress = null;
       synchronized (map) {
         for (PeerAddress peerAddress : map.values()) {
           final long lastSeenOline = peerMapStat.getLastSeenOnlineTime(peerAddress);
           if (lastSeenOline < maxValue) {
             maxValue = lastSeenOline;
             removePeerAddress = peerAddress;
           }
           // TODO: idea use a score system rather than
           // lastSeenOnline, as we might have old reliable peers.
           if (maxValue == 0) break;
         }
       }
       if (removePeerAddress != null) {
         return removePeerAddress;
       }
     }
   }
   return null;
 }
示例#2
0
 private void addToMaintenanceQueue(PeerAddress remotePeer) {
   if (maintenanceTimeoutsSeconds.length == 0) return;
   long scheduledCheck;
   if (peerMapStat.getLastSeenOnlineTime(remotePeer) == 0) {
     // we need to check now!
     scheduledCheck = Timings.currentTimeMillis();
   } else {
     // check for next schedule
     int checked = peerMapStat.getChecked(remotePeer);
     if (checked >= maintenanceTimeoutsSeconds.length)
       checked = maintenanceTimeoutsSeconds.length - 1;
     scheduledCheck = Timings.currentTimeMillis() + (maintenanceTimeoutsSeconds[checked] * 1000L);
   }
   synchronized (maintenance) {
     maintenance.put(remotePeer, scheduledCheck);
   }
 }