@Override public void stop() { log.debug("Stop for peer=" + peer.getYnodeUri()); if (channel != null) { channel.shutdown(); } }
@Override public void healthCheck(Peer owner) { if (handlerMap.isEmpty()) { log.trace("Active peer is empty to health check peer"); return; } for (PeerHandler handler : new ArrayList<>(handlerMap.values())) { try { String pong = handler.ping("Ping", owner); if ("Pong".equals(pong)) { continue; } } catch (Exception e) { log.warn(e.getMessage()); } log.warn("Health check fail. peer=" + handler.getPeer().getYnodeUri()); removeHandler(handler); } }
@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; }
private static PeerHandler dummy(Peer peer) { return new PeerHandlerMock(peer.getYnodeUri()); } }
@Test public void createPeerWithNodeIdTest() { Peer peer1 = Peer.valueOf("75bff16c", "yggdrash-node1", 32918); assertThat(peer1.getYnodeUri()).isEqualTo("ynode://75bff16c@yggdrash-node1:32918"); }
@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()); }
@Override protected ManagedChannel createChannel(Peer peer) { return InProcessChannelBuilder.forName(peer.getYnodeUri()).directExecutor().build(); }
@Override public String ping(String message, Peer peer) { Proto.Ping request = Proto.Ping.newBuilder().setPing(message) .setPeer(Proto.PeerInfo.newBuilder().setUrl(peer.getYnodeUri())).build(); return blockingPeerStub.ping(request).getPong(); }
@Test public void getPeerYnodeUriTest() { GRpcPeerHandler peerHandler = new GRpcPeerHandler(Peer.valueOf("ynode://75bff16c@localhost:32918")); assertEquals("ynode://75bff16c@localhost:32918", peerHandler.getPeer().getYnodeUri()); }
@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 play() { PeerGrpc.PeerBlockingStub blockingStub = PeerGrpc.newBlockingStub( grpcServerRule.getChannel()); Peer requestPeer = Peer.valueOf("ynode://75bff16c@127.0.0.1:32918"); when(discoveryConsumerMock.play(requestPeer, "Ping")).thenReturn("Pong"); Proto.PeerInfo peerInfo = Proto.PeerInfo.newBuilder() .setUrl(requestPeer.getYnodeUri()) .build(); Proto.Ping ping = Proto.Ping.newBuilder().setPing("Ping").setPeer(peerInfo).build(); Proto.Pong pong = blockingStub.ping(ping); assertEquals("Pong", pong.getPong()); }
@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; } } }