github.com/decred/dcrlnd@v0.7.6/channeldb/channel_cache.go (about)

     1  package channeldb
     2  
     3  // channelCache is an in-memory cache used to improve the performance of
     4  // ChanUpdatesInHorizon. It caches the chan info and edge policies for a
     5  // particular channel.
     6  type channelCache struct {
     7  	n        int
     8  	channels map[uint64]ChannelEdge
     9  }
    10  
    11  // newChannelCache creates a new channelCache with maximum capacity of n
    12  // channels.
    13  func newChannelCache(n int) *channelCache {
    14  	return &channelCache{
    15  		n:        n,
    16  		channels: make(map[uint64]ChannelEdge),
    17  	}
    18  }
    19  
    20  // get returns the channel from the cache, if it exists.
    21  func (c *channelCache) get(chanid uint64) (ChannelEdge, bool) {
    22  	channel, ok := c.channels[chanid]
    23  	return channel, ok
    24  }
    25  
    26  // insert adds the entry to the channel cache. If an entry for chanid already
    27  // exists, it will be replaced with the new entry. If the entry doesn't exist,
    28  // it will be inserted to the cache, performing a random eviction if the cache
    29  // is at capacity.
    30  func (c *channelCache) insert(chanid uint64, channel ChannelEdge) {
    31  	// If entry exists, replace it.
    32  	if _, ok := c.channels[chanid]; ok {
    33  		c.channels[chanid] = channel
    34  		return
    35  	}
    36  
    37  	// Otherwise, evict an entry at random and insert.
    38  	if len(c.channels) == c.n {
    39  		for id := range c.channels {
    40  			delete(c.channels, id)
    41  			break
    42  		}
    43  	}
    44  	c.channels[chanid] = channel
    45  }
    46  
    47  // remove deletes an edge for chanid from the cache, if it exists.
    48  func (c *channelCache) remove(chanid uint64) {
    49  	delete(c.channels, chanid)
    50  }