MCPcopy Create free account
hub / github.com/OpenListTeam/OpenList / ensureCache

Method ensureCache

internal/stream/stream.go:198–224  ·  view source on GitHub ↗

*旧笔记 使用bytes.Buffer作为io.CopyBuffer的写入对象,CopyBuffer会调用Buffer.ReadFrom 即使被写入的数据量与Buffer.Cap一致,Buffer也会扩大 确保指定大小的数据被缓存

(size int64)

Source from the content-addressed store, hash-verified

196
197// 确保指定大小的数据被缓存
198func (f *FileStream) ensureCache(size int64) (model.File, error) {
199 if f.peek == nil {
200 blockSize := min(size, f.GetSize(), int64(conf.MaxBlockLimit))
201 var err error
202 f.hc, err = hcache.NewHybridCache(uint64(blockSize), uint64(f.GetSize()))
203 if err != nil {
204 return nil, err
205 }
206 f.peek = buffer.NewDynamicReadAtSeeker(f.hc)
207 f.oriReader = f.Reader
208 f.Reader = io.MultiReader(f.peek, f.oriReader)
209 f.Add(f.hc)
210 }
211 size = size - f.peek.Size()
212 if size <= 0 {
213 return f.peek, nil
214 }
215 written, err := f.hc.CopyFromN(f.oriReader, size)
216 if written != size {
217 f.hc.RewindBySize(uint64(size - written))
218 return nil, fmt.Errorf("failed to read all data: (expect =%d, actual =%d) %w", size, written, err)
219 }
220 if f.peek.Size() >= f.GetSize() {
221 f.Reader = f.peek
222 }
223 return f.peek, nil
224}
225
226var _ model.FileStreamer = (*SeekableStream)(nil)
227var _ model.FileStreamer = (*FileStream)(nil)

Callers 2

CacheFullAndWriterMethod · 0.95
RangeReadMethod · 0.95

Calls 7

GetSizeMethod · 0.95
NewDynamicReadAtSeekerFunction · 0.92
minFunction · 0.85
CopyFromNMethod · 0.80
RewindBySizeMethod · 0.80
AddMethod · 0.65
SizeMethod · 0.65

Tested by

no test coverage detected