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

Commit 166626d

Browse files
authored
Merge pull request #1138 from jmank88/multi_cache
gps: source cache: adding multiCache
2 parents 92657ba + 902ea2b commit 166626d

File tree

2 files changed

+182
-2
lines changed

2 files changed

+182
-2
lines changed

internal/gps/source_cache_multi.go

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
// Copyright 2017 The Go Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
5+
package gps
6+
7+
import (
8+
"github.com/golang/dep/internal/gps/pkgtree"
9+
)
10+
11+
// A multiCache manages two cache levels, ephemeral in-memory and persistent on-disk.
12+
//
13+
// The in-memory cache is always checked first, with the on-disk used as a fallback.
14+
// Values read from disk are set in-memory when an appropriate method exists.
15+
//
16+
// Set values are cached both in-memory and on-disk.
17+
type multiCache struct {
18+
mem, disk singleSourceCache
19+
}
20+
21+
func (c *multiCache) setManifestAndLock(r Revision, ai ProjectAnalyzerInfo, m Manifest, l Lock) {
22+
c.mem.setManifestAndLock(r, ai, m, l)
23+
c.disk.setManifestAndLock(r, ai, m, l)
24+
}
25+
26+
func (c *multiCache) getManifestAndLock(r Revision, ai ProjectAnalyzerInfo) (Manifest, Lock, bool) {
27+
m, l, ok := c.mem.getManifestAndLock(r, ai)
28+
if ok {
29+
return m, l, true
30+
}
31+
32+
m, l, ok = c.disk.getManifestAndLock(r, ai)
33+
if ok {
34+
c.mem.setManifestAndLock(r, ai, m, l)
35+
return m, l, true
36+
}
37+
38+
return nil, nil, false
39+
}
40+
41+
func (c *multiCache) setPackageTree(r Revision, ptree pkgtree.PackageTree) {
42+
c.mem.setPackageTree(r, ptree)
43+
c.disk.setPackageTree(r, ptree)
44+
}
45+
46+
func (c *multiCache) getPackageTree(r Revision) (pkgtree.PackageTree, bool) {
47+
ptree, ok := c.mem.getPackageTree(r)
48+
if ok {
49+
return ptree, true
50+
}
51+
52+
ptree, ok = c.disk.getPackageTree(r)
53+
if ok {
54+
c.mem.setPackageTree(r, ptree)
55+
return ptree, true
56+
}
57+
58+
return pkgtree.PackageTree{}, false
59+
}
60+
61+
func (c *multiCache) markRevisionExists(r Revision) {
62+
c.mem.markRevisionExists(r)
63+
c.disk.markRevisionExists(r)
64+
}
65+
66+
func (c *multiCache) setVersionMap(pvs []PairedVersion) {
67+
c.mem.setVersionMap(pvs)
68+
c.disk.setVersionMap(pvs)
69+
}
70+
71+
func (c *multiCache) getVersionsFor(rev Revision) ([]UnpairedVersion, bool) {
72+
uvs, ok := c.mem.getVersionsFor(rev)
73+
if ok {
74+
return uvs, true
75+
}
76+
77+
return c.disk.getVersionsFor(rev)
78+
}
79+
80+
func (c *multiCache) getAllVersions() []PairedVersion {
81+
pvs := c.mem.getAllVersions()
82+
if pvs != nil {
83+
return pvs
84+
}
85+
86+
pvs = c.disk.getAllVersions()
87+
if pvs != nil {
88+
c.mem.setVersionMap(pvs)
89+
return pvs
90+
}
91+
92+
return nil
93+
}
94+
95+
func (c *multiCache) getRevisionFor(uv UnpairedVersion) (Revision, bool) {
96+
rev, ok := c.mem.getRevisionFor(uv)
97+
if ok {
98+
return rev, true
99+
}
100+
101+
return c.disk.getRevisionFor(uv)
102+
}
103+
104+
func (c *multiCache) toRevision(v Version) (Revision, bool) {
105+
rev, ok := c.mem.toRevision(v)
106+
if ok {
107+
return rev, true
108+
}
109+
110+
return c.disk.toRevision(v)
111+
}
112+
113+
func (c *multiCache) toUnpaired(v Version) (UnpairedVersion, bool) {
114+
uv, ok := c.mem.toUnpaired(v)
115+
if ok {
116+
return uv, true
117+
}
118+
119+
return c.disk.toUnpaired(v)
120+
}

internal/gps/source_cache_test.go

Lines changed: 62 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,29 @@ func Test_singleSourceCache(t *testing.T) {
3131
}
3232
return bc.newSingleSourceCache(pi), bc.close
3333
}
34-
t.Run("bolt/open", singleSourceCacheTest{newCache: newBolt}.run)
35-
t.Run("bolt/refresh", singleSourceCacheTest{newCache: newBolt, persistent: true}.run)
34+
t.Run("bolt/keepOpen", singleSourceCacheTest{newCache: newBolt}.run)
35+
t.Run("bolt/reOpen", singleSourceCacheTest{newCache: newBolt, persistent: true}.run)
36+
37+
newMulti := func(t *testing.T, cachedir, root string) (singleSourceCache, func() error) {
38+
disk, close := newBolt(t, cachedir, root)
39+
return &multiCache{mem: newMemoryCache(), disk: disk}, close
40+
}
41+
t.Run("multi/keepOpen", singleSourceCacheTest{newCache: newMulti}.run)
42+
t.Run("multi/reOpen", singleSourceCacheTest{persistent: true, newCache: newMulti}.run)
43+
44+
t.Run("multi/keepOpen/noDisk", singleSourceCacheTest{
45+
newCache: func(*testing.T, string, string) (singleSourceCache, func() error) {
46+
return &multiCache{mem: newMemoryCache(), disk: discardCache{}}, func() error { return nil }
47+
},
48+
}.run)
49+
50+
t.Run("multi/reOpen/noMem", singleSourceCacheTest{
51+
persistent: true,
52+
newCache: func(t *testing.T, cachedir, root string) (singleSourceCache, func() error) {
53+
disk, close := newBolt(t, cachedir, root)
54+
return &multiCache{mem: discardCache{}, disk: disk}, close
55+
},
56+
}.run)
3657
}
3758

3859
var testAnalyzerInfo = ProjectAnalyzerInfo{
@@ -521,3 +542,42 @@ func packageOrErrEqual(a, b pkgtree.PackageOrErr) bool {
521542

522543
return true
523544
}
545+
546+
// discardCache discards set values and returns nothing.
547+
type discardCache struct{}
548+
549+
func (discardCache) setManifestAndLock(Revision, ProjectAnalyzerInfo, Manifest, Lock) {}
550+
551+
func (discardCache) getManifestAndLock(Revision, ProjectAnalyzerInfo) (Manifest, Lock, bool) {
552+
return nil, nil, false
553+
}
554+
555+
func (discardCache) setPackageTree(Revision, pkgtree.PackageTree) {}
556+
557+
func (discardCache) getPackageTree(Revision) (pkgtree.PackageTree, bool) {
558+
return pkgtree.PackageTree{}, false
559+
}
560+
561+
func (discardCache) markRevisionExists(r Revision) {}
562+
563+
func (discardCache) setVersionMap(versionList []PairedVersion) {}
564+
565+
func (discardCache) getVersionsFor(Revision) ([]UnpairedVersion, bool) {
566+
return nil, false
567+
}
568+
569+
func (discardCache) getAllVersions() []PairedVersion {
570+
return nil
571+
}
572+
573+
func (discardCache) getRevisionFor(UnpairedVersion) (Revision, bool) {
574+
return "", false
575+
}
576+
577+
func (discardCache) toRevision(v Version) (Revision, bool) {
578+
return "", false
579+
}
580+
581+
func (discardCache) toUnpaired(v Version) (UnpairedVersion, bool) {
582+
return nil, false
583+
}

0 commit comments

Comments
 (0)