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

lightningnetwork / lnd / 15782265189

20 Jun 2025 03:23PM UTC coverage: 68.14% (-0.003%) from 68.143%
15782265189

Pull #9958

github

web-flow
Merge ae1a1d1ba into 7857d2c6a
Pull Request #9958: improve CloseChannel docs

134478 of 197355 relevant lines covered (68.14%)

22170.18 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 {
47✔
22
        return &BlockCache{
47✔
23
                Cache: lru.NewCache[wire.InvVect, *neutrino.CacheableBlock](
47✔
24
                        capacity,
47✔
25
                ),
47✔
26
                HashMutex: multimutex.NewMutex[lntypes.Hash](),
47✔
27
        }
47✔
28
}
47✔
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) {
1,469✔
37

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

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

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

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

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

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

76
        return msgBlockCopy, nil
1,271✔
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