mirror of
https://github.com/lightningnetwork/lnd.git
synced 2025-06-02 11:09:38 +02:00
routing: add error case for zero capacity
Since no edge should have a zero capacity associated with it, passing a zero capacity to the bimodal probability calculation results now in an error.
This commit is contained in:
parent
7df1482cfc
commit
4aa90cf474
@ -459,6 +459,10 @@ in the lnwire package](https://github.com/lightningnetwork/lnd/pull/7303)
|
|||||||
https://github.com/lightningnetwork/lnd/pull/6815)
|
https://github.com/lightningnetwork/lnd/pull/6815)
|
||||||
* [The a priori capacity factor is made configurable and its effect is
|
* [The a priori capacity factor is made configurable and its effect is
|
||||||
limited.](https://github.com/lightningnetwork/lnd/pull/7444)
|
limited.](https://github.com/lightningnetwork/lnd/pull/7444)
|
||||||
|
* Local edges and hop hints [are extended with a
|
||||||
|
capacity](https://github.com/lightningnetwork/lnd/pull/7520) to avoid channel
|
||||||
|
white listing in probability calculations. The influence of the node
|
||||||
|
probability is reduced.
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
* Note that [this pathfinding change](https://github.com/lightningnetwork/lnd/pull/6815)
|
* Note that [this pathfinding change](https://github.com/lightningnetwork/lnd/pull/6815)
|
||||||
|
@ -49,6 +49,10 @@ var (
|
|||||||
|
|
||||||
// ErrInvalidDecayTime is returned when we get a decay time below zero.
|
// ErrInvalidDecayTime is returned when we get a decay time below zero.
|
||||||
ErrInvalidDecayTime = errors.New("decay time must be larger than zero")
|
ErrInvalidDecayTime = errors.New("decay time must be larger than zero")
|
||||||
|
|
||||||
|
// ErrZeroCapacity is returned when we encounter a channel with zero
|
||||||
|
// capacity in probability estimation.
|
||||||
|
ErrZeroCapacity = errors.New("capacity must be larger than zero")
|
||||||
)
|
)
|
||||||
|
|
||||||
// BimodalConfig contains configuration for our probability estimator.
|
// BimodalConfig contains configuration for our probability estimator.
|
||||||
@ -226,7 +230,9 @@ func (p *BimodalEstimator) directProbability(now time.Time,
|
|||||||
capacity, successAmount, failAmount, amt,
|
capacity, successAmount, failAmount, amt,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("error computing probability: %v", err)
|
log.Errorf("error computing probability to node: %v "+
|
||||||
|
"(node: %v, results: %v, amt: %v, capacity: %v)",
|
||||||
|
err, toNode, results, amt, capacity)
|
||||||
|
|
||||||
return 0.0
|
return 0.0
|
||||||
}
|
}
|
||||||
@ -441,10 +447,10 @@ func (p *BimodalEstimator) probabilityFormula(capacityMsat, successAmountMsat,
|
|||||||
failAmount := float64(failAmountMsat)
|
failAmount := float64(failAmountMsat)
|
||||||
amount := float64(amountMsat)
|
amount := float64(amountMsat)
|
||||||
|
|
||||||
// Capacity being zero is a sentinel value to ignore the probability
|
// In order for this formula to give reasonable results, we need to have
|
||||||
// estimation, we'll return the full probability here.
|
// an estimate of the capacity of a channel (or edge between nodes).
|
||||||
if capacity == 0.0 {
|
if capacity == 0.0 {
|
||||||
return 1.0, nil
|
return 0, ErrZeroCapacity
|
||||||
}
|
}
|
||||||
|
|
||||||
// We cannot send more than the capacity.
|
// We cannot send more than the capacity.
|
||||||
|
@ -232,6 +232,16 @@ func TestSuccessProbability(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We expect an error when the capacity is zero.
|
||||||
|
t.Run("zero capacity", func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
_, err := estimator.probabilityFormula(
|
||||||
|
0, 0, 0, 0,
|
||||||
|
)
|
||||||
|
require.ErrorIs(t, err, ErrZeroCapacity)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// TestIntegral tests certain limits of the probability distribution integral.
|
// TestIntegral tests certain limits of the probability distribution integral.
|
||||||
@ -649,7 +659,9 @@ func FuzzProbability(f *testing.F) {
|
|||||||
estimator := BimodalEstimator{
|
estimator := BimodalEstimator{
|
||||||
BimodalConfig: BimodalConfig{BimodalScaleMsat: scale},
|
BimodalConfig: BimodalConfig{BimodalScaleMsat: scale},
|
||||||
}
|
}
|
||||||
f.Add(uint64(0), uint64(0), uint64(0), uint64(0))
|
|
||||||
|
// We don't start fuzzing at zero, because that would cause an error.
|
||||||
|
f.Add(uint64(1), uint64(0), uint64(0), uint64(0))
|
||||||
|
|
||||||
f.Fuzz(func(t *testing.T, capacity, successAmt, failAmt, amt uint64) {
|
f.Fuzz(func(t *testing.T, capacity, successAmt, failAmt, amt uint64) {
|
||||||
_, err := estimator.probabilityFormula(
|
_, err := estimator.probabilityFormula(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user