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

lightningnetwork / lnd / 15838907453

24 Jun 2025 01:26AM UTC coverage: 57.079% (-11.1%) from 68.172%
15838907453

Pull #9982

github

web-flow
Merge e42780be2 into 45c15646c
Pull Request #9982: lnwire+lnwallet: add LocalNonces field for splice nonce coordination w/ taproot channels

103 of 167 new or added lines in 5 files covered. (61.68%)

30191 existing lines in 463 files now uncovered.

96331 of 168768 relevant lines covered (57.08%)

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

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

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

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

54
        // Fetch the block from the chain backends.
55
        msgBlock, err := getBlockImpl(hash)
1✔
56
        if err != nil {
1✔
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()
1✔
62
        block := btcutil.NewBlock(msgBlockCopy)
1✔
63

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

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