(key string, offset uint64, len uint32)
| 211 | } |
| 212 | |
| 213 | func (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 | |
| 266 | func (bm *bcacheManager) load(key string) (ReadCloser, error) { |
| 267 | if len(bm.bstore) == 0 { |
nothing calls this directly
no test coverage detected