solver: attach causing vertex in an error

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
v0.8
Tonis Tiigi 2020-04-21 18:28:29 -07:00
parent ae3b75d56d
commit cce301badd
8 changed files with 50 additions and 15 deletions

View File

@ -299,6 +299,11 @@ func buildAction(clicontext *cli.Context) error {
// temp test
if os.Getenv("BUILDCTL_DEBUG_ERROR_UNSTABLE") == "1" {
log.Printf("%+v", errdefs.StackFormatter(err))
var ve *errdefs.VertexError
if errors.As(err, &ve) {
log.Printf("error-vertex: %s", ve.Digest)
}
}
return err

View File

@ -342,7 +342,7 @@ func defaultConfigPath() string {
func defaultConf() (config.Config, *toml.MetaData, error) {
cfg, md, err := LoadFile(defaultConfigPath())
if err != nil {
var pe os.PathError
var pe *os.PathError
if !errors.As(err, &pe) {
return config.Config{}, nil, err
}

View File

@ -25,7 +25,7 @@ func withLocation(err error, startLine, endLine int) error {
if err == nil {
return nil
}
var el ErrorLocation
var el *ErrorLocation
if errors.As(err, &el) {
return err
}

View File

@ -2,10 +2,6 @@ syntax = "proto3";
package errdefs;
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
option (gogoproto.stable_marshaler_all) = true;
message Stack {
repeated Frame frames = 1;
repeated string cmdline = 2;
@ -21,7 +17,7 @@ message Frame {
}
message Vertex {
string digest = 1 [(gogoproto.customtype) = "github.com/opencontainers/go-digest.Digest", (gogoproto.nullable) = false];
string digest = 1;
}
message Source {

View File

@ -3,6 +3,7 @@ package errdefs
import (
"github.com/golang/protobuf/proto"
"github.com/golang/protobuf/ptypes"
"github.com/opencontainers/go-digest"
"github.com/pkg/errors"
spb "google.golang.org/genproto/googleapis/rpc/status"
"google.golang.org/grpc/codes"
@ -29,6 +30,11 @@ func ToGRPC(err error) error {
details = append(details, st)
}
var ve *VertexError
if errors.As(err, &ve) {
details = append(details, &ve.Vertex)
}
if len(details) > 0 {
if st2, err := st.WithDetails(details...); err == nil {
st = st2
@ -105,7 +111,7 @@ func FromGRPC(err error) error {
continue
}
switch detail.Message.(type) {
case *Stack:
case *Stack, *Vertex:
details = append(details, detail.Message)
default:
n.Details = append(n.Details, d)
@ -120,6 +126,8 @@ func FromGRPC(err error) error {
if v != nil {
err = &withStack{stack: *v, error: err}
}
case *Vertex:
err = WrapVertex(err, digest.Digest(v.Digest))
}
}

View File

@ -18,11 +18,6 @@ func SetVersionInfo(v, r string) {
revision = r
}
type VertexError struct {
Vertex
error
}
func Traces(err error) []*Stack {
var st []*Stack

19
solver/errdefs/vertex.go Normal file
View File

@ -0,0 +1,19 @@
package errdefs
import "github.com/opencontainers/go-digest"
type VertexError struct {
Vertex
error
}
func (e *VertexError) Unwrap() error {
return e.error
}
func WrapVertex(err error, dgst digest.Digest) error {
if err == nil {
return nil
}
return &VertexError{Vertex: Vertex{Digest: dgst.String()}, error: err}
}

View File

@ -9,6 +9,7 @@ import (
"github.com/moby/buildkit/client"
"github.com/moby/buildkit/session"
"github.com/moby/buildkit/solver/errdefs"
"github.com/moby/buildkit/util/flightcontrol"
"github.com/moby/buildkit/util/progress"
"github.com/moby/buildkit/util/tracing"
@ -53,6 +54,7 @@ type state struct {
vtx Vertex
clientVertex client.Vertex
origDigest digest.Digest // original LLB digest. TODO: probably better to use string ID so this isn't needed
mu sync.Mutex
op *sharedOp
@ -318,6 +320,7 @@ func (jl *Solver) loadUnlocked(v, parent Vertex, j *Job, cache map[Vertex]Vertex
mainCache: jl.opts.DefaultCache,
cache: map[string]CacheManager{},
solver: jl,
origDigest: origVtx.Digest(),
}
jl.actives[dgst] = st
}
@ -564,7 +567,10 @@ func (s *sharedOp) LoadCache(ctx context.Context, rec *CacheRecord) (Result, err
return res, err
}
func (s *sharedOp) CalcSlowCache(ctx context.Context, index Index, f ResultBasedCacheFunc, res Result) (digest.Digest, error) {
func (s *sharedOp) CalcSlowCache(ctx context.Context, index Index, f ResultBasedCacheFunc, res Result) (dgst digest.Digest, err error) {
defer func() {
err = errdefs.WrapVertex(err, s.st.origDigest)
}()
key, err := s.g.Do(ctx, fmt.Sprintf("slow-compute-%d", index), func(ctx context.Context) (interface{}, error) {
s.slowMu.Lock()
// TODO: add helpers for these stored values
@ -609,7 +615,10 @@ func (s *sharedOp) CalcSlowCache(ctx context.Context, index Index, f ResultBased
return key.(digest.Digest), nil
}
func (s *sharedOp) CacheMap(ctx context.Context, index int) (*cacheMapResp, error) {
func (s *sharedOp) CacheMap(ctx context.Context, index int) (resp *cacheMapResp, err error) {
defer func() {
err = errdefs.WrapVertex(err, s.st.origDigest)
}()
op, err := s.getOp()
if err != nil {
return nil, err
@ -665,6 +674,9 @@ func (s *sharedOp) CacheMap(ctx context.Context, index int) (*cacheMapResp, erro
}
func (s *sharedOp) Exec(ctx context.Context, inputs []Result) (outputs []Result, exporters []ExportableCacheKey, err error) {
defer func() {
err = errdefs.WrapVertex(err, s.st.origDigest)
}()
op, err := s.getOp()
if err != nil {
return nil, nil, err