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,10 +53,10 @@ 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(
@ -73,10 +73,18 @@ public class ArbitratorProtocol extends DisputeProtocol {
.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();