Merge pull request #1557 from tonistiigi/mark-cached

solver: fix marking already cached vertex as cancelled
v0.8
Akihiro Suda 2020-07-07 12:49:49 +09:00 committed by GitHub
commit 6220b8a4fc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 21 additions and 3 deletions

View File

@ -12,7 +12,7 @@ import (
) )
func (j *Job) Status(ctx context.Context, ch chan *client.SolveStatus) error { func (j *Job) Status(ctx context.Context, ch chan *client.SolveStatus) error {
vs := &vertexStream{cache: map[digest.Digest]*client.Vertex{}} vs := &vertexStream{cache: map[digest.Digest]*client.Vertex{}, wasCached: make(map[digest.Digest]struct{})}
pr := j.pr.Reader(ctx) pr := j.pr.Reader(ctx)
defer func() { defer func() {
if enc := vs.encore(); len(enc) > 0 { if enc := vs.encore(); len(enc) > 0 {
@ -72,7 +72,8 @@ func (j *Job) Status(ctx context.Context, ch chan *client.SolveStatus) error {
} }
type vertexStream struct { type vertexStream struct {
cache map[digest.Digest]*client.Vertex cache map[digest.Digest]*client.Vertex
wasCached map[digest.Digest]struct{}
} }
func (vs *vertexStream) append(v client.Vertex) []*client.Vertex { func (vs *vertexStream) append(v client.Vertex) []*client.Vertex {
@ -91,17 +92,34 @@ func (vs *vertexStream) append(v client.Vertex) []*client.Vertex {
} }
} }
} }
if v.Cached {
vs.markCached(v.Digest)
}
vcopy := v vcopy := v
return append(out, &vcopy) return append(out, &vcopy)
} }
func (vs *vertexStream) markCached(dgst digest.Digest) {
if v, ok := vs.cache[dgst]; ok {
if _, ok := vs.wasCached[dgst]; !ok {
for _, inp := range v.Inputs {
vs.markCached(inp)
}
}
vs.wasCached[dgst] = struct{}{}
}
}
func (vs *vertexStream) encore() []*client.Vertex { func (vs *vertexStream) encore() []*client.Vertex {
var out []*client.Vertex var out []*client.Vertex
for _, v := range vs.cache { for _, v := range vs.cache {
if v.Started != nil && v.Completed == nil { if v.Started != nil && v.Completed == nil {
now := time.Now() now := time.Now()
v.Completed = &now v.Completed = &now
v.Error = context.Canceled.Error() if _, ok := vs.wasCached[v.Digest]; !ok && v.Error == "" {
v.Error = context.Canceled.Error()
}
out = append(out, v) out = append(out, v)
} }
} }