public KademliaDiscovery(PeerTable peerTable) { this.peerTable = peerTable; this.owner = peerTable.getOwner(); }
@Override public List<String> findPeers(Peer requestPeer) { return peerTable.getPeers(requestPeer); }
@Override public String play(Peer from, String msg) { if ("Ping".equals(msg)) { peerTable.touchPeer(from); return "Pong"; } return ""; } }
@Override public PeerTable discover(PeerHandlerFactory factory) { this.factory = factory; List<Peer> prevTried = new ArrayList<>(); for (Peer peer : peerTable.getBootstrappingSeedList()) { String ynodeUriWithoutPubKey = peerTable.getOwner().getYnodeUri() .substring(peer.getYnodeUri().indexOf("@")); if (peer.getYnodeUri().contains(ynodeUriWithoutPubKey)) { continue; } prevTried.add(peer); PeerHandler peerHandler = null; try { log.info("Try connecting to SEED peer = {}", peer); peerHandler = factory.create(peer); List<Peer> peerList = peerHandler.findPeers(owner); peerList.forEach(peerTable::addPeer); } catch (Exception e) { log.error("Failed connecting to SEED peer = {}", peer); } finally { if (peerHandler != null) { peerHandler.stop(); } } } int peerCount = peerTable.count(); log.info("Start discover! peerCount={}", peerCount - 1); findPeers(0, prevTried); return peerTable; }
+ "after %d rounds.", round)); log.trace("{}\n{}", String.format("Peers discovered %d", peerTable.count()), peerTable.getPeerUriList()); return; List<Peer> closest = peerTable.getClosestPeers(KademliaOptions.BUCKET_SIZE); List<Peer> tried = new ArrayList<>(); log.debug("Terminating discover after {} rounds.", round); log.trace("{}\n{}", String.format("Peers discovered %d", peerTable.count()), peerTable.getPeerUriList()); return;
public void bootstrapping(Discovery discovery, int maxPeer) { PeerTable peerTable = discovery.discover(peerHandlerGroup.getPeerHandlerFactory()); for (Peer peer : peerTable.getClosestPeers(maxPeer)) { if (peerHandlerGroup.handlerCount() >= maxPeer) { break; } peerHandlerGroup.addHandler(peerTable.getOwner(), peer); } }
@Test public void getLatestPeers() { SlowTest.apply(); assert peerTable.count() == 0; Peer peer1 = Peer.valueOf("ynode://75bff16c@127.0.0.1:32921"); peerTable.addPeer(peer1); assert peerTable.count() == 1; Utils.sleep(2000); Peer peer2 = Peer.valueOf("ynode://75bff16c@127.0.0.1:32922"); peerTable.addPeer(peer2); assert peerTable.count() == 2; long touchedTime = peer2.getModified(); List<Peer> latestPeerList = peerTable.getLatestPeers(touchedTime); assertEquals(latestPeerList.size(), 1); assertTrue(!latestPeerList.contains(peer1)); assertTrue(latestPeerList.contains(peer2)); }
@Test public void getPeersTest() { // acct Peer requester = Peer.valueOf("ynode://75bff16c@127.0.0.1:32918"); Collection<String> peerListWithoutRequester = peerTable.getPeers(requester); // assert assert peerListWithoutRequester.size() == 1; assert peerTable.getPeerUriList().contains(requester.getYnodeUri()); }
public static PeerTable createPeerTable(int port) { Peer owner = Peer.valueOf(NODE_URI_PREFIX + port); PeerTable peerTable = new KademliaPeerTable(owner, storeBuilder.buildPeerStore()); List<String> seedList = Collections.singletonList(NODE_URI_PREFIX + 32918); peerTable.setSeedPeerList(seedList); return peerTable; } }
@Test public void getBootstrappingSeedList() { assert peerTable.getBootstrappingSeedList().size() == 1; }
@Test public void getClosestPeers() { assert peerTable.getClosestPeers(KademliaOptions.BUCKET_SIZE).size() == 0; }
@Bean PeerTable peerTable(Wallet wallet, StoreBuilder storeBuilder) { Peer owner = Peer.valueOf(wallet.getNodeId(), nodeProperties.getGrpc().getHost(), nodeProperties.getGrpc().getPort()); PeerStore peerStore = storeBuilder.buildPeerStore(); PeerTable peerTable = new KademliaPeerTable(owner, peerStore); peerTable.setSeedPeerList(nodeProperties.getSeedPeerList()); return peerTable; }
@Scheduled(cron = "*/10 * * * * *") public void healthCheck() { if (!nodeStatus.isUpStatus()) { return; } peerHandlerGroup.healthCheck(peerTable.getOwner()); } }
@Override protected Server createServer(GRpcTestNode node) { String ynodeUri = node.peerTable.getOwner().getYnodeUri(); Server server = InProcessServerBuilder.forName(ynodeUri).directExecutor().addService( new DiscoveryService(node.consumer)).build(); gRpcCleanup.register(server); try { return server.start(); } catch (Exception e) { return null; } } }