Merge pull request #1842 from wpaulino/dedup-chan-updates-horizon

channeldb: dedup channel edges returned from ChanUpdatesInHorizon
This commit is contained in:
Olaoluwa Osuntokun 2018-09-04 21:24:40 -07:00 committed by GitHub
commit 16b5a67c3a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 4 deletions

@ -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,

@ -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