mirror of
https://github.com/lightningnetwork/lnd.git
synced 2025-11-30 07:58:15 +01:00
routing: global probability based mission control
Previously every payment had its own local mission control state which was in effect only for that payment. In this commit most of the local state is removed and payments all tap into the global mission control probability estimator. Furthermore the decay time of pruned edges and nodes is extended, so that observations about the network can better benefit future payment processes. Last, the probability function is transformed from a binary output to a gradual curve, allowing for a better trade off between candidate routes.
This commit is contained in:
67
routing/missioncontrol_test.go
Normal file
67
routing/missioncontrol_test.go
Normal file
@@ -0,0 +1,67 @@
|
||||
package routing
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/lightningnetwork/lnd/lnwire"
|
||||
"github.com/lightningnetwork/lnd/routing/route"
|
||||
)
|
||||
|
||||
// TestMissionControl tests mission control probability estimation.
|
||||
func TestMissionControl(t *testing.T) {
|
||||
now := testTime
|
||||
|
||||
mc := NewMissionControl(nil, nil, nil)
|
||||
mc.now = func() time.Time { return now }
|
||||
mc.penaltyHalfLife = 30 * time.Minute
|
||||
|
||||
testTime := time.Date(2018, time.January, 9, 14, 00, 00, 0, time.UTC)
|
||||
|
||||
testNode := route.Vertex{}
|
||||
testEdge := edge{
|
||||
channel: 123,
|
||||
}
|
||||
|
||||
expectP := func(amt lnwire.MilliSatoshi, expected float64) {
|
||||
t.Helper()
|
||||
|
||||
p := mc.getEdgeProbability(
|
||||
testNode, EdgeLocator{ChannelID: testEdge.channel},
|
||||
amt,
|
||||
)
|
||||
if p != expected {
|
||||
t.Fatalf("unexpected probability %v", p)
|
||||
}
|
||||
}
|
||||
|
||||
// Initial probability is expected to be 1.
|
||||
expectP(1000, 1)
|
||||
|
||||
// Expect probability to be zero after reporting the edge as failed.
|
||||
mc.reportEdgeFailure(testEdge, 1000)
|
||||
expectP(1000, 0)
|
||||
|
||||
// As we reported with a min penalization amt, a lower amt than reported
|
||||
// should be unaffected.
|
||||
expectP(500, 1)
|
||||
|
||||
// Edge decay started.
|
||||
now = testTime.Add(30 * time.Minute)
|
||||
expectP(1000, 0.5)
|
||||
|
||||
// Edge fails again, this time without a min penalization amt. The edge
|
||||
// should be penalized regardless of amount.
|
||||
mc.reportEdgeFailure(testEdge, 0)
|
||||
expectP(1000, 0)
|
||||
expectP(500, 0)
|
||||
|
||||
// Edge decay started.
|
||||
now = testTime.Add(60 * time.Minute)
|
||||
expectP(1000, 0.5)
|
||||
|
||||
// A node level failure should bring probability of every channel back
|
||||
// to zero.
|
||||
mc.reportVertexFailure(testNode)
|
||||
expectP(1000, 0)
|
||||
}
|
||||
Reference in New Issue
Block a user