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.
This commit is contained in:
Olaoluwa Osuntokun committed 2021-10-28 15:50:07 -07:00
1 parent 700bae16a3
commit c0f934e363
2 files changed
+12 -7

No files matched your search

+9 -3
View File
@@ -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,
+3 -4
View File
@@ -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
}