graph/db: version fetch chan infos

Add a gossip version parameter to FetchChanInfos in the Store interface
and both KV/SQL implementations. Update the graph builder caller and
refactor related tests.
This commit is contained in:
Elle Mouton committed 2026-02-20 09:28:13 +02:00
1 parent 769d6260f5
commit acb3240d3d
6 files changed
+56 -35

No files matched your search

+1 -1
View File
@@ -581,7 +581,7 @@ func (b *Builder) pruneZombieChans() error {
"ids chans: %v", err)
}
disabledEdges, err := b.cfg.Graph.FetchChanInfos(
disabledEdges, err := b.v1Graph.FetchChanInfos(
disabledChanIDs,
)
if err != nil {
+14 -3
View File
@@ -349,7 +349,9 @@ func (c *ChannelGraph) MarkEdgeLive(chanID uint64) error {
if c.graphCache != nil {
// We need to add the channel back into our graph cache,
// otherwise we won't use it for path finding.
infos, err := c.db.FetchChanInfos([]uint64{chanID})
infos, err := c.db.FetchChanInfos(
lnwire.GossipVersion1, []uint64{chanID},
)
if err != nil {
return err
}
@@ -710,8 +712,10 @@ func (c *ChannelGraph) FilterChannelRange(startHeight, endHeight uint32,
}
// FetchChanInfos returns the set of channel edges for the passed channel IDs.
func (c *ChannelGraph) FetchChanInfos(chanIDs []uint64) ([]ChannelEdge, error) {
return c.db.FetchChanInfos(chanIDs)
func (c *ChannelGraph) FetchChanInfos(v lnwire.GossipVersion,
chanIDs []uint64) ([]ChannelEdge, error) {
return c.db.FetchChanInfos(v, chanIDs)
}
// FetchChannelEdgesByOutpoint attempts to lookup directed edges by funding
@@ -952,6 +956,13 @@ func (c *VersionedGraph) DisabledChannelIDs() ([]uint64, error) {
return c.db.DisabledChannelIDs(c.v)
}
// FetchChanInfos returns the set of channel edges for the passed channel IDs.
func (c *VersionedGraph) FetchChanInfos(chanIDs []uint64) ([]ChannelEdge,
error) {
return c.db.FetchChanInfos(c.v, chanIDs)
}
// HighestChanID returns the "highest" known channel ID in the channel graph.
func (c *VersionedGraph) HighestChanID(ctx context.Context) (uint64, error) {
return c.db.HighestChanID(ctx, c.v)
+24 -27
View File
@@ -202,6 +202,10 @@ var versionedTests = []versionedTest{
name: "highest chan id",
test: testHighestChanID,
},
{
name: "fetch chan infos",
test: testFetchChanInfos,
},
}
// TestVersionedDBs runs various tests against both v1 and v2 versioned
@@ -3868,22 +3872,18 @@ func TestFilterChannelRange(t *testing.T) {
// TestFetchChanInfos tests that we're able to properly retrieve the full set
// of ChannelEdge structs for a given set of short channel ID's.
func TestFetchChanInfos(t *testing.T) {
func testFetchChanInfos(t *testing.T, v lnwire.GossipVersion) {
t.Parallel()
ctx := t.Context()
graph := MakeTestGraph(t)
graph := NewVersionedGraph(MakeTestGraph(t), v)
// We'll first populate our graph with two nodes. All channels created
// below will be made between these two nodes.
node1 := createTestVertex(t, lnwire.GossipVersion1)
if err := graph.AddNode(ctx, node1); err != nil {
t.Fatalf("unable to add node: %v", err)
}
node2 := createTestVertex(t, lnwire.GossipVersion1)
if err := graph.AddNode(ctx, node2); err != nil {
t.Fatalf("unable to add node: %v", err)
}
node1 := createTestVertex(t, v)
require.NoError(t, graph.AddNode(ctx, node1))
node2 := createTestVertex(t, v)
require.NoError(t, graph.AddNode(ctx, node2))
// We'll make 5 test channels, ensuring we keep track of which channel
// ID corresponds to a particular ChannelEdge.
@@ -3894,36 +3894,35 @@ func TestFetchChanInfos(t *testing.T) {
edgeQuery := make([]uint64, 0, numChans)
for i := 0; i < numChans; i++ {
channel, chanID := createEdge(
lnwire.GossipVersion1, uint32(i*10), 0, 0, 0,
node1, node2,
v, uint32(i*10), 0, 0, 0, node1, node2,
)
if err := graph.AddChannelEdge(ctx, channel); err != nil {
t.Fatalf("unable to create channel edge: %v", err)
}
require.NoError(t, graph.AddChannelEdge(ctx, channel))
updateTime := endTime
endTime = updateTime.Add(time.Second * 10)
edge1 := newEdgePolicy(
lnwire.GossipVersion1, chanID.ToUint64(),
v, chanID.ToUint64(),
updateTime.Unix(), true,
)
if v == lnwire.GossipVersion1 {
edge1.ChannelFlags = 0
}
edge1.ToNode = node2.PubKeyBytes
edge1.SigBytes = testSig.Serialize()
if err := graph.UpdateEdgePolicy(ctx, edge1); err != nil {
t.Fatalf("unable to update edge: %v", err)
}
require.NoError(t, graph.UpdateEdgePolicy(ctx, edge1))
edge2 := newEdgePolicy(
lnwire.GossipVersion1, chanID.ToUint64(),
v, chanID.ToUint64(),
updateTime.Unix(), false,
)
if v == lnwire.GossipVersion1 {
edge2.ChannelFlags = 1
}
edge2.ToNode = node1.PubKeyBytes
edge2.SigBytes = testSig.Serialize()
if err := graph.UpdateEdgePolicy(ctx, edge2); err != nil {
t.Fatalf("unable to update edge: %v", err)
}
require.NoError(t, graph.UpdateEdgePolicy(ctx, edge2))
edges = append(edges, ChannelEdge{
Info: channel,
@@ -3941,11 +3940,9 @@ func TestFetchChanInfos(t *testing.T) {
// Add an another edge to the query that has been marked as a zombie
// edge. The query should also skip this channel.
zombieChan, zombieChanID := createEdge(
lnwire.GossipVersion1, 666, 0, 0, 0, node1, node2,
v, 666, 0, 0, 0, node1, node2,
)
if err := graph.AddChannelEdge(ctx, zombieChan); err != nil {
t.Fatalf("unable to create channel edge: %v", err)
}
require.NoError(t, graph.AddChannelEdge(ctx, zombieChan))
err := graph.DeleteChannelEdges(false, true, zombieChan.ChannelID)
require.NoError(t, err, "unable to delete and mark edge zombie")
edgeQuery = append(edgeQuery, zombieChanID.ToUint64())
+2 -1
View File
@@ -282,7 +282,8 @@ type Store interface { //nolint:interfacebloat
// edges that exist at the time of the query. This can be used to
// respond to peer queries that are seeking to fill in gaps in their
// view of the channel graph.
FetchChanInfos(chanIDs []uint64) ([]ChannelEdge, error)
FetchChanInfos(v lnwire.GossipVersion,
chanIDs []uint64) ([]ChannelEdge, error)
// FetchChannelEdgesByOutpoint attempts to lookup the two directed edges
// for the channel identified by the funding outpoint. If the channel
+7 -1
View File
@@ -2960,7 +2960,13 @@ func (c *KVStore) FilterChannelRange(startHeight,
// skipped and the result will contain only those edges that exist at the time
// of the query. This can be used to respond to peer queries that are seeking to
// fill in gaps in their view of the channel graph.
func (c *KVStore) FetchChanInfos(chanIDs []uint64) ([]ChannelEdge, error) {
func (c *KVStore) FetchChanInfos(v lnwire.GossipVersion,
chanIDs []uint64) ([]ChannelEdge, error) {
if v != lnwire.GossipVersion1 {
return nil, ErrVersionNotSupportedForKVDB
}
return c.fetchChanInfos(nil, chanIDs)
}
+8 -2
View File
@@ -2599,12 +2599,18 @@ func (s *SQLStore) IsPublicNode(v lnwire.GossipVersion, pubKey [33]byte) (bool,
// fill in gaps in their view of the channel graph.
//
// NOTE: part of the Store interface.
func (s *SQLStore) FetchChanInfos(chanIDs []uint64) ([]ChannelEdge, error) {
func (s *SQLStore) FetchChanInfos(v lnwire.GossipVersion,
chanIDs []uint64) ([]ChannelEdge, error) {
var (
ctx = context.TODO()
edges = make(map[uint64]ChannelEdge)
)
err := s.db.ExecTx(ctx, sqldb.ReadTxOpt(), func(db SQLQueries) error {
if !isKnownGossipVersion(v) {
return fmt.Errorf("unsupported gossip version: %d", v)
}
// First, collect all channel rows.
var channelRows []sqlc.GetChannelsBySCIDWithPoliciesRow
chanCallBack := func(ctx context.Context,
@@ -2615,7 +2621,7 @@ func (s *SQLStore) FetchChanInfos(chanIDs []uint64) ([]ChannelEdge, error) {
}
err := s.forEachChanWithPoliciesInSCIDList(
ctx, db, lnwire.GossipVersion1, chanCallBack, chanIDs,
ctx, db, v, chanCallBack, chanIDs,
)
if err != nil {
return err