From 4509c4f3a9430074b8daabdd5b99510159c28760 Mon Sep 17 00:00:00 2001 From: "Johan T. Halseth" Date: Wed, 1 Apr 2020 00:13:24 +0200 Subject: [PATCH] routing: move ErrMaxRouteHopsExceeded check Now that SendToRoute is no longer using the payment lifecycle, we move the max hop check out of the payment shard's launch() method, and return the error directly, such that it can be handled in SendToRoute. --- routing/payment_lifecycle.go | 18 ------------------ routing/router.go | 26 ++++++++++++++++++++++---- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/routing/payment_lifecycle.go b/routing/payment_lifecycle.go index 40089479..802a80b2 100644 --- a/routing/payment_lifecycle.go +++ b/routing/payment_lifecycle.go @@ -139,24 +139,6 @@ func (p *paymentLifecycle) resumePayment() ([32]byte, *route.Route, error) { // With the route in hand, launch a new shard. var outcome *launchOutcome attempt, outcome, err = shardHandler.launchShard(rt) - - // With SendToRoute, it can happen that the route exceeds protocol - // constraints. Mark the payment as failed with an internal error. - if err == route.ErrMaxRouteHopsExceeded || - err == sphinx.ErrMaxRoutingInfoSizeExceeded { - - log.Debugf("Invalid route provided for payment %x: %v", - p.paymentHash, err) - - controlErr := p.router.cfg.Control.Fail( - p.paymentHash, channeldb.FailureReasonError, - ) - if controlErr != nil { - return [32]byte{}, nil, controlErr - } - } - - // In any case, don't continue if there is an error. if err != nil { return [32]byte{}, nil, err } diff --git a/routing/router.go b/routing/router.go index 2ceefe94..7f860c89 100644 --- a/routing/router.go +++ b/routing/router.go @@ -1731,11 +1731,11 @@ func (r *ChannelRouter) preparePayment(payment *LightningPayment) ( // SendToRoute attempts to send a payment with the given hash through the // provided route. This function is blocking and will return the obtained // preimage if the payment is successful or the full error in case of a failure. -func (r *ChannelRouter) SendToRoute(hash lntypes.Hash, route *route.Route) ( +func (r *ChannelRouter) SendToRoute(hash lntypes.Hash, rt *route.Route) ( lntypes.Preimage, error) { // Calculate amount paid to receiver. - amt := route.ReceiverAmt() + amt := rt.ReceiverAmt() // Record this payment hash with the ControlTower, ensuring it is not // already in-flight. @@ -1753,7 +1753,7 @@ func (r *ChannelRouter) SendToRoute(hash lntypes.Hash, route *route.Route) ( log.Tracef("Dispatching SendToRoute for hash %v: %v", hash, newLogClosure(func() string { - return spew.Sdump(route) + return spew.Sdump(rt) }), ) @@ -1764,7 +1764,25 @@ func (r *ChannelRouter) SendToRoute(hash lntypes.Hash, route *route.Route) ( } var shardError error - attempt, outcome, err := sh.launchShard(route) + attempt, outcome, err := sh.launchShard(rt) + + // With SendToRoute, it can happen that the route exceeds protocol + // constraints. Mark the payment as failed with an internal error. + if err == route.ErrMaxRouteHopsExceeded || + err == sphinx.ErrMaxRoutingInfoSizeExceeded { + + log.Debugf("Invalid route provided for payment %x: %v", + hash, err) + + controlErr := r.cfg.Control.Fail( + hash, channeldb.FailureReasonError, + ) + if controlErr != nil { + return [32]byte{}, controlErr + } + } + + // In any case, don't continue if there is an error. if err != nil { return lntypes.Preimage{}, err }