aboutsummaryrefslogtreecommitdiffstats
path: root/plumbing/cache/object.go
diff options
context:
space:
mode:
authorAntonio Jesus Navarro Perez <antonio@sourced.tech>2017-02-21 14:53:30 +0100
committerAntonio Jesus Navarro Perez <antonio@sourced.tech>2017-02-21 14:55:58 +0100
commit6e15f9cb0dbac68992eb242282e725784fe72b32 (patch)
tree04246d19a1c4814752599ff8d02da35c09f1dc20 /plumbing/cache/object.go
parent0b8b8da617d5a077f282e57d0300dc106a604236 (diff)
downloadgo-git-6e15f9cb0dbac68992eb242282e725784fe72b32.tar.gz
cache: move package to plumbing
Because cache package is only intended to be used at internal level, we move it to the plumbing package.
Diffstat (limited to 'plumbing/cache/object.go')
-rw-r--r--plumbing/cache/object.go68
1 files changed, 68 insertions, 0 deletions
diff --git a/plumbing/cache/object.go b/plumbing/cache/object.go
new file mode 100644
index 0000000..47e390b
--- /dev/null
+++ b/plumbing/cache/object.go
@@ -0,0 +1,68 @@
+package cache
+
+import "srcd.works/go-git.v4/plumbing"
+
+const (
+ initialQueueSize = 20
+ MaxSize = 10 * MiByte
+)
+
+type ObjectFIFO struct {
+ objects map[plumbing.Hash]plumbing.EncodedObject
+ order *queue
+
+ maxSize int64
+ actualSize int64
+}
+
+// NewObjectFIFO returns an Object cache that keeps the newest objects that fit
+// into the specific memory size
+func NewObjectFIFO(size int64) *ObjectFIFO {
+ return &ObjectFIFO{
+ objects: make(map[plumbing.Hash]plumbing.EncodedObject),
+ order: newQueue(initialQueueSize),
+ maxSize: size,
+ }
+}
+
+// Add adds a new object to the cache. If the object size is greater than the
+// cache size, the object is not added.
+func (c *ObjectFIFO) Add(o plumbing.EncodedObject) {
+ // if the size of the object is bigger or equal than the cache size,
+ // skip it
+ if o.Size() >= c.maxSize {
+ return
+ }
+
+ // if the object is into the cache, do not add it again
+ if _, ok := c.objects[o.Hash()]; ok {
+ return
+ }
+
+ // delete the oldest object if cache is full
+ if c.actualSize >= c.maxSize {
+ h := c.order.Pop()
+ o := c.objects[h]
+ if o != nil {
+ c.actualSize -= o.Size()
+ delete(c.objects, h)
+ }
+ }
+
+ c.objects[o.Hash()] = o
+ c.order.Push(o.Hash())
+ c.actualSize += o.Size()
+}
+
+// Get returns an object by his hash. If the object is not found in the cache, it
+// returns nil
+func (c *ObjectFIFO) Get(k plumbing.Hash) plumbing.EncodedObject {
+ return c.objects[k]
+}
+
+// Clear the content of this object cache
+func (c *ObjectFIFO) Clear() {
+ c.objects = make(map[plumbing.Hash]plumbing.EncodedObject)
+ c.order = newQueue(initialQueueSize)
+ c.actualSize = 0
+}