Merge pull request #4745 from chimp1984/fix-bug-with-reading-historical-data

Fix bug with reading historical data
This commit is contained in:
Christoph Atteneder 2020-11-03 21:56:05 +01:00 committed by GitHub
commit 63cae1ceb1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 43 additions and 31 deletions

View file

@ -102,11 +102,13 @@ public class CommonSetup {
protected static void setupSigIntHandlers(GracefulShutDownHandler gracefulShutDownHandler) { protected static void setupSigIntHandlers(GracefulShutDownHandler gracefulShutDownHandler) {
Signal.handle(new Signal("INT"), signal -> { Signal.handle(new Signal("INT"), signal -> {
log.info("Received {}", signal);
UserThread.execute(() -> gracefulShutDownHandler.gracefulShutDown(() -> { UserThread.execute(() -> gracefulShutDownHandler.gracefulShutDown(() -> {
})); }));
}); });
Signal.handle(new Signal("TERM"), signal -> { Signal.handle(new Signal("TERM"), signal -> {
log.info("Received {}", signal);
UserThread.execute(() -> gracefulShutDownHandler.gracefulShutDown(() -> { UserThread.execute(() -> gracefulShutDownHandler.gracefulShutDown(() -> {
})); }));
}); });

View file

@ -168,8 +168,8 @@ public abstract class BisqExecutable implements GracefulShutDownHandler, BisqSet
} }
AtomicInteger remaining = new AtomicInteger(hosts.size()); AtomicInteger remaining = new AtomicInteger(hosts.size());
hosts.forEach(e -> { hosts.forEach(host -> {
e.readPersisted(() -> { host.readPersisted(() -> {
if (remaining.decrementAndGet() == 0) { if (remaining.decrementAndGet() == 0) {
UserThread.execute(completeHandler); UserThread.execute(completeHandler);
} }

View file

@ -19,7 +19,6 @@ package bisq.core.app.misc;
import bisq.core.account.sign.SignedWitnessService; import bisq.core.account.sign.SignedWitnessService;
import bisq.core.account.witness.AccountAgeWitnessService; import bisq.core.account.witness.AccountAgeWitnessService;
import bisq.core.app.TorSetup;
import bisq.core.filter.FilterManager; import bisq.core.filter.FilterManager;
import bisq.core.trade.statistics.TradeStatisticsManager; import bisq.core.trade.statistics.TradeStatisticsManager;
@ -28,6 +27,8 @@ import bisq.network.p2p.P2PServiceListener;
import bisq.network.p2p.network.CloseConnectionReason; import bisq.network.p2p.network.CloseConnectionReason;
import bisq.network.p2p.network.Connection; import bisq.network.p2p.network.Connection;
import bisq.network.p2p.network.ConnectionListener; import bisq.network.p2p.network.ConnectionListener;
import bisq.network.p2p.peers.PeerManager;
import bisq.network.p2p.storage.P2PDataStorage;
import bisq.common.config.Config; import bisq.common.config.Config;
import bisq.common.proto.persistable.PersistedDataHost; import bisq.common.proto.persistable.PersistedDataHost;
@ -47,32 +48,36 @@ public class AppSetupWithP2P extends AppSetup {
protected final AccountAgeWitnessService accountAgeWitnessService; protected final AccountAgeWitnessService accountAgeWitnessService;
private final SignedWitnessService signedWitnessService; private final SignedWitnessService signedWitnessService;
protected final FilterManager filterManager; protected final FilterManager filterManager;
private final TorSetup torSetup; private final P2PDataStorage p2PDataStorage;
protected BooleanProperty p2pNetWorkReady; private final PeerManager peerManager;
protected final TradeStatisticsManager tradeStatisticsManager; protected final TradeStatisticsManager tradeStatisticsManager;
protected ArrayList<PersistedDataHost> persistedDataHosts; protected ArrayList<PersistedDataHost> persistedDataHosts;
protected BooleanProperty p2pNetWorkReady;
@Inject @Inject
public AppSetupWithP2P(P2PService p2PService, public AppSetupWithP2P(P2PService p2PService,
P2PDataStorage p2PDataStorage,
PeerManager peerManager,
TradeStatisticsManager tradeStatisticsManager, TradeStatisticsManager tradeStatisticsManager,
AccountAgeWitnessService accountAgeWitnessService, AccountAgeWitnessService accountAgeWitnessService,
SignedWitnessService signedWitnessService, SignedWitnessService signedWitnessService,
FilterManager filterManager, FilterManager filterManager,
TorSetup torSetup,
Config config) { Config config) {
super(config); super(config);
this.p2PService = p2PService; this.p2PService = p2PService;
this.p2PDataStorage = p2PDataStorage;
this.peerManager = peerManager;
this.tradeStatisticsManager = tradeStatisticsManager; this.tradeStatisticsManager = tradeStatisticsManager;
this.accountAgeWitnessService = accountAgeWitnessService; this.accountAgeWitnessService = accountAgeWitnessService;
this.signedWitnessService = signedWitnessService; this.signedWitnessService = signedWitnessService;
this.filterManager = filterManager; this.filterManager = filterManager;
this.torSetup = torSetup;
this.persistedDataHosts = new ArrayList<>(); this.persistedDataHosts = new ArrayList<>();
} }
@Override @Override
public void initPersistedDataHosts() { public void initPersistedDataHosts() {
persistedDataHosts.add(p2PService); persistedDataHosts.add(p2PDataStorage);
persistedDataHosts.add(peerManager);
// we apply at startup the reading of persisted data but don't want to get it triggered in the constructor // we apply at startup the reading of persisted data but don't want to get it triggered in the constructor
persistedDataHosts.forEach(e -> { persistedDataHosts.forEach(e -> {
@ -88,7 +93,7 @@ public class AppSetupWithP2P extends AppSetup {
@Override @Override
protected void initBasicServices() { protected void initBasicServices() {
String postFix = "_" + config.baseCurrencyNetwork.name(); String postFix = "_" + config.baseCurrencyNetwork.name();
p2PService.getP2PDataStorage().readFromResources(postFix, this::startInitP2PNetwork); p2PDataStorage.readFromResources(postFix, this::startInitP2PNetwork);
} }
private void startInitP2PNetwork() { private void startInitP2PNetwork() {

View file

@ -19,7 +19,6 @@ package bisq.core.app.misc;
import bisq.core.account.sign.SignedWitnessService; import bisq.core.account.sign.SignedWitnessService;
import bisq.core.account.witness.AccountAgeWitnessService; import bisq.core.account.witness.AccountAgeWitnessService;
import bisq.core.app.TorSetup;
import bisq.core.dao.DaoSetup; import bisq.core.dao.DaoSetup;
import bisq.core.dao.governance.ballot.BallotListService; import bisq.core.dao.governance.ballot.BallotListService;
import bisq.core.dao.governance.blindvote.MyBlindVoteListService; import bisq.core.dao.governance.blindvote.MyBlindVoteListService;
@ -31,6 +30,8 @@ import bisq.core.filter.FilterManager;
import bisq.core.trade.statistics.TradeStatisticsManager; import bisq.core.trade.statistics.TradeStatisticsManager;
import bisq.network.p2p.P2PService; import bisq.network.p2p.P2PService;
import bisq.network.p2p.peers.PeerManager;
import bisq.network.p2p.storage.P2PDataStorage;
import bisq.common.config.Config; import bisq.common.config.Config;
@ -44,6 +45,8 @@ public class AppSetupWithP2PAndDAO extends AppSetupWithP2P {
@Inject @Inject
public AppSetupWithP2PAndDAO(P2PService p2PService, public AppSetupWithP2PAndDAO(P2PService p2PService,
P2PDataStorage p2PDataStorage,
PeerManager peerManager,
TradeStatisticsManager tradeStatisticsManager, TradeStatisticsManager tradeStatisticsManager,
AccountAgeWitnessService accountAgeWitnessService, AccountAgeWitnessService accountAgeWitnessService,
SignedWitnessService signedWitnessService, SignedWitnessService signedWitnessService,
@ -55,14 +58,14 @@ public class AppSetupWithP2PAndDAO extends AppSetupWithP2P {
MyProposalListService myProposalListService, MyProposalListService myProposalListService,
MyReputationListService myReputationListService, MyReputationListService myReputationListService,
MyProofOfBurnListService myProofOfBurnListService, MyProofOfBurnListService myProofOfBurnListService,
TorSetup torSetup,
Config config) { Config config) {
super(p2PService, super(p2PService,
p2PDataStorage,
peerManager,
tradeStatisticsManager, tradeStatisticsManager,
accountAgeWitnessService, accountAgeWitnessService,
signedWitnessService, signedWitnessService,
filterManager, filterManager,
torSetup,
config); config);
this.daoSetup = daoSetup; this.daoSetup = daoSetup;

View file

@ -35,7 +35,8 @@ import bisq.core.trade.failed.FailedTradesManager;
import bisq.core.user.Preferences; import bisq.core.user.Preferences;
import bisq.core.user.User; import bisq.core.user.User;
import bisq.network.p2p.P2PService; import bisq.network.p2p.peers.PeerManager;
import bisq.network.p2p.storage.P2PDataStorage;
import bisq.common.config.Config; import bisq.common.config.Config;
import bisq.common.proto.persistable.PersistedDataHost; import bisq.common.proto.persistable.PersistedDataHost;
@ -63,7 +64,8 @@ public class CorePersistedDataHost {
persistedDataHosts.add(injector.getInstance(ArbitrationDisputeListService.class)); persistedDataHosts.add(injector.getInstance(ArbitrationDisputeListService.class));
persistedDataHosts.add(injector.getInstance(MediationDisputeListService.class)); persistedDataHosts.add(injector.getInstance(MediationDisputeListService.class));
persistedDataHosts.add(injector.getInstance(RefundDisputeListService.class)); persistedDataHosts.add(injector.getInstance(RefundDisputeListService.class));
persistedDataHosts.add(injector.getInstance(P2PService.class)); persistedDataHosts.add(injector.getInstance(P2PDataStorage.class));
persistedDataHosts.add(injector.getInstance(PeerManager.class));
if (injector.getInstance(Config.class).daoActivated) { if (injector.getInstance(Config.class).daoActivated) {
persistedDataHosts.add(injector.getInstance(BallotListService.class)); persistedDataHosts.add(injector.getInstance(BallotListService.class));

View file

@ -114,7 +114,6 @@ public class BsqDashboardView extends ActivatableView<GridPane, Void> implements
private Coin availableAmount; private Coin availableAmount;
private int gridRow = 0; private int gridRow = 0;
double percentToTrim = 5;
double howManyStdDevsConstituteOutlier = 10; double howManyStdDevsConstituteOutlier = 10;

View file

@ -52,7 +52,6 @@ import bisq.common.crypto.KeyRing;
import bisq.common.crypto.PubKeyRing; import bisq.common.crypto.PubKeyRing;
import bisq.common.proto.ProtobufferException; import bisq.common.proto.ProtobufferException;
import bisq.common.proto.network.NetworkEnvelope; import bisq.common.proto.network.NetworkEnvelope;
import bisq.common.proto.persistable.PersistedDataHost;
import bisq.common.util.Utilities; import bisq.common.util.Utilities;
import com.google.inject.Inject; import com.google.inject.Inject;
@ -105,7 +104,7 @@ import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
public class P2PService implements SetupListener, MessageListener, ConnectionListener, RequestDataManager.Listener, public class P2PService implements SetupListener, MessageListener, ConnectionListener, RequestDataManager.Listener,
HashMapChangedListener, PersistedDataHost { HashMapChangedListener {
private static final Logger log = LoggerFactory.getLogger(P2PService.class); private static final Logger log = LoggerFactory.getLogger(P2PService.class);
private final SeedNodeRepository seedNodeRepository; private final SeedNodeRepository seedNodeRepository;
@ -184,12 +183,6 @@ public class P2PService implements SetupListener, MessageListener, ConnectionLis
}); });
} }
@Override
public void readPersisted(Runnable completeHandler) {
p2PDataStorage.readPersisted(completeHandler);
peerManager.readPersisted(completeHandler);
}
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// API // API

View file

@ -29,6 +29,7 @@ import java.io.File;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -154,14 +155,18 @@ public abstract class HistoricalDataStoreService<T extends PersistableNetworkPay
ImmutableMap.Builder<P2PDataStorage.ByteArray, PersistableNetworkPayload> allHistoricalPayloadsBuilder = ImmutableMap.builder(); ImmutableMap.Builder<P2PDataStorage.ByteArray, PersistableNetworkPayload> allHistoricalPayloadsBuilder = ImmutableMap.builder();
ImmutableMap.Builder<String, PersistableNetworkPayloadStore<? extends PersistableNetworkPayload>> storesByVersionBuilder = ImmutableMap.builder(); ImmutableMap.Builder<String, PersistableNetworkPayloadStore<? extends PersistableNetworkPayload>> storesByVersionBuilder = ImmutableMap.builder();
AtomicInteger numFiles = new AtomicInteger(Version.HISTORICAL_RESOURCE_FILE_VERSION_TAGS.size());
Version.HISTORICAL_RESOURCE_FILE_VERSION_TAGS.forEach(version -> readHistoricalStoreFromResources(version, Version.HISTORICAL_RESOURCE_FILE_VERSION_TAGS.forEach(version -> readHistoricalStoreFromResources(version,
postFix, postFix,
allHistoricalPayloadsBuilder, allHistoricalPayloadsBuilder,
storesByVersionBuilder)); storesByVersionBuilder,
() -> {
allHistoricalPayloads = allHistoricalPayloadsBuilder.build(); if (numFiles.decrementAndGet() == 0) {
storesByVersion = storesByVersionBuilder.build(); allHistoricalPayloads = allHistoricalPayloadsBuilder.build();
completeHandler.run(); storesByVersion = storesByVersionBuilder.build();
completeHandler.run();
}
}));
}); });
} }
@ -173,21 +178,24 @@ public abstract class HistoricalDataStoreService<T extends PersistableNetworkPay
private void readHistoricalStoreFromResources(String version, private void readHistoricalStoreFromResources(String version,
String postFix, String postFix,
ImmutableMap.Builder<P2PDataStorage.ByteArray, PersistableNetworkPayload> allHistoricalDataBuilder, ImmutableMap.Builder<P2PDataStorage.ByteArray, PersistableNetworkPayload> allHistoricalDataBuilder,
ImmutableMap.Builder<String, PersistableNetworkPayloadStore<? extends PersistableNetworkPayload>> storesByVersionBuilder) { ImmutableMap.Builder<String, PersistableNetworkPayloadStore<? extends PersistableNetworkPayload>> storesByVersionBuilder,
Runnable completeHandler) {
String fileName = getFileName() + "_" + version; String fileName = getFileName() + "_" + version;
boolean wasCreatedFromResources = makeFileFromResourceFile(fileName, postFix); boolean wasCreatedFromResources = makeFileFromResourceFile(fileName, postFix);
// If resource file does not exist we do not create a new store as it would never get filled. // If resource file does not exist we do not create a new store as it would never get filled.
persistenceManager.readPersisted(getFileName(), persisted -> { persistenceManager.readPersisted(fileName, persisted -> {
storesByVersionBuilder.put(version, persisted); storesByVersionBuilder.put(version, persisted);
allHistoricalDataBuilder.putAll(persisted.getMap()); allHistoricalDataBuilder.putAll(persisted.getMap());
log.info("We have read from {} {} historical items.", fileName, persisted.getMap().size());
if (wasCreatedFromResources) { if (wasCreatedFromResources) {
pruneStore(persisted, version); pruneStore(persisted, version);
} }
completeHandler.run();
}, },
() -> { () -> {
log.warn("Resource file with file name {} does not exits.", fileName); log.warn("Resource file with file name {} does not exits.", fileName);
completeHandler.run();
}); });
} }