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

Commit 790191e

Browse files
committed
plumbing, storage: add bases to the common cache
After clone only resolved deltas were added to the cache. This caused slowdowns in small repositories where most objects can be held in cache. It also makes packfiles reuse delta cache from the store. Previously it created a new delta cache each time a packfile object was created. This also slowed down a bit accessing objects and had an impact on memory consumption when bases are added to the cache. Signed-off-by: Javi Fontan <jfontan@gmail.com>
1 parent cdfa0bb commit 790191e

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)