-
Notifications
You must be signed in to change notification settings - Fork 2.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[2/3] Graph RIP: multi: Graph Source Abstraction #9243
base: master
Are you sure you want to change the base?
[2/3] Graph RIP: multi: Graph Source Abstraction #9243
Conversation
Important Review skippedAuto reviews are limited to specific labels. 🏷️ Labels to auto review (1)
Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
298f526
to
3ce1526
Compare
Exciting functionality! |
quite a big change/update incoming here soon - so not ready to review yet! 🦖 |
3ce1526
to
2a3db35
Compare
1504b31
to
53d1fab
Compare
2a3db35
to
d04f613
Compare
971cca9
to
2dc2543
Compare
Alrighty: updated. See the updated PR description for: 1) PR description 2) PR Flow and 3) how to test this PR. The follow up PR will add the RPC implementation of the |
53d1fab
to
d7d8c39
Compare
9335ed9
to
eea9022
Compare
Simplify the ChannelGraphSource interface by removing this unused method.
For consistency in the graphsessoin.graph interface, we let the FetchNodeFeatures method take a read transaction just like the ForEachNodeDirectedChannel. This is nice because then all calls in the same pathfinding transaction use the same read transaction.
The package name is kept the same. So this is just for less stuttering at a path level.
This commit adds a new GraphSources interface that LND requires for graph related read-only queries. As of this commit, the interface is empty but it will be populated over the next couple of commits. We add an implementation of this interface backed by a pointer to a graphdb.ChannelGraph. The infrustructure is put into place so that the GraphSoure provided to LND can be overridden by a caller of the lnd.Main function. By default, LND will satisfy the interface itself via the new `graphsource.DBSource` struct.
In this commit, we take the existing graphsession.ReadyOnlyGraph interface and remove its usage of a kvdb.RTx and replace it with a more abstract `RTx` interface type. The new GraphSource interface is expanded to include the graphsession.ReadOnlyGraph interface and the implementation of it, DBSource, is expanded to include the new methods. It converts the given RTx to the underlying kvdb read transaction where needed.
Since the GraphSource interface may be satisfied by an RPC connection, it is best practice to pass a context through to any call in the interface. The ChanGraphSource implementation, which uses a kvdb backend, does not make use of the ctx. Any call-sites are for now given a `context.TODO()` which will all be addressed in follow up commits.
Define a new GraphSource interface required by the invoicerpc server and remove its access to the graphdb.ChannelGraph pointer. Add the new invoicesrpc.GraphSource interface to the GraphSource interface and let DBSource implement it.
And let DBSource implement it.
In this commit, we add a bunch of graph methods to the GraphSource, let DBSource implement it and then we use the graph source for these methods for the GetNodeInfo, VerifyMessage, DescribeGraph, GetNodeMetrics, GetChanInfo and GetNodeInfo RPC calls along with peer alias lookup.
We will later implement this interface with a backing RPC connection and so it makes sense to pass a context through for cancellation.
So that LND can use a different GraphSource for network bootstrapping and does not need to rely on its local graph db.
so that the external graph source can be used to query network information rather than depending on the local graph DB.
So that the calcuation is abstracted behind the interface and not necessarily dependent on LND's local channel graph.
Remove four context.TODO()s
259b811
to
15c2161
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pretty straightforward refactor! Great work! :) I guess my main comment is to rename graph.ChannelGraphSource
so we know it is meant to push updates.
@@ -503,9 +503,12 @@ func (c *ChannelGraph) ForEachChannel(cb func(*models.ChannelEdgeInfo, | |||
// ForEachNodeDirectedChannel iterates through all channels of a given node, | |||
// executing the passed callback on the directed edge representing the channel | |||
// and its incoming policy. If the callback returns an error, then the iteration | |||
// is halted with the error propagated back up to the caller. | |||
// is halted with the error propagated back up to the caller. An optional read |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: commit message graphsessoin
=> graphsession
🤓
@@ -1,4 +1,4 @@ | |||
package graphsession | |||
package session |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice 👍
type GraphProvider interface { | ||
// Graph returns the GraphSource that LND will use for read-only graph | ||
// related queries. | ||
Graph(context.Context, *DatabaseInstances) (sources.GraphSource, error) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: wdyt of calling it GetGraphSource
instead?
|
||
// NewDBGSource returns a new instance of the DBSource backed by a | ||
// graphdb.ChannelGraph instance. | ||
func NewDBGSource(db *graphdb.ChannelGraph) *DBSource { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: the constructor could also be called NewDBSource
. Or if we want the "graph" term in the name the type could also be named DBGraphSource
.
|
||
// Name returns a human readable string which names the concrete | ||
// implementation of the NetworkPeerBootstrapper. | ||
Name() string | ||
Name(ctx context.Context) string |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think functions that can't return an error should not receive a context or unless we can't know if on context cancellation the returned value is valid. wdyt?
|
||
// NetworkStats represents various statistics about the state of the Lightning | ||
// network graph. | ||
type NetworkStats struct { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Alternatively stats could jus be implemented locally using a GraphSource
.
|
||
// BetweennessCentrality represents the betweenness centrality of a node in the | ||
// graph. | ||
type BetweennessCentrality struct { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same comment for centrality. Feels more like an application level feature and less of a source feature.
@ellemouton, remember to re-request review from reviewers when ready |
PR description
Depends on #9236
This PR adds a new
GraphSource
interface and passes it around tovarious sub-systems of LND instead of passing around the raw
*graphdb.ChannelGraph
pointer. This will allow us to plug in a differentgraph source if we so please. The new
ImplementationCfg.GraphProvider
can be be overridden to provide a different graph source.
This PR by itself is a pure refactor with no logic changes.
PR Flow:
GraphSource
interface is added and one by one we add tointerface and pass it around to more and more parts of the code base.
Testing this PR:
See/use this demo multinode binary PR to test this PR.
It shows how one LND node can be used as the remote graph source of
another LND node. See that PR description for a more in depth description.