Skip to content

Commit c644fb8

Browse files
committed
llbsolver: tie op metadata to the op before recomputing digests
When recomputing digests happens, the metadata is lost. This previously happened only with sources that were affected by source policies so it wasn't noticed, but now any LLB Op that is rewritten is affected since the gogo protobuf switch will cause all digests to be rewritten if the frontend and buildkit are using different versions. Signed-off-by: Jonathan A. Sternberg <[email protected]>
1 parent 38a47db commit c644fb8

File tree

1 file changed

+18
-9
lines changed

1 file changed

+18
-9
lines changed

solver/llbsolver/vertex.go

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -155,9 +155,8 @@ func (dpc *detectPrunedCacheID) Load(op *pb.Op, md *pb.OpMetadata, opt *solver.V
155155
}
156156

157157
func Load(ctx context.Context, def *pb.Definition, polEngine SourcePolicyEvaluator, opts ...LoadOpt) (solver.Edge, error) {
158-
return loadLLB(ctx, def, polEngine, func(dgst digest.Digest, pbOp *pb.Op, load func(digest.Digest) (solver.Vertex, error)) (solver.Vertex, error) {
159-
opMetadata := def.Metadata[string(dgst)]
160-
vtx, err := newVertex(dgst, pbOp, opMetadata, load, opts...)
158+
return loadLLB(ctx, def, polEngine, func(dgst digest.Digest, op *op, load func(digest.Digest) (solver.Vertex, error)) (solver.Vertex, error) {
159+
vtx, err := newVertex(dgst, &op.Op, op.Metadata, load, opts...)
161160
if err != nil {
162161
return nil, err
163162
}
@@ -198,7 +197,7 @@ func newVertex(dgst digest.Digest, op *pb.Op, opMeta *pb.OpMetadata, load func(d
198197
return vtx, nil
199198
}
200199

201-
func recomputeDigests(ctx context.Context, all map[digest.Digest]*pb.Op, visited map[digest.Digest]digest.Digest, dgst digest.Digest) (digest.Digest, error) {
200+
func recomputeDigests(ctx context.Context, all map[digest.Digest]*op, visited map[digest.Digest]digest.Digest, dgst digest.Digest) (digest.Digest, error) {
202201
if dgst, ok := visited[dgst]; ok {
203202
return dgst, nil
204203
}
@@ -235,20 +234,29 @@ func recomputeDigests(ctx context.Context, all map[digest.Digest]*pb.Op, visited
235234
return newDgst, nil
236235
}
237236

237+
type op struct {
238+
pb.Op
239+
Metadata *pb.OpMetadata
240+
}
241+
242+
func (o *op) Unmarshal(data []byte) error {
243+
return o.Op.UnmarshalVT(data)
244+
}
245+
238246
// loadLLB loads LLB.
239247
// fn is executed sequentially.
240-
func loadLLB(ctx context.Context, def *pb.Definition, polEngine SourcePolicyEvaluator, fn func(digest.Digest, *pb.Op, func(digest.Digest) (solver.Vertex, error)) (solver.Vertex, error)) (solver.Edge, error) {
248+
func loadLLB(ctx context.Context, def *pb.Definition, polEngine SourcePolicyEvaluator, fn func(digest.Digest, *op, func(digest.Digest) (solver.Vertex, error)) (solver.Vertex, error)) (solver.Edge, error) {
241249
if len(def.Def) == 0 {
242250
return solver.Edge{}, errors.New("invalid empty definition")
243251
}
244252

245-
allOps := make(map[digest.Digest]*pb.Op)
253+
allOps := make(map[digest.Digest]*op)
246254

247255
var lastDgst digest.Digest
248256

249257
for _, dt := range def.Def {
250-
var op pb.Op
251-
if err := op.UnmarshalVT(dt); err != nil {
258+
var op op
259+
if err := op.Unmarshal(dt); err != nil {
252260
return solver.Edge{}, errors.Wrap(err, "failed to parse llb proto op")
253261
}
254262
dgst := digest.FromBytes(dt)
@@ -257,6 +265,7 @@ func loadLLB(ctx context.Context, def *pb.Definition, polEngine SourcePolicyEval
257265
return solver.Edge{}, errors.Wrap(err, "error evaluating the source policy")
258266
}
259267
}
268+
op.Metadata = def.Metadata[string(dgst)]
260269

261270
allOps[dgst] = &op
262271
lastDgst = dgst
@@ -300,7 +309,7 @@ func loadLLB(ctx context.Context, def *pb.Definition, polEngine SourcePolicyEval
300309
return nil, errors.Errorf("invalid missing input digest %s", dgst)
301310
}
302311

303-
if err := opsutils.Validate(op); err != nil {
312+
if err := opsutils.Validate(&op.Op); err != nil {
304313
return nil, err
305314
}
306315

0 commit comments

Comments
 (0)