diff --git a/common/src/main/java/bisq/common/persistence/PersistenceManager.java b/common/src/main/java/bisq/common/persistence/PersistenceManager.java index 8300e9c336c..27fffacdad1 100644 --- a/common/src/main/java/bisq/common/persistence/PersistenceManager.java +++ b/common/src/main/java/bisq/common/persistence/PersistenceManager.java @@ -375,7 +375,10 @@ public void persistNow(@Nullable Runnable completeHandler) { // reference to the persistable object. getWriteToDiskExecutor().execute(() -> writeToDisk(serialized, completeHandler)); - log.info("Serializing {} took {} msec", fileName, System.currentTimeMillis() - ts); + long duration = System.currentTimeMillis() - ts; + if (duration > 100) { + log.info("Serializing {} took {} msec", fileName, duration); + } } catch (Throwable e) { log.error("Error in saveToFile toProtoMessage: {}, {}", persistable.getClass().getSimpleName(), fileName); e.printStackTrace(); @@ -437,7 +440,10 @@ public void writeToDisk(protobuf.PersistableEnvelope serialized, @Nullable Runna e.printStackTrace(); log.error("Cannot close resources." + e.getMessage()); } - log.info("Writing the serialized {} completed in {} msec", fileName, System.currentTimeMillis() - ts); + long duration = System.currentTimeMillis() - ts; + if (duration > 100) { + log.info("Writing the serialized {} completed in {} msec", fileName, duration); + } persistenceRequested = false; if (completeHandler != null) { UserThread.execute(completeHandler); diff --git a/core/src/main/java/bisq/core/dao/state/model/governance/Role.java b/core/src/main/java/bisq/core/dao/state/model/governance/Role.java index c0b7079e0c5..4850b315415 100644 --- a/core/src/main/java/bisq/core/dao/state/model/governance/Role.java +++ b/core/src/main/java/bisq/core/dao/state/model/governance/Role.java @@ -46,6 +46,9 @@ public final class Role implements PersistablePayload, NetworkPayload, BondedAss private final String link; private final BondedRoleType bondedRoleType; + // Only used as cache + transient private final byte[] hash; + /** * @param name Full name or nickname * @param link GitHub account or forum account of user @@ -74,6 +77,8 @@ private Role(String uid, this.name = name; this.link = link; this.bondedRoleType = bondedRoleType; + + hash = Hash.getSha256Ripemd160hash(toProtoMessage().toByteArray()); } @Override @@ -100,8 +105,7 @@ public static Role fromProto(protobuf.Role proto) { @Override public byte[] getHash() { - byte[] bytes = toProtoMessage().toByteArray(); - return Hash.getSha256Ripemd160hash(bytes); + return hash; } @Override diff --git a/core/src/main/java/bisq/core/offer/Offer.java b/core/src/main/java/bisq/core/offer/Offer.java index bcca0078b4e..963009a0d2b 100644 --- a/core/src/main/java/bisq/core/offer/Offer.java +++ b/core/src/main/java/bisq/core/offer/Offer.java @@ -109,6 +109,11 @@ public enum State { @Setter transient private PriceFeedService priceFeedService; + // Used only as cache + @Nullable + @JsonExclude + transient private String currencyCode; + /////////////////////////////////////////////////////////////////////////////////////////// // Constructor @@ -346,8 +351,9 @@ public boolean isMyOffer(KeyRing keyRing) { public Optional getAccountAgeWitnessHashAsHex() { - if (getExtraDataMap() != null && getExtraDataMap().containsKey(OfferPayload.ACCOUNT_AGE_WITNESS_HASH)) - return Optional.of(getExtraDataMap().get(OfferPayload.ACCOUNT_AGE_WITNESS_HASH)); + Map extraDataMap = getExtraDataMap(); + if (extraDataMap != null && extraDataMap.containsKey(OfferPayload.ACCOUNT_AGE_WITNESS_HASH)) + return Optional.of(extraDataMap.get(OfferPayload.ACCOUNT_AGE_WITNESS_HASH)); else return Optional.empty(); } @@ -421,9 +427,14 @@ public String getCountryCode() { } public String getCurrencyCode() { - return offerPayload.getBaseCurrencyCode().equals("BTC") ? + if (currencyCode != null) { + return currencyCode; + } + + currencyCode = offerPayload.getBaseCurrencyCode().equals("BTC") ? offerPayload.getCounterCurrencyCode() : offerPayload.getBaseCurrencyCode(); + return currencyCode; } public long getProtocolVersion() { diff --git a/core/src/main/java/bisq/core/trade/statistics/TradeStatistics3.java b/core/src/main/java/bisq/core/trade/statistics/TradeStatistics3.java index 10a5989bbab..71cb5e86023 100644 --- a/core/src/main/java/bisq/core/trade/statistics/TradeStatistics3.java +++ b/core/src/main/java/bisq/core/trade/statistics/TradeStatistics3.java @@ -182,6 +182,10 @@ private enum PaymentMethodMapper { @Getter private final Map extraDataMap; + // We cache the date object to avoid reconstructing a new Date at each getDate call. + @JsonExclude + private transient final Date dateObj; + public TradeStatistics3(String currency, long price, long amount, @@ -251,6 +255,8 @@ public TradeStatistics3(String currency, this.extraDataMap = ExtraDataMapValidator.getValidatedExtraDataMap(extraDataMap); this.hash = hash == null ? createHash() : hash; + + dateObj = new Date(date); } public byte[] createHash() { @@ -319,7 +325,7 @@ public Capabilities getRequiredCapabilities() { @Override public Date getDate() { - return new Date(date); + return dateObj; } public long getDateAsLong() { diff --git a/p2p/src/main/java/bisq/network/p2p/storage/P2PDataStorage.java b/p2p/src/main/java/bisq/network/p2p/storage/P2PDataStorage.java index 172cae338f9..454d9420967 100644 --- a/p2p/src/main/java/bisq/network/p2p/storage/P2PDataStorage.java +++ b/p2p/src/main/java/bisq/network/p2p/storage/P2PDataStorage.java @@ -177,7 +177,7 @@ public P2PDataStorage(NetworkNode networkNode, networkNode.addMessageListener(this); networkNode.addConnectionListener(this); - this.persistenceManager.initialize(sequenceNumberMap, PersistenceManager.Source.PRIVATE); + this.persistenceManager.initialize(sequenceNumberMap, PersistenceManager.Source.PRIVATE_LOW_PRIO); }