From 3f58c2dea4ca532001058fe69cef01215b738b7f Mon Sep 17 00:00:00 2001 From: Wilmer Paulino Date: Tue, 4 Sep 2018 18:39:23 -0700 Subject: [PATCH] channeldb/graph: dedup channel edges returned from ChanUpdatesInHorizon In this commit, we ensure that we de-duplicate the set of channel edges returned from ChanUpdatesInHorizon. Other subsystems within lnd use this method to retrieve and send all the channels with updates within a time series to network peers. However, since the method looks at the edge update index, which can include up to two entries per edge for each policy, it's possible that we'd send channel announcements and updates twice, causing extra bandwidth. --- channeldb/graph.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/channeldb/graph.go b/channeldb/graph.go index dc481cf7c..0872d686a 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 { @@ -1237,6 +1249,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,