routing: remove paymentFailure pointer

This introduces an option instead to signal whether there was a failure
for result interpretation.
This commit is contained in:
bitromortac
2025-04-30 15:29:25 +02:00
parent 4498a78cb0
commit a450d85309
3 changed files with 30 additions and 23 deletions

View File

@@ -276,7 +276,7 @@ type paymentResult struct {
// newPaymentResult constructs a new paymentResult. // newPaymentResult constructs a new paymentResult.
func newPaymentResult(id uint64, rt *mcRoute, timeFwd, timeReply time.Time, func newPaymentResult(id uint64, rt *mcRoute, timeFwd, timeReply time.Time,
failure *paymentFailure) *paymentResult { failure fn.Option[paymentFailure]) *paymentResult {
result := &paymentResult{ result := &paymentResult{
id: id, id: id,
@@ -289,11 +289,13 @@ func newPaymentResult(id uint64, rt *mcRoute, timeFwd, timeReply time.Time,
route: tlv.NewRecordT[tlv.TlvType2](*rt), route: tlv.NewRecordT[tlv.TlvType2](*rt),
} }
if failure != nil { failure.WhenSome(
result.failure = tlv.SomeRecordT( func(f paymentFailure) {
tlv.NewRecordT[tlv.TlvType3](*failure), result.failure = tlv.SomeRecordT(
) tlv.NewRecordT[tlv.TlvType3](f),
} )
},
)
return result return result
} }
@@ -621,7 +623,7 @@ func (m *MissionControl) ReportPaymentFail(paymentID uint64, rt *route.Route,
result := newPaymentResult( result := newPaymentResult(
paymentID, extractMCRoute(rt), timestamp, timestamp, paymentID, extractMCRoute(rt), timestamp, timestamp,
newPaymentFailure(failureSourceIdx, failure), fn.Some(newPaymentFailure(failureSourceIdx, failure)),
) )
return m.processPaymentResult(result) return m.processPaymentResult(result)
@@ -635,7 +637,8 @@ func (m *MissionControl) ReportPaymentSuccess(paymentID uint64,
timestamp := m.cfg.clock.Now() timestamp := m.cfg.clock.Now()
result := newPaymentResult( result := newPaymentResult(
paymentID, extractMCRoute(rt), timestamp, timestamp, nil, paymentID, extractMCRoute(rt), timestamp, timestamp,
fn.None[paymentFailure](),
) )
_, err := m.processPaymentResult(result) _, err := m.processPaymentResult(result)
@@ -832,13 +835,13 @@ func (n *namespacedDB) purge() error {
// failure with unknown details. Otherwise, the index and failure message are // failure with unknown details. Otherwise, the index and failure message are
// used to populate the info field of the paymentFailure. // used to populate the info field of the paymentFailure.
func newPaymentFailure(sourceIdx *int, func newPaymentFailure(sourceIdx *int,
failureMsg lnwire.FailureMessage) *paymentFailure { failureMsg lnwire.FailureMessage) paymentFailure {
if sourceIdx == nil { if sourceIdx == nil {
return &paymentFailure{} return paymentFailure{}
} }
return &paymentFailure{ return paymentFailure{
sourceIdx: tlv.SomeRecordT( sourceIdx: tlv.SomeRecordT(
tlv.NewPrimitiveRecord[tlv.TlvType0]( tlv.NewPrimitiveRecord[tlv.TlvType0](
uint8(*sourceIdx), uint8(*sourceIdx),

View File

@@ -7,6 +7,7 @@ import (
"time" "time"
"github.com/btcsuite/btcwallet/walletdb" "github.com/btcsuite/btcwallet/walletdb"
"github.com/lightningnetwork/lnd/fn/v2"
"github.com/lightningnetwork/lnd/kvdb" "github.com/lightningnetwork/lnd/kvdb"
"github.com/lightningnetwork/lnd/lntest/wait" "github.com/lightningnetwork/lnd/lntest/wait"
"github.com/lightningnetwork/lnd/lnwire" "github.com/lightningnetwork/lnd/lnwire"
@@ -85,19 +86,19 @@ func TestMissionControlStore(t *testing.T) {
result1 := newPaymentResult( result1 := newPaymentResult(
99, mcStoreTestRoute, testTime, testTime, 99, mcStoreTestRoute, testTime, testTime,
newPaymentFailure( fn.Some(newPaymentFailure(
&failureSourceIdx, &failureSourceIdx,
lnwire.NewFailIncorrectDetails(100, 1000), lnwire.NewFailIncorrectDetails(100, 1000),
), )),
) )
result2 := newPaymentResult( result2 := newPaymentResult(
2, mcStoreTestRoute, testTime.Add(time.Hour), 2, mcStoreTestRoute, testTime.Add(time.Hour),
testTime.Add(time.Hour), testTime.Add(time.Hour),
newPaymentFailure( fn.Some(newPaymentFailure(
&failureSourceIdx, &failureSourceIdx,
lnwire.NewFailIncorrectDetails(100, 1000), lnwire.NewFailIncorrectDetails(100, 1000),
), )),
) )
// Store result. // Store result.
@@ -134,7 +135,7 @@ func TestMissionControlStore(t *testing.T) {
) )
result3.id = 3 result3.id = 3
result3.failure = tlv.SomeRecordT( result3.failure = tlv.SomeRecordT(
tlv.NewRecordT[tlv.TlvType3](*newPaymentFailure( tlv.NewRecordT[tlv.TlvType3](newPaymentFailure(
&failureSourceIdx, &lnwire.FailMPPTimeout{}, &failureSourceIdx, &lnwire.FailMPPTimeout{},
)), )),
) )
@@ -153,7 +154,7 @@ func TestMissionControlStore(t *testing.T) {
// Also demonstrate the persistence of a success result. // Also demonstrate the persistence of a success result.
result4 := newPaymentResult( result4 := newPaymentResult(
5, mcStoreTestRoute, testTime.Add(3*time.Hour), 5, mcStoreTestRoute, testTime.Add(3*time.Hour),
testTime.Add(3*time.Hour), nil, testTime.Add(3*time.Hour), fn.None[paymentFailure](),
) )
store.AddResult(result4) store.AddResult(result4)
require.NoError(t, store.storeResults()) require.NoError(t, store.storeResults())
@@ -186,7 +187,10 @@ func TestMissionControlStoreFlushing(t *testing.T) {
return newPaymentResult( return newPaymentResult(
lastID, mcStoreTestRoute, testTime.Add(-time.Hour), lastID, mcStoreTestRoute, testTime.Add(-time.Hour),
testTime, testTime,
newPaymentFailure(&failureSourceIdx, failureDetails), fn.Some(newPaymentFailure(
&failureSourceIdx,
failureDetails,
)),
) )
} }
@@ -287,10 +291,10 @@ func BenchmarkMissionControlStoreFlushing(b *testing.B) {
result := newPaymentResult( result := newPaymentResult(
lastID, mcStoreTestRoute, testTimeFwd, lastID, mcStoreTestRoute, testTimeFwd,
testTime, testTime,
newPaymentFailure( fn.Some(newPaymentFailure(
&failureSourceIdx, &failureSourceIdx,
failureDetails, failureDetails,
), )),
) )
store.AddResult(result) store.AddResult(result)
} }
@@ -305,10 +309,10 @@ func BenchmarkMissionControlStoreFlushing(b *testing.B) {
results[i] = newPaymentResult( results[i] = newPaymentResult(
0, mcStoreTestRoute, testTimeFwd, 0, mcStoreTestRoute, testTimeFwd,
testTime, testTime,
newPaymentFailure( fn.Some(newPaymentFailure(
&failureSourceIdx, &failureSourceIdx,
failureDetails, failureDetails,
), )),
) )
} }

View File

@@ -732,7 +732,7 @@ func TestResultInterpretation(t *testing.T) {
t.Run(testCase.name, func(t *testing.T) { t.Run(testCase.name, func(t *testing.T) {
var failure fn.Option[paymentFailure] var failure fn.Option[paymentFailure]
if !testCase.success { if !testCase.success {
failure = fn.Some(*newPaymentFailure( failure = fn.Some(newPaymentFailure(
&testCase.failureSrcIdx, &testCase.failureSrcIdx,
testCase.failure, testCase.failure,
)) ))