routing: modify findPaths to take an upper limit on the number of routes
In this commit, we modify the findPaths method to take the max number of routes to return. With this change, FindRoutes can eventually itself also take a max number of routes in order to make the function useable again.
This commit is contained in:
parent
3e422fedd3
commit
33ba60ce66
@ -612,9 +612,7 @@ func findPath(tx *bolt.Tx, graph *channeldb.ChannelGraph,
|
|||||||
// algorithm in a block box manner.
|
// algorithm in a block box manner.
|
||||||
func findPaths(tx *bolt.Tx, graph *channeldb.ChannelGraph,
|
func findPaths(tx *bolt.Tx, graph *channeldb.ChannelGraph,
|
||||||
source *channeldb.LightningNode, target *btcec.PublicKey,
|
source *channeldb.LightningNode, target *btcec.PublicKey,
|
||||||
amt lnwire.MilliSatoshi) ([][]*ChannelHop, error) {
|
amt lnwire.MilliSatoshi, numPaths uint32) ([][]*ChannelHop, error) {
|
||||||
|
|
||||||
// TODO(roasbeef): take in db tx
|
|
||||||
|
|
||||||
ignoredEdges := make(map[uint64]struct{})
|
ignoredEdges := make(map[uint64]struct{})
|
||||||
ignoredVertexes := make(map[Vertex]struct{})
|
ignoredVertexes := make(map[Vertex]struct{})
|
||||||
@ -629,8 +627,9 @@ func findPaths(tx *bolt.Tx, graph *channeldb.ChannelGraph,
|
|||||||
// First we'll find a single shortest path from the source (our
|
// First we'll find a single shortest path from the source (our
|
||||||
// selfNode) to the target destination that's capable of carrying amt
|
// selfNode) to the target destination that's capable of carrying amt
|
||||||
// satoshis along the path before fees are calculated.
|
// satoshis along the path before fees are calculated.
|
||||||
startingPath, err := findPath(tx, graph, source, target,
|
startingPath, err := findPath(
|
||||||
ignoredVertexes, ignoredEdges, amt)
|
tx, graph, source, target, ignoredVertexes, ignoredEdges, amt,
|
||||||
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("Unable to find path: %v", err)
|
log.Errorf("Unable to find path: %v", err)
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -651,7 +650,7 @@ func findPaths(tx *bolt.Tx, graph *channeldb.ChannelGraph,
|
|||||||
|
|
||||||
// While we still have candidate paths to explore we'll keep exploring
|
// While we still have candidate paths to explore we'll keep exploring
|
||||||
// the sub-graphs created to find the next k-th shortest path.
|
// the sub-graphs created to find the next k-th shortest path.
|
||||||
for k := 1; k < 100; k++ {
|
for k := uint32(1); k < numPaths; k++ {
|
||||||
prevShortest := shortestPaths[k-1]
|
prevShortest := shortestPaths[k-1]
|
||||||
|
|
||||||
// We'll examine each edge in the previous iteration's shortest
|
// We'll examine each edge in the previous iteration's shortest
|
||||||
@ -673,7 +672,8 @@ func findPaths(tx *bolt.Tx, graph *channeldb.ChannelGraph,
|
|||||||
|
|
||||||
// Before we kickoff our next path finding iteration,
|
// Before we kickoff our next path finding iteration,
|
||||||
// we'll find all the edges we need to ignore in this
|
// we'll find all the edges we need to ignore in this
|
||||||
// next round.
|
// next round. This ensures that we create a new unique
|
||||||
|
// path.
|
||||||
for _, path := range shortestPaths {
|
for _, path := range shortestPaths {
|
||||||
// If our current rootPath is a prefix of this
|
// If our current rootPath is a prefix of this
|
||||||
// shortest path, then we'll remove the edge
|
// shortest path, then we'll remove the edge
|
||||||
@ -685,7 +685,8 @@ func findPaths(tx *bolt.Tx, graph *channeldb.ChannelGraph,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Next we'll remove all entries in the root path that
|
// Next we'll remove all entries in the root path that
|
||||||
// aren't the current spur node from the graph.
|
// aren't the current spur node from the graph. This
|
||||||
|
// ensures we don't create a path with loops.
|
||||||
for _, hop := range rootPath {
|
for _, hop := range rootPath {
|
||||||
node := hop.Node.PubKeyBytes
|
node := hop.Node.PubKeyBytes
|
||||||
if node == spurNode.PubKeyBytes {
|
if node == spurNode.PubKeyBytes {
|
||||||
@ -699,8 +700,10 @@ func findPaths(tx *bolt.Tx, graph *channeldb.ChannelGraph,
|
|||||||
// the Vertexes (other than the spur path) within the
|
// the Vertexes (other than the spur path) within the
|
||||||
// root path removed, we'll attempt to find another
|
// root path removed, we'll attempt to find another
|
||||||
// shortest path from the spur node to the destination.
|
// shortest path from the spur node to the destination.
|
||||||
spurPath, err := findPath(tx, graph, spurNode, target,
|
spurPath, err := findPath(
|
||||||
ignoredVertexes, ignoredEdges, amt)
|
tx, graph, spurNode, target, ignoredVertexes,
|
||||||
|
ignoredEdges, amt,
|
||||||
|
)
|
||||||
|
|
||||||
// If we weren't able to find a path, we'll continue to
|
// If we weren't able to find a path, we'll continue to
|
||||||
// the next round.
|
// the next round.
|
||||||
|
Loading…
Reference in New Issue
Block a user