edit open offer on shared thread to fix concurrent processing

This commit is contained in:
woodser 2025-09-30 02:27:40 -04:00
parent 5c42536d6d
commit 21720048a6
No known key found for this signature in database
GPG key ID: 55A10DD48ADEE5EF

View file

@ -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,