Merge pull request #2305 from halseth/autopilot-scores-logging

[autopilot] populate addresses in NodeScores
This commit is contained in:
Olaoluwa Osuntokun authored and GitHub committed 2018-12-10 12:51:46 -08:00
commit de9bb922dd
3 files changed
+107 -3

No files matched your search

+62
View File
@@ -270,6 +270,30 @@ func (d *databaseChannelGraph) addRandChannel(node1, node2 *btcec.PublicKey,
nil nil
} }
func (d *databaseChannelGraph) addRandNode() (*btcec.PublicKey, error) {
nodeKey, err := randKey()
if err != nil {
return nil, err
}
dbNode := &channeldb.LightningNode{
HaveNodeAnnouncement: true,
Addresses: []net.Addr{
&net.TCPAddr{
IP: bytes.Repeat([]byte("a"), 16),
},
},
Features: lnwire.NewFeatureVector(nil, lnwire.GlobalFeatures),
AuthSigBytes: testSig.Serialize(),
}
dbNode.AddPubKey(nodeKey)
if err := d.db.AddLightningNode(dbNode); err != nil {
return nil, err
}
return nodeKey, nil
}
// memChannelGraph is an implementation of the autopilot.ChannelGraph backed by // memChannelGraph is an implementation of the autopilot.ChannelGraph backed by
// an in-memory graph. // an in-memory graph.
type memChannelGraph struct { type memChannelGraph struct {
@@ -335,6 +359,11 @@ func (m *memChannelGraph) addRandChannel(node1, node2 *btcec.PublicKey,
if !ok { if !ok {
vertex1 = memNode{ vertex1 = memNode{
pub: node1, pub: node1,
addrs: []net.Addr{
&net.TCPAddr{
IP: bytes.Repeat([]byte("a"), 16),
},
},
} }
} }
} else { } else {
@@ -344,6 +373,11 @@ func (m *memChannelGraph) addRandChannel(node1, node2 *btcec.PublicKey,
} }
vertex1 = memNode{ vertex1 = memNode{
pub: newPub, pub: newPub,
addrs: []net.Addr{
&net.TCPAddr{
IP: bytes.Repeat([]byte("a"), 16),
},
},
} }
} }
@@ -352,6 +386,11 @@ func (m *memChannelGraph) addRandChannel(node1, node2 *btcec.PublicKey,
if !ok { if !ok {
vertex2 = memNode{ vertex2 = memNode{
pub: node2, pub: node2,
addrs: []net.Addr{
&net.TCPAddr{
IP: bytes.Repeat([]byte("a"), 16),
},
},
} }
} }
} else { } else {
@@ -361,6 +400,11 @@ func (m *memChannelGraph) addRandChannel(node1, node2 *btcec.PublicKey,
} }
vertex2 = memNode{ vertex2 = memNode{
pub: newPub, pub: newPub,
addrs: []net.Addr{
&net.TCPAddr{
IP: bytes.Repeat([]byte("a"), 16),
},
},
} }
} }
@@ -387,6 +431,24 @@ func (m *memChannelGraph) addRandChannel(node1, node2 *btcec.PublicKey,
return &edge1, &edge2, nil return &edge1, &edge2, nil
} }
func (m *memChannelGraph) addRandNode() (*btcec.PublicKey, error) {
newPub, err := randKey()
if err != nil {
return nil, err
}
vertex := memNode{
pub: newPub,
addrs: []net.Addr{
&net.TCPAddr{
IP: bytes.Repeat([]byte("a"), 16),
},
},
}
m.graph[NewNodeID(newPub)] = vertex
return newPub, nil
}
// memNode is a purely in-memory implementation of the autopilot.Node // memNode is a purely in-memory implementation of the autopilot.Node
// interface. // interface.
type memNode struct { type memNode struct {
+12
View File
@@ -148,6 +148,7 @@ func (p *ConstrainedPrefAttachment) NodeScores(g ChannelGraph, chans []Channel,
} }
_, ok := existingPeers[nID] _, ok := existingPeers[nID]
addrs := addresses[nID]
switch { switch {
@@ -160,6 +161,16 @@ func (p *ConstrainedPrefAttachment) NodeScores(g ChannelGraph, chans []Channel,
// another channel. // another channel.
case chanSize == 0 || chanSize < p.constraints.MinChanSize: case chanSize == 0 || chanSize < p.constraints.MinChanSize:
continue continue
// If the node has no addresses, we cannot connect to it, so we
// skip it for now, which implicitly gives it a score of 0.
case len(addrs) == 0:
continue
// If the node had no channels, we skip it, since it would have
// gotten a zero score anyway.
case nodeChans == 0:
continue
} }
// Otherwise we score the node according to its fraction of // Otherwise we score the node according to its fraction of
@@ -168,6 +179,7 @@ func (p *ConstrainedPrefAttachment) NodeScores(g ChannelGraph, chans []Channel,
candidates[nID] = &AttachmentDirective{ candidates[nID] = &AttachmentDirective{
NodeID: nID, NodeID: nID,
ChanAmt: chanSize, ChanAmt: chanSize,
Addrs: addrs,
Score: score, Score: score,
} }
} }
+33 -3
View File
@@ -182,6 +182,8 @@ type testGraph interface {
addRandChannel(*btcec.PublicKey, *btcec.PublicKey, addRandChannel(*btcec.PublicKey, *btcec.PublicKey,
btcutil.Amount) (*ChannelEdge, *ChannelEdge, error) btcutil.Amount) (*ChannelEdge, *ChannelEdge, error)
addRandNode() (*btcec.PublicKey, error)
} }
func newDiskChanGraph() (testGraph, func(), error) { func newDiskChanGraph() (testGraph, func(), error) {
@@ -374,6 +376,12 @@ func TestConstrainedPrefAttachmentSelectTwoVertexes(t *testing.T) {
t1.Fatalf("unable to generate channel: %v", err) t1.Fatalf("unable to generate channel: %v", err)
} }
// We also add a third, non-connected node to the graph.
_, err = graph.addRandNode()
if err != nil {
t1.Fatalf("unable to add random node: %v", err)
}
// Get the score for all nodes found in the graph at // Get the score for all nodes found in the graph at
// this point. // this point.
nodes := make(map[NodeID]struct{}) nodes := make(map[NodeID]struct{})
@@ -384,7 +392,7 @@ func TestConstrainedPrefAttachmentSelectTwoVertexes(t *testing.T) {
t1.Fatalf("unable to traverse graph: %v", err) t1.Fatalf("unable to traverse graph: %v", err)
} }
if len(nodes) != 2 { if len(nodes) != 3 {
t1.Fatalf("expected 2 nodes, found %d", len(nodes)) t1.Fatalf("expected 2 nodes, found %d", len(nodes))
} }
@@ -399,8 +407,10 @@ func TestConstrainedPrefAttachmentSelectTwoVertexes(t *testing.T) {
"directives: %v", err) "directives: %v", err)
} }
if len(candidates) != len(nodes) { // We expect two candidates, since one of the nodes
t1.Fatalf("all nodes should be scored, "+ // doesn't have any channels.
if len(candidates) != 2 {
t1.Fatalf("2 nodes should be scored, "+
"instead %v were", len(candidates)) "instead %v were", len(candidates))
} }
@@ -436,6 +446,11 @@ func TestConstrainedPrefAttachmentSelectTwoVertexes(t *testing.T) {
"to be %v, instead was %v", "to be %v, instead was %v",
expScore, candidate.Score) expScore, candidate.Score)
} }
if len(candidate.Addrs) == 0 {
t1.Fatalf("expected node to have " +
"available addresses, didn't")
}
} }
}) })
if !success { if !success {
@@ -633,6 +648,11 @@ func TestConstrainedPrefAttachmentSelectGreedyAllocation(t *testing.T) {
"of %v, instead got %v", "of %v, instead got %v",
maxChanSize, candidate.ChanAmt) maxChanSize, candidate.ChanAmt)
} }
if len(candidate.Addrs) == 0 {
t1.Fatalf("expected node to have " +
"available addresses, didn't")
}
} }
// Imagine a few channels are being opened, and there's // Imagine a few channels are being opened, and there's
@@ -663,6 +683,11 @@ func TestConstrainedPrefAttachmentSelectGreedyAllocation(t *testing.T) {
"of %v, instead got %v", "of %v, instead got %v",
remBalance, candidate.ChanAmt) remBalance, candidate.ChanAmt)
} }
if len(candidate.Addrs) == 0 {
t1.Fatalf("expected node to have " +
"available addresses, didn't")
}
} }
}) })
if !success { if !success {
@@ -753,6 +778,11 @@ func TestConstrainedPrefAttachmentSelectSkipNodes(t *testing.T) {
"of %v, instead got %v", "of %v, instead got %v",
maxChanSize, candidate.ChanAmt) maxChanSize, candidate.ChanAmt)
} }
if len(candidate.Addrs) == 0 {
t1.Fatalf("expected node to have " +
"available addresses, didn't")
}
} }
// We'll simulate a channel update by adding the nodes // We'll simulate a channel update by adding the nodes