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

Commit 235cdec

Browse files
committed
gps: source cache: clean up bolt cache
1 parent 1d22fcc commit 235cdec

File tree

1 file changed

+27
-16
lines changed

1 file changed

+27
-16
lines changed

internal/gps/source_cache_bolt.go

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ func (s *singleSourceCacheBolt) close() error {
9393
}
9494

9595
func (s *singleSourceCacheBolt) setManifestAndLock(rev Revision, ai ProjectAnalyzerInfo, m Manifest, l Lock) {
96-
err := s.updateBucket("rev:"+string(rev), func(b *bolt.Bucket) error {
96+
err := s.updateRevBucket(rev, func(b *bolt.Bucket) error {
9797
pre := "info:" + ai.String() + ":"
9898
if err := cachePrefixDelete(b, pre); err != nil {
9999
return err
@@ -128,7 +128,7 @@ func (s *singleSourceCacheBolt) setManifestAndLock(rev Revision, ai ProjectAnaly
128128
}
129129

130130
func (s *singleSourceCacheBolt) getManifestAndLock(rev Revision, ai ProjectAnalyzerInfo) (m Manifest, l Lock, ok bool) {
131-
err := s.viewBucket("rev:"+string(rev), func(b *bolt.Bucket) error {
131+
err := s.viewRevBucket(rev, func(b *bolt.Bucket) error {
132132
info := cacheFindLatestValid(b, "info:"+ai.String()+":", s.epoch)
133133
if info == nil {
134134
return nil
@@ -166,7 +166,7 @@ func (s *singleSourceCacheBolt) getManifestAndLock(rev Revision, ai ProjectAnaly
166166
}
167167

168168
func (s *singleSourceCacheBolt) setPackageTree(rev Revision, ptree pkgtree.PackageTree) {
169-
err := s.updateBucket("rev:"+string(rev), func(b *bolt.Bucket) error {
169+
err := s.updateRevBucket(rev, func(b *bolt.Bucket) error {
170170
if err := cachePrefixDelete(b, "ptree:"); err != nil {
171171
return err
172172
}
@@ -193,7 +193,7 @@ func (s *singleSourceCacheBolt) setPackageTree(rev Revision, ptree pkgtree.Packa
193193
}
194194

195195
func (s *singleSourceCacheBolt) getPackageTree(rev Revision) (ptree pkgtree.PackageTree, ok bool) {
196-
err := s.viewBucket("rev:"+string(rev), func(b *bolt.Bucket) error {
196+
err := s.viewRevBucket(rev, func(b *bolt.Bucket) error {
197197
ptrees := cacheFindLatestValid(b, "ptree:", s.epoch)
198198
if ptrees == nil {
199199
return nil
@@ -223,7 +223,7 @@ func (s *singleSourceCacheBolt) getPackageTree(rev Revision) (ptree pkgtree.Pack
223223
}
224224

225225
func (s *singleSourceCacheBolt) markRevisionExists(rev Revision) {
226-
err := s.updateBucket("rev:"+string(rev), func(versions *bolt.Bucket) error {
226+
err := s.updateRevBucket(rev, func(versions *bolt.Bucket) error {
227227
return nil
228228
})
229229
if err != nil {
@@ -243,8 +243,7 @@ func (s *singleSourceCacheBolt) setVersionMap(pvs []PairedVersion) {
243243
}
244244

245245
c := tx.Cursor()
246-
pre := []byte("rev:")
247-
for k, _ := c.Seek(pre); bytes.HasPrefix(k, pre); k, _ = c.Next() {
246+
for k, _ := c.Seek(cacheRev); bytes.HasPrefix(k, cacheRev); k, _ = c.Next() {
248247
rb := tx.Bucket(k)
249248
if err := cachePrefixDelete(rb, "versions:"); err != nil {
250249
return err
@@ -262,7 +261,7 @@ func (s *singleSourceCacheBolt) setVersionMap(pvs []PairedVersion) {
262261
return errors.Wrap(err, "failed to put version->revision")
263262
}
264263

265-
b, err := tx.CreateBucketIfNotExists([]byte("rev:" + rev))
264+
b, err := tx.CreateBucketIfNotExists(cacheRevisionName(rev))
266265
if err != nil {
267266
return errors.Wrapf(err, "failed to create bucket for revision: %s", rev)
268267
}
@@ -291,7 +290,7 @@ func (s *singleSourceCacheBolt) setVersionMap(pvs []PairedVersion) {
291290
}
292291

293292
func (s *singleSourceCacheBolt) getVersionsFor(rev Revision) (uvs []UnpairedVersion, ok bool) {
294-
err := s.viewBucket("rev:"+string(rev), func(b *bolt.Bucket) error {
293+
err := s.viewRevBucket(rev, func(b *bolt.Bucket) error {
295294
versions := cacheFindLatestValid(b, "versions:", s.epoch)
296295
if versions == nil {
297296
return nil
@@ -385,7 +384,7 @@ func (s *singleSourceCacheBolt) toUnpaired(v Version) (uv UnpairedVersion, ok bo
385384
case PairedVersion:
386385
return t.Unpair(), true
387386
case Revision:
388-
err := s.viewBucket("rev:"+string(t), func(b *bolt.Bucket) error {
387+
err := s.viewRevBucket(t, func(b *bolt.Bucket) error {
389388
versions := cacheFindLatestValid(b, "versions:", s.epoch)
390389
if versions == nil {
391390
return nil
@@ -414,21 +413,33 @@ func (s *singleSourceCacheBolt) toUnpaired(v Version) (uv UnpairedVersion, ok bo
414413
}
415414
}
416415

417-
// viewBucket executes view with the named bucket, if it exists.
418-
func (s *singleSourceCacheBolt) viewBucket(name string, view func(b *bolt.Bucket) error) error {
416+
// cache revision bucket prefix.
417+
var cacheRev = []byte("rev:")
418+
419+
// cacheRevisionName returns the bucket name for rev.
420+
func cacheRevisionName(rev Revision) []byte {
421+
name := make([]byte, len(cacheRev)+len(rev))
422+
copy(name, cacheRev)
423+
copy(name[len(cacheRev):], string(rev))
424+
return name
425+
}
426+
427+
// viewRevBucket executes view with rev's bucket, if it exists.
428+
func (s *singleSourceCacheBolt) viewRevBucket(rev Revision, view func(b *bolt.Bucket) error) error {
419429
return s.db.View(func(tx *bolt.Tx) error {
420-
b := tx.Bucket([]byte(name))
430+
b := tx.Bucket(cacheRevisionName(rev))
421431
if b == nil {
422432
return nil
423433
}
424434
return view(b)
425435
})
426436
}
427437

428-
// updateBucket executes update with the named bucket, creating it first if necessary.
429-
func (s *singleSourceCacheBolt) updateBucket(name string, update func(b *bolt.Bucket) error) error {
438+
// updateRevBucket executes update with rev's bucket, creating it first if necessary.
439+
func (s *singleSourceCacheBolt) updateRevBucket(rev Revision, update func(b *bolt.Bucket) error) error {
430440
return s.db.Update(func(tx *bolt.Tx) error {
431-
b, err := tx.CreateBucketIfNotExists([]byte(name))
441+
name := cacheRevisionName(rev)
442+
b, err := tx.CreateBucketIfNotExists(name)
432443
if err != nil {
433444
return errors.Wrapf(err, "failed to create bucket: %s", name)
434445
}

0 commit comments

Comments
 (0)