multi: thread context through FailAttempt

This commit is contained in:
ziggie committed 2026-02-25 08:02:24 +01:00
1 parent 3b7fdabaec
commit 446300984e
10 files changed
+33 -26

No files matched your search

+2 -1
View File
@@ -90,7 +90,8 @@ type PaymentControl interface {
*HTLCSettleInfo) (*MPPayment, error) *HTLCSettleInfo) (*MPPayment, error)
// FailAttempt marks the given payment attempt failed. // FailAttempt marks the given payment attempt failed.
FailAttempt(lntypes.Hash, uint64, *HTLCFailInfo) (*MPPayment, error) FailAttempt(context.Context, lntypes.Hash, uint64,
*HTLCFailInfo) (*MPPayment, error)
// Fail transitions a payment into the Failed state, and records // Fail transitions a payment into the Failed state, and records
// the ultimate reason the payment failed. Note that this should only // the ultimate reason the payment failed. Note that this should only
+1 -1
View File
@@ -443,7 +443,7 @@ func (p *KVStore) SettleAttempt(_ context.Context, hash lntypes.Hash,
} }
// FailAttempt marks the given payment attempt failed. // FailAttempt marks the given payment attempt failed.
func (p *KVStore) FailAttempt(hash lntypes.Hash, func (p *KVStore) FailAttempt(_ context.Context, hash lntypes.Hash,
attemptID uint64, failInfo *HTLCFailInfo) (*MPPayment, error) { attemptID uint64, failInfo *HTLCFailInfo) (*MPPayment, error) {
var b bytes.Buffer var b bytes.Buffer
+1 -1
View File
@@ -100,7 +100,7 @@ func TestKVStoreDeleteNonInFlight(t *testing.T) {
// Fail the payment attempt. // Fail the payment attempt.
htlcFailure := HTLCFailUnreadable htlcFailure := HTLCFailUnreadable
_, err := paymentDB.FailAttempt( _, err := paymentDB.FailAttempt(
info.PaymentIdentifier, attempt.AttemptID, ctx, info.PaymentIdentifier, attempt.AttemptID,
&HTLCFailInfo{ &HTLCFailInfo{
Reason: htlcFailure, Reason: htlcFailure,
}, },
+6 -6
View File
@@ -156,7 +156,7 @@ func createTestPayments(t *testing.T, p DB, payments []*payment) {
htlcFailure := HTLCFailUnreadable htlcFailure := HTLCFailUnreadable
_, err = p.FailAttempt( _, err = p.FailAttempt(
info.PaymentIdentifier, attempt.AttemptID, ctx, info.PaymentIdentifier, attempt.AttemptID,
&HTLCFailInfo{ &HTLCFailInfo{
Reason: htlcFailure, Reason: htlcFailure,
}, },
@@ -183,7 +183,7 @@ func createTestPayments(t *testing.T, p DB, payments []*payment) {
case StatusFailed: case StatusFailed:
htlcFailure := HTLCFailUnreadable htlcFailure := HTLCFailUnreadable
_, err = p.FailAttempt( _, err = p.FailAttempt(
info.PaymentIdentifier, attempt.AttemptID, ctx, info.PaymentIdentifier, attempt.AttemptID,
&HTLCFailInfo{ &HTLCFailInfo{
Reason: htlcFailure, Reason: htlcFailure,
}, },
@@ -1885,7 +1885,7 @@ func TestSwitchFail(t *testing.T) {
htlcReason := HTLCFailUnreadable htlcReason := HTLCFailUnreadable
_, err = paymentDB.FailAttempt( _, err = paymentDB.FailAttempt(
info.PaymentIdentifier, attempt.AttemptID, ctx, info.PaymentIdentifier, attempt.AttemptID,
&HTLCFailInfo{ &HTLCFailInfo{
Reason: htlcReason, Reason: htlcReason,
}, },
@@ -2069,7 +2069,7 @@ func TestMultiShard(t *testing.T) {
a := attempts[1] a := attempts[1]
htlcFail := HTLCFailUnreadable htlcFail := HTLCFailUnreadable
_, err = paymentDB.FailAttempt( _, err = paymentDB.FailAttempt(
info.PaymentIdentifier, a.AttemptID, ctx, info.PaymentIdentifier, a.AttemptID,
&HTLCFailInfo{ &HTLCFailInfo{
Reason: htlcFail, Reason: htlcFail,
}, },
@@ -2118,7 +2118,7 @@ func TestMultiShard(t *testing.T) {
) )
} else { } else {
_, err := paymentDB.FailAttempt( _, err := paymentDB.FailAttempt(
info.PaymentIdentifier, a.AttemptID, ctx, info.PaymentIdentifier, a.AttemptID,
&HTLCFailInfo{ &HTLCFailInfo{
Reason: htlcFail, Reason: htlcFail,
}, },
@@ -2209,7 +2209,7 @@ func TestMultiShard(t *testing.T) {
} else { } else {
// Fail the attempt. // Fail the attempt.
_, err := paymentDB.FailAttempt( _, err := paymentDB.FailAttempt(
info.PaymentIdentifier, a.AttemptID, ctx, info.PaymentIdentifier, a.AttemptID,
&HTLCFailInfo{ &HTLCFailInfo{
Reason: htlcFail, Reason: htlcFail,
}, },
+1 -3
View File
@@ -1695,11 +1695,9 @@ func (s *SQLStore) SettleAttempt(ctx context.Context, paymentHash lntypes.Hash,
// the PaymentWriter interface and ultimately the DB interface. It represents // the PaymentWriter interface and ultimately the DB interface. It represents
// step 3b in the payment lifecycle control flow (step 3a is SettleAttempt), // step 3b in the payment lifecycle control flow (step 3a is SettleAttempt),
// called after RegisterAttempt when an HTLC fails. // called after RegisterAttempt when an HTLC fails.
func (s *SQLStore) FailAttempt(paymentHash lntypes.Hash, func (s *SQLStore) FailAttempt(ctx context.Context, paymentHash lntypes.Hash,
attemptID uint64, failInfo *HTLCFailInfo) (*MPPayment, error) { attemptID uint64, failInfo *HTLCFailInfo) (*MPPayment, error) {
ctx := context.TODO()
var mpPayment *MPPayment var mpPayment *MPPayment
err := s.db.ExecTx(ctx, sqldb.WriteTxOpt(), func(db SQLQueries) error { err := s.db.ExecTx(ctx, sqldb.WriteTxOpt(), func(db SQLQueries) error {
+6 -6
View File
@@ -50,8 +50,8 @@ type ControlTower interface {
// FailAttempt marks the given payment attempt failed. // FailAttempt marks the given payment attempt failed.
// //
// NOTE: Subscribers should be notified by the new state of the payment. // NOTE: Subscribers should be notified by the new state of the payment.
FailAttempt(lntypes.Hash, uint64, *paymentsdb.HTLCFailInfo) ( FailAttempt(context.Context, lntypes.Hash, uint64,
*paymentsdb.HTLCAttempt, error) *paymentsdb.HTLCFailInfo) (*paymentsdb.HTLCAttempt, error)
// FetchPayment fetches the payment corresponding to the given payment // FetchPayment fetches the payment corresponding to the given payment
// hash. // hash.
@@ -239,14 +239,14 @@ func (p *controlTower) SettleAttempt(ctx context.Context,
} }
// FailAttempt marks the given payment attempt failed. // FailAttempt marks the given payment attempt failed.
func (p *controlTower) FailAttempt(paymentHash lntypes.Hash, func (p *controlTower) FailAttempt(ctx context.Context,
attemptID uint64, failInfo *paymentsdb.HTLCFailInfo) ( paymentHash lntypes.Hash, attemptID uint64,
*paymentsdb.HTLCAttempt, error) { failInfo *paymentsdb.HTLCFailInfo) (*paymentsdb.HTLCAttempt, error) {
p.paymentsMtx.Lock(paymentHash) p.paymentsMtx.Lock(paymentHash)
defer p.paymentsMtx.Unlock(paymentHash) defer p.paymentsMtx.Unlock(paymentHash)
payment, err := p.db.FailAttempt(paymentHash, attemptID, failInfo) payment, err := p.db.FailAttempt(ctx, paymentHash, attemptID, failInfo)
if err != nil { if err != nil {
return nil, err return nil, err
} }
+4 -2
View File
@@ -448,7 +448,8 @@ func TestKVStoreUnsubscribeSuccess(t *testing.T) {
Reason: paymentsdb.HTLCFailInternal, Reason: paymentsdb.HTLCFailInternal,
} }
_, err = pControl.FailAttempt( _, err = pControl.FailAttempt(
info.PaymentIdentifier, attempt.AttemptID, &failInfo, t.Context(), info.PaymentIdentifier, attempt.AttemptID,
&failInfo,
) )
require.NoError(t, err, "unable to fail htlc") require.NoError(t, err, "unable to fail htlc")
@@ -502,7 +503,8 @@ func testKVStoreSubscribeFail(t *testing.T, registerAttempt,
Reason: paymentsdb.HTLCFailInternal, Reason: paymentsdb.HTLCFailInternal,
} }
htlcAttempt, err := pControl.FailAttempt( htlcAttempt, err := pControl.FailAttempt(
info.PaymentIdentifier, attempt.AttemptID, &failInfo, t.Context(), info.PaymentIdentifier, attempt.AttemptID,
&failInfo,
) )
if err != nil { if err != nil {
t.Fatalf("unable to fail htlc: %v", err) t.Fatalf("unable to fail htlc: %v", err)
+6 -4
View File
@@ -451,8 +451,9 @@ func (m *mockControlTowerOld) SettleAttempt(_ context.Context,
return nil, fmt.Errorf("pid not found") return nil, fmt.Errorf("pid not found")
} }
func (m *mockControlTowerOld) FailAttempt(phash lntypes.Hash, pid uint64, func (m *mockControlTowerOld) FailAttempt(_ context.Context, phash lntypes.Hash,
failInfo *paymentsdb.HTLCFailInfo) (*paymentsdb.HTLCAttempt, error) { pid uint64, failInfo *paymentsdb.HTLCFailInfo) (*paymentsdb.HTLCAttempt,
error) {
if m.failAttempt != nil { if m.failAttempt != nil {
m.failAttempt <- failAttemptArgs{failInfo} m.failAttempt <- failAttemptArgs{failInfo}
@@ -767,8 +768,9 @@ func (m *mockControlTower) SettleAttempt(_ context.Context, phash lntypes.Hash,
return attempt.(*paymentsdb.HTLCAttempt), args.Error(1) return attempt.(*paymentsdb.HTLCAttempt), args.Error(1)
} }
func (m *mockControlTower) FailAttempt(phash lntypes.Hash, pid uint64, func (m *mockControlTower) FailAttempt(_ context.Context, phash lntypes.Hash,
failInfo *paymentsdb.HTLCFailInfo) (*paymentsdb.HTLCAttempt, error) { pid uint64, failInfo *paymentsdb.HTLCFailInfo) (*paymentsdb.HTLCAttempt,
error) {
args := m.Called(phash, pid, failInfo) args := m.Called(phash, pid, failInfo)
+3 -1
View File
@@ -1003,6 +1003,8 @@ func (p *paymentLifecycle) handleFailureMessage(rt *route.Route,
func (p *paymentLifecycle) failAttempt(attemptID uint64, func (p *paymentLifecycle) failAttempt(attemptID uint64,
sendError error) (*attemptResult, error) { sendError error) (*attemptResult, error) {
ctx := context.TODO()
log.Warnf("Attempt %v for payment %v failed: %v", attemptID, log.Warnf("Attempt %v for payment %v failed: %v", attemptID,
p.identifier, sendError) p.identifier, sendError)
@@ -1019,7 +1021,7 @@ func (p *paymentLifecycle) failAttempt(attemptID uint64,
} }
attempt, err := p.router.cfg.Control.FailAttempt( attempt, err := p.router.cfg.Control.FailAttempt(
p.identifier, attemptID, failInfo, ctx, p.identifier, attemptID, failInfo,
) )
if err != nil { if err != nil {
return nil, err return nil, err
+3 -1
View File
@@ -1531,6 +1531,8 @@ func (r *ChannelRouter) resumePayments() error {
func (r *ChannelRouter) failStaleAttempt(a paymentsdb.HTLCAttempt, func (r *ChannelRouter) failStaleAttempt(a paymentsdb.HTLCAttempt,
payHash lntypes.Hash) { payHash lntypes.Hash) {
ctx := context.TODO()
// We can only fail inflight HTLCs so we skip the settled/failed ones. // We can only fail inflight HTLCs so we skip the settled/failed ones.
if a.Failure != nil || a.Settle != nil { if a.Failure != nil || a.Settle != nil {
return return
@@ -1614,7 +1616,7 @@ func (r *ChannelRouter) failStaleAttempt(a paymentsdb.HTLCAttempt,
Reason: paymentsdb.HTLCFailUnknown, Reason: paymentsdb.HTLCFailUnknown,
FailTime: r.cfg.Clock.Now(), FailTime: r.cfg.Clock.Now(),
} }
_, err = r.cfg.Control.FailAttempt(payHash, a.AttemptID, failInfo) _, err = r.cfg.Control.FailAttempt(ctx, payHash, a.AttemptID, failInfo)
if err != nil { if err != nil {
log.Errorf("Fail attempt=%v got error: %v", a.AttemptID, err) log.Errorf("Fail attempt=%v got error: %v", a.AttemptID, err)
} }