From b998ce11f18ab9f43575fc83d1193e9312105306 Mon Sep 17 00:00:00 2001 From: yyforyongyu Date: Thu, 16 Nov 2023 20:53:19 +0800 Subject: [PATCH] routing+htlcswitch: add new interface method `HasAttemptResult` --- htlcswitch/switch.go | 15 +++++++++++++++ routing/mock_test.go | 17 +++++++++++++++++ routing/router.go | 10 ++++++++++ 3 files changed, 42 insertions(+) diff --git a/htlcswitch/switch.go b/htlcswitch/switch.go index 1ac8f93a5..0cd3d7c3d 100644 --- a/htlcswitch/switch.go +++ b/htlcswitch/switch.go @@ -431,6 +431,21 @@ func (s *Switch) ProcessContractResolution(msg contractcourt.ResolutionMsg) erro } } +// HasAttemptResult reads the network result store to fetch the specified +// attempt. Returns true if the attempt result exists. +func (s *Switch) HasAttemptResult(attemptID uint64) (bool, error) { + _, err := s.networkResults.getResult(attemptID) + if err == nil { + return true, nil + } + + if !errors.Is(err, ErrPaymentIDNotFound) { + return false, err + } + + return false, nil +} + // GetAttemptResult returns the result of the HTLC attempt with the given // attemptID. The paymentHash should be set to the payment's overall hash, or // in case of AMP payments the payment's unique identifier. diff --git a/routing/mock_test.go b/routing/mock_test.go index f712c420d..306c18210 100644 --- a/routing/mock_test.go +++ b/routing/mock_test.go @@ -60,6 +60,12 @@ func (m *mockPaymentAttemptDispatcherOld) SendHTLC( return nil } +func (m *mockPaymentAttemptDispatcherOld) HasAttemptResult( + attemptID uint64) (bool, error) { + + return false, nil +} + func (m *mockPaymentAttemptDispatcherOld) GetAttemptResult(paymentID uint64, _ lntypes.Hash, _ htlcswitch.ErrorDecrypter) ( <-chan *htlcswitch.PaymentResult, error) { @@ -209,6 +215,10 @@ func (m *mockPayerOld) SendHTLC(_ lnwire.ShortChannelID, } +func (m *mockPayerOld) HasAttemptResult(attemptID uint64) (bool, error) { + return false, nil +} + func (m *mockPayerOld) GetAttemptResult(paymentID uint64, _ lntypes.Hash, _ htlcswitch.ErrorDecrypter) (<-chan *htlcswitch.PaymentResult, error) { @@ -585,6 +595,13 @@ func (m *mockPaymentAttemptDispatcher) SendHTLC(firstHop lnwire.ShortChannelID, return args.Error(0) } +func (m *mockPaymentAttemptDispatcher) HasAttemptResult( + attemptID uint64) (bool, error) { + + args := m.Called(attemptID) + return args.Bool(0), args.Error(1) +} + func (m *mockPaymentAttemptDispatcher) GetAttemptResult(attemptID uint64, paymentHash lntypes.Hash, deobfuscator htlcswitch.ErrorDecrypter) ( <-chan *htlcswitch.PaymentResult, error) { diff --git a/routing/router.go b/routing/router.go index e5c55e609..c12198277 100644 --- a/routing/router.go +++ b/routing/router.go @@ -135,6 +135,16 @@ type PaymentAttemptDispatcher interface { // NOTE: New payment attempts MUST NOT be made after the keepPids map // has been created and this method has returned. CleanStore(keepPids map[uint64]struct{}) error + + // HasAttemptResult reads the network result store to fetch the + // specified attempt. Returns true if the attempt result exists. + // + // NOTE: This method is used and should only be used by the router to + // resume payments during startup. It can be viewed as a subset of + // `GetAttemptResult` in terms of its functionality, and can be removed + // once we move the construction of `UpdateAddHTLC` and + // `ErrorDecrypter` into `htlcswitch`. + HasAttemptResult(attemptID uint64) (bool, error) } // PaymentSessionSource is an interface that defines a source for the router to