From b1873e63ec476acc79a47d0d19ffa82a46375019 Mon Sep 17 00:00:00 2001 From: Elle Mouton Date: Wed, 25 Feb 2026 09:26:07 +0200 Subject: [PATCH] graph/db: thread context through FetchNodeFeatures --- graph/db/graph.go | 6 +++--- graph/db/graph_test.go | 4 ++-- graph/db/interfaces.go | 5 +++-- graph/db/kv_store.go | 5 +++-- graph/db/sql_store.go | 12 +++++------- routing/graph.go | 4 +++- routing/mock_graph_test.go | 5 +++-- routing/pathfind.go | 11 ++++++++--- 8 files changed, 30 insertions(+), 22 deletions(-) diff --git a/graph/db/graph.go b/graph/db/graph.go index 283f7d536..ba63941a8 100644 --- a/graph/db/graph.go +++ b/graph/db/graph.go @@ -236,14 +236,14 @@ func (c *ChannelGraph) ForEachNodeDirectedChannel(node route.Vertex, // features instead of the database. // // NOTE: this is part of the graphdb.NodeTraverser interface. -func (c *ChannelGraph) FetchNodeFeatures(node route.Vertex) ( - *lnwire.FeatureVector, error) { +func (c *ChannelGraph) FetchNodeFeatures(ctx context.Context, + node route.Vertex) (*lnwire.FeatureVector, error) { if c.graphCache != nil { return c.graphCache.GetFeatures(node), nil } - return c.db.FetchNodeFeatures(lnwire.GossipVersion1, node) + return c.db.FetchNodeFeatures(ctx, lnwire.GossipVersion1, node) } // GraphSession will provide the call-back with access to a NodeTraverser diff --git a/graph/db/graph_test.go b/graph/db/graph_test.go index aa0e02b3e..051f59a6d 100644 --- a/graph/db/graph_test.go +++ b/graph/db/graph_test.go @@ -298,13 +298,13 @@ func testNodeInsertionAndDeletion(t *testing.T, v lnwire.GossipVersion) { // Check that the node's features are fetched correctly. This check // will use the graph cache to fetch the features. - features, err := graph.FetchNodeFeatures(node.PubKeyBytes) + features, err := graph.FetchNodeFeatures(ctx, node.PubKeyBytes) require.NoError(t, err) require.Equal(t, testFeatures, features) // Check that the node's features are fetched correctly. This check // will check the database directly. - features, err = graph.FetchNodeFeatures(node.PubKeyBytes) + features, err = graph.FetchNodeFeatures(ctx, node.PubKeyBytes) require.NoError(t, err) require.Equal(t, testFeatures, features) diff --git a/graph/db/interfaces.go b/graph/db/interfaces.go index 446644077..9daabb0c6 100644 --- a/graph/db/interfaces.go +++ b/graph/db/interfaces.go @@ -25,7 +25,8 @@ type NodeTraverser interface { cb func(channel *DirectedChannel) error, reset func()) error // FetchNodeFeatures returns the features of the given node. - FetchNodeFeatures(nodePub route.Vertex) (*lnwire.FeatureVector, error) + FetchNodeFeatures(ctx context.Context, + nodePub route.Vertex) (*lnwire.FeatureVector, error) } // Store represents the main interface for the channel graph database for all @@ -37,7 +38,7 @@ type Store interface { //nolint:interfacebloat cb func(channel *DirectedChannel) error, reset func()) error // FetchNodeFeatures returns the features of the given node. - FetchNodeFeatures(v lnwire.GossipVersion, + FetchNodeFeatures(ctx context.Context, v lnwire.GossipVersion, nodePub route.Vertex) (*lnwire.FeatureVector, error) // AddNode adds a vertex/node to the graph database. If the diff --git a/graph/db/kv_store.go b/graph/db/kv_store.go index de9ff401e..67cebc280 100644 --- a/graph/db/kv_store.go +++ b/graph/db/kv_store.go @@ -684,7 +684,7 @@ func (c *KVStore) ForEachNodeDirectedChannel(v lnwire.GossipVersion, // known for the node, an empty feature vector is returned. // // NOTE: this is part of the graphdb.NodeTraverser interface. -func (c *KVStore) FetchNodeFeatures(v lnwire.GossipVersion, +func (c *KVStore) FetchNodeFeatures(_ context.Context, v lnwire.GossipVersion, nodePub route.Vertex) (*lnwire.FeatureVector, error) { if v != lnwire.GossipVersion1 { @@ -4511,7 +4511,8 @@ func (c *nodeTraverserSession) ForEachNodeDirectedChannel( // unknown, assume no additional features are supported. // // NOTE: Part of the NodeTraverser interface. -func (c *nodeTraverserSession) FetchNodeFeatures(nodePub route.Vertex) ( +func (c *nodeTraverserSession) FetchNodeFeatures(_ context.Context, + nodePub route.Vertex) ( *lnwire.FeatureVector, error) { return c.db.fetchNodeFeatures(c.tx, nodePub) diff --git a/graph/db/sql_store.go b/graph/db/sql_store.go index a04a70aba..cc058c8b0 100644 --- a/graph/db/sql_store.go +++ b/graph/db/sql_store.go @@ -447,10 +447,9 @@ func (s *SQLStore) DeleteNode(ctx context.Context, v lnwire.GossipVersion, // known for the node, an empty feature vector is returned. // // NOTE: this is part of the graphdb.NodeTraverser interface. -func (s *SQLStore) FetchNodeFeatures(v lnwire.GossipVersion, - nodePub route.Vertex) (*lnwire.FeatureVector, error) { - - ctx := context.TODO() +func (s *SQLStore) FetchNodeFeatures(ctx context.Context, + v lnwire.GossipVersion, nodePub route.Vertex) (*lnwire.FeatureVector, + error) { return fetchNodeFeatures(ctx, s.db, v, nodePub) } @@ -3391,11 +3390,10 @@ func (s *sqlNodeTraverser) ForEachNodeDirectedChannel( // unknown, assume no additional features are supported. // // NOTE: Part of the NodeTraverser interface. -func (s *sqlNodeTraverser) FetchNodeFeatures(nodePub route.Vertex) ( +func (s *sqlNodeTraverser) FetchNodeFeatures(ctx context.Context, + nodePub route.Vertex) ( *lnwire.FeatureVector, error) { - ctx := context.TODO() - return fetchNodeFeatures(ctx, s.db, lnwire.GossipVersion1, nodePub) } diff --git a/routing/graph.go b/routing/graph.go index 4be34def9..2cfaec052 100644 --- a/routing/graph.go +++ b/routing/graph.go @@ -1,6 +1,7 @@ package routing import ( + "context" "fmt" "github.com/btcsuite/btcd/btcutil" @@ -19,7 +20,8 @@ type Graph interface { reset func()) error // FetchNodeFeatures returns the features of the given node. - FetchNodeFeatures(nodePub route.Vertex) (*lnwire.FeatureVector, error) + FetchNodeFeatures(ctx context.Context, + nodePub route.Vertex) (*lnwire.FeatureVector, error) } // GraphSessionFactory can be used to gain access to a graphdb.NodeTraverser diff --git a/routing/mock_graph_test.go b/routing/mock_graph_test.go index d9b16f646..b11bdf812 100644 --- a/routing/mock_graph_test.go +++ b/routing/mock_graph_test.go @@ -2,6 +2,7 @@ package routing import ( "bytes" + "context" "fmt" "testing" @@ -221,8 +222,8 @@ func (m *mockGraph) sourceNode() route.Vertex { // fetchNodeFeatures returns the features of the given node. // // NOTE: Part of the Graph interface. -func (m *mockGraph) FetchNodeFeatures(nodePub route.Vertex) ( - *lnwire.FeatureVector, error) { +func (m *mockGraph) FetchNodeFeatures(_ context.Context, + _ route.Vertex) (*lnwire.FeatureVector, error) { return lnwire.EmptyFeatureVector(), nil } diff --git a/routing/pathfind.go b/routing/pathfind.go index ddaade60c..0f177c396 100644 --- a/routing/pathfind.go +++ b/routing/pathfind.go @@ -3,6 +3,7 @@ package routing import ( "bytes" "container/heap" + "context" "errors" "fmt" "math" @@ -621,7 +622,9 @@ func findPath(g *graphParams, r *RestrictParams, cfg *PathFindingConfig, features := r.DestFeatures if features == nil { var err error - features, err = g.graph.FetchNodeFeatures(target) + features, err = g.graph.FetchNodeFeatures( + context.TODO(), target, + ) if err != nil { return nil, 0, err } @@ -1019,7 +1022,9 @@ func findPath(g *graphParams, r *RestrictParams, cfg *PathFindingConfig, } // Fetch node features fresh from the graph. - fromFeatures, err := g.graph.FetchNodeFeatures(node) + fromFeatures, err := g.graph.FetchNodeFeatures( + context.TODO(), node, + ) if err != nil { return nil, err } @@ -1349,7 +1354,7 @@ func findBlindedPaths(g Graph, target route.Vertex, return true, nil } - features, err := g.FetchNodeFeatures(node) + features, err := g.FetchNodeFeatures(context.TODO(), node) if err != nil { return false, err }