expand cache keys; note future optimizations

This commit is contained in:
Jordan Krage 2017-09-21 07:17:24 -05:00
Родитель 58a88e9508
Коммит d67284a3f3
2 изменённых файлов: 51 добавлений и 47 удалений

Просмотреть файл

@ -189,12 +189,12 @@ func (s *singleSourceCacheBolt) getManifestAndLock(rev Revision, ai ProjectAnaly
func (s *singleSourceCacheBolt) setPackageTree(rev Revision, ptree pkgtree.PackageTree) {
err := s.updateRevBucket(rev, func(b *bolt.Bucket) error {
if b.Bucket(cacheKeyP) != nil {
if err := b.DeleteBucket(cacheKeyP); err != nil {
if b.Bucket(cacheKeyPTree) != nil {
if err := b.DeleteBucket(cacheKeyPTree); err != nil {
return err
}
}
ptrees, err := b.CreateBucket(cacheKeyP)
ptrees, err := b.CreateBucket(cacheKeyPTree)
if err != nil {
return err
}
@ -218,7 +218,7 @@ func (s *singleSourceCacheBolt) setPackageTree(rev Revision, ptree pkgtree.Packa
func (s *singleSourceCacheBolt) getPackageTree(rev Revision) (ptree pkgtree.PackageTree, ok bool) {
err := s.viewRevBucket(rev, func(b *bolt.Bucket) error {
ptrees := b.Bucket(cacheKeyP)
ptrees := b.Bucket(cacheKeyPTree)
if ptrees == nil {
return nil
}
@ -260,19 +260,19 @@ func (s *singleSourceCacheBolt) markRevisionExists(rev Revision) {
func (s *singleSourceCacheBolt) setVersionMap(pvs []PairedVersion) {
err := s.updateSourceBucket(func(src *bolt.Bucket) error {
if err := cachePrefixDelete(src, cacheV); err != nil {
if err := cachePrefixDelete(src, cacheVersion); err != nil {
return err
}
vk := cacheTimestampedKey(cacheV, time.Now())
vk := cacheTimestampedKey(cacheVersion, time.Now())
versions, err := src.CreateBucket(vk)
if err != nil {
return err
}
c := src.Cursor()
for k, _ := c.Seek(cacheKeyR); len(k) > 0 && k[0] == cacheR; k, _ = c.Next() {
for k, _ := c.Seek(cacheKeyRevision); len(k) > 0 && k[0] == cacheRevision; k, _ = c.Next() {
rb := src.Bucket(k)
if err := cachePrefixDelete(rb, cacheV); err != nil {
if err := cachePrefixDelete(rb, cacheVersion); err != nil {
return err
}
}
@ -299,7 +299,7 @@ func (s *singleSourceCacheBolt) setVersionMap(pvs []PairedVersion) {
var versions *bolt.Bucket
if versions = revVersions[rev]; versions == nil {
err := cachePrefixDelete(b, cacheV)
err := cachePrefixDelete(b, cacheVersion)
if err != nil {
return err
}
@ -324,7 +324,7 @@ func (s *singleSourceCacheBolt) setVersionMap(pvs []PairedVersion) {
func (s *singleSourceCacheBolt) getVersionsFor(rev Revision) (uvs []UnpairedVersion, ok bool) {
err := s.viewRevBucket(rev, func(b *bolt.Bucket) error {
versions := cacheFindLatestValid(b, cacheV, s.epoch)
versions := cacheFindLatestValid(b, cacheVersion, s.epoch)
if versions == nil {
return nil
}
@ -354,7 +354,7 @@ func (s *singleSourceCacheBolt) getVersionsFor(rev Revision) (uvs []UnpairedVers
func (s *singleSourceCacheBolt) getAllVersions() []PairedVersion {
var pvs []PairedVersion
err := s.viewSourceBucket(func(src *bolt.Bucket) error {
versions := cacheFindLatestValid(src, cacheV, s.epoch)
versions := cacheFindLatestValid(src, cacheVersion, s.epoch)
if versions == nil {
return nil
}
@ -381,7 +381,7 @@ func (s *singleSourceCacheBolt) getAllVersions() []PairedVersion {
func (s *singleSourceCacheBolt) getRevisionFor(uv UnpairedVersion) (rev Revision, ok bool) {
err := s.viewSourceBucket(func(src *bolt.Bucket) error {
versions := cacheFindLatestValid(src, cacheV, s.epoch)
versions := cacheFindLatestValid(src, cacheVersion, s.epoch)
if versions == nil {
return nil
}
@ -429,7 +429,7 @@ func (s *singleSourceCacheBolt) toUnpaired(v Version) (uv UnpairedVersion, ok bo
return t.Unpair(), true
case Revision:
err := s.viewRevBucket(t, func(b *bolt.Bucket) error {
versions := cacheFindLatestValid(b, cacheV, s.epoch)
versions := cacheFindLatestValid(b, cacheVersion, s.epoch)
if versions == nil {
return nil
}

Просмотреть файл

@ -17,19 +17,22 @@ import (
)
var (
cacheKeyC = []byte("c")
cacheKeyE = []byte("e")
cacheKeyH = []byte("h")
cacheKeyI = []byte("i")
cacheKeyL = []byte("l")
cacheKeyN = []byte("n")
cacheKeyO = []byte("o")
cacheKeyP = []byte("p")
cacheKeyR = []byte("r")
cacheKeyT = []byte("t")
cacheKeyComment = []byte("c")
cacheKeyConstraint = cacheKeyComment
cacheKeyError = []byte("e")
cacheKeyHash = []byte("h")
cacheKeyIgnored = []byte("i")
cacheKeyImport = cacheKeyIgnored
cacheKeyLock = []byte("l")
cacheKeyName = []byte("n")
cacheKeyOverride = []byte("o")
cacheKeyPTree = []byte("p")
cacheKeyRequired = []byte("r")
cacheKeyRevision = cacheKeyRequired
cacheKeyTestImport = []byte("t")
cacheR = byte('r')
cacheV = byte('v')
cacheRevision = byte('r')
cacheVersion = byte('v')
)
// propertiesFromCache returns a new ProjectRoot and ProjectProperties with the fields from m.
@ -76,7 +79,7 @@ func cachePutManifest(b *bolt.Bucket, m Manifest) error {
constraints := m.DependencyConstraints()
if len(constraints) > 0 {
cs, err := b.CreateBucket(cacheKeyC)
cs, err := b.CreateBucket(cacheKeyConstraint)
if err != nil {
return err
}
@ -103,7 +106,7 @@ func cachePutManifest(b *bolt.Bucket, m Manifest) error {
ignored := rm.IgnoredPackages()
if len(ignored) > 0 {
ig, err := b.CreateBucket(cacheKeyI)
ig, err := b.CreateBucket(cacheKeyIgnored)
if err != nil {
return err
}
@ -122,7 +125,7 @@ func cachePutManifest(b *bolt.Bucket, m Manifest) error {
overrides := rm.Overrides()
if len(overrides) > 0 {
ovr, err := b.CreateBucket(cacheKeyO)
ovr, err := b.CreateBucket(cacheKeyOverride)
if err != nil {
return err
}
@ -144,7 +147,7 @@ func cachePutManifest(b *bolt.Bucket, m Manifest) error {
required := rm.RequiredPackages()
if len(required) > 0 {
req, err := b.CreateBucket(cacheKeyR)
req, err := b.CreateBucket(cacheKeyRequired)
if err != nil {
return err
}
@ -166,6 +169,7 @@ func cachePutManifest(b *bolt.Bucket, m Manifest) error {
// cacheGetManifest returns a new RootManifest with the data retrieved from the bolt.Bucket.
func cacheGetManifest(b *bolt.Bucket) (RootManifest, error) {
//TODO consider storing slice/map lens to enable calling make() with capacity
m := &simpleRootManifest{
c: make(ProjectConstraints),
ovr: make(ProjectConstraints),
@ -174,7 +178,7 @@ func cacheGetManifest(b *bolt.Bucket) (RootManifest, error) {
}
// Constraints
if cs := b.Bucket(cacheKeyC); cs != nil {
if cs := b.Bucket(cacheKeyConstraint); cs != nil {
var msg pb.ProjectProperties
err := cs.ForEach(func(_, v []byte) error {
if err := proto.Unmarshal(v, &msg); err != nil {
@ -193,7 +197,7 @@ func cacheGetManifest(b *bolt.Bucket) (RootManifest, error) {
}
// Ignored
if ig := b.Bucket(cacheKeyI); ig != nil {
if ig := b.Bucket(cacheKeyIgnored); ig != nil {
err := ig.ForEach(func(_, v []byte) error {
m.ig[string(v)] = true
return nil
@ -204,7 +208,7 @@ func cacheGetManifest(b *bolt.Bucket) (RootManifest, error) {
}
// Overrides
if os := b.Bucket(cacheKeyO); os != nil {
if os := b.Bucket(cacheKeyOverride); os != nil {
var msg pb.ProjectProperties
err := os.ForEach(func(_, v []byte) error {
if err := proto.Unmarshal(v, &msg); err != nil {
@ -223,7 +227,7 @@ func cacheGetManifest(b *bolt.Bucket) (RootManifest, error) {
}
// Required
if req := b.Bucket(cacheKeyR); req != nil {
if req := b.Bucket(cacheKeyRequired); req != nil {
err := req.ForEach(func(_, v []byte) error {
m.req[string(v)] = true
return nil
@ -275,14 +279,14 @@ func lockedProjectFromCache(m *pb.LockedProject) (LockedProject, error) {
func cachePutLock(b *bolt.Bucket, l Lock) error {
// InputHash
if v := l.InputHash(); len(v) > 0 {
if err := b.Put(cacheKeyH, v); err != nil {
if err := b.Put(cacheKeyHash, v); err != nil {
return errors.Wrap(err, "failed to put hash")
}
}
// Projects
if projects := l.Projects(); len(projects) > 0 {
lb, err := b.CreateBucket(cacheKeyL)
lb, err := b.CreateBucket(cacheKeyLock)
if err != nil {
return err
}
@ -308,9 +312,9 @@ func cachePutLock(b *bolt.Bucket, l Lock) error {
// cacheGetLock returns a new *safeLock with the fields retrieved from the bolt.Bucket.
func cacheGetLock(b *bolt.Bucket) (*safeLock, error) {
l := &safeLock{
h: b.Get(cacheKeyH),
h: b.Get(cacheKeyHash),
}
if locked := b.Bucket(cacheKeyL); locked != nil {
if locked := b.Bucket(cacheKeyLock); locked != nil {
var msg pb.LockedProject
err := locked.ForEach(func(_, v []byte) error {
if err := proto.Unmarshal(v, &msg); err != nil {
@ -333,17 +337,17 @@ func cacheGetLock(b *bolt.Bucket) (*safeLock, error) {
// cachePutPackageOrError stores the pkgtree.PackageOrErr as fields in the bolt.Bucket.
func cachePutPackageOrErr(b *bolt.Bucket, poe pkgtree.PackageOrErr) error {
if poe.Err != nil {
err := b.Put(cacheKeyE, []byte(poe.Err.Error()))
err := b.Put(cacheKeyError, []byte(poe.Err.Error()))
return errors.Wrapf(err, "failed to put error: %v", poe.Err)
}
if len(poe.P.CommentPath) > 0 {
err := b.Put(cacheKeyC, []byte(poe.P.CommentPath))
err := b.Put(cacheKeyComment, []byte(poe.P.CommentPath))
if err != nil {
return errors.Wrapf(err, "failed to put package: %v", poe.P)
}
}
if len(poe.P.Imports) > 0 {
ip, err := b.CreateBucket(cacheKeyI)
ip, err := b.CreateBucket(cacheKeyImport)
if err != nil {
return err
}
@ -358,14 +362,14 @@ func cachePutPackageOrErr(b *bolt.Bucket, poe pkgtree.PackageOrErr) error {
}
if len(poe.P.Name) > 0 {
err := b.Put(cacheKeyN, []byte(poe.P.Name))
err := b.Put(cacheKeyName, []byte(poe.P.Name))
if err != nil {
return errors.Wrapf(err, "failed to put package: %v", poe.P)
}
}
if len(poe.P.TestImports) > 0 {
ip, err := b.CreateBucket(cacheKeyT)
ip, err := b.CreateBucket(cacheKeyTestImport)
if err != nil {
return err
}
@ -384,15 +388,15 @@ func cachePutPackageOrErr(b *bolt.Bucket, poe pkgtree.PackageOrErr) error {
// cacheGetPackageOrErr returns a new pkgtree.PackageOrErr with fields retrieved
// from the bolt.Bucket.
func cacheGetPackageOrErr(b *bolt.Bucket) (pkgtree.PackageOrErr, error) {
if v := b.Get(cacheKeyE); len(v) > 0 {
if v := b.Get(cacheKeyError); len(v) > 0 {
return pkgtree.PackageOrErr{
Err: errors.New(string(v)),
}, nil
}
var p pkgtree.Package
p.CommentPath = string(b.Get(cacheKeyC))
if ip := b.Bucket(cacheKeyI); ip != nil {
p.CommentPath = string(b.Get(cacheKeyComment))
if ip := b.Bucket(cacheKeyImport); ip != nil {
err := ip.ForEach(func(_, v []byte) error {
p.Imports = append(p.Imports, string(v))
return nil
@ -401,8 +405,8 @@ func cacheGetPackageOrErr(b *bolt.Bucket) (pkgtree.PackageOrErr, error) {
return pkgtree.PackageOrErr{}, err
}
}
p.Name = string(b.Get(cacheKeyN))
if tip := b.Bucket(cacheKeyT); tip != nil {
p.Name = string(b.Get(cacheKeyName))
if tip := b.Bucket(cacheKeyTestImport); tip != nil {
err := tip.ForEach(func(_, v []byte) error {
p.TestImports = append(p.TestImports, string(v))
return nil