From c0f934e3636db345b311f65529c8e7e5c580146e Mon Sep 17 00:00:00 2001 From: Olaoluwa Osuntokun Date: Thu, 14 Oct 2021 18:20:09 +0200 Subject: [PATCH] channeldb: don't cancel other HTLCs w/ diff setID once once is settled With this change, we allow multiple users to concurrently pay the same AMP invoice with distinct set IDs. --- channeldb/invoice_test.go | 12 +++++++++--- channeldb/invoices.go | 7 +++---- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/channeldb/invoice_test.go b/channeldb/invoice_test.go index 2a0d01fb9..5676d64af 100644 --- a/channeldb/invoice_test.go +++ b/channeldb/invoice_test.go @@ -1669,7 +1669,9 @@ func testUpdateHTLCPreimages(t *testing.T, test updateHTLCPreimageTestCase) { // Update the invoice with an accepted HTLC that also accepts the // invoice. ref := InvoiceRefByAddr(invoice.Terms.PaymentAddr) - dbInvoice, err := db.UpdateInvoice(ref, updateAcceptAMPHtlc(0, amt, setID, true)) + dbInvoice, err := db.UpdateInvoice( + ref, updateAcceptAMPHtlc(0, amt, setID, true), + ) require.Nil(t, err) htlcPreimages := make(map[CircuitKey]lntypes.Preimage) @@ -2062,6 +2064,10 @@ func TestUpdateHTLC(t *testing.T) { expErr: nil, }, { + // With the newer AMP logic, this is now valid, as we + // want to be able to accept multiple settle attempts + // to a given pay_addr. In this case, the HTLC should + // remain in the accepted state. name: "AMP settle valid preimage different htlc set", input: InvoiceHTLC{ Amt: 5000, @@ -2085,9 +2091,9 @@ func TestUpdateHTLC(t *testing.T) { MppTotalAmt: 5000, AcceptHeight: 100, AcceptTime: testNow, - ResolveTime: testNow, + ResolveTime: time.Time{}, Expiry: 40, - State: HtlcStateCanceled, + State: HtlcStateAccepted, CustomRecords: make(record.CustomSet), AMP: &InvoiceHtlcAMPData{ Record: *ampRecord, diff --git a/channeldb/invoices.go b/channeldb/invoices.go index 41ba4362d..c962009cb 100644 --- a/channeldb/invoices.go +++ b/channeldb/invoices.go @@ -2710,13 +2710,12 @@ func updateHtlc(resolveTime time.Time, htlc *InvoiceHTLC, } htlcState = HtlcStateSettled - } else { - htlcState = HtlcStateCanceled } // Only persist the changes if the invoice is moving to the - // settled state. - if persist { + // settled state, and we're actually updating the state to + // settled. + if persist && htlcState == HtlcStateSettled { htlc.State = htlcState htlc.ResolveTime = resolveTime }