add function to determine if dispute opened message needs resent

This commit is contained in:
woodser 2025-10-09 07:04:50 -04:00
parent 7ca861b692
commit c7a790124a
No known key found for this signature in database
GPG key ID: 55A10DD48ADEE5EF
3 changed files with 34 additions and 18 deletions

View file

@ -53,30 +53,38 @@ public class ArbitratorProtocol extends DisputeProtocol {
public void sendDisputeOpenedMessageIfApplicable() {
ThreadUtils.execute(() -> {
if (!needsToResendDisputeOpenedMessage()) return;
if (trade.isShutDownStarted() || trade.isPayoutPublished()) return;
synchronized (trade.getLock()) {
if (trade.isShutDownStarted() || trade.isPayoutPublished()) return;
if (trade.getDisputeState() == Trade.DisputeState.DISPUTE_OPENED) {
latchTrade();
given(new Condition(trade))
.setup(tasks(
ArbitratorSendDisputeOpenedMessageToBuyer.class,
ArbitratorSendDisputeOpenedMessageToSeller.class)
.using(new TradeTaskRunner(trade,
() -> {
unlatchTrade();
},
(errorMessage) -> {
log.warn("Error sending DisputeOpenedMessage: " + errorMessage);
unlatchTrade();
})))
.executeTasks();
awaitTradeLatch();
}
if (!needsToResendDisputeOpenedMessage()) return;
latchTrade();
given(new Condition(trade))
.setup(tasks(
ArbitratorSendDisputeOpenedMessageToBuyer.class,
ArbitratorSendDisputeOpenedMessageToSeller.class)
.using(new TradeTaskRunner(trade,
() -> {
unlatchTrade();
},
(errorMessage) -> {
log.warn("Error sending DisputeOpenedMessage: " + errorMessage);
unlatchTrade();
})))
.executeTasks();
awaitTradeLatch();
}
}, trade.getId());
}
private boolean needsToResendDisputeOpenedMessage() {
if (trade.isShutDownStarted()) return false;
if (trade.isPayoutPublished()) return false;
if (trade.getBuyer().getDisputeOpenedMessage() == null && trade.getSeller().getDisputeOpenedMessage() == null) return false;
if (trade.getDisputeState() != Trade.DisputeState.DISPUTE_OPENED) return false;
if (!((ArbitratorTrade) trade).resendDisputeOpenedMessageWithinDuration()) return false;
return !trade.getProcessModel().isDisputeOpenedMessageAckedOrStored();
}
///////////////////////////////////////////////////////////////////////////////////////////
// Incoming messages
///////////////////////////////////////////////////////////////////////////////////////////

View file

@ -313,6 +313,10 @@ public class ProcessModel implements Model, PersistablePayload {
return getArbitrator().isPaymentReceivedMessageAckedOrStored() && getBuyer().isPaymentReceivedMessageAckedOrStored();
}
public boolean isDisputeOpenedMessageAckedOrStored() {
return getBuyer().isDisputeOpenedMessageAckedOrStored() || getSeller().isDisputeOpenedMessageAckedOrStored();
}
void setDepositTxSentAckMessage(AckMessage ackMessage) {
MessageState messageState = ackMessage.isSuccess() ?
MessageState.ACKNOWLEDGED :

View file

@ -304,6 +304,10 @@ public final class TradePeer implements PersistablePayload {
return disputeOpenedMessageStateProperty.get() == MessageState.ACKNOWLEDGED || disputeOpenedMessageStateProperty.get() == MessageState.STORED_IN_MAILBOX || disputeOpenedMessageStateProperty.get() == MessageState.NACKED;
}
public boolean isDisputeOpenedMessageAckedOrStored() {
return disputeOpenedMessageStateProperty.get() == MessageState.ACKNOWLEDGED || disputeOpenedMessageStateProperty.get() == MessageState.STORED_IN_MAILBOX;
}
@Override
public Message toProtoMessage() {
final protobuf.TradePeer.Builder builder = protobuf.TradePeer.newBuilder();