diff --git a/payments/db/interface.go b/payments/db/interface.go index caf222b7a..c6f1bf353 100644 --- a/payments/db/interface.go +++ b/payments/db/interface.go @@ -36,7 +36,8 @@ type PaymentWriter interface { // DeletePayments deletes all payments from the DB given the specified // flags. - DeletePayments(failedOnly, failedAttemptsOnly bool) (int, error) + DeletePayments(ctx context.Context, failedOnly, + failedAttemptsOnly bool) (int, error) PaymentControl } diff --git a/payments/db/kv_store.go b/payments/db/kv_store.go index 138edb6fc..d3d347afe 100644 --- a/payments/db/kv_store.go +++ b/payments/db/kv_store.go @@ -1372,7 +1372,7 @@ func (p *KVStore) DeletePayment(_ context.Context, paymentHash lntypes.Hash, // failedHtlcsOnly is set, the payment itself won't be deleted, only failed HTLC // attempts. The method returns the number of deleted payments, which is always // 0 if failedHtlcsOnly is set. -func (p *KVStore) DeletePayments(failedOnly, +func (p *KVStore) DeletePayments(_ context.Context, failedOnly, failedHtlcsOnly bool) (int, error) { var numPayments int diff --git a/payments/db/kv_store_test.go b/payments/db/kv_store_test.go index f0c2b148f..cf5a9a9a0 100644 --- a/payments/db/kv_store_test.go +++ b/payments/db/kv_store_test.go @@ -30,6 +30,8 @@ import ( func TestKVStoreDeleteNonInFlight(t *testing.T) { t.Parallel() + ctx := t.Context() + paymentDB := NewKVTestDB(t) // Create a sequence number for duplicate payments that will not collide @@ -180,7 +182,7 @@ func TestKVStoreDeleteNonInFlight(t *testing.T) { } // Delete all failed payments. - numPayments, err := paymentDB.DeletePayments(true, false) + numPayments, err := paymentDB.DeletePayments(ctx, true, false) require.NoError(t, err) require.EqualValues(t, 1, numPayments) @@ -216,7 +218,7 @@ func TestKVStoreDeleteNonInFlight(t *testing.T) { } // Now delete all payments except in-flight. - numPayments, err = paymentDB.DeletePayments(false, false) + numPayments, err = paymentDB.DeletePayments(ctx, false, false) require.NoError(t, err) require.EqualValues(t, 2, numPayments) diff --git a/payments/db/payment_test.go b/payments/db/payment_test.go index 1180cf953..4a9a69b0c 100644 --- a/payments/db/payment_test.go +++ b/payments/db/payment_test.go @@ -1658,6 +1658,8 @@ func TestFailsWithoutInFlight(t *testing.T) { func TestDeletePayments(t *testing.T) { t.Parallel() + ctx := t.Context() + paymentDB, _ := NewTestDB(t) // Register three payments: @@ -1678,7 +1680,7 @@ func TestDeletePayments(t *testing.T) { assertDBPayments(t, paymentDB, payments) // Delete HTLC attempts for failed payments only. - numPayments, err := paymentDB.DeletePayments(true, true) + numPayments, err := paymentDB.DeletePayments(ctx, true, true) require.NoError(t, err) require.EqualValues(t, 0, numPayments) @@ -1687,7 +1689,7 @@ func TestDeletePayments(t *testing.T) { assertDBPayments(t, paymentDB, payments) // Delete failed attempts for all payments. - numPayments, err = paymentDB.DeletePayments(false, true) + numPayments, err = paymentDB.DeletePayments(ctx, false, true) require.NoError(t, err) require.EqualValues(t, 0, numPayments) @@ -1697,14 +1699,14 @@ func TestDeletePayments(t *testing.T) { assertDBPayments(t, paymentDB, payments) // Now delete all failed payments. - numPayments, err = paymentDB.DeletePayments(true, false) + numPayments, err = paymentDB.DeletePayments(ctx, true, false) require.NoError(t, err) require.EqualValues(t, 1, numPayments) assertDBPayments(t, paymentDB, payments[1:]) // Finally delete all completed payments. - numPayments, err = paymentDB.DeletePayments(false, false) + numPayments, err = paymentDB.DeletePayments(ctx, false, false) require.NoError(t, err) require.EqualValues(t, 1, numPayments) diff --git a/payments/db/sql_store.go b/payments/db/sql_store.go index f6f5d0d37..ef0d96c93 100644 --- a/payments/db/sql_store.go +++ b/payments/db/sql_store.go @@ -1874,13 +1874,13 @@ func (s *SQLStore) Fail(paymentHash lntypes.Hash, // This method is part of the PaymentWriter interface, which is embedded in // the DB interface. // -// TODO(ziggie): batch this call instead in the background so for dbs with -// many payments it doesn't block the main thread. -func (s *SQLStore) DeletePayments(failedOnly, failedHtlcsOnly bool) (int, - error) { +// TODO(ziggie): batch and use iterator instead, moreover we dont need to fetch +// the complete payment data for each payment, we can just fetch the payment ID +// and the resolution types to decide if the payment is removable. +func (s *SQLStore) DeletePayments(ctx context.Context, failedOnly, + failedHtlcsOnly bool) (int, error) { var numPayments int - ctx := context.TODO() extractCursor := func(row sqlc.FilterPaymentsRow) int64 { return row.Payment.ID diff --git a/rpcserver.go b/rpcserver.go index df27c41ce..2f88b2db8 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -7782,7 +7782,7 @@ func (r *rpcServer) DeleteAllPayments(ctx context.Context, req.FailedHtlcsOnly) numDeletedPayments, err := r.server.paymentsDB.DeletePayments( - req.FailedPaymentsOnly, req.FailedHtlcsOnly, + ctx, req.FailedPaymentsOnly, req.FailedHtlcsOnly, ) if err != nil { return nil, err