Skip to content
This repository was archived by the owner on Sep 11, 2020. It is now read-only.

Commit 005d5dc

Browse files
authored
Merge pull request #929 from jfontan/fix/reuse-base-cache
plumbing, storage: add bases to the common cache
2 parents cdfa0bb + 790191e commit 005d5dc

File tree

3 files changed

+41
-2
lines changed

3 files changed

+41
-2
lines changed

plumbing/format/packfile/fsobject.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,16 @@ func NewFSObject(
4747

4848
// Reader implements the plumbing.EncodedObject interface.
4949
func (o *FSObject) Reader() (io.ReadCloser, error) {
50+
obj, ok := o.cache.Get(o.hash)
51+
if ok {
52+
reader, err := obj.Reader()
53+
if err != nil {
54+
return nil, err
55+
}
56+
57+
return reader, nil
58+
}
59+
5060
f, err := o.fs.Open(o.path)
5161
if err != nil {
5262
return nil, err

plumbing/format/packfile/packfile.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,19 @@ func (p *Packfile) nextObject() (plumbing.EncodedObject, error) {
258258
}
259259

260260
func (p *Packfile) getObjectContent(offset int64) (io.ReadCloser, error) {
261+
ref, err := p.FindHash(offset)
262+
if err == nil {
263+
obj, ok := p.cacheGet(ref)
264+
if ok {
265+
reader, err := obj.Reader()
266+
if err != nil {
267+
return nil, err
268+
}
269+
270+
return reader, nil
271+
}
272+
}
273+
261274
if _, err := p.s.SeekFromStart(offset); err != nil {
262275
return nil, err
263276
}
@@ -306,6 +319,8 @@ func (p *Packfile) fillRegularObjectContent(obj plumbing.EncodedObject) error {
306319
}
307320

308321
_, _, err = p.s.NextObject(w)
322+
p.cachePut(obj)
323+
309324
return err
310325
}
311326

storage/filesystem/object.go

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,14 @@ func (s *ObjectStorage) decodeObjectAt(
295295
return nil, err
296296
}
297297

298-
return packfile.NewPackfile(idx, s.dir.Fs(), f).GetByOffset(offset)
298+
var p *packfile.Packfile
299+
if s.deltaBaseCache != nil {
300+
p = packfile.NewPackfileWithCache(idx, s.dir.Fs(), f, s.deltaBaseCache)
301+
} else {
302+
p = packfile.NewPackfile(idx, s.dir.Fs(), f)
303+
}
304+
305+
return p.GetByOffset(offset)
299306
}
300307

301308
func (s *ObjectStorage) decodeDeltaObjectAt(
@@ -486,7 +493,14 @@ func newPackfileIter(
486493
index idxfile.Index,
487494
cache cache.Object,
488495
) (storer.EncodedObjectIter, error) {
489-
iter, err := packfile.NewPackfile(index, fs, f).GetByType(t)
496+
var p *packfile.Packfile
497+
if cache != nil {
498+
p = packfile.NewPackfileWithCache(index, fs, f, cache)
499+
} else {
500+
p = packfile.NewPackfile(index, fs, f)
501+
}
502+
503+
iter, err := p.GetByType(t)
490504
if err != nil {
491505
return nil, err
492506
}

0 commit comments

Comments
 (0)