diff --git a/network/src/main/java/io/bitsquare/p2p/P2PService.java b/network/src/main/java/io/bitsquare/p2p/P2PService.java
index f6558344d6..78eaee43f7 100644
--- a/network/src/main/java/io/bitsquare/p2p/P2PService.java
+++ b/network/src/main/java/io/bitsquare/p2p/P2PService.java
@@ -44,9 +44,6 @@ import java.util.concurrent.TimeUnit;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
-/**
- * Represents our node in the P2P network
- */
public class P2PService implements SetupListener, MessageListener, ConnectionListener {
private static final Logger log = LoggerFactory.getLogger(P2PService.class);
@@ -92,9 +89,10 @@ public class P2PService implements SetupListener, MessageListener, ConnectionLis
@Named(ProgramArguments.TOR_DIR) File torDir,
@Named(ProgramArguments.USE_LOCALHOST) boolean useLocalhost,
@Named(ProgramArguments.NETWORK_ID) int networkId,
+ @Named("storage.dir") File storageDir,
@Nullable EncryptionService encryptionService,
- KeyRing keyRing,
- @Named("storage.dir") File storageDir) {
+ @Nullable KeyRing keyRing
+ ) {
Log.traceCall();
this.seedNodesRepository = seedNodesRepository;
this.port = port;
@@ -107,6 +105,16 @@ public class P2PService implements SetupListener, MessageListener, ConnectionLis
init(networkId, storageDir);
}
+ // Used for seed node
+ public P2PService(SeedNodesRepository seedNodesRepository,
+ int port,
+ File torDir,
+ boolean useLocalhost,
+ int networkId,
+ File storageDir) {
+ this(seedNodesRepository, port, torDir, useLocalhost, networkId, storageDir, null, null);
+ }
+
private void init(int networkId, File storageDir) {
Log.traceCall();
diff --git a/network/src/main/java/io/bitsquare/p2p/peers/AuthenticationHandshake.java b/network/src/main/java/io/bitsquare/p2p/peers/AuthenticationHandshake.java
index dc1376ab2a..042ed5e365 100644
--- a/network/src/main/java/io/bitsquare/p2p/peers/AuthenticationHandshake.java
+++ b/network/src/main/java/io/bitsquare/p2p/peers/AuthenticationHandshake.java
@@ -22,8 +22,7 @@ import java.util.concurrent.TimeUnit;
import static com.google.common.base.Preconditions.checkArgument;
-
-// authentication example:
+// authentication protocol:
// node2 -> node1 AuthenticationRequest
// node1: close connection
// node1 -> node2 AuthenticationResponse on new connection
diff --git a/network/src/main/java/io/bitsquare/p2p/peers/PeerGroup.java b/network/src/main/java/io/bitsquare/p2p/peers/PeerGroup.java
index 846696b8e7..1a50ab2ed5 100644
--- a/network/src/main/java/io/bitsquare/p2p/peers/PeerGroup.java
+++ b/network/src/main/java/io/bitsquare/p2p/peers/PeerGroup.java
@@ -23,7 +23,6 @@ import java.util.stream.Collectors;
import static com.google.common.base.Preconditions.checkArgument;
-// Run in UserThread
public class PeerGroup implements MessageListener, ConnectionListener {
private static final Logger log = LoggerFactory.getLogger(PeerGroup.class);
@@ -656,28 +655,31 @@ public class PeerGroup implements MessageListener, ConnectionListener {
} else {
newReportedPeers.remove(new ReportedPeer(getMyAddress(), new Date()));
- //TODO if we have already peer, we mix date from old and new item
- //
- /* Map
reportedPeersMap = new HashMap<>();
+ // In case we have a peers already we adjust the lastActivityDate by adjusting the date to the mid
+ // of the lastActivityDate of our already stored peer and the reported one
+ Map reportedPeersMap = new HashMap<>();
reportedPeers.stream().forEach(e -> reportedPeersMap.put(e.address, e));
-
- HashSet newAdjustedReportedPeers = new HashSet<>();
+ Set newAdjustedReportedPeers = new HashSet<>();
newReportedPeers.stream()
.forEach(e -> {
- if()
- long adjustedTime = (e.lastActivityDate.getTime() +
- reportedPeersMap.get(e.address).lastActivityDate.getTime()) / 2;
- newAdjustedReportedPeers.add(new ReportedPeer(e.address,
- new Date(adjustedTime)));
- });*/
+ if (reportedPeersMap.containsKey(e.address)) {
+ long adjustedTime = (e.lastActivityDate.getTime() +
+ reportedPeersMap.get(e.address).lastActivityDate.getTime()) / 2;
+ newAdjustedReportedPeers.add(new ReportedPeer(e.address,
+ new Date(adjustedTime)));
+ } else {
+ newAdjustedReportedPeers.add(e);
+ }
+ });
- this.reportedPeers.addAll(newReportedPeers);
+ this.reportedPeers.addAll(newAdjustedReportedPeers);
purgeReportedPeersIfExceeds();
}
printReportedPeers();
}
+ // TODO unit test
private void purgeReportedPeersIfExceeds() {
Log.traceCall();
int size = reportedPeers.size();
@@ -685,9 +687,10 @@ public class PeerGroup implements MessageListener, ConnectionListener {
log.trace("We have more then {} reported peers. size={}. " +
"We remove random peers from the reported peers list.", MAX_REPORTED_PEERS, size);
int diff = size - MAX_REPORTED_PEERS;
- List list = new LinkedList<>(getReportedNotConnectedPeerAddresses());
-
- //TODO sort and remove oldest
+ List list = new ArrayList<>(getReportedNotConnectedPeerAddresses());
+ log.debug("Peers before sort " + list);
+ list.sort((a, b) -> a.lastActivityDate.compareTo(b.lastActivityDate));
+ log.debug("Peers after sort " + list);
for (int i = 0; i < diff; i++) {
ReportedPeer toRemove = getAndRemoveRandomReportedPeer(list);
reportedPeers.remove(toRemove);
diff --git a/network/src/main/java/io/bitsquare/p2p/seed/SeedNode.java b/network/src/main/java/io/bitsquare/p2p/seed/SeedNode.java
index 572e529629..c14a69c2fa 100644
--- a/network/src/main/java/io/bitsquare/p2p/seed/SeedNode.java
+++ b/network/src/main/java/io/bitsquare/p2p/seed/SeedNode.java
@@ -3,8 +3,6 @@ package io.bitsquare.p2p.seed;
import io.bitsquare.app.Log;
import io.bitsquare.app.Version;
import io.bitsquare.common.UserThread;
-import io.bitsquare.common.crypto.KeyRing;
-import io.bitsquare.crypto.EncryptionService;
import io.bitsquare.p2p.Address;
import io.bitsquare.p2p.P2PService;
import io.bitsquare.p2p.P2PServiceListener;
@@ -28,7 +26,7 @@ public class SeedNode {
private Address mySeedNodeAddress = new Address("localhost:8001");
private boolean useLocalhost = false;
- private Set seedNodes;
+ private Set progArgSeedNodes;
private P2PService p2PService;
private boolean stopped;
private final String defaultUserDataDir;
@@ -80,13 +78,13 @@ public class SeedNode {
checkArgument(arg4.contains(":") && arg4.split(":").length > 1 && arg4.split(":")[1].length() > 3,
"Wrong program argument");
List list = Arrays.asList(arg4.split("|"));
- seedNodes = new HashSet<>();
+ progArgSeedNodes = new HashSet<>();
list.forEach(e -> {
checkArgument(e.contains(":") && e.split(":").length == 2 && e.split(":")[1].length() == 4,
"Wrong program argument");
- seedNodes.add(new Address(e));
+ progArgSeedNodes.add(new Address(e));
});
- seedNodes.remove(mySeedNodeAddress);
+ progArgSeedNodes.remove(mySeedNodeAddress);
} else if (args.length > 5) {
log.error("Too many program arguments." +
"\nProgram arguments: myAddress (incl. port) bitcoinNetworkId " +
@@ -100,23 +98,21 @@ public class SeedNode {
}
public void createAndStartP2PService() {
- createAndStartP2PService(null, null, mySeedNodeAddress, useLocalhost, Version.NETWORK_ID, seedNodes, null);
+ createAndStartP2PService(mySeedNodeAddress, useLocalhost, Version.NETWORK_ID, progArgSeedNodes, null);
}
- public void createAndStartP2PService(EncryptionService encryptionService,
- KeyRing keyRing,
- Address mySeedNodeAddress,
+ public void createAndStartP2PService(Address mySeedNodeAddress,
boolean useLocalhost,
int networkId,
- @Nullable Set seedNodes,
+ @Nullable Set progArgSeedNodes,
@Nullable P2PServiceListener listener) {
Log.traceCall();
SeedNodesRepository seedNodesRepository = new SeedNodesRepository();
- if (seedNodes != null && !seedNodes.isEmpty()) {
+ if (progArgSeedNodes != null && !progArgSeedNodes.isEmpty()) {
if (useLocalhost)
- seedNodesRepository.setLocalhostSeedNodeAddresses(seedNodes);
+ seedNodesRepository.setLocalhostSeedNodeAddresses(progArgSeedNodes);
else
- seedNodesRepository.setTorSeedNodeAddresses(seedNodes);
+ seedNodesRepository.setTorSeedNodeAddresses(progArgSeedNodes);
}
Path seedNodePath = Paths.get(defaultUserDataDir,
"Bitsquare_seed_node_" + String.valueOf(mySeedNodeAddress.getFullAddress().replace(":", "_")));
@@ -128,8 +124,7 @@ public class SeedNode {
if (torDir.mkdirs())
log.info("Created torDir at " + torDir.getAbsolutePath());
- p2PService = new P2PService(seedNodesRepository, mySeedNodeAddress.port, torDir,
- useLocalhost, networkId, encryptionService, keyRing, storageDir);
+ p2PService = new P2PService(seedNodesRepository, mySeedNodeAddress.port, torDir, useLocalhost, networkId, storageDir);
p2PService.removeMySeedNodeAddressFromList(mySeedNodeAddress);
p2PService.start(listener);
}
diff --git a/network/src/test/java/io/bitsquare/p2p/P2PServiceTest.java b/network/src/test/java/io/bitsquare/p2p/P2PServiceTest.java
index f2d8f7870e..c91abb5238 100644
--- a/network/src/test/java/io/bitsquare/p2p/P2PServiceTest.java
+++ b/network/src/test/java/io/bitsquare/p2p/P2PServiceTest.java
@@ -82,7 +82,7 @@ public class P2PServiceTest {
sleepTime = 1000;
}
- seedNode1 = TestUtils.getAndStartSeedNode(8001, encryptionService1, keyRing1, useLocalhost, seedNodes);
+ seedNode1 = TestUtils.getAndStartSeedNode(8001, useLocalhost, seedNodes);
p2PService1 = seedNode1.getP2PService();
p2PService2 = TestUtils.getAndAuthenticateP2PService(8002, encryptionService2, keyRing2, useLocalhost, seedNodes);
}
diff --git a/network/src/test/java/io/bitsquare/p2p/TestUtils.java b/network/src/test/java/io/bitsquare/p2p/TestUtils.java
index c353e25d15..9e2e1ef4a3 100644
--- a/network/src/test/java/io/bitsquare/p2p/TestUtils.java
+++ b/network/src/test/java/io/bitsquare/p2p/TestUtils.java
@@ -62,7 +62,7 @@ public class TestUtils {
return result;
}
- public static SeedNode getAndStartSeedNode(int port, EncryptionService encryptionService, KeyRing keyRing, boolean useLocalhost, Set seedNodes) throws InterruptedException {
+ public static SeedNode getAndStartSeedNode(int port, boolean useLocalhost, Set seedNodes) throws InterruptedException {
SeedNode seedNode;
if (useLocalhost) {
@@ -80,7 +80,7 @@ public class TestUtils {
}
CountDownLatch latch = new CountDownLatch(1);
- seedNode.createAndStartP2PService(encryptionService, keyRing, new Address("localhost", port), useLocalhost, 2,
+ seedNode.createAndStartP2PService(new Address("localhost", port), useLocalhost, 2,
seedNodes, new P2PServiceListener() {
@Override
public void onRequestingDataCompleted() {
diff --git a/network/src/test/java/io/bitsquare/p2p/routing/PeerGroupTest.java b/network/src/test/java/io/bitsquare/p2p/routing/PeerGroupTest.java
index 5b76ba48bf..82122ab6e5 100644
--- a/network/src/test/java/io/bitsquare/p2p/routing/PeerGroupTest.java
+++ b/network/src/test/java/io/bitsquare/p2p/routing/PeerGroupTest.java
@@ -80,7 +80,7 @@ public class PeerGroupTest {
seedNodes.add(address);
seedNode1 = new SeedNode("test_dummy_dir");
latch = new CountDownLatch(2);
- seedNode1.createAndStartP2PService(null, null, address, useLocalhost, 2,
+ seedNode1.createAndStartP2PService(address, useLocalhost, 2,
seedNodes, new P2PServiceListener() {
@Override
public void onRequestingDataCompleted() {
@@ -125,7 +125,7 @@ public class PeerGroupTest {
latch = new CountDownLatch(6);
seedNode1 = new SeedNode("test_dummy_dir");
- seedNode1.createAndStartP2PService(null, null, address1, useLocalhost, 2, seedNodes, new P2PServiceListener() {
+ seedNode1.createAndStartP2PService(address1, useLocalhost, 2, seedNodes, new P2PServiceListener() {
@Override
public void onRequestingDataCompleted() {
latch.countDown();
@@ -156,7 +156,7 @@ public class PeerGroupTest {
Thread.sleep(500);
seedNode2 = new SeedNode("test_dummy_dir");
- seedNode2.createAndStartP2PService(null, null, address2, useLocalhost, 2, seedNodes, new P2PServiceListener() {
+ seedNode2.createAndStartP2PService(address2, useLocalhost, 2, seedNodes, new P2PServiceListener() {
@Override
public void onRequestingDataCompleted() {
latch.countDown();
@@ -386,7 +386,7 @@ public class PeerGroupTest {
SeedNode seedNode = new SeedNode("test_dummy_dir");
latch = new CountDownLatch(1);
- seedNode.createAndStartP2PService(null, null, new Address("localhost", port), useLocalhost, 2, seedNodes, new P2PServiceListener() {
+ seedNode.createAndStartP2PService(new Address("localhost", port), useLocalhost, 2, seedNodes, new P2PServiceListener() {
@Override
public void onRequestingDataCompleted() {
latch.countDown();
diff --git a/network/src/test/java/io/bitsquare/p2p/storage/ProtectedDataStorageTest.java b/network/src/test/java/io/bitsquare/p2p/storage/ProtectedDataStorageTest.java
index 239faaab25..4f8cc476c5 100644
--- a/network/src/test/java/io/bitsquare/p2p/storage/ProtectedDataStorageTest.java
+++ b/network/src/test/java/io/bitsquare/p2p/storage/ProtectedDataStorageTest.java
@@ -64,7 +64,7 @@ public class ProtectedDataStorageTest {
storageSignatureKeyPair1 = keyRing1.getSignatureKeyPair();
encryptionService1 = new EncryptionService(keyRing1);
- networkNode1 = TestUtils.getAndStartSeedNode(8001, encryptionService1, keyRing1, useClearNet, seedNodes).getP2PService().getNetworkNode();
+ networkNode1 = TestUtils.getAndStartSeedNode(8001, useClearNet, seedNodes).getP2PService().getNetworkNode();
peerGroup1 = new PeerGroup(networkNode1, seedNodes);
dataStorage1 = new ProtectedExpirableDataStorage(peerGroup1, new File("dummy"));