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

Commit b3fc776

Browse files
committed
storage/filesystem: reuse delta cache
Reuse delta base object cache for packfile decoders across multiple instances.
1 parent f07672f commit b3fc776

File tree

2 files changed

+31
-11
lines changed

2 files changed

+31
-11
lines changed

plumbing/format/packfile/decoder.go

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ var (
5252
// is destroyed. The Offsets and CRCs are calculated whether an
5353
// ObjectStorer was provided or not.
5454
type Decoder struct {
55+
DeltaBaseCache cache.Object
56+
5557
s *Scanner
5658
o storer.EncodedObjectStorer
5759
tx storer.Transaction
@@ -65,8 +67,6 @@ type Decoder struct {
6567

6668
offsetToType map[int64]plumbing.ObjectType
6769
decoderType plumbing.ObjectType
68-
69-
cache cache.Object
7070
}
7171

7272
// NewDecoder returns a new Decoder that decodes a Packfile using the given
@@ -107,8 +107,6 @@ func NewDecoderForType(s *Scanner, o storer.EncodedObjectStorer,
107107
idx: NewIndex(0),
108108
offsetToType: make(map[int64]plumbing.ObjectType, 0),
109109
decoderType: t,
110-
111-
cache: cache.NewObjectFIFO(cache.MaxSize),
112110
}, nil
113111
}
114112

@@ -355,7 +353,7 @@ func (d *Decoder) fillREFDeltaObjectContent(obj plumbing.EncodedObject, ref plum
355353
return 0, err
356354
}
357355

358-
base, ok := d.cache.Get(ref)
356+
base, ok := d.cacheGet(ref)
359357
if !ok {
360358
base, err = d.recallByHash(ref)
361359
if err != nil {
@@ -365,7 +363,7 @@ func (d *Decoder) fillREFDeltaObjectContent(obj plumbing.EncodedObject, ref plum
365363

366364
obj.SetType(base.Type())
367365
err = ApplyDelta(obj, base, buf.Bytes())
368-
d.cache.Put(obj)
366+
d.cachePut(obj)
369367

370368
return crc, err
371369
}
@@ -380,7 +378,7 @@ func (d *Decoder) fillOFSDeltaObjectContent(obj plumbing.EncodedObject, offset i
380378
e, ok := d.idx.LookupOffset(uint64(offset))
381379
var base plumbing.EncodedObject
382380
if ok {
383-
base, ok = d.cache.Get(e.Hash)
381+
base, ok = d.cacheGet(e.Hash)
384382
}
385383

386384
if !ok {
@@ -392,11 +390,27 @@ func (d *Decoder) fillOFSDeltaObjectContent(obj plumbing.EncodedObject, offset i
392390

393391
obj.SetType(base.Type())
394392
err = ApplyDelta(obj, base, buf.Bytes())
395-
d.cache.Put(obj)
393+
d.cachePut(obj)
396394

397395
return crc, err
398396
}
399397

398+
func (d *Decoder) cacheGet(h plumbing.Hash) (plumbing.EncodedObject, bool) {
399+
if d.DeltaBaseCache == nil {
400+
return nil, false
401+
}
402+
403+
return d.DeltaBaseCache.Get(h)
404+
}
405+
406+
func (d *Decoder) cachePut(obj plumbing.EncodedObject) {
407+
if d.DeltaBaseCache == nil {
408+
return
409+
}
410+
411+
d.DeltaBaseCache.Put(obj)
412+
}
413+
400414
func (d *Decoder) recallByOffset(o int64) (plumbing.EncodedObject, error) {
401415
if d.s.IsSeekable {
402416
return d.DecodeObjectAt(o)
@@ -454,7 +468,5 @@ func (d *Decoder) Index() *Index {
454468
// Close closes the Scanner. usually this mean that the whole reader is read and
455469
// discarded
456470
func (d *Decoder) Close() error {
457-
d.cache.Clear()
458-
459471
return d.s.Close()
460472
}

storage/filesystem/object.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"os"
66

77
"gopkg.in/src-d/go-git.v4/plumbing"
8+
"gopkg.in/src-d/go-git.v4/plumbing/cache"
89
"gopkg.in/src-d/go-git.v4/plumbing/format/idxfile"
910
"gopkg.in/src-d/go-git.v4/plumbing/format/objfile"
1011
"gopkg.in/src-d/go-git.v4/plumbing/format/packfile"
@@ -16,14 +17,20 @@ import (
1617
"gopkg.in/src-d/go-billy.v3"
1718
)
1819

20+
const DefaultMaxDeltaBaseCacheSize = 92 * cache.MiByte
21+
1922
type ObjectStorage struct {
23+
// DeltaBaseCache is an object cache uses to cache delta's bases when
24+
DeltaBaseCache cache.Object
25+
2026
dir *dotgit.DotGit
2127
index map[plumbing.Hash]*packfile.Index
2228
}
2329

2430
func newObjectStorage(dir *dotgit.DotGit) (ObjectStorage, error) {
2531
s := ObjectStorage{
26-
dir: dir,
32+
DeltaBaseCache: cache.NewObjectFIFO(DefaultMaxDeltaBaseCacheSize),
33+
dir: dir,
2734
}
2835

2936
return s, nil
@@ -198,6 +205,7 @@ func (s *ObjectStorage) getFromPackfile(h plumbing.Hash) (plumbing.EncodedObject
198205
return nil, err
199206
}
200207

208+
d.DeltaBaseCache = s.DeltaBaseCache
201209
d.SetIndex(s.index[pack])
202210
obj, err := d.DecodeObjectAt(offset)
203211
return obj, err

0 commit comments

Comments
 (0)