commit eaee0dca7b554c5919414bf7457c7ece75fc65c3
parent 0e9ec0327f8f782fae1925c2a6eb12965d2d59f9
Author: Antoine A <>
Date: Fri, 24 Jan 2025 11:06:53 +0100
nexus: improve batch and tx failure msg logic
Diffstat:
2 files changed, 14 insertions(+), 5 deletions(-)
diff --git a/database-versioning/libeufin-nexus-procedures.sql b/database-versioning/libeufin-nexus-procedures.sql
@@ -558,11 +558,10 @@ BEGIN
WHERE end_to_end_id = in_end_to_end_id;
IF FOUND THEN
-- Update unsettled transaction status
- IF local_status = 'success' AND in_status = 'permanent_failure' THEN
- UPDATE initiated_outgoing_transactions
- SET status = 'late_failure', status_msg = in_status_msg
- WHERE initiated_outgoing_transaction_id = local_tx_id;
- ELSIF local_status NOT IN ('success', 'permanent_failure', 'late_failure') THEN
+ IF in_status = 'permanent_failure' OR local_status NOT IN ('success', 'permanent_failure', 'late_failure') THEN
+ IF in_status = 'permanent_failure' AND local_status = 'success' THEN
+ in_status = 'late_failure';
+ END IF;
UPDATE initiated_outgoing_transactions
SET status = in_status, status_msg = in_status_msg
WHERE initiated_outgoing_transaction_id = local_tx_id;
diff --git a/nexus/src/test/kotlin/DatabaseTest.kt b/nexus/src/test/kotlin/DatabaseTest.kt
@@ -521,6 +521,16 @@ class PaymentInitiationsTest {
registerOutgoingPayment(db, genOutPay("", endToEndId = "TX", msgId = "BATCH"))
checkPart(batchId, SubmissionState.success, null, SubmissionState.success, null, SubmissionState.success, null)
}
+
+ // Transaction failure take over batch failures
+ test { batchId ->
+ checkBatch(batchId, SubmissionState.unsubmitted, null)
+ db.initiated.batchStatusUpdate("BATCH", StatusUpdate.permanent_failure, "batch")
+ checkPart(batchId, SubmissionState.permanent_failure, "batch", SubmissionState.permanent_failure, "batch", SubmissionState.permanent_failure, "batch")
+ db.initiated.txStatusUpdate("TX", "BATCH", StatusUpdate.permanent_failure, "tx")
+ db.initiated.batchStatusUpdate("BATCH", StatusUpdate.permanent_failure, "batch2")
+ checkPart(batchId, SubmissionState.permanent_failure, "batch", SubmissionState.permanent_failure, "tx", SubmissionState.permanent_failure, "batch")
+ }
// Unknown order and batch
db.initiated.batchSubmissionSuccess(42, Instant.now(), "ORDER_X")