-
Notifications
You must be signed in to change notification settings - Fork 1
/
node.go
77 lines (65 loc) · 1.7 KB
/
node.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package main
import (
"context"
"errors"
"github.com/go-logr/logr"
"github.com/ipfs/go-block-format"
"github.com/ipfs/go-cid"
"github.com/ipfs/go-ipfs-blockstore"
)
var _ (BlockCache) = (*NodeBlockCache)(nil)
type NodeBlockCacheAPI interface {
ChainHasObj(ctx context.Context, obj cid.Cid) (bool, error)
ChainReadObj(ctx context.Context, obj cid.Cid) ([]byte, error)
}
type NodeBlockCache struct {
node NodeBlockCacheAPI
tlogger logr.Logger // request tracing
}
func NewNodeBlockCache(node NodeBlockCacheAPI, logger logr.Logger) *NodeBlockCache {
if logger == nil {
logger = logr.Discard()
}
return &NodeBlockCache{
node: node,
tlogger: logger.V(LogLevelTrace),
}
}
func (n *NodeBlockCache) Has(ctx context.Context, c cid.Cid) (bool, error) {
ctx = cacheContext(ctx, "node")
has, err := n.node.ChainHasObj(ctx, c)
if err != nil {
if errors.Is(err, blockstore.ErrNotFound) {
return false, err
}
if n.tlogger.Enabled() {
n.tlogger.Error(err, "Has failed", "block", c)
}
return false, err
}
return has, nil
}
func (n *NodeBlockCache) Get(ctx context.Context, c cid.Cid) (blocks.Block, error) {
ctx = cacheContext(ctx, "node")
reportEvent(ctx, getRequest)
stop := startTimer(ctx, getDuration)
defer stop()
data, err := n.node.ChainReadObj(ctx, c)
if err != nil {
if errors.Is(err, blockstore.ErrNotFound) {
reportEvent(ctx, getMiss)
return nil, err
}
reportEvent(ctx, getFailure)
if n.tlogger.Enabled() {
n.tlogger.Error(err, "Get failed", "block", c)
}
return nil, err
}
reportEvent(ctx, getHit)
reportSize(ctx, getSize, len(data))
return blocks.NewBlockWithCid(data, c)
}
func (n *NodeBlockCache) SetUpstream(u BlockCache) {
panic("Not supported")
}