routing: map insufficient local bandwidth error to no path

With mpp it isn't possible anymore for findPath to determine that there
isn't enough local bandwidth. The full payment amount isn't known at
that point.

In a follow-up, this payment outcome can be reintroduced on a higher
level (payment lifecycle).
This commit is contained in:
Joost Jager 2020-03-25 14:59:08 +01:00
parent 3ad7ab223e
commit cb4cd49dc8
No known key found for this signature in database
GPG Key ID: A61B9D4C393C59C7
4 changed files with 4 additions and 42 deletions

@ -116,6 +116,9 @@ const (
// FailureReasonInsufficientBalance indicates that we didn't have enough // FailureReasonInsufficientBalance indicates that we didn't have enough
// balance to complete the payment. // balance to complete the payment.
//
// This reason isn't assigned anymore, but may still exist for older
// payments.
FailureReasonInsufficientBalance FailureReason = 4 FailureReasonInsufficientBalance FailureReason = 4
// TODO(halseth): cancel state. // TODO(halseth): cancel state.

@ -478,7 +478,7 @@ func findPathInternal(
return nil, err return nil, err
} }
if max < amt { if max < amt {
return nil, errInsufficientBalance return nil, errNoPathFound
} }
} }

@ -2809,37 +2809,6 @@ func TestRouteToSelf(t *testing.T) {
ctx.assertPath(path, []uint64{1, 3, 2}) ctx.assertPath(path, []uint64{1, 3, 2})
} }
// TestInsufficientBalance tests that a dedicated error is returned for
// insufficient local balance.
func TestInsufficientBalance(t *testing.T) {
t.Parallel()
testChannels := []*testChannel{
symmetricTestChannel("source", "target", 100000, &testChannelPolicy{
Expiry: 144,
FeeBaseMsat: 500,
}, 1),
}
ctx := newPathFindingTestContext(t, testChannels, "source")
defer ctx.cleanup()
paymentAmt := lnwire.NewMSatFromSatoshis(100)
target := ctx.keyFromAlias("target")
ctx.graphParams.bandwidthHints = map[uint64]lnwire.MilliSatoshi{
1: lnwire.NewMSatFromSatoshis(50),
}
// Find the best path to self. We expect this to be source->a->source,
// because a charges the lowest forwarding fee.
_, err := ctx.findPath(target, paymentAmt)
if err != errInsufficientBalance {
t.Fatalf("expected insufficient balance error, but got: %v",
err)
}
}
type pathFindingTestContext struct { type pathFindingTestContext struct {
t *testing.T t *testing.T
graphParams graphParams graphParams graphParams

@ -26,10 +26,6 @@ const (
// not exist in the graph. // not exist in the graph.
errNoPathFound errNoPathFound
// errInsufficientLocalBalance is returned when none of the local
// channels have enough balance for the payment.
errInsufficientBalance
// errEmptyPaySession is returned when the empty payment session is // errEmptyPaySession is returned when the empty payment session is
// queried for a route. // queried for a route.
errEmptyPaySession errEmptyPaySession
@ -50,9 +46,6 @@ func (e noRouteError) Error() string {
case errEmptyPaySession: case errEmptyPaySession:
return "empty payment session" return "empty payment session"
case errInsufficientBalance:
return "insufficient local balance"
default: default:
return "unknown no-route error" return "unknown no-route error"
} }
@ -69,9 +62,6 @@ func (e noRouteError) FailureReason() channeldb.FailureReason {
return channeldb.FailureReasonNoRoute return channeldb.FailureReasonNoRoute
case errInsufficientBalance:
return channeldb.FailureReasonInsufficientBalance
default: default:
return channeldb.FailureReasonError return channeldb.FailureReasonError
} }