routing: integrate forced MC import to the low/high plugin

pull/466/head
Andras Banki-Horvath 2 years ago
parent 9ace542056
commit dc9bc9e976
No known key found for this signature in database
GPG Key ID: 80E5375C094198D8

@ -5,7 +5,6 @@ import (
"fmt" "fmt"
"sort" "sort"
"sync" "sync"
"time"
"github.com/btcsuite/btclog" "github.com/btcsuite/btclog"
"github.com/btcsuite/btcutil" "github.com/btcsuite/btcutil"
@ -520,13 +519,10 @@ func (r *lowToHighRoutingPlugin) BeforePayment(ctx context.Context,
limit := minFee + limit := minFee +
((maxFee-minFee)/int64(maxAttempts))*int64(currAttempt) ((maxFee-minFee)/int64(maxAttempts))*int64(currAttempt)
// Create a timestamp just slightly in the future as Mission Control // With the forced MC import we can safely set the pair history
// stores timestamps with sub second precision where as we send a unix // timestamps to the current time as import will always just override
// timestamp it may occur that we can't override the last entries as // current MC state.
// they have the same unix timestamp. now := r.clock.Now()
// TODO(bhandras): not very reliable, ideally we'd need a force import
// for MC.
now := r.clock.Now().Add(time.Second)
allowed := 0 allowed := 0
entries := make( entries := make(
@ -566,7 +562,7 @@ func (r *lowToHighRoutingPlugin) BeforePayment(ctx context.Context,
return ErrRoutingPluginNoMoreRetries return ErrRoutingPluginNoMoreRetries
} }
err := r.lnd.Router.ImportMissionControl(ctx, entries, false) err := r.lnd.Router.ImportMissionControl(ctx, entries, true)
if err != nil { if err != nil {
return err return err
} }
@ -606,10 +602,10 @@ func (r *lowToHighRoutingPlugin) Done(ctx context.Context) error {
return nil return nil
} }
// Roll the entry times forward (to be able to override recent updates). // With the forced import we're safe to just set the pair history
// Use the "time travel" trick which is required to make overrides // timestamps to the current time as import will always succeed and
// succeed. // override current MC state.
now := r.clock.Now().Add(time.Second) now := r.clock.Now()
entries := make( entries := make(
[]lndclient.MissionControlEntry, 0, len(r.nodesByMaxFee), []lndclient.MissionControlEntry, 0, len(r.nodesByMaxFee),
) )
@ -647,7 +643,7 @@ func (r *lowToHighRoutingPlugin) Done(ctx context.Context) error {
} }
} }
err := r.lnd.Router.ImportMissionControl(ctx, entries, false) err := r.lnd.Router.ImportMissionControl(ctx, entries, true)
if err != nil { if err != nil {
return err return err
} }

@ -81,8 +81,6 @@ func TestLowHighRoutingPlugin(t *testing.T) {
target := loopNode target := loopNode
amt := btcutil.Amount(50) amt := btcutil.Amount(50)
testTime := time.Now().UTC() testTime := time.Now().UTC()
// We expect Mission Control entries to be set to now + 1 sec.
testTimeMc := testTime.Add(time.Second)
tests := []struct { tests := []struct {
name string name string
@ -168,7 +166,7 @@ func TestLowHighRoutingPlugin(t *testing.T) {
NodeTo: dave, NodeTo: dave,
FailTime: time.Time{}, FailTime: time.Time{},
FailAmt: 0, FailAmt: 0,
SuccessTime: testTimeMc, SuccessTime: testTime,
SuccessAmt: 10000, SuccessAmt: 10000,
}, },
}, },
@ -210,14 +208,14 @@ func TestLowHighRoutingPlugin(t *testing.T) {
{ {
NodeFrom: bob, NodeFrom: bob,
NodeTo: dave, NodeTo: dave,
FailTime: testTimeMc, FailTime: testTime,
FailAmt: 1, FailAmt: 1,
}, },
// Encourage Charlie - Dave // Encourage Charlie - Dave
{ {
NodeFrom: charlie, NodeFrom: charlie,
NodeTo: dave, NodeTo: dave,
SuccessTime: testTimeMc, SuccessTime: testTime,
SuccessAmt: 1000000, SuccessAmt: 1000000,
}, },
}, },
@ -228,15 +226,15 @@ func TestLowHighRoutingPlugin(t *testing.T) {
NodeTo: dave, NodeTo: dave,
FailTime: time.Time{}, FailTime: time.Time{},
FailAmt: 0, FailAmt: 0,
SuccessTime: testTimeMc, SuccessTime: testTime,
SuccessAmt: 10000, SuccessAmt: 10000,
}, },
{ {
NodeFrom: charlie, NodeFrom: charlie,
NodeTo: dave, NodeTo: dave,
FailTime: testTimeMc, FailTime: testTime,
FailAmt: 1000001, FailAmt: 1000001,
SuccessTime: testTimeMc, SuccessTime: testTime,
SuccessAmt: 1000000, SuccessAmt: 1000000,
}, },
}, },
@ -283,13 +281,13 @@ func TestLowHighRoutingPlugin(t *testing.T) {
{ {
NodeFrom: bob, NodeFrom: bob,
NodeTo: dave, NodeTo: dave,
SuccessTime: testTimeMc, SuccessTime: testTime,
SuccessAmt: 999000, SuccessAmt: 999000,
}, },
{ {
NodeFrom: charlie, NodeFrom: charlie,
NodeTo: dave, NodeTo: dave,
SuccessTime: testTimeMc, SuccessTime: testTime,
SuccessAmt: 999000, SuccessAmt: 999000,
}, },
}, },
@ -304,17 +302,17 @@ func TestLowHighRoutingPlugin(t *testing.T) {
{ {
NodeFrom: bob, NodeFrom: bob,
NodeTo: dave, NodeTo: dave,
SuccessTime: testTimeMc, SuccessTime: testTime,
SuccessAmt: 999000, SuccessAmt: 999000,
FailTime: testTimeMc, FailTime: testTime,
FailAmt: 999001, FailAmt: 999001,
}, },
{ {
NodeFrom: charlie, NodeFrom: charlie,
NodeTo: dave, NodeTo: dave,
SuccessTime: testTimeMc, SuccessTime: testTime,
SuccessAmt: 999000, SuccessAmt: 999000,
FailTime: testTimeMc, FailTime: testTime,
FailAmt: 999001, FailAmt: 999001,
}, },
}, },
@ -375,21 +373,21 @@ func TestLowHighRoutingPlugin(t *testing.T) {
{ {
NodeFrom: bob, NodeFrom: bob,
NodeTo: eugene, NodeTo: eugene,
FailTime: testTimeMc, FailTime: testTime,
FailAmt: 1, FailAmt: 1,
}, },
// Encourage Charlie - Eugene // Encourage Charlie - Eugene
{ {
NodeFrom: charlie, NodeFrom: charlie,
NodeTo: eugene, NodeTo: eugene,
SuccessTime: testTimeMc, SuccessTime: testTime,
SuccessAmt: 1000000, SuccessAmt: 1000000,
}, },
// Encourage Dave - Eugene // Encourage Dave - Eugene
{ {
NodeFrom: dave, NodeFrom: dave,
NodeTo: eugene, NodeTo: eugene,
SuccessTime: testTimeMc, SuccessTime: testTime,
SuccessAmt: 1000000, SuccessAmt: 1000000,
}, },
}, },
@ -399,21 +397,21 @@ func TestLowHighRoutingPlugin(t *testing.T) {
{ {
NodeFrom: bob, NodeFrom: bob,
NodeTo: eugene, NodeTo: eugene,
FailTime: testTimeMc, FailTime: testTime,
FailAmt: 1, FailAmt: 1,
}, },
// Discourage Charlie - Eugene // Discourage Charlie - Eugene
{ {
NodeFrom: charlie, NodeFrom: charlie,
NodeTo: eugene, NodeTo: eugene,
FailTime: testTimeMc, FailTime: testTime,
FailAmt: 1, FailAmt: 1,
}, },
// Encourage Dave - Eugene // Encourage Dave - Eugene
{ {
NodeFrom: dave, NodeFrom: dave,
NodeTo: eugene, NodeTo: eugene,
SuccessTime: testTimeMc, SuccessTime: testTime,
SuccessAmt: 1000000, SuccessAmt: 1000000,
}, },
}, },
@ -422,9 +420,9 @@ func TestLowHighRoutingPlugin(t *testing.T) {
{ {
NodeFrom: bob, NodeFrom: bob,
NodeTo: eugene, NodeTo: eugene,
FailTime: testTimeMc, FailTime: testTime,
FailAmt: 1000001, FailAmt: 1000001,
SuccessTime: testTimeMc, SuccessTime: testTime,
SuccessAmt: 1000000, SuccessAmt: 1000000,
}, },
{ {
@ -432,15 +430,15 @@ func TestLowHighRoutingPlugin(t *testing.T) {
NodeTo: eugene, NodeTo: eugene,
FailTime: time.Time{}, FailTime: time.Time{},
FailAmt: 0, FailAmt: 0,
SuccessTime: testTimeMc, SuccessTime: testTime,
SuccessAmt: 10000, SuccessAmt: 10000,
}, },
{ {
NodeFrom: dave, NodeFrom: dave,
NodeTo: eugene, NodeTo: eugene,
FailTime: testTimeMc, FailTime: testTime,
FailAmt: 1000001, FailAmt: 1000001,
SuccessTime: testTimeMc, SuccessTime: testTime,
SuccessAmt: 1000000, SuccessAmt: 1000000,
}, },
}, },
@ -500,14 +498,14 @@ func TestLowHighRoutingPlugin(t *testing.T) {
{ {
NodeFrom: frank, NodeFrom: frank,
NodeTo: george, NodeTo: george,
FailTime: testTimeMc, FailTime: testTime,
FailAmt: 1, FailAmt: 1,
}, },
// Encourage Dave - George // Encourage Dave - George
{ {
NodeFrom: dave, NodeFrom: dave,
NodeTo: george, NodeTo: george,
SuccessTime: testTimeMc, SuccessTime: testTime,
SuccessAmt: 1000000, SuccessAmt: 1000000,
}, },
}, },
@ -522,17 +520,17 @@ func TestLowHighRoutingPlugin(t *testing.T) {
{ {
NodeFrom: frank, NodeFrom: frank,
NodeTo: george, NodeTo: george,
FailTime: testTimeMc, FailTime: testTime,
FailAmt: 1000001, FailAmt: 1000001,
SuccessTime: testTimeMc, SuccessTime: testTime,
SuccessAmt: 1000000, SuccessAmt: 1000000,
}, },
{ {
NodeFrom: dave, NodeFrom: dave,
NodeTo: george, NodeTo: george,
FailTime: testTimeMc, FailTime: testTime,
FailAmt: 1000001, FailAmt: 1000001,
SuccessTime: testTimeMc, SuccessTime: testTime,
SuccessAmt: 1000000, SuccessAmt: 1000000,
}, },
}, },

@ -52,7 +52,7 @@ func (r *mockRouter) QueryMissionControl(ctx context.Context) (
// ImpotMissionControl is a mocked reimplementation of the pair import. // ImpotMissionControl is a mocked reimplementation of the pair import.
// Reference: lnd/router/missioncontrol_state.go:importSnapshot(). // Reference: lnd/router/missioncontrol_state.go:importSnapshot().
func (r *mockRouter) ImportMissionControl(ctx context.Context, func (r *mockRouter) ImportMissionControl(ctx context.Context,
entries []lndclient.MissionControlEntry) error { entries []lndclient.MissionControlEntry, force bool) error {
for _, entry := range entries { for _, entry := range entries {
found := false found := false
@ -79,12 +79,14 @@ func (r *mockRouter) ImportMissionControl(ctx context.Context,
// Import success result second. // Import success result second.
current.SuccessTime = entry.SuccessTime current.SuccessTime = entry.SuccessTime
if entry.SuccessAmt > current.SuccessAmt { if force ||
entry.SuccessAmt > current.SuccessAmt {
current.SuccessAmt = entry.SuccessAmt current.SuccessAmt = entry.SuccessAmt
} }
if !current.FailTime.IsZero() && if !force && (!current.FailTime.IsZero() &&
entry.SuccessAmt >= current.FailAmt { entry.SuccessAmt >= current.FailAmt) {
current.FailAmt = entry.SuccessAmt + 1 current.FailAmt = entry.SuccessAmt + 1
} }

Loading…
Cancel
Save