diff --git a/lnrpc/routerrpc/router_server.go b/lnrpc/routerrpc/router_server.go index 5414f9e60..fd3f5e6cf 100644 --- a/lnrpc/routerrpc/router_server.go +++ b/lnrpc/routerrpc/router_server.go @@ -347,30 +347,13 @@ func (s *Server) SendPaymentV2(req *SendPaymentRequest, return err } - // Send the payment. - err = s.cfg.Router.SendPaymentAsync(payment, paySession, shardTracker) - if err == nil { - // If the payment was sent successfully, we can start tracking - // the events. - return s.trackPayment( - sub, payHash, stream, req.NoInflightUpdates, - ) - } + // Send the payment asynchronously. + s.cfg.Router.SendPaymentAsync(payment, paySession, shardTracker) - // Otherwise, transform user errors to grpc code. - if errors.Is(err, channeldb.ErrPaymentInFlight) || - errors.Is(err, channeldb.ErrAlreadyPaid) { - - log.Debugf("SendPayment async result for payment %x: %v", - payment.Identifier(), err) - - return status.Error(codes.AlreadyExists, err.Error()) - } - - log.Errorf("SendPayment async error for payment %x: %v", - payment.Identifier(), err) - - return err + // Track the payment and return. + return s.trackPayment( + sub, payHash, stream, req.NoInflightUpdates, + ) } // EstimateRouteFee allows callers to obtain a lower bound w.r.t how much it @@ -889,10 +872,17 @@ func (s *Server) trackPayment(subscription routing.ControlTowerSubscriber, stream.Context(), subscription, noInflightUpdates, stream.Send, ) + // If the context is canceled, we don't return an error. if errors.Is(err, context.Canceled) { - log.Debugf("Payment stream %v canceled", identifier) + log.Infof("Payment stream %v canceled", identifier) + + return nil } + // Otherwise, we will log and return the error as the stream has + // received an error from the payment lifecycle. + log.Errorf("TrackPayment got error for payment %x: %v", identifier, err) + return err } diff --git a/routing/router.go b/routing/router.go index 80f647807..d67535c24 100644 --- a/routing/router.go +++ b/routing/router.go @@ -2386,7 +2386,7 @@ func (r *ChannelRouter) SendPayment(payment *LightningPayment) ([32]byte, // SendPaymentAsync is the non-blocking version of SendPayment. The payment // result needs to be retrieved via the control tower. func (r *ChannelRouter) SendPaymentAsync(payment *LightningPayment, - ps PaymentSession, st shards.ShardTracker) error { + ps PaymentSession, st shards.ShardTracker) { // Since this is the first time this payment is being made, we pass nil // for the existing attempt. @@ -2406,8 +2406,6 @@ func (r *ChannelRouter) SendPaymentAsync(payment *LightningPayment, payment.Identifier(), err) } }() - - return nil } // spewPayment returns a log closures that provides a spewed string