diff --git a/common/src/main/java/io/bitsquare/common/handlers/ResultHandler.java b/common/src/main/java/io/bitsquare/common/handlers/ResultHandler.java index 60ac05be77..eff8b8e605 100644 --- a/common/src/main/java/io/bitsquare/common/handlers/ResultHandler.java +++ b/common/src/main/java/io/bitsquare/common/handlers/ResultHandler.java @@ -17,6 +17,6 @@ package io.bitsquare.common.handlers; -public interface ResultHandler extends Runnable { +public interface ResultHandler { void handleResult(); } diff --git a/core/src/main/java/io/bitsquare/storage/FileManager.java b/common/src/main/java/io/bitsquare/storage/FileManager.java similarity index 100% rename from core/src/main/java/io/bitsquare/storage/FileManager.java rename to common/src/main/java/io/bitsquare/storage/FileManager.java diff --git a/core/src/main/java/io/bitsquare/storage/Storage.java b/common/src/main/java/io/bitsquare/storage/Storage.java similarity index 100% rename from core/src/main/java/io/bitsquare/storage/Storage.java rename to common/src/main/java/io/bitsquare/storage/Storage.java diff --git a/core/src/main/java/io/bitsquare/arbitration/ArbitratorManager.java b/core/src/main/java/io/bitsquare/arbitration/ArbitratorManager.java index 86a706f8c8..bf9a76204b 100644 --- a/core/src/main/java/io/bitsquare/arbitration/ArbitratorManager.java +++ b/core/src/main/java/io/bitsquare/arbitration/ArbitratorManager.java @@ -157,7 +157,7 @@ public class ArbitratorManager { Arbitrator registeredArbitrator = user.getRegisteredArbitrator(); if (registeredArbitrator != null) { addArbitrator(registeredArbitrator, - this::applyArbitrators, + () -> applyArbitrators(), log::error ); } diff --git a/network/src/main/java/io/bitsquare/p2p/P2PService.java b/network/src/main/java/io/bitsquare/p2p/P2PService.java index 2873ddbfa6..8ad461626c 100644 --- a/network/src/main/java/io/bitsquare/p2p/P2PService.java +++ b/network/src/main/java/io/bitsquare/p2p/P2PService.java @@ -85,7 +85,8 @@ public class P2PService { @Named(ProgramArguments.TOR_DIR) File torDir, @Named(ProgramArguments.USE_LOCALHOST) boolean useLocalhost, EncryptionService encryptionService, - KeyRing keyRing) { + KeyRing keyRing, + @Named("storage.dir") File storageDir) { this.encryptionService = encryptionService; this.keyRing = keyRing; @@ -105,7 +106,7 @@ public class P2PService { // storage layer - dataStorage = new ProtectedExpirableDataStorage(routing, encryptionService); + dataStorage = new ProtectedExpirableDataStorage(routing, storageDir); // Listeners @@ -132,7 +133,7 @@ public class P2PService { UserThread.execute(() -> p2pServiceListeners.stream().forEach(e -> e.onSetupFailed(throwable))); } }; - + networkNode.addConnectionListener(new ConnectionListener() { @Override public void onConnection(Connection connection) { 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 977fa1c512..cdeae353cc 100644 --- a/network/src/main/java/io/bitsquare/p2p/seed/SeedNode.java +++ b/network/src/main/java/io/bitsquare/p2p/seed/SeedNode.java @@ -85,7 +85,7 @@ public class SeedNode { seedNodesRepository.setTorSeedNodeAddresses(seedNodes); } - p2PService = new P2PService(seedNodesRepository, port, new File("bitsquare_seed_node_" + port), useLocalhost, encryptionService, keyRing); + p2PService = new P2PService(seedNodesRepository, port, new File("bitsquare_seed_node_" + port), useLocalhost, encryptionService, keyRing, new File("dummy")); p2PService.start(listener); } diff --git a/network/src/main/java/io/bitsquare/p2p/storage/ProtectedExpirableDataStorage.java b/network/src/main/java/io/bitsquare/p2p/storage/ProtectedExpirableDataStorage.java index d1b3ca027d..a18e063abb 100644 --- a/network/src/main/java/io/bitsquare/p2p/storage/ProtectedExpirableDataStorage.java +++ b/network/src/main/java/io/bitsquare/p2p/storage/ProtectedExpirableDataStorage.java @@ -3,16 +3,17 @@ package io.bitsquare.p2p.storage; import com.google.common.annotations.VisibleForTesting; import io.bitsquare.common.UserThread; import io.bitsquare.common.crypto.CryptoUtil; -import io.bitsquare.crypto.EncryptionService; import io.bitsquare.p2p.Address; import io.bitsquare.p2p.network.IllegalRequest; import io.bitsquare.p2p.network.MessageListener; import io.bitsquare.p2p.routing.Routing; import io.bitsquare.p2p.storage.data.*; import io.bitsquare.p2p.storage.messages.*; +import io.bitsquare.storage.Storage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.File; import java.math.BigInteger; import java.security.*; import java.util.List; @@ -29,10 +30,10 @@ public class ProtectedExpirableDataStorage { public static int CHECK_TTL_INTERVAL = 10 * 60 * 1000; private final Routing routing; - private final EncryptionService encryptionService; private final Map map = new ConcurrentHashMap<>(); private final List hashSetChangedListeners = new CopyOnWriteArrayList<>(); - private final Map sequenceNumberMap = new ConcurrentHashMap<>(); + private ConcurrentHashMap sequenceNumberMap = new ConcurrentHashMap<>(); + private final Storage storage; private boolean authenticated; private final Timer timer = new Timer(); private volatile boolean shutDownInProgress; @@ -42,9 +43,15 @@ public class ProtectedExpirableDataStorage { // Constructor /////////////////////////////////////////////////////////////////////////////////////////// - public ProtectedExpirableDataStorage(Routing routing, EncryptionService encryptionService) { + public ProtectedExpirableDataStorage(Routing routing, File storageDir) { this.routing = routing; - this.encryptionService = encryptionService; + + storage = new Storage<>(storageDir); + + ConcurrentHashMap persisted = storage.initAndGetPersisted(sequenceNumberMap, "sequenceNumberMap"); + if (persisted != null) { + sequenceNumberMap = persisted; + } addMessageListener((message, connection) -> { if (message instanceof DataMessage) { @@ -102,11 +109,12 @@ public class ProtectedExpirableDataStorage { && (!containsKey || checkIfStoredDataMatchesNewData(protectedData, hashOfPayload)) && doAddProtectedExpirableData(protectedData, hashOfPayload, sender); - if (result) + if (result) { sequenceNumberMap.put(hashOfPayload, protectedData.sequenceNumber); - else + storage.queueUpForSave(); + } else { log.debug("add failed"); - + } return result; } @@ -121,11 +129,12 @@ public class ProtectedExpirableDataStorage { && checkIfStoredDataMatchesNewData(protectedData, hashOfPayload) && doRemoveProtectedExpirableData(protectedData, hashOfPayload, sender); - if (result) + if (result) { sequenceNumberMap.put(hashOfPayload, protectedData.sequenceNumber); - else + storage.queueUpForSave(); + } else { log.debug("remove failed"); - + } return result; } @@ -141,11 +150,12 @@ public class ProtectedExpirableDataStorage { && checkIfStoredMailboxDataMatchesNewMailboxData(protectedMailboxData, hashOfData) && doRemoveProtectedExpirableData(protectedMailboxData, hashOfData, sender); - if (result) + if (result) { sequenceNumberMap.put(hashOfData, protectedMailboxData.sequenceNumber); - else + storage.queueUpForSave(); + } else { log.debug("removeMailboxData failed"); - + } return result; } diff --git a/network/src/test/java/io/bitsquare/p2p/TestUtils.java b/network/src/test/java/io/bitsquare/p2p/TestUtils.java index 842f9882e4..c0c2d3f566 100644 --- a/network/src/test/java/io/bitsquare/p2p/TestUtils.java +++ b/network/src/test/java/io/bitsquare/p2p/TestUtils.java @@ -117,7 +117,7 @@ public class TestUtils { seedNodesRepository.setTorSeedNodeAddresses(seedNodes); } - P2PService p2PService = new P2PService(seedNodesRepository, port, new File("seed_node_" + port), useLocalhost, encryptionService, keyRing); + P2PService p2PService = new P2PService(seedNodesRepository, port, new File("seed_node_" + port), useLocalhost, encryptionService, keyRing, new File("dummy")); p2PService.start(new P2PServiceListener() { @Override public void onAllDataReceived() { 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 acc122633b..8ba0689ba9 100644 --- a/network/src/test/java/io/bitsquare/p2p/storage/ProtectedDataStorageTest.java +++ b/network/src/test/java/io/bitsquare/p2p/storage/ProtectedDataStorageTest.java @@ -58,7 +58,7 @@ public class ProtectedDataStorageTest { encryptionService1 = new EncryptionService(keyRing1); networkNode1 = TestUtils.getAndStartSeedNode(8001, encryptionService1, keyRing1, useClearNet, seedNodes).getP2PService().getNetworkNode(); routing1 = new Routing(networkNode1, seedNodes); - dataStorage1 = new ProtectedExpirableDataStorage(routing1, encryptionService1); + dataStorage1 = new ProtectedExpirableDataStorage(routing1, new File("dummy")); // for mailbox keyRing2 = new KeyRing(new KeyStorage(new File("temp_keyStorage2"))); @@ -100,7 +100,7 @@ public class ProtectedDataStorageTest { public void testExpirableData() throws InterruptedException, NoSuchAlgorithmException, CertificateException, KeyStoreException, IOException, CryptoException, SignatureException, InvalidKeyException { ProtectedExpirableDataStorage.CHECK_TTL_INTERVAL = 10; // CHECK_TTL_INTERVAL is used in constructor of ProtectedExpirableDataStorage so we recreate it here - dataStorage1 = new ProtectedExpirableDataStorage(routing1, encryptionService1); + dataStorage1 = new ProtectedExpirableDataStorage(routing1, new File("dummy")); mockData.ttl = 50; ProtectedData data = dataStorage1.getDataWithSignedSeqNr(mockData, storageSignatureKeyPair1);