/** * Writes all peers to a file, sorted in descending order of uptime. * @param file */ private void writePeersSorted(File file) { List<KademliaPeer> peers = bucketManager.getAllPeers(); if (peers.isEmpty()) return; sortByUptime(peers); log.info("Writing peers to file: <" + file.getAbsolutePath() + ">"); writePeers(peers, file); }
/** * Adds a <code>{@link KademliaPeer}</code> to the s-bucket or a k-bucket, * depending on its distance to the local node and how full the buckets are. * @param destination */ public void addOrUpdate(KademliaPeer peer) { Hash destHash = peer.getDestinationHash(); if (localDestinationHash.equals(destHash)) { log.debug("Not adding local destination to bucket."); return; } KademliaPeer removedOrNotAdded = sBucket.addOrUpdate(peer); if (removedOrNotAdded == null) getKBucket(destHash).remove(peer); // if the peer was in a k-bucket, remove it because it is now in the s-bucket else addToKBucket(removedOrNotAdded); // if a peer was removed from the s-bucket or didn't qualify as a sibling, add it to a k-bucket // log int numBuckets = kBuckets.size(); int numPeers = getAllPeers().size(); int numSiblings = sBucket.size(); log.debug("Peer " + Util.toBase32(destHash) + " added/updated. Peers=" + numPeers + " sib=" + numSiblings + " buk=" + numBuckets + " (not counting the sibling bucket)"); }
refreshAll(); log.info("Bootstrapping finished. Number of peers = " + bucketManager.getPeerCount()); for (Destination peer: bucketManager.getAllPeers()) log.debug(" Peer: " + Util.toBase32(peer)); break outerLoop;
@Test public void test() throws Exception { assertEquals(0, bucketManager.getPeerCount()); assertEquals(0, bucketManager.getAllPeers().size()); assertEquals(1, getNumKBuckets()); bucketManager.addOrUpdate(new KademliaPeer(peers[i])); assertEquals(S, bucketManager.getPeerCount()); assertEquals(S, bucketManager.getAllPeers().size()); assertEquals(1, getNumKBuckets()); bucketManager.addOrUpdate(new KademliaPeer(peers[startIndex+i])); assertEquals(S + K, bucketManager.getPeerCount()); assertEquals(S + K, bucketManager.getAllPeers().size()); assertEquals(1, getNumKBuckets()); bucketManager.addOrUpdate(new KademliaPeer(peers[index])); assertEquals(S+K+1, bucketManager.getPeerCount()); assertEquals(S+K+1, bucketManager.getAllPeers().size()); assertTrue(getNumKBuckets() >= 2); // there should be at least 2 buckets after the split assertTrue(bucketManager.getAllPeers().contains(peers[i]));
assertFalse(bucketManager.getAllPeers().contains(localDestination));