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

lightningnetwork / lnd / 13980275562

20 Mar 2025 10:06PM UTC coverage: 58.6% (-10.2%) from 68.789%
13980275562

Pull #9623

github

web-flow
Merge b9b960345 into 09b674508
Pull Request #9623: Size msg test msg

0 of 1518 new or added lines in 42 files covered. (0.0%)

26603 existing lines in 443 files now uncovered.

96807 of 165200 relevant lines covered (58.6%)

1.82 hits per line

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

86.36
/blockcache/blockcache.go
1
package blockcache
2

3
import (
4
        "github.com/btcsuite/btcd/btcutil"
5
        "github.com/btcsuite/btcd/chaincfg/chainhash"
6
        "github.com/btcsuite/btcd/wire"
7
        "github.com/lightninglabs/neutrino"
8
        "github.com/lightninglabs/neutrino/cache"
9
        "github.com/lightninglabs/neutrino/cache/lru"
10
        "github.com/lightningnetwork/lnd/lntypes"
11
        "github.com/lightningnetwork/lnd/multimutex"
12
)
13

14
// BlockCache is an lru cache for blocks.
15
type BlockCache struct {
16
        Cache     *lru.Cache[wire.InvVect, *neutrino.CacheableBlock]
17
        HashMutex *multimutex.Mutex[lntypes.Hash]
18
}
19

20
// NewBlockCache creates a new BlockCache with the given maximum capacity.
21
func NewBlockCache(capacity uint64) *BlockCache {
3✔
22
        return &BlockCache{
3✔
23
                Cache: lru.NewCache[wire.InvVect, *neutrino.CacheableBlock](
3✔
24
                        capacity,
3✔
25
                ),
3✔
26
                HashMutex: multimutex.NewMutex[lntypes.Hash](),
3✔
27
        }
3✔
28
}
3✔
29

30
// GetBlock first checks to see if the BlockCache already contains the block
31
// with the given hash. If it does then the block is fetched from the cache and
32
// returned. Otherwise the getBlockImpl function is used in order to fetch the
33
// new block and then it is stored in the block cache and returned.
34
func (bc *BlockCache) GetBlock(hash *chainhash.Hash,
35
        getBlockImpl func(hash *chainhash.Hash) (*wire.MsgBlock,
36
                error)) (*wire.MsgBlock, error) {
2✔
37

2✔
38
        bc.HashMutex.Lock(lntypes.Hash(*hash))
2✔
39
        defer bc.HashMutex.Unlock(lntypes.Hash(*hash))
2✔
40

2✔
41
        // Create an inv vector for getting the block.
2✔
42
        inv := wire.NewInvVect(wire.InvTypeWitnessBlock, hash)
2✔
43

2✔
44
        // Check if the block corresponding to the given hash is already
2✔
45
        // stored in the blockCache and return it if it is.
2✔
46
        cacheBlock, err := bc.Cache.Get(*inv)
2✔
47
        if err != nil && err != cache.ErrElementNotFound {
2✔
48
                return nil, err
×
49
        }
×
50
        if cacheBlock != nil {
4✔
51
                return cacheBlock.MsgBlock(), nil
2✔
52
        }
2✔
53

54
        // Fetch the block from the chain backends.
55
        msgBlock, err := getBlockImpl(hash)
2✔
56
        if err != nil {
2✔
UNCOV
57
                return nil, err
×
UNCOV
58
        }
×
59

60
        // Make a copy of the block so it won't escape to the heap.
61
        msgBlockCopy := msgBlock.Copy()
2✔
62
        block := btcutil.NewBlock(msgBlockCopy)
2✔
63

2✔
64
        // Add the new block to blockCache. If the Cache is at its maximum
2✔
65
        // capacity then the LFU item will be evicted in favour of this new
2✔
66
        // block.
2✔
67
        _, err = bc.Cache.Put(
2✔
68
                *inv, &neutrino.CacheableBlock{
2✔
69
                        Block: block,
2✔
70
                },
2✔
71
        )
2✔
72
        if err != nil {
2✔
73
                return nil, err
×
74
        }
×
75

76
        return msgBlockCopy, nil
2✔
77
}
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