Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion cache/remotecache/v1/cachestorage.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package cacheimport

import (
"context"
"time"

"github.com/moby/buildkit/identity"
"github.com/moby/buildkit/solver"
Expand Down Expand Up @@ -191,7 +192,7 @@ type cacheResultStorage struct {
byResult map[string]map[string]struct{}
}

func (cs *cacheResultStorage) Save(res solver.Result) (solver.CacheResult, error) {
func (cs *cacheResultStorage) Save(res solver.Result, createdAt time.Time) (solver.CacheResult, error) {
return solver.CacheResult{}, errors.Errorf("importer is immutable")
}

Expand Down
13 changes: 13 additions & 0 deletions cache/remotecache/v1/chains.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package cacheimport

import (
"strings"
"time"

"github.com/containerd/containerd/content"
Expand All @@ -19,6 +20,9 @@ type CacheChains struct {
}

func (c *CacheChains) Add(dgst digest.Digest) solver.CacheExporterRecord {
if strings.HasPrefix(dgst.String(), "random:") {
return &nopRecord{}
}
it := &item{c: c, dgst: dgst}
c.items = append(c.items, it)
return it
Expand Down Expand Up @@ -124,4 +128,13 @@ func (c *item) LinkFrom(rec solver.CacheExporterRecord, index int, selector stri
c.links[index][link{src: src, selector: selector}] = struct{}{}
}

type nopRecord struct {
}

func (c *nopRecord) AddResult(createdAt time.Time, result *solver.Remote) {
}

func (c *nopRecord) LinkFrom(rec solver.CacheExporterRecord, index int, selector string) {
}

var _ solver.CacheExporterTarget = &CacheChains{}
35 changes: 18 additions & 17 deletions solver/cache_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package solver
import (
"context"
"testing"
"time"

"github.com/moby/buildkit/identity"
digest "github.com/opencontainers/go-digest"
Expand Down Expand Up @@ -41,7 +42,7 @@ func TestInMemoryCache(t *testing.T) {

m := NewInMemoryCacheManager()

cacheFoo, err := m.Save(NewCacheKey(dgst("foo"), 0), testResult("result0"))
cacheFoo, err := m.Save(NewCacheKey(dgst("foo"), 0), testResult("result0"), time.Now())
require.NoError(t, err)

keys, err := m.Query(nil, 0, dgst("foo"), 0)
Expand All @@ -57,7 +58,7 @@ func TestInMemoryCache(t *testing.T) {
require.Equal(t, "result0", unwrap(res))

// another record
cacheBar, err := m.Save(NewCacheKey(dgst("bar"), 0), testResult("result1"))
cacheBar, err := m.Save(NewCacheKey(dgst("bar"), 0), testResult("result1"), time.Now())
require.NoError(t, err)

keys, err = m.Query(nil, 0, dgst("bar"), 0)
Expand All @@ -79,7 +80,7 @@ func TestInMemoryCache(t *testing.T) {

// second level
k := testCacheKey(dgst("baz"), Index(1), *cacheFoo, *cacheBar)
cacheBaz, err := m.Save(k, testResult("result2"))
cacheBaz, err := m.Save(k, testResult("result2"), time.Now())
require.NoError(t, err)

keys, err = m.Query(nil, 0, dgst("baz"), 0)
Expand Down Expand Up @@ -113,7 +114,7 @@ func TestInMemoryCache(t *testing.T) {
require.Equal(t, keys[0].ID, keys2[0].ID)

k = testCacheKey(dgst("baz"), Index(1), *cacheFoo)
_, err = m.Save(k, testResult("result3"))
_, err = m.Save(k, testResult("result3"), time.Now())
require.NoError(t, err)

keys, err = m.Query(depKeys(*cacheFoo), 0, dgst("baz"), Index(1))
Expand All @@ -128,7 +129,7 @@ func TestInMemoryCache(t *testing.T) {
{{CacheKey: *cacheFoo}, {CacheKey: *cacheBaz}},
{{CacheKey: *cacheBar}},
})
_, err = m.Save(k, testResult("result4"))
_, err = m.Save(k, testResult("result4"), time.Now())
require.NoError(t, err)

// foo, bar, baz should all point to result4
Expand All @@ -154,12 +155,12 @@ func TestInMemoryCacheSelector(t *testing.T) {

m := NewInMemoryCacheManager()

cacheFoo, err := m.Save(NewCacheKey(dgst("foo"), 0), testResult("result0"))
cacheFoo, err := m.Save(NewCacheKey(dgst("foo"), 0), testResult("result0"), time.Now())
require.NoError(t, err)

_, err = m.Save(testCacheKeyWithDeps(dgst("bar"), 0, [][]CacheKeyWithSelector{
{{CacheKey: *cacheFoo, Selector: dgst("sel0")}},
}), testResult("result1"))
}), testResult("result1"), time.Now())
require.NoError(t, err)

keys, err := m.Query(depKeys(*cacheFoo), 0, dgst("bar"), 0)
Expand Down Expand Up @@ -188,12 +189,12 @@ func TestInMemoryCacheSelectorNested(t *testing.T) {

m := NewInMemoryCacheManager()

cacheFoo, err := m.Save(NewCacheKey(dgst("foo"), 0), testResult("result0"))
cacheFoo, err := m.Save(NewCacheKey(dgst("foo"), 0), testResult("result0"), time.Now())
require.NoError(t, err)

_, err = m.Save(testCacheKeyWithDeps(dgst("bar"), 0, [][]CacheKeyWithSelector{
{{CacheKey: *cacheFoo, Selector: dgst("sel0")}, {CacheKey: expKey(NewCacheKey(dgst("second"), 0))}},
}), testResult("result1"))
}), testResult("result1"), time.Now())
require.NoError(t, err)

keys, err := m.Query(
Expand Down Expand Up @@ -241,11 +242,11 @@ func TestInMemoryCacheReleaseParent(t *testing.T) {
m := NewCacheManager(identity.NewID(), storage, results)

res0 := testResult("result0")
cacheFoo, err := m.Save(NewCacheKey(dgst("foo"), 0), res0)
cacheFoo, err := m.Save(NewCacheKey(dgst("foo"), 0), res0, time.Now())
require.NoError(t, err)

res1 := testResult("result1")
_, err = m.Save(testCacheKey(dgst("bar"), 0, *cacheFoo), res1)
_, err = m.Save(testCacheKey(dgst("bar"), 0, *cacheFoo), res1, time.Now())
require.NoError(t, err)

keys, err := m.Query(nil, 0, dgst("foo"), 0)
Expand Down Expand Up @@ -293,15 +294,15 @@ func TestInMemoryCacheRestoreOfflineDeletion(t *testing.T) {
m := NewCacheManager(identity.NewID(), storage, results)

res0 := testResult("result0")
cacheFoo, err := m.Save(NewCacheKey(dgst("foo"), 0), res0)
cacheFoo, err := m.Save(NewCacheKey(dgst("foo"), 0), res0, time.Now())
require.NoError(t, err)

res1 := testResult("result1")
_, err = m.Save(testCacheKey(dgst("bar"), 0, *cacheFoo), res1)
_, err = m.Save(testCacheKey(dgst("bar"), 0, *cacheFoo), res1, time.Now())
require.NoError(t, err)

results2 := NewInMemoryResultStorage()
_, err = results2.Save(res1) // only add bar
_, err = results2.Save(res1, time.Now()) // only add bar
require.NoError(t, err)

m = NewCacheManager(identity.NewID(), storage, results2)
Expand All @@ -328,15 +329,15 @@ func TestCarryOverFromSublink(t *testing.T) {
results := NewInMemoryResultStorage()
m := NewCacheManager(identity.NewID(), storage, results)

cacheFoo, err := m.Save(NewCacheKey(dgst("foo"), 0), testResult("resultFoo"))
cacheFoo, err := m.Save(NewCacheKey(dgst("foo"), 0), testResult("resultFoo"), time.Now())
require.NoError(t, err)

_, err = m.Save(testCacheKeyWithDeps(dgst("res"), 0, [][]CacheKeyWithSelector{
{{CacheKey: *cacheFoo, Selector: dgst("sel0")}, {CacheKey: expKey(NewCacheKey(dgst("content0"), 0))}},
}), testResult("result0"))
}), testResult("result0"), time.Now())
require.NoError(t, err)

cacheBar, err := m.Save(NewCacheKey(dgst("bar"), 0), testResult("resultBar"))
cacheBar, err := m.Save(NewCacheKey(dgst("bar"), 0), testResult("resultBar"), time.Now())
require.NoError(t, err)

keys, err := m.Query([]CacheKeyWithSelector{
Expand Down
10 changes: 7 additions & 3 deletions solver/cachemanager.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ package solver
import (
"context"
"fmt"
"strings"
"sync"
"time"

"github.com/moby/buildkit/identity"
digest "github.com/opencontainers/go-digest"
Expand Down Expand Up @@ -142,15 +144,14 @@ func (c *cacheManager) Load(ctx context.Context, rec *CacheRecord) (Result, erro
return c.results.Load(ctx, res)
}

func (c *cacheManager) Save(k *CacheKey, r Result) (*ExportableCacheKey, error) {
func (c *cacheManager) Save(k *CacheKey, r Result, createdAt time.Time) (*ExportableCacheKey, error) {
c.mu.Lock()
defer c.mu.Unlock()

res, err := c.results.Save(r)
res, err := c.results.Save(r, createdAt)
if err != nil {
return nil, err
}

if err := c.backend.AddResult(c.getID(k), res); err != nil {
return nil, err
}
Expand Down Expand Up @@ -273,5 +274,8 @@ func (c *cacheManager) getIDFromDeps(k *CacheKey) string {
}

func rootKey(dgst digest.Digest, output Index) digest.Digest {
if strings.HasPrefix(dgst.String(), "random:") {
return digest.Digest("random:" + strings.TrimPrefix(digest.FromBytes([]byte(fmt.Sprintf("%s@%d", dgst, output))).String(), digest.Canonical.String()+":"))
}
return digest.FromBytes([]byte(fmt.Sprintf("%s@%d", dgst, output)))
}
2 changes: 1 addition & 1 deletion solver/cachestorage.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ type CacheInfoLink struct {
// CacheResultStorage is interface for converting cache metadata result to
// actual solve result
type CacheResultStorage interface {
Save(Result) (CacheResult, error)
Save(Result, time.Time) (CacheResult, error)
Load(ctx context.Context, res CacheResult) (Result, error)
LoadRemote(ctx context.Context, res CacheResult) (*Remote, error)
Exists(id string) bool
Expand Down
7 changes: 4 additions & 3 deletions solver/combinedcache.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"context"
"strings"
"sync"
"time"

digest "github.com/opencontainers/go-digest"
"github.com/pkg/errors"
Expand Down Expand Up @@ -71,14 +72,14 @@ func (cm *combinedCacheManager) Load(ctx context.Context, rec *CacheRecord) (Res
if err != nil {
return nil, err
}
if _, err := cm.main.Save(rec.key, res); err != nil {
if _, err := cm.main.Save(rec.key, res, rec.CreatedAt); err != nil {
return nil, err
}
return res, nil
}

func (cm *combinedCacheManager) Save(key *CacheKey, s Result) (*ExportableCacheKey, error) {
return cm.main.Save(key, s)
func (cm *combinedCacheManager) Save(key *CacheKey, s Result, createdAt time.Time) (*ExportableCacheKey, error) {
return cm.main.Save(key, s, createdAt)
}

func (cm *combinedCacheManager) Records(ck *CacheKey) ([]*CacheRecord, error) {
Expand Down
3 changes: 2 additions & 1 deletion solver/edge.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package solver
import (
"context"
"sync"
"time"

"github.com/moby/buildkit/solver/internal/pipe"
digest "github.com/opencontainers/go-digest"
Expand Down Expand Up @@ -845,7 +846,7 @@ func (e *edge) execOp(ctx context.Context) (interface{}, error) {
var exporters []CacheExporter

for _, cacheKey := range cacheKeys {
ck, err := e.op.Cache().Save(cacheKey, res)
ck, err := e.op.Cache().Save(cacheKey, res, time.Now())
if err != nil {
return nil, err
}
Expand Down
5 changes: 3 additions & 2 deletions solver/llbsolver/bridge.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"io"
"strings"
"sync"
"time"

"github.com/containerd/containerd/platforms"
"github.com/moby/buildkit/cache"
Expand Down Expand Up @@ -190,11 +191,11 @@ func (lcm *lazyCacheManager) Load(ctx context.Context, rec *solver.CacheRecord)
}
return lcm.main.Load(ctx, rec)
}
func (lcm *lazyCacheManager) Save(key *solver.CacheKey, s solver.Result) (*solver.ExportableCacheKey, error) {
func (lcm *lazyCacheManager) Save(key *solver.CacheKey, s solver.Result, createdAt time.Time) (*solver.ExportableCacheKey, error) {
if err := lcm.wait(); err != nil {
return nil, err
}
return lcm.main.Save(key, s)
return lcm.main.Save(key, s, createdAt)
}

func (lcm *lazyCacheManager) wait() error {
Expand Down
9 changes: 8 additions & 1 deletion solver/llbsolver/ops/source.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package ops

import (
"context"
"strings"
"sync"

"github.com/moby/buildkit/solver"
Expand Down Expand Up @@ -59,9 +60,15 @@ func (s *sourceOp) CacheMap(ctx context.Context, index int) (*solver.CacheMap, b
return nil, false, err
}

dgst := digest.FromBytes([]byte(sourceCacheType + ":" + k))

if strings.HasPrefix(k, "session:") {
dgst = digest.Digest("random:" + strings.TrimPrefix(dgst.String(), dgst.Algorithm().String()+":"))
}

return &solver.CacheMap{
// TODO: add os/arch
Digest: digest.FromBytes([]byte(sourceCacheType + ":" + k)),
Digest: dgst,
}, done, nil
}

Expand Down
4 changes: 2 additions & 2 deletions solver/memorycachestorage.go
Original file line number Diff line number Diff line change
Expand Up @@ -284,9 +284,9 @@ type inMemoryResultStore struct {
m *sync.Map
}

func (s *inMemoryResultStore) Save(r Result) (CacheResult, error) {
func (s *inMemoryResultStore) Save(r Result, createdAt time.Time) (CacheResult, error) {
s.m.Store(r.ID(), r)
return CacheResult{ID: r.ID(), CreatedAt: time.Now()}, nil
return CacheResult{ID: r.ID(), CreatedAt: createdAt}, nil
}

func (s *inMemoryResultStore) Load(ctx context.Context, res CacheResult) (Result, error) {
Expand Down
2 changes: 1 addition & 1 deletion solver/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -164,5 +164,5 @@ type CacheManager interface {
// Load pulls and returns the cached result
Load(ctx context.Context, rec *CacheRecord) (Result, error)
// Save saves a result based on a cache key
Save(key *CacheKey, s Result) (*ExportableCacheKey, error)
Save(key *CacheKey, s Result, createdAt time.Time) (*ExportableCacheKey, error)
}
4 changes: 2 additions & 2 deletions worker/cacheresult.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ type cacheResultStorage struct {
wc *Controller
}

func (s *cacheResultStorage) Save(res solver.Result) (solver.CacheResult, error) {
func (s *cacheResultStorage) Save(res solver.Result, createdAt time.Time) (solver.CacheResult, error) {
ref, ok := res.Sys().(*WorkerRef)
if !ok {
return solver.CacheResult{}, errors.Errorf("invalid result: %T", res.Sys())
Expand All @@ -33,7 +33,7 @@ func (s *cacheResultStorage) Save(res solver.Result) (solver.CacheResult, error)
ref.ImmutableRef.Metadata().Commit()
}
}
return solver.CacheResult{ID: ref.ID(), CreatedAt: time.Now()}, nil
return solver.CacheResult{ID: ref.ID(), CreatedAt: createdAt}, nil
}
func (s *cacheResultStorage) Load(ctx context.Context, res solver.CacheResult) (solver.Result, error) {
return s.load(res.ID, false)
Expand Down