diff --git a/channeldb/payment_control.go b/channeldb/payment_control.go index b6bcd5a1..72c5c199 100644 --- a/channeldb/payment_control.go +++ b/channeldb/payment_control.go @@ -76,7 +76,10 @@ func (p *PaymentControl) InitPayment(paymentHash lntypes.Hash, } // Get the existing status of this payment, if any. - paymentStatus := fetchPaymentStatus(bucket) + paymentStatus, err := fetchPaymentStatus(bucket) + if err != nil { + return err + } switch paymentStatus { @@ -358,27 +361,30 @@ func nextPaymentSequence(tx *bbolt.Tx) ([]byte, error) { // fetchPaymentStatus fetches the payment status of the payment. If the payment // isn't found, it will default to "StatusUnknown". -func fetchPaymentStatus(bucket *bbolt.Bucket) PaymentStatus { +func fetchPaymentStatus(bucket *bbolt.Bucket) (PaymentStatus, error) { if bucket.Get(paymentSettleInfoKey) != nil { - return StatusSucceeded + return StatusSucceeded, nil } if bucket.Get(paymentFailInfoKey) != nil { - return StatusFailed + return StatusFailed, nil } if bucket.Get(paymentCreationInfoKey) != nil { - return StatusInFlight + return StatusInFlight, nil } - return StatusUnknown + return StatusUnknown, nil } // ensureInFlight checks whether the payment found in the given bucket has // status InFlight, and returns an error otherwise. This should be used to // ensure we only mark in-flight payments as succeeded or failed. func ensureInFlight(bucket *bbolt.Bucket) error { - paymentStatus := fetchPaymentStatus(bucket) + paymentStatus, err := fetchPaymentStatus(bucket) + if err != nil { + return err + } switch { @@ -443,15 +449,16 @@ func (p *PaymentControl) FetchInFlightPayments() ([]*InFlightPayment, error) { } // If the status is not InFlight, we can return early. - paymentStatus := fetchPaymentStatus(bucket) + paymentStatus, err := fetchPaymentStatus(bucket) + if err != nil { + return err + } + if paymentStatus != StatusInFlight { return nil } - var ( - inFlight = &InFlightPayment{} - err error - ) + inFlight := &InFlightPayment{} // Get the CreationInfo. b := bucket.Get(paymentCreationInfoKey) diff --git a/channeldb/payments.go b/channeldb/payments.go index 64f4f1c7..fc5e38bc 100644 --- a/channeldb/payments.go +++ b/channeldb/payments.go @@ -337,7 +337,10 @@ func fetchPayment(bucket *bbolt.Bucket) (*MPPayment, error) { p.sequenceNum = binary.BigEndian.Uint64(seqBytes) // Get the payment status. - p.Status = fetchPaymentStatus(bucket) + p.Status, err = fetchPaymentStatus(bucket) + if err != nil { + return nil, err + } // Get the PaymentCreationInfo. b := bucket.Get(paymentCreationInfoKey) @@ -401,7 +404,11 @@ func (db *DB) DeletePayments() error { // If the status is InFlight, we cannot safely delete // the payment information, so we return early. - paymentStatus := fetchPaymentStatus(bucket) + paymentStatus, err := fetchPaymentStatus(bucket) + if err != nil { + return err + } + if paymentStatus == StatusInFlight { return nil }