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() { public void sendDisputeOpenedMessageIfApplicable() {
ThreadUtils.execute(() -> { ThreadUtils.execute(() -> {
if (!needsToResendDisputeOpenedMessage()) return;
if (trade.isShutDownStarted() || trade.isPayoutPublished()) return; if (trade.isShutDownStarted() || trade.isPayoutPublished()) return;
synchronized (trade.getLock()) { synchronized (trade.getLock()) {
if (trade.isShutDownStarted() || trade.isPayoutPublished()) return; if (!needsToResendDisputeOpenedMessage()) return;
if (trade.getDisputeState() == Trade.DisputeState.DISPUTE_OPENED) { latchTrade();
latchTrade(); given(new Condition(trade))
given(new Condition(trade)) .setup(tasks(
.setup(tasks( ArbitratorSendDisputeOpenedMessageToBuyer.class,
ArbitratorSendDisputeOpenedMessageToBuyer.class, ArbitratorSendDisputeOpenedMessageToSeller.class)
ArbitratorSendDisputeOpenedMessageToSeller.class) .using(new TradeTaskRunner(trade,
.using(new TradeTaskRunner(trade, () -> {
() -> { unlatchTrade();
unlatchTrade(); },
}, (errorMessage) -> {
(errorMessage) -> { log.warn("Error sending DisputeOpenedMessage: " + errorMessage);
log.warn("Error sending DisputeOpenedMessage: " + errorMessage); unlatchTrade();
unlatchTrade(); })))
}))) .executeTasks();
.executeTasks(); awaitTradeLatch();
awaitTradeLatch();
}
} }
}, trade.getId()); }, 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 // Incoming messages
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////

View file

@ -313,6 +313,10 @@ public class ProcessModel implements Model, PersistablePayload {
return getArbitrator().isPaymentReceivedMessageAckedOrStored() && getBuyer().isPaymentReceivedMessageAckedOrStored(); return getArbitrator().isPaymentReceivedMessageAckedOrStored() && getBuyer().isPaymentReceivedMessageAckedOrStored();
} }
public boolean isDisputeOpenedMessageAckedOrStored() {
return getBuyer().isDisputeOpenedMessageAckedOrStored() || getSeller().isDisputeOpenedMessageAckedOrStored();
}
void setDepositTxSentAckMessage(AckMessage ackMessage) { void setDepositTxSentAckMessage(AckMessage ackMessage) {
MessageState messageState = ackMessage.isSuccess() ? MessageState messageState = ackMessage.isSuccess() ?
MessageState.ACKNOWLEDGED : 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; 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 @Override
public Message toProtoMessage() { public Message toProtoMessage() {
final protobuf.TradePeer.Builder builder = protobuf.TradePeer.newBuilder(); final protobuf.TradePeer.Builder builder = protobuf.TradePeer.newBuilder();