/// <summary> /// Requests close neighbors from the remote peer. The remote peer may indicate if the /// data is present on that peer. This is an RPC. /// </summary> /// <param name="remotePeer">The remote peer to send this request to.</param> /// <param name="searchValues">The values to search for in the storage.</param> /// <param name="type">The type of the neighbor request: /// - Request1 for Neighbors means check for Put (no digest) for tracker and storage. /// - Request2 for Neighbors means check for Get (with digest) for storage. /// - Request3 for Neighbors means check for Get (with digest) for tracker. /// - Request4 for Neighbors means check for Put (with digest) for task.</param> /// <param name="channelCreator">The channel creator that creates connections.</param> /// <param name="configuration">The client-side connection configuration.</param> /// <returns>The future response message.</returns> public Task <Message.Message> CloseNeighborsAsync(PeerAddress remotePeer, SearchValues searchValues, Message.Message.MessageType type, ChannelCreator channelCreator, IConnectionConfiguration configuration) { var tcsResponse = CloseNeighborsTcs(remotePeer, searchValues, type, channelCreator, configuration); return(tcsResponse.Task); }
/// <summary> /// .NET-specific: Used for DistributedRouting only. /// </summary> internal TaskCompletionSource<Message.Message> CloseNeighborsTcs(PeerAddress remotePeer, SearchValues searchValues, Message.Message.MessageType type, ChannelCreator channelCreator, IConnectionConfiguration configuration) { var message = CreateRequestMessage(remotePeer, Rpc.Commands.Neighbor.GetNr(), type); if (!message.IsRequest()) { throw new ArgumentException("The type must be a request."); } message.SetKey(searchValues.LocationKey); message.SetKey(searchValues.DomainKey ?? Number160.Zero); if (searchValues.From != null && searchValues.To != null) { ICollection<Number640> collection = new List<Number640>(); collection.Add(searchValues.From); collection.Add(searchValues.To); var keyCollection = new KeyCollection(collection); message.SetKeyCollection(keyCollection); } else { if (searchValues.ContentKey != null) { message.SetKey(searchValues.ContentKey); } if (searchValues.KeyBloomFilter != null) { message.SetBloomFilter(searchValues.KeyBloomFilter); } if (searchValues.ContentBloomFilter != null) { message.SetBloomFilter(searchValues.ContentBloomFilter); } } return Send(message, configuration, channelCreator); }
/// <summary> /// .NET-specific: Used for DistributedRouting only. /// </summary> internal TaskCompletionSource <Message.Message> CloseNeighborsTcs(PeerAddress remotePeer, SearchValues searchValues, Message.Message.MessageType type, ChannelCreator channelCreator, IConnectionConfiguration configuration) { var message = CreateRequestMessage(remotePeer, Rpc.Commands.Neighbor.GetNr(), type); if (!message.IsRequest()) { throw new ArgumentException("The type must be a request."); } message.SetKey(searchValues.LocationKey); message.SetKey(searchValues.DomainKey ?? Number160.Zero); if (searchValues.From != null && searchValues.To != null) { ICollection <Number640> collection = new List <Number640>(); collection.Add(searchValues.From); collection.Add(searchValues.To); var keyCollection = new KeyCollection(collection); message.SetKeyCollection(keyCollection); } else { if (searchValues.ContentKey != null) { message.SetKey(searchValues.ContentKey); } if (searchValues.KeyBloomFilter != null) { message.SetBloomFilter(searchValues.KeyBloomFilter); } if (searchValues.ContentBloomFilter != null) { message.SetBloomFilter(searchValues.ContentBloomFilter); } } return(Send(message, configuration, channelCreator)); }
public async void TestNeighborTcp() { Peer sender = null; Peer recv1 = null; try { sender = new PeerBuilder(new Number160("0x50")) .SetMaintenanceTask(Utils2.CreateInfiniteIntervalMaintenanceTask()) .SetChannelServerConfiguration(Utils2.CreateInfiniteTimeoutChannelServerConfiguration(2424, 2424)) .SetP2PId(55) .SetPorts(2424) .Start(); // add neighbors to the sender's peer map var addresses = Utils2.CreateDummyAddresses(300, PortTcp, PortUdp); for (int i = 0; i < addresses.Length; i++) { sender.PeerBean.PeerMap.PeerFound(addresses[i], null, null); } // register neighbor RPC handlers var neighbors1 = new NeighborRpc(sender.PeerBean, sender.ConnectionBean); // TODO needed? registering? recv1 = new PeerBuilder(new Number160("0x20")) .SetMaintenanceTask(Utils2.CreateInfiniteIntervalMaintenanceTask()) .SetChannelServerConfiguration(Utils2.CreateInfiniteTimeoutChannelServerConfiguration(8088, 8088)) .SetP2PId(55) .SetPorts(8088) .Start(); var neighbors2 = new NeighborRpc(recv1.PeerBean, recv1.ConnectionBean); // ask sender for his neighbors var cc = await recv1.ConnectionBean.Reservation.CreateAsync(0, 1); var sv = new SearchValues(new Number160("0x1"), null); var infConfig = Utils2.CreateInfiniteConfiguration() .SetIsForceTcp(); var tr = neighbors2.CloseNeighborsAsync(sender.PeerAddress, sv, Message.MessageType.Request2, cc, infConfig); await tr; Assert.IsTrue(!tr.IsFaulted); // check if receiver got the neighbors var neighborSet = tr.Result.NeighborsSet(0); // 33 peer addresses can be stored in 1000 bytes (NeighborsLimit) Assert.IsTrue(neighborSet.Size == 33); var neighbors = neighborSet.Neighbors.ToList(); Assert.AreEqual(new Number160("0x1"), neighbors[0].PeerId); Assert.AreEqual(PortTcp, neighbors[1].TcpPort); Assert.AreEqual(PortUdp, neighbors[2].UdpPort); await cc.ShutdownAsync(); } finally { if (sender != null) { sender.ShutdownAsync().Wait(); } if (recv1 != null) { recv1.ShutdownAsync().Wait(); } } }
public async void TestNeighborFail() { Peer sender = null; Peer recv1 = null; try { sender = new PeerBuilder(new Number160("0x50")) .SetMaintenanceTask(Utils2.CreateInfiniteIntervalMaintenanceTask()) .SetChannelServerConfiguration(Utils2.CreateInfiniteTimeoutChannelServerConfiguration(2424, 2424)) .SetP2PId(55) .SetPorts(2424) .Start(); recv1 = new PeerBuilder(new Number160("0x20")) .SetMaintenanceTask(Utils2.CreateInfiniteIntervalMaintenanceTask()) .SetChannelServerConfiguration(Utils2.CreateInfiniteTimeoutChannelServerConfiguration(8088, 8088)) .SetP2PId(55) .SetPorts(2424) .Start(); var neighbors1 = new NeighborRpc(sender.PeerBean, sender.ConnectionBean); var neighbors2 = new NeighborRpc(recv1.PeerBean, recv1.ConnectionBean); var cc = await recv1.ConnectionBean.Reservation.CreateAsync(1, 0); try { var sv = new SearchValues(new Number160("0x30"), null); var infConfig = Utils2.CreateInfiniteConfiguration(); await neighbors2.CloseNeighborsAsync(sender.PeerAddress, sv, Message.MessageType.Exception, cc, infConfig); Assert.Fail("ArgumentException should have been thrown."); } catch (ArgumentException) { cc.ShutdownAsync().Wait(); } } finally { if (sender != null) { sender.ShutdownAsync().Wait(); } if (recv1 != null) { recv1.ShutdownAsync().Wait(); } } }
public async void TestNeighbor2() { Peer sender = null; Peer recv1 = null; try { sender = new PeerBuilder(new Number160("0x50")) .SetMaintenanceTask(Utils2.CreateInfiniteIntervalMaintenanceTask()) .SetChannelServerConfiguration(Utils2.CreateInfiniteTimeoutChannelServerConfiguration(2424, 2424)) .SetP2PId(55) .SetPorts(2424) .Start(); recv1 = new PeerBuilder(new Number160("0x20")) .SetMaintenanceTask(Utils2.CreateInfiniteIntervalMaintenanceTask()) .SetChannelServerConfiguration(Utils2.CreateInfiniteTimeoutChannelServerConfiguration(8088, 8088)) .SetP2PId(55) .SetPorts(2424) .Start(); var neighbors1 = new NeighborRpc(sender.PeerBean, sender.ConnectionBean); var neighbors2 = new NeighborRpc(recv1.PeerBean, recv1.ConnectionBean); var cc = await recv1.ConnectionBean.Reservation.CreateAsync(1, 0); var sv = new SearchValues(new Number160("0x30"), null); var infConfig = Utils2.CreateInfiniteConfiguration(); var tr = neighbors2.CloseNeighborsAsync(sender.PeerAddress, sv, Message.MessageType.Request2, cc, infConfig); await tr; Assert.IsTrue(!tr.IsFaulted); var addresses = tr.Result.NeighborsSet(0); // I see noone, not even myself. My peer was added in the overflow map. Assert.AreEqual(0, addresses.Size); await cc.ShutdownAsync(); } finally { if (sender != null) { sender.ShutdownAsync().Wait(); } if (recv1 != null) { recv1.ShutdownAsync().Wait(); } } }
/// <summary> /// Requests close neighbors from the remote peer. The remote peer may indicate if the /// data is present on that peer. This is an RPC. /// </summary> /// <param name="remotePeer">The remote peer to send this request to.</param> /// <param name="searchValues">The values to search for in the storage.</param> /// <param name="type">The type of the neighbor request: /// - Request1 for Neighbors means check for Put (no digest) for tracker and storage. /// - Request2 for Neighbors means check for Get (with digest) for storage. /// - Request3 for Neighbors means check for Get (with digest) for tracker. /// - Request4 for Neighbors means check for Put (with digest) for task.</param> /// <param name="channelCreator">The channel creator that creates connections.</param> /// <param name="configuration">The client-side connection configuration.</param> /// <returns>The future response message.</returns> public Task<Message.Message> CloseNeighborsAsync(PeerAddress remotePeer, SearchValues searchValues, Message.Message.MessageType type, ChannelCreator channelCreator, IConnectionConfiguration configuration) { var tcsResponse = CloseNeighborsTcs(remotePeer, searchValues, type, channelCreator, configuration); return tcsResponse.Task; }