diff --git a/channeldb/graph.go b/channeldb/graph.go index 68f4fb537..3cda1d782 100644 --- a/channeldb/graph.go +++ b/channeldb/graph.go @@ -376,7 +376,8 @@ func (c *ChannelGraph) ForEachNodeChannel(node route.Vertex, return c.graphCache.ForEachChannel(node, cb) } -// FetchNodeFeatures returns the features of a given node. +// FetchNodeFeatures returns the features of a given node. If no features are +// known for the node, an empty feature vector is returned. func (c *ChannelGraph) FetchNodeFeatures( node route.Vertex) (*lnwire.FeatureVector, error) { diff --git a/channeldb/graph_cache.go b/channeldb/graph_cache.go index bec44c3e5..891004bfc 100644 --- a/channeldb/graph_cache.go +++ b/channeldb/graph_cache.go @@ -415,9 +415,12 @@ func (c *GraphCache) ForEachChannel(node route.Vertex, features, ok := c.nodeFeatures[node] if !ok { - log.Warnf("Node %v has no features defined, falling back to "+ - "default feature vector for path finding", node) - + // If the features were set to nil explicitly, that's fine here. + // The router will overwrite the features of the destination + // node with those found in the invoice if necessary. But if we + // didn't yet get a node announcement we want to mimic the + // behavior of the old DB based code that would always set an + // empty feature vector instead of leaving it nil. features = lnwire.EmptyFeatureVector() } @@ -444,7 +447,8 @@ func (c *GraphCache) ForEachChannel(node route.Vertex, return nil } -// GetFeatures returns the features of the node with the given ID. +// GetFeatures returns the features of the node with the given ID. If no +// features are known for the node, an empty feature vector is returned. func (c *GraphCache) GetFeatures(node route.Vertex) *lnwire.FeatureVector { c.mtx.RLock() defer c.mtx.RUnlock()