/** * 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; }
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); } }