mirror of
https://github.com/haveno-dex/haveno.git
synced 2025-10-14 11:30:55 -04:00
edit open offer on shared thread to fix concurrent processing
This commit is contained in:
parent
5c42536d6d
commit
21720048a6
1 changed files with 50 additions and 41 deletions
|
@ -703,6 +703,7 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.info("Editing open offer: {}", openOffer.getId());
|
||||||
offersToBeEdited.put(openOffer.getId(), openOffer);
|
offersToBeEdited.put(openOffer.getId(), openOffer);
|
||||||
|
|
||||||
if (openOffer.isAvailable()) {
|
if (openOffer.isAvailable()) {
|
||||||
|
@ -723,58 +724,66 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
|
||||||
OpenOffer.State originalState,
|
OpenOffer.State originalState,
|
||||||
ResultHandler resultHandler,
|
ResultHandler resultHandler,
|
||||||
ErrorMessageHandler errorMessageHandler) {
|
ErrorMessageHandler errorMessageHandler) {
|
||||||
Optional<OpenOffer> openOfferOptional = getOpenOffer(editedOffer.getId());
|
ThreadUtils.execute(() -> {
|
||||||
|
Optional<OpenOffer> openOfferOptional = getOpenOffer(editedOffer.getId());
|
||||||
|
|
||||||
if (openOfferOptional.isPresent()) {
|
if (openOfferOptional.isPresent()) {
|
||||||
OpenOffer openOffer = openOfferOptional.get();
|
OpenOffer openOffer = openOfferOptional.get();
|
||||||
|
|
||||||
openOffer.getOffer().setState(Offer.State.REMOVED);
|
openOffer.getOffer().setState(Offer.State.REMOVED);
|
||||||
openOffer.setState(OpenOffer.State.CANCELED);
|
openOffer.setState(OpenOffer.State.CANCELED);
|
||||||
removeOpenOffer(openOffer);
|
removeOpenOffer(openOffer);
|
||||||
|
|
||||||
OpenOffer editedOpenOffer = new OpenOffer(editedOffer, triggerPrice, openOffer);
|
OpenOffer editedOpenOffer = new OpenOffer(editedOffer, triggerPrice, openOffer);
|
||||||
if (originalState == OpenOffer.State.DEACTIVATED && openOffer.isDeactivatedByTrigger()) {
|
if (originalState == OpenOffer.State.DEACTIVATED && openOffer.isDeactivatedByTrigger()) {
|
||||||
if (hasConflictingClone(editedOpenOffer)) {
|
if (hasConflictingClone(editedOpenOffer)) {
|
||||||
editedOpenOffer.setState(OpenOffer.State.DEACTIVATED);
|
editedOpenOffer.setState(OpenOffer.State.DEACTIVATED);
|
||||||
|
} else {
|
||||||
|
editedOpenOffer.setState(OpenOffer.State.AVAILABLE);
|
||||||
|
}
|
||||||
|
applyTriggerState(editedOpenOffer);
|
||||||
} else {
|
} else {
|
||||||
editedOpenOffer.setState(OpenOffer.State.AVAILABLE);
|
if (originalState == OpenOffer.State.AVAILABLE && hasConflictingClone(editedOpenOffer)) {
|
||||||
|
editedOpenOffer.setState(OpenOffer.State.DEACTIVATED);
|
||||||
|
} else {
|
||||||
|
editedOpenOffer.setState(originalState);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
applyTriggerState(editedOpenOffer);
|
|
||||||
} else {
|
addOpenOffer(editedOpenOffer);
|
||||||
if (originalState == OpenOffer.State.AVAILABLE && hasConflictingClone(editedOpenOffer)) {
|
|
||||||
editedOpenOffer.setState(OpenOffer.State.DEACTIVATED);
|
// check for valid arbitrator signature after editing
|
||||||
|
Arbitrator arbitrator = user.getAcceptedArbitratorByAddress(editedOpenOffer.getOffer().getOfferPayload().getArbitratorSigner());
|
||||||
|
if (arbitrator == null || !HavenoUtils.isArbitratorSignatureValid(editedOpenOffer.getOffer().getOfferPayload(), arbitrator)) {
|
||||||
|
|
||||||
|
// reset arbitrator signature
|
||||||
|
editedOpenOffer.getOffer().getOfferPayload().setArbitratorSignature(null);
|
||||||
|
editedOpenOffer.getOffer().getOfferPayload().setArbitratorSigner(null);
|
||||||
|
|
||||||
|
// process offer to sign and publish
|
||||||
|
synchronized (processOffersLock) {
|
||||||
|
CountDownLatch latch = new CountDownLatch(1);
|
||||||
|
processOffer(getOpenOffers(), editedOpenOffer, (transaction) -> {
|
||||||
|
offersToBeEdited.remove(openOffer.getId());
|
||||||
|
requestPersistence();
|
||||||
|
latch.countDown();
|
||||||
|
resultHandler.handleResult();
|
||||||
|
}, (errorMsg) -> {
|
||||||
|
latch.countDown();
|
||||||
|
errorMessageHandler.handleErrorMessage(errorMsg);
|
||||||
|
});
|
||||||
|
HavenoUtils.awaitLatch(latch);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
editedOpenOffer.setState(originalState);
|
maybeRepublishOffer(editedOpenOffer, null);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
addOpenOffer(editedOpenOffer);
|
|
||||||
|
|
||||||
// check for valid arbitrator signature after editing
|
|
||||||
Arbitrator arbitrator = user.getAcceptedArbitratorByAddress(editedOpenOffer.getOffer().getOfferPayload().getArbitratorSigner());
|
|
||||||
if (arbitrator == null || !HavenoUtils.isArbitratorSignatureValid(editedOpenOffer.getOffer().getOfferPayload(), arbitrator)) {
|
|
||||||
|
|
||||||
// reset arbitrator signature
|
|
||||||
editedOpenOffer.getOffer().getOfferPayload().setArbitratorSignature(null);
|
|
||||||
editedOpenOffer.getOffer().getOfferPayload().setArbitratorSigner(null);
|
|
||||||
|
|
||||||
// process offer to sign and publish
|
|
||||||
processOffer(getOpenOffers(), editedOpenOffer, (transaction) -> {
|
|
||||||
offersToBeEdited.remove(openOffer.getId());
|
offersToBeEdited.remove(openOffer.getId());
|
||||||
requestPersistence();
|
requestPersistence();
|
||||||
resultHandler.handleResult();
|
resultHandler.handleResult();
|
||||||
}, (errorMsg) -> {
|
}
|
||||||
errorMessageHandler.handleErrorMessage(errorMsg);
|
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
maybeRepublishOffer(editedOpenOffer, null);
|
errorMessageHandler.handleErrorMessage("There is no offer with this id existing to be published.");
|
||||||
offersToBeEdited.remove(openOffer.getId());
|
|
||||||
requestPersistence();
|
|
||||||
resultHandler.handleResult();
|
|
||||||
}
|
}
|
||||||
} else {
|
}, THREAD_ID);
|
||||||
errorMessageHandler.handleErrorMessage("There is no offer with this id existing to be published.");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void editOpenOfferCancel(OpenOffer openOffer,
|
public void editOpenOfferCancel(OpenOffer openOffer,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue