9
9
metrics "github.com/ipfs/go-metrics-interface"
10
10
)
11
11
12
+ type cacheHave bool
13
+ type cacheSize int
14
+
12
15
// arccache wraps a BlockStore with an Adaptive Replacement Cache (ARC) for
13
16
// block Cids. This provides block access-time improvements, allowing
14
17
// to short-cut many searches without query-ing the underlying datastore.
@@ -41,7 +44,7 @@ func (b *arccache) DeleteBlock(k *cid.Cid) error {
41
44
err := b .blockstore .DeleteBlock (k )
42
45
switch err {
43
46
case nil , ErrNotFound :
44
- b .addCache (k , - 1 )
47
+ b .cacheHave (k , false )
45
48
return err
46
49
default :
47
50
return err
@@ -62,21 +65,26 @@ func (b *arccache) hasCached(k *cid.Cid) (has bool, size int, ok bool) {
62
65
h , ok := b .arc .Get (k .KeyString ())
63
66
if ok {
64
67
b .hits .Inc ()
65
- if h .(int ) > - 1 {
66
- return true , h .(int ), true
67
- } else {
68
- return false , h .(int ), true
68
+ switch h := h .(type ) {
69
+ case cacheHave :
70
+ return bool (h ), - 1 , true
71
+ case cacheSize :
72
+ return true , int (h ), true
69
73
}
70
74
}
71
75
return false , - 1 , false
72
76
}
73
77
74
78
func (b * arccache ) Has (k * cid.Cid ) (bool , error ) {
75
- blockSize , err := b .GetSize (k )
76
- if err == ErrNotFound {
77
- return false , nil
79
+ if has , _ , ok := b .hasCached (k ); ok {
80
+ return has , nil
81
+ }
82
+ has , err := b .blockstore .Has (k )
83
+ if err != nil {
84
+ return false , err
78
85
}
79
- return blockSize > - 1 , err
86
+ b .cacheHave (k , has )
87
+ return has , nil
80
88
}
81
89
82
90
func (b * arccache ) GetSize (k * cid.Cid ) (int , error ) {
@@ -85,9 +93,9 @@ func (b *arccache) GetSize(k *cid.Cid) (int, error) {
85
93
}
86
94
blockSize , err := b .blockstore .GetSize (k )
87
95
if err == ErrNotFound {
88
- b .addCache (k , - 1 )
96
+ b .cacheHave (k , false )
89
97
} else if err == nil {
90
- b .addCache (k , blockSize )
98
+ b .cacheSize (k , blockSize )
91
99
}
92
100
return blockSize , err
93
101
}
@@ -104,9 +112,9 @@ func (b *arccache) Get(k *cid.Cid) (blocks.Block, error) {
104
112
105
113
bl , err := b .blockstore .Get (k )
106
114
if bl == nil && err == ErrNotFound {
107
- b .addCache (k , - 1 )
115
+ b .cacheHave (k , false )
108
116
} else if bl != nil {
109
- b .addCache (k , len (bl .RawData ()))
117
+ b .cacheSize (k , len (bl .RawData ()))
110
118
}
111
119
return bl , err
112
120
}
@@ -118,7 +126,7 @@ func (b *arccache) Put(bl blocks.Block) error {
118
126
119
127
err := b .blockstore .Put (bl )
120
128
if err == nil {
121
- b .addCache (bl .Cid (), len (bl .RawData ()))
129
+ b .cacheSize (bl .Cid (), len (bl .RawData ()))
122
130
}
123
131
return err
124
132
}
@@ -137,7 +145,7 @@ func (b *arccache) PutMany(bs []blocks.Block) error {
137
145
return err
138
146
}
139
147
for _ , block := range good {
140
- b .addCache (block .Cid (), len (block .RawData ()))
148
+ b .cacheSize (block .Cid (), len (block .RawData ()))
141
149
}
142
150
return nil
143
151
}
@@ -146,8 +154,12 @@ func (b *arccache) HashOnRead(enabled bool) {
146
154
b .blockstore .HashOnRead (enabled )
147
155
}
148
156
149
- func (b * arccache ) addCache (c * cid.Cid , blockSize int ) {
150
- b .arc .Add (c .KeyString (), blockSize )
157
+ func (b * arccache ) cacheHave (c * cid.Cid , have bool ) {
158
+ b .arc .Add (c .KeyString (), cacheHave (have ))
159
+ }
160
+
161
+ func (b * arccache ) cacheSize (c * cid.Cid , blockSize int ) {
162
+ b .arc .Add (c .KeyString (), cacheSize (blockSize ))
151
163
}
152
164
153
165
func (b * arccache ) AllKeysChan (ctx context.Context ) (<- chan * cid.Cid , error ) {
0 commit comments