diff --git a/channeldb/graph.go b/channeldb/graph.go index 1d7625ba7..37b1dbc15 100644 --- a/channeldb/graph.go +++ b/channeldb/graph.go @@ -1176,6 +1176,10 @@ type ChannelEdge struct { // ChanUpdatesInHorizon returns all the known channel edges which have at least // one edge that has an update timestamp within the specified horizon. func (c *ChannelGraph) ChanUpdatesInHorizon(startTime, endTime time.Time) ([]ChannelEdge, error) { + // To ensure we don't return duplicate ChannelEdges, we'll use an + // additional map to keep track of the edges already seen to prevent + // re-adding it. + edgesSeen := make(map[uint64]struct{}) var edgesInHorizon []ChannelEdge err := c.db.View(func(tx *bolt.Tx) error { @@ -1219,6 +1223,14 @@ func (c *ChannelGraph) ChanUpdatesInHorizon(startTime, endTime time.Time) ([]Cha // chan ID so we can query it in the DB. chanID := indexKey[8:] + // If we've already retrieved the info and policies for + // this edge, then we can skip it as we don't need to do + // so again. + chanIDInt := byteOrder.Uint64(chanID) + if _, ok := edgesSeen[chanIDInt]; ok { + continue + } + // First, we'll fetch the static edge information. edgeInfo, err := fetchChanEdgeInfo(edgeIndex, chanID) if err != nil { @@ -1242,6 +1254,7 @@ func (c *ChannelGraph) ChanUpdatesInHorizon(startTime, endTime time.Time) ([]Cha // Finally, we'll collate this edge with the rest of // edges to be returned. + edgesSeen[chanIDInt] = struct{}{} edgesInHorizon = append(edgesInHorizon, ChannelEdge{ Info: &edgeInfo, Policy1: edge1, diff --git a/channeldb/graph_test.go b/channeldb/graph_test.go index 4e1d10f71..45ff5177d 100644 --- a/channeldb/graph_test.go +++ b/channeldb/graph_test.go @@ -1398,11 +1398,12 @@ func TestChanUpdatesInHorizon(t *testing.T) { t.Fatalf("unable to create channel edge: %v", err) } - updateTime := endTime - endTime = updateTime.Add(time.Second * 10) + edge1UpdateTime := endTime + edge2UpdateTime := edge1UpdateTime.Add(time.Second) + endTime = endTime.Add(time.Second * 10) edge1 := newEdgePolicy( - chanID.ToUint64(), op, db, updateTime.Unix(), + chanID.ToUint64(), op, db, edge1UpdateTime.Unix(), ) edge1.Flags = 0 edge1.Node = node2 @@ -1412,7 +1413,7 @@ func TestChanUpdatesInHorizon(t *testing.T) { } edge2 := newEdgePolicy( - chanID.ToUint64(), op, db, updateTime.Unix(), + chanID.ToUint64(), op, db, edge2UpdateTime.Unix(), ) edge2.Flags = 1 edge2.Node = node1