routing: convert to nillable failure reason
This commit converts several functions from returning a bool and a failure reason to a nillable failure reason as return parameter. This will take away confusion about the interpretation of the two separate values.
This commit is contained in:
parent
d134e0362e
commit
e7af6a077a
@ -420,12 +420,11 @@ func (m *MissionControl) GetHistorySnapshot() *MissionControlSnapshot {
|
|||||||
// ReportPaymentFail reports a failed payment to mission control as input for
|
// ReportPaymentFail reports a failed payment to mission control as input for
|
||||||
// future probability estimates. The failureSourceIdx argument indicates the
|
// future probability estimates. The failureSourceIdx argument indicates the
|
||||||
// failure source. If it is nil, the failure source is unknown. This function
|
// failure source. If it is nil, the failure source is unknown. This function
|
||||||
// returns a bool indicating whether this error is a final error. If it is
|
// returns a reason if this failure is a final failure. In that case no further
|
||||||
// final, a failure reason is returned and no further payment attempts need to
|
// payment attempts need to be made.
|
||||||
// be made.
|
|
||||||
func (m *MissionControl) ReportPaymentFail(paymentID uint64, rt *route.Route,
|
func (m *MissionControl) ReportPaymentFail(paymentID uint64, rt *route.Route,
|
||||||
failureSourceIdx *int, failure lnwire.FailureMessage) (bool,
|
failureSourceIdx *int, failure lnwire.FailureMessage) (
|
||||||
channeldb.FailureReason, error) {
|
*channeldb.FailureReason, error) {
|
||||||
|
|
||||||
timestamp := m.now()
|
timestamp := m.now()
|
||||||
|
|
||||||
@ -442,13 +441,18 @@ func (m *MissionControl) ReportPaymentFail(paymentID uint64, rt *route.Route,
|
|||||||
|
|
||||||
// Store complete result in database.
|
// Store complete result in database.
|
||||||
if err := m.store.AddResult(result); err != nil {
|
if err := m.store.AddResult(result); err != nil {
|
||||||
return false, 0, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply result to update mission control state.
|
// Apply result to update mission control state.
|
||||||
final, reason := m.applyPaymentResult(result)
|
final, reason := m.applyPaymentResult(result)
|
||||||
|
|
||||||
return final, reason, nil
|
// Convert final bool and reason to nillable reason.
|
||||||
|
if final {
|
||||||
|
return &reason, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// applyPaymentResult applies a payment result as input for future probability
|
// applyPaymentResult applies a payment result as input for future probability
|
||||||
|
@ -98,11 +98,11 @@ type mockMissionControl struct {
|
|||||||
|
|
||||||
var _ MissionController = (*mockMissionControl)(nil)
|
var _ MissionController = (*mockMissionControl)(nil)
|
||||||
|
|
||||||
func (m *mockMissionControl) ReportPaymentFail(paymentID uint64,
|
func (m *mockMissionControl) ReportPaymentFail(paymentID uint64, rt *route.Route,
|
||||||
rt *route.Route, failureSourceIdx *int, failure lnwire.FailureMessage) (
|
failureSourceIdx *int, failure lnwire.FailureMessage) (
|
||||||
bool, channeldb.FailureReason, error) {
|
*channeldb.FailureReason, error) {
|
||||||
|
|
||||||
return false, 0, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *mockMissionControl) GetProbability(fromNode, toNode route.Vertex,
|
func (m *mockMissionControl) GetProbability(fromNode, toNode route.Vertex,
|
||||||
|
@ -342,10 +342,10 @@ func (p *paymentLifecycle) sendPaymentAttempt(firstHop lnwire.ShortChannelID,
|
|||||||
// whether we should make another payment attempt.
|
// whether we should make another payment attempt.
|
||||||
func (p *paymentLifecycle) handleSendError(sendErr error) error {
|
func (p *paymentLifecycle) handleSendError(sendErr error) error {
|
||||||
|
|
||||||
final, reason := p.router.processSendError(
|
reason := p.router.processSendError(
|
||||||
p.attempt.PaymentID, &p.attempt.Route, sendErr,
|
p.attempt.PaymentID, &p.attempt.Route, sendErr,
|
||||||
)
|
)
|
||||||
if !final {
|
if reason == nil {
|
||||||
// Save the forwarding error so it can be returned if
|
// Save the forwarding error so it can be returned if
|
||||||
// this turns out to be the last attempt.
|
// this turns out to be the last attempt.
|
||||||
p.lastError = sendErr
|
p.lastError = sendErr
|
||||||
@ -354,14 +354,14 @@ func (p *paymentLifecycle) handleSendError(sendErr error) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
log.Debugf("Payment %x failed: final_outcome=%v, raw_err=%v",
|
log.Debugf("Payment %x failed: final_outcome=%v, raw_err=%v",
|
||||||
p.payment.PaymentHash, reason, sendErr)
|
p.payment.PaymentHash, *reason, sendErr)
|
||||||
|
|
||||||
// Mark the payment failed with no route.
|
// Mark the payment failed with no route.
|
||||||
//
|
//
|
||||||
// TODO(halseth): make payment codes for the actual reason we don't
|
// TODO(halseth): make payment codes for the actual reason we don't
|
||||||
// continue path finding.
|
// continue path finding.
|
||||||
err := p.router.cfg.Control.Fail(
|
err := p.router.cfg.Control.Fail(
|
||||||
p.payment.PaymentHash, reason,
|
p.payment.PaymentHash, *reason,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -179,8 +179,8 @@ type MissionController interface {
|
|||||||
// whether this error is a final error and no further payment attempts
|
// whether this error is a final error and no further payment attempts
|
||||||
// need to be made.
|
// need to be made.
|
||||||
ReportPaymentFail(paymentID uint64, rt *route.Route,
|
ReportPaymentFail(paymentID uint64, rt *route.Route,
|
||||||
failureSourceIdx *int, failure lnwire.FailureMessage) (bool,
|
failureSourceIdx *int, failure lnwire.FailureMessage) (
|
||||||
channeldb.FailureReason, error)
|
*channeldb.FailureReason, error)
|
||||||
|
|
||||||
// GetProbability is expected to return the success probability of a
|
// GetProbability is expected to return the success probability of a
|
||||||
// payment from fromNode along edge.
|
// payment from fromNode along edge.
|
||||||
@ -1887,23 +1887,25 @@ func (r *ChannelRouter) tryApplyChannelUpdate(rt *route.Route,
|
|||||||
// to continue with an alternative route. This is indicated by the boolean
|
// to continue with an alternative route. This is indicated by the boolean
|
||||||
// return value.
|
// return value.
|
||||||
func (r *ChannelRouter) processSendError(paymentID uint64, rt *route.Route,
|
func (r *ChannelRouter) processSendError(paymentID uint64, rt *route.Route,
|
||||||
sendErr error) (bool, channeldb.FailureReason) {
|
sendErr error) *channeldb.FailureReason {
|
||||||
|
|
||||||
reportFail := func(srcIdx *int, msg lnwire.FailureMessage) (bool,
|
internalErrorReason := channeldb.FailureReasonError
|
||||||
channeldb.FailureReason) {
|
|
||||||
|
reportFail := func(srcIdx *int,
|
||||||
|
msg lnwire.FailureMessage) *channeldb.FailureReason {
|
||||||
|
|
||||||
// Report outcome to mission control.
|
// Report outcome to mission control.
|
||||||
final, reason, err := r.cfg.MissionControl.ReportPaymentFail(
|
reason, err := r.cfg.MissionControl.ReportPaymentFail(
|
||||||
paymentID, rt, srcIdx, msg,
|
paymentID, rt, srcIdx, msg,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("Error reporting payment result to mc: %v",
|
log.Errorf("Error reporting payment result to mc: %v",
|
||||||
err)
|
err)
|
||||||
|
|
||||||
return true, channeldb.FailureReasonError
|
return &internalErrorReason
|
||||||
}
|
}
|
||||||
|
|
||||||
return final, reason
|
return reason
|
||||||
}
|
}
|
||||||
|
|
||||||
if sendErr == htlcswitch.ErrUnreadableFailureMessage {
|
if sendErr == htlcswitch.ErrUnreadableFailureMessage {
|
||||||
@ -1915,7 +1917,7 @@ func (r *ChannelRouter) processSendError(paymentID uint64, rt *route.Route,
|
|||||||
// trying.
|
// trying.
|
||||||
fErr, ok := sendErr.(*htlcswitch.ForwardingError)
|
fErr, ok := sendErr.(*htlcswitch.ForwardingError)
|
||||||
if !ok {
|
if !ok {
|
||||||
return true, channeldb.FailureReasonError
|
return &internalErrorReason
|
||||||
}
|
}
|
||||||
|
|
||||||
failureMessage := fErr.FailureMessage
|
failureMessage := fErr.FailureMessage
|
||||||
@ -1928,7 +1930,7 @@ func (r *ChannelRouter) processSendError(paymentID uint64, rt *route.Route,
|
|||||||
rt, failureSourceIdx, failureMessage,
|
rt, failureSourceIdx, failureMessage,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return true, channeldb.FailureReasonError
|
return &internalErrorReason
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user