@Test public void testDefaultSizeBucket() { assert bucket.getPeersCount() == 0; bucket.addPeer(peer1); assert bucket.getPeersCount() == 1; bucket.addPeer(peer2); assert bucket.getPeersCount() == 2; bucket.dropPeer(peer1); assert bucket.getPeersCount() == 1; bucket.dropPeer(peer2); assert bucket.getPeersCount() == 0; }
@Override public Map<Integer, List<Peer>> getBucketIdAndPeerList() { Map<Integer, List<Peer>> res = new LinkedHashMap<>(); if (getBucketsCount() > 0) { int i = 0; for (PeerBucket b : buckets) { if (b.getPeersCount() > 0) { res.put(i, new ArrayList<>(b.getPeers())); } i++; } } return res; }
synchronized Peer addPeer(Peer p) { if (!peers.contains(p)) { if (peers.size() >= KademliaOptions.BUCKET_SIZE) { return getLastSeen(); } else { peers.add(p); } } // updated peers.remove(p); peers.add(p); return null; }
@Test public void testUpdatedWithLatestPeer() { // arrange Peer newPeerWithBestBlock = Peer.valueOf(peer1.getYnodeUri()); newPeerWithBestBlock.updateBestBlock(BestBlock.of(TestConstants.STEM, 0)); bucket.addPeer(peer1); assert bucket.findByPeer(peer1).getBestBlocks().size() == 0; // act bucket.addPeer(newPeerWithBestBlock); // assert assert bucket.getPeers().size() == 1; assert bucket.findByPeer(peer1).getBestBlocks().size() == 1; } }
@Test public void testAddDuplicatedPeer() { assert bucket.getPeersCount() == 0; bucket.addPeer(peer1); assert bucket.getPeersCount() == 1; bucket.addPeer(peer1); assert bucket.getPeersCount() == 1; }
public synchronized boolean contains(Peer p) { for (PeerBucket b : buckets) { if (b.getPeers().contains(p)) { return true; } } return false; }
@Before public void setUp() { bucket = new PeerBucket(1); assert bucket.getDepth() == 1; }
private int getBucketsCount() { int i = 0; for (PeerBucket b : buckets) { if (b.getPeersCount() > 0) { i++; } } return i; }
@Override public synchronized void touchPeer(Peer p) { if (!contains(p)) { return; } for (PeerBucket b : buckets) { Peer found = b.findByPeer(p); if (found != null) { found.touch(); break; } } }
/** * call back from PeerHandlerGroup * @param peer disconnected peer */ @Override public void peerDisconnected(Peer peer) { buckets[getBucketId(peer)].dropPeer(peer); peerStore.remove(peer.getPeerId()); } }
private void init() { buckets = new PeerBucket[KademliaOptions.BINS]; for (int i = 0; i < KademliaOptions.BINS; i++) { buckets[i] = new PeerBucket(i); } if (this.peerStore.size() > 0) { this.peerStore.getAll().forEach(s -> addPeer(Peer.valueOf(s))); } }
@Override public synchronized Peer addPeer(Peer p) { p.setDistance(owner); Peer lastSeen = buckets[getBucketId(p)].addPeer(p); if (lastSeen != null) { return lastSeen; } if (!peerStore.contains(p.getPeerId())) { peerStore.put(p.getPeerId(), p); log.debug("Added peerStore size={}, peer={}", count(), p.toAddress()); } return null; }
private synchronized List<Peer> getAllPeers() { List<Peer> peers = new ArrayList<>(); for (PeerBucket b : buckets) { peers.addAll(b.getPeers()); } return peers; }
@Test public void testMaxBucketSize() { KademliaOptions.BUCKET_SIZE = 1; assert bucket.getPeersCount() == 0; bucket.addPeer(peer1); assert bucket.getPeersCount() == 1; bucket.addPeer(peer2); assert bucket.getPeersCount() == 1; bucket.dropPeer(peer1); assert bucket.getPeersCount() == 0; }
@Override public List<Peer> getLatestPeers(long reqTime) { long limitTime = reqTime - 1000; List<Peer> latestPeers = new ArrayList<>(); for (PeerBucket b : buckets) { b.getPeers().forEach(peer -> { if (peer.getModified() >= limitTime) { latestPeers.add(peer); } }); } return latestPeers; }