mirror of
https://github.com/boldsuck/haveno.git
synced 2025-01-11 02:24:30 +00:00
process unposted offers within lock
This commit is contained in:
parent
900d3a91e1
commit
a088f685c1
1 changed files with 99 additions and 89 deletions
|
@ -152,6 +152,8 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
|
||||||
private static final long KEY_IMAGE_REFRESH_PERIOD_MS_LOCAL = 20000; // 20 seconds
|
private static final long KEY_IMAGE_REFRESH_PERIOD_MS_LOCAL = 20000; // 20 seconds
|
||||||
private static final long KEY_IMAGE_REFRESH_PERIOD_MS_REMOTE = 300000; // 5 minutes
|
private static final long KEY_IMAGE_REFRESH_PERIOD_MS_REMOTE = 300000; // 5 minutes
|
||||||
|
|
||||||
|
private Object processOffersLock = new Object(); // lock for processing offers
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Constructor, Initialization
|
// Constructor, Initialization
|
||||||
|
@ -423,8 +425,8 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
|
||||||
// .forEach(openOffer -> OfferUtil.getInvalidMakerFeeTxErrorMessage(openOffer.getOffer(), btcWalletService)
|
// .forEach(openOffer -> OfferUtil.getInvalidMakerFeeTxErrorMessage(openOffer.getOffer(), btcWalletService)
|
||||||
// .ifPresent(errorMsg -> invalidOffers.add(new Tuple2<>(openOffer, errorMsg))));
|
// .ifPresent(errorMsg -> invalidOffers.add(new Tuple2<>(openOffer, errorMsg))));
|
||||||
|
|
||||||
// process unposted offers
|
// process scheduled offers
|
||||||
processUnpostedOffers((transaction) -> {}, (errorMessage) -> {
|
processScheduledOffers((transaction) -> {}, (errorMessage) -> {
|
||||||
log.warn("Error processing unposted offers: " + errorMessage);
|
log.warn("Error processing unposted offers: " + errorMessage);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -434,7 +436,7 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
|
||||||
@Override
|
@Override
|
||||||
public void onBalancesChanged(BigInteger newBalance, BigInteger newUnlockedBalance) {
|
public void onBalancesChanged(BigInteger newBalance, BigInteger newUnlockedBalance) {
|
||||||
if (lastUnlockedBalance == null || lastUnlockedBalance.compareTo(newUnlockedBalance) < 0) {
|
if (lastUnlockedBalance == null || lastUnlockedBalance.compareTo(newUnlockedBalance) < 0) {
|
||||||
processUnpostedOffers((transaction) -> {}, (errorMessage) -> {
|
processScheduledOffers((transaction) -> {}, (errorMessage) -> {
|
||||||
log.warn("Error processing unposted offers on new unlocked balance: " + errorMessage); // TODO: popup to notify user that offer did not post
|
log.warn("Error processing unposted offers on new unlocked balance: " + errorMessage); // TODO: popup to notify user that offer did not post
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -498,17 +500,25 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
|
||||||
// create open offer
|
// create open offer
|
||||||
OpenOffer openOffer = new OpenOffer(offer, triggerPrice, reserveExactAmount);
|
OpenOffer openOffer = new OpenOffer(offer, triggerPrice, reserveExactAmount);
|
||||||
|
|
||||||
// process open offer to schedule or post
|
// schedule or post offer
|
||||||
|
new Thread(() -> {
|
||||||
|
synchronized (processOffersLock) {
|
||||||
|
CountDownLatch latch = new CountDownLatch(1);
|
||||||
processUnpostedOffer(getOpenOffers(), openOffer, (transaction) -> {
|
processUnpostedOffer(getOpenOffers(), openOffer, (transaction) -> {
|
||||||
addOpenOffer(openOffer);
|
addOpenOffer(openOffer);
|
||||||
requestPersistence();
|
requestPersistence();
|
||||||
|
latch.countDown();
|
||||||
resultHandler.handleResult(transaction);
|
resultHandler.handleResult(transaction);
|
||||||
}, (errorMessage) -> {
|
}, (errorMessage) -> {
|
||||||
log.warn("Error processing unposted offer {}: {}", openOffer.getId(), errorMessage);
|
log.warn("Error processing unposted offer {}: {}", openOffer.getId(), errorMessage);
|
||||||
onCancelled(openOffer);
|
onCancelled(openOffer);
|
||||||
offer.setErrorMessage(errorMessage);
|
offer.setErrorMessage(errorMessage);
|
||||||
|
latch.countDown();
|
||||||
errorMessageHandler.handleErrorMessage(errorMessage);
|
errorMessageHandler.handleErrorMessage(errorMessage);
|
||||||
});
|
});
|
||||||
|
HavenoUtils.awaitLatch(latch);
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove from offerbook
|
// Remove from offerbook
|
||||||
|
@ -772,9 +782,10 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
|
||||||
// Place offer helpers
|
// Place offer helpers
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
private void processUnpostedOffers(TransactionResultHandler resultHandler, // TODO (woodser): transaction not needed with result handler
|
private void processScheduledOffers(TransactionResultHandler resultHandler, // TODO (woodser): transaction not needed with result handler
|
||||||
ErrorMessageHandler errorMessageHandler) {
|
ErrorMessageHandler errorMessageHandler) {
|
||||||
new Thread(() -> {
|
new Thread(() -> {
|
||||||
|
synchronized (processOffersLock) {
|
||||||
List<String> errorMessages = new ArrayList<String>();
|
List<String> errorMessages = new ArrayList<String>();
|
||||||
List<OpenOffer> openOffers = getOpenOffers();
|
List<OpenOffer> openOffers = getOpenOffers();
|
||||||
for (OpenOffer scheduledOffer : openOffers) {
|
for (OpenOffer scheduledOffer : openOffers) {
|
||||||
|
@ -793,12 +804,12 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
|
||||||
requestPersistence();
|
requestPersistence();
|
||||||
if (errorMessages.size() > 0) errorMessageHandler.handleErrorMessage(errorMessages.toString());
|
if (errorMessages.size() > 0) errorMessageHandler.handleErrorMessage(errorMessages.toString());
|
||||||
else resultHandler.handleResult(null);
|
else resultHandler.handleResult(null);
|
||||||
|
}
|
||||||
}).start();
|
}).start();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void processUnpostedOffer(List<OpenOffer> openOffers, OpenOffer openOffer, TransactionResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) {
|
private void processUnpostedOffer(List<OpenOffer> openOffers, OpenOffer openOffer, TransactionResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) {
|
||||||
new Thread(() -> {
|
new Thread(() -> {
|
||||||
synchronized (xmrWalletService) {
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
// done processing if wallet not initialized
|
// done processing if wallet not initialized
|
||||||
|
@ -860,7 +871,6 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
errorMessageHandler.handleErrorMessage(e.getMessage());
|
errorMessageHandler.handleErrorMessage(e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}).start();
|
}).start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1090,7 +1100,7 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
|
||||||
synchronized (placeOfferProtocols) {
|
synchronized (placeOfferProtocols) {
|
||||||
placeOfferProtocols.put(openOffer.getOffer().getId(), placeOfferProtocol);
|
placeOfferProtocols.put(openOffer.getOffer().getId(), placeOfferProtocol);
|
||||||
}
|
}
|
||||||
placeOfferProtocol.placeOffer(); // TODO (woodser): if error placing offer (e.g. bad signature), remove protocol and unfreeze trade funds
|
placeOfferProtocol.placeOffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
Loading…
Reference in a new issue