mirror of
https://github.com/sparrowwallet/sparrow.git
synced 2024-12-23 20:36:44 +00:00
buffer nodehistorychangedevents to avoid multiple simultaneous history refreshes
This commit is contained in:
parent
416fc83b4d
commit
81810fced5
2 changed files with 18 additions and 3 deletions
|
@ -113,7 +113,7 @@ public class TransactionEntry extends Entry implements Comparable<TransactionEnt
|
|||
BlockTransactionHashIndex ref = walletTxos.get(new HashIndex(txInput.getOutpoint().getHash(), txInput.getOutpoint().getIndex()));
|
||||
if(ref != null) {
|
||||
validEntries++;
|
||||
if(getChildren().stream().noneMatch(entry -> ((HashIndexEntry)entry).getHashIndex().equals(ref.getSpentBy()) && ((HashIndexEntry)entry).getType().equals(HashIndexEntry.Type.INPUT))) {
|
||||
if(getChildren().stream().noneMatch(entry -> ((HashIndexEntry)entry).getHashIndex().toString().equals(ref.getSpentBy().toString()) && ((HashIndexEntry)entry).getType().equals(HashIndexEntry.Type.INPUT))) {
|
||||
log.warn("TransactionEntry " + blockTransaction.getHash() + " for wallet " + getWallet().getFullName() + " missing child for input " + ref.getSpentBy() + " on output " + ref);
|
||||
return false;
|
||||
}
|
||||
|
@ -123,7 +123,7 @@ public class TransactionEntry extends Entry implements Comparable<TransactionEnt
|
|||
BlockTransactionHashIndex ref = walletTxos.get(new HashIndex(txOutput.getHash(), txOutput.getIndex()));
|
||||
if(ref != null) {
|
||||
validEntries++;
|
||||
if(getChildren().stream().noneMatch(entry -> ((HashIndexEntry)entry).getHashIndex().equals(ref) && ((HashIndexEntry)entry).getType().equals(HashIndexEntry.Type.OUTPUT))) {
|
||||
if(getChildren().stream().noneMatch(entry -> ((HashIndexEntry)entry).getHashIndex().toString().equals(ref.toString()) && ((HashIndexEntry)entry).getType().equals(HashIndexEntry.Type.OUTPUT))) {
|
||||
log.warn("TransactionEntry " + blockTransaction.getHash() + " for wallet " + getWallet().getFullName() + " missing child for output " + ref);
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -12,6 +12,8 @@ import com.sparrowwallet.sparrow.io.StorageException;
|
|||
import com.sparrowwallet.sparrow.net.AllHistoryChangedException;
|
||||
import com.sparrowwallet.sparrow.net.ElectrumServer;
|
||||
import com.sparrowwallet.sparrow.io.Storage;
|
||||
import io.reactivex.rxjavafx.schedulers.JavaFxScheduler;
|
||||
import io.reactivex.subjects.PublishSubject;
|
||||
import javafx.application.Platform;
|
||||
import javafx.beans.property.BooleanProperty;
|
||||
import javafx.beans.property.ObjectProperty;
|
||||
|
@ -24,6 +26,7 @@ import org.slf4j.LoggerFactory;
|
|||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static com.sparrowwallet.drongo.wallet.WalletNode.nodeRangesToString;
|
||||
|
@ -34,6 +37,8 @@ public class WalletForm {
|
|||
private final Storage storage;
|
||||
protected Wallet wallet;
|
||||
|
||||
private final PublishSubject<WalletNode> refreshNodesSubject;
|
||||
|
||||
private final List<WalletForm> nestedWalletForms = new ArrayList<>();
|
||||
|
||||
private WalletTransactionsEntry walletTransactionsEntry;
|
||||
|
@ -54,6 +59,16 @@ public class WalletForm {
|
|||
this.storage = storage;
|
||||
this.wallet = currentWallet;
|
||||
|
||||
refreshNodesSubject = PublishSubject.create();
|
||||
refreshNodesSubject.buffer(1, TimeUnit.SECONDS)
|
||||
.filter(walletNodes -> !walletNodes.isEmpty())
|
||||
.observeOn(JavaFxScheduler.platform())
|
||||
.subscribe(walletNodes -> {
|
||||
refreshHistory(AppServices.getCurrentBlockHeight(), new HashSet<>(walletNodes));
|
||||
}, exception -> {
|
||||
log.error("Error refreshing nodes", exception);
|
||||
});
|
||||
|
||||
if(refreshHistory && wallet.isValid()) {
|
||||
refreshHistory(AppServices.getCurrentBlockHeight());
|
||||
}
|
||||
|
@ -437,7 +452,7 @@ public class WalletForm {
|
|||
WalletNode walletNode = event.getWalletNode(wallet);
|
||||
if(walletNode != null) {
|
||||
log.debug(wallet.getFullName() + " history event for node " + walletNode + " (" + event.getScriptHash() + ")");
|
||||
refreshHistory(AppServices.getCurrentBlockHeight(), Set.of(walletNode));
|
||||
refreshNodesSubject.onNext(walletNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue