• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

lightningnetwork / lnd / 13566028875

27 Feb 2025 12:09PM UTC coverage: 49.396% (-9.4%) from 58.748%
13566028875

Pull #9555

github

ellemouton
graph/db: populate the graph cache in Start instead of during construction

In this commit, we move the graph cache population logic out of the
ChannelGraph constructor and into its Start method instead.
Pull Request #9555: graph: extract cache from CRUD [6]

34 of 54 new or added lines in 4 files covered. (62.96%)

27464 existing lines in 436 files now uncovered.

101095 of 204664 relevant lines covered (49.4%)

1.54 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

86.49
/graph/db/reject_cache.go
1
package graphdb
2

3
// rejectFlags is a compact representation of various metadata stored by the
4
// reject cache about a particular channel.
5
type rejectFlags uint8
6

7
const (
8
        // rejectFlagExists is a flag indicating whether the channel exists,
9
        // i.e. the channel is open and has a recent channel update. If this
10
        // flag is not set, the channel is either a zombie or unknown.
11
        rejectFlagExists rejectFlags = 1 << iota
12

13
        // rejectFlagZombie is a flag indicating whether the channel is a
14
        // zombie, i.e. the channel is open but has no recent channel updates.
15
        rejectFlagZombie
16
)
17

18
// packRejectFlags computes the rejectFlags corresponding to the passed boolean
19
// values indicating whether the edge exists or is a zombie.
20
func packRejectFlags(exists, isZombie bool) rejectFlags {
3✔
21
        var flags rejectFlags
3✔
22
        if exists {
6✔
23
                flags |= rejectFlagExists
3✔
24
        }
3✔
25
        if isZombie {
3✔
UNCOV
26
                flags |= rejectFlagZombie
×
UNCOV
27
        }
×
28

29
        return flags
3✔
30
}
31

32
// unpack returns the booleans packed into the rejectFlags. The first indicates
33
// if the edge exists in our graph, the second indicates if the edge is a
34
// zombie.
35
func (f rejectFlags) unpack() (bool, bool) {
3✔
36
        return f&rejectFlagExists == rejectFlagExists,
3✔
37
                f&rejectFlagZombie == rejectFlagZombie
3✔
38
}
3✔
39

40
// rejectCacheEntry caches frequently accessed information about a channel,
41
// including the timestamps of its latest edge policies and whether or not the
42
// channel exists in the graph.
43
type rejectCacheEntry struct {
44
        upd1Time int64
45
        upd2Time int64
46
        flags    rejectFlags
47
}
48

49
// rejectCache is an in-memory cache used to improve the performance of
50
// HasChannelEdge. It caches information about the whether or channel exists, as
51
// well as the most recent timestamps for each policy (if they exists).
52
type rejectCache struct {
53
        n     int
54
        edges map[uint64]rejectCacheEntry
55
}
56

57
// newRejectCache creates a new rejectCache with maximum capacity of n entries.
58
func newRejectCache(n int) *rejectCache {
3✔
59
        return &rejectCache{
3✔
60
                n:     n,
3✔
61
                edges: make(map[uint64]rejectCacheEntry, n),
3✔
62
        }
3✔
63
}
3✔
64

65
// get returns the entry from the cache for chanid, if it exists.
66
func (c *rejectCache) get(chanid uint64) (rejectCacheEntry, bool) {
3✔
67
        entry, ok := c.edges[chanid]
3✔
68
        return entry, ok
3✔
69
}
3✔
70

71
// insert adds the entry to the reject cache. If an entry for chanid already
72
// exists, it will be replaced with the new entry. If the entry doesn't exists,
73
// it will be inserted to the cache, performing a random eviction if the cache
74
// is at capacity.
75
func (c *rejectCache) insert(chanid uint64, entry rejectCacheEntry) {
3✔
76
        // If entry exists, replace it.
3✔
77
        if _, ok := c.edges[chanid]; ok {
6✔
78
                c.edges[chanid] = entry
3✔
79
                return
3✔
80
        }
3✔
81

82
        // Otherwise, evict an entry at random and insert.
83
        if len(c.edges) == c.n {
3✔
UNCOV
84
                for id := range c.edges {
×
UNCOV
85
                        delete(c.edges, id)
×
UNCOV
86
                        break
×
87
                }
88
        }
89
        c.edges[chanid] = entry
3✔
90
}
91

92
// remove deletes an entry for chanid from the cache, if it exists.
93
func (c *rejectCache) remove(chanid uint64) {
3✔
94
        delete(c.edges, chanid)
3✔
95
}
3✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc