MCPcopy
hub / github.com/cubefs/cubefs / read

Method read

client/blockcache/bcache/manage.go:213–264  ·  view source on GitHub ↗
(key string, offset uint64, len uint32)

Source from the content-addressed store, hash-verified

211}
212
213func (bm *bcacheManager) read(key string, offset uint64, len uint32) (io.ReadCloser, error) {
214 var err error
215 bgTime := stat.BeginStat()
216 defer func() {
217 stat.EndStat("GetCache:Read", err, bgTime, 1)
218 if err == nil {
219 stat.StatBandWidth("GetCache:Read", len)
220 }
221 }()
222 metaBgTime := stat.BeginStat()
223 bm.Lock()
224 element, ok := bm.bcacheKeys[key]
225 bm.Unlock()
226 stat.EndStat("GetCache:Read:GetMeta", nil, metaBgTime, 1)
227 log.LogDebugf("Trace read. ok =%v", ok)
228 if ok {
229 item := element.Value.(*cacheItem)
230 f, err := bm.load(key)
231 if os.IsNotExist(err) {
232 bm.Lock()
233 delete(bm.bcacheKeys, key)
234 bm.Unlock()
235 d := bm.selectDiskKv(key)
236 atomic.AddInt64(&d.usedSize, -int64(item.size))
237 atomic.AddInt64(&d.usedCount, -1)
238 return nil, os.ErrNotExist
239 }
240 if err != nil {
241 return nil, err
242 }
243 defer f.Close()
244 size := item.size
245 log.LogDebugf("read. offset =%v,len=%v size=%v", offset, len, size)
246 if uint32(offset)+len > size {
247 len = size - uint32(offset)
248 }
249 dataBgTime := stat.BeginStat()
250 buf := make([]byte, len)
251 n, err := f.ReadAt(buf, int64(offset))
252 stat.EndStat("GetCache:Read:ReadData", err, dataBgTime, 1)
253 if err != nil {
254 return nil, err
255 } else {
256 // decrypt
257 encryptXOR(buf[:n])
258 return io.NopCloser(bytes.NewBuffer(buf[:n])), nil
259 }
260 } else {
261 err = os.ErrNotExist
262 }
263 return nil, err
264}
265
266func (bm *bcacheManager) load(key string) (ReadCloser, error) {
267 if len(bm.bstore) == 0 {

Callers

nothing calls this directly

Calls 11

loadMethod · 0.95
selectDiskKvMethod · 0.95
BeginStatFunction · 0.92
EndStatFunction · 0.92
StatBandWidthFunction · 0.92
LogDebugfFunction · 0.92
encryptXORFunction · 0.85
LockMethod · 0.80
CloseMethod · 0.65
ReadAtMethod · 0.65
UnlockMethod · 0.45

Tested by

no test coverage detected