Skip to content

Commit d43daca

Browse files
committed
[image-builder-mk3] Avoid sending "Unknown" error code in all cases
1 parent a13223e commit d43daca

File tree

1 file changed

+23
-9
lines changed

1 file changed

+23
-9
lines changed

components/image-builder-mk3/pkg/orchestrator/orchestrator.go

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ func (o *Orchestrator) Build(req *protocol.BuildRequest, resp protocol.ImageBuil
260260
BaseRef: req.BaseImageNameResolved,
261261
})
262262
if err != nil {
263-
return err
263+
return handleFailedBuildStreamResponse(err, "cannot send build response")
264264
}
265265
return nil
266266
}
@@ -307,7 +307,7 @@ func (o *Orchestrator) Build(req *protocol.BuildRequest, resp protocol.ImageBuil
307307
BaseRef: baseref,
308308
})
309309
if err != nil {
310-
return err
310+
return handleFailedBuildStreamResponse(err, "cannot send build response")
311311
}
312312
return nil
313313
}
@@ -322,7 +322,7 @@ func (o *Orchestrator) Build(req *protocol.BuildRequest, resp protocol.ImageBuil
322322

323323
randomUUID, err := uuid.NewRandom()
324324
if err != nil {
325-
return
325+
return status.Errorf(codes.Internal, "failed to generate build ID: %v", err)
326326
}
327327

328328
var (
@@ -368,7 +368,7 @@ func (o *Orchestrator) Build(req *protocol.BuildRequest, resp protocol.ImageBuil
368368

369369
pbaseref, err := reference.ParseNormalizedNamed(baseref)
370370
if err != nil {
371-
return xerrors.Errorf("cannot parse baseref: %v", err)
371+
return status.Errorf(codes.InvalidArgument, "cannot parse baseref: %v", err)
372372
}
373373
bobBaseref := "localhost:8080/base"
374374
if r, ok := pbaseref.(reference.Digested); ok {
@@ -384,7 +384,7 @@ func (o *Orchestrator) Build(req *protocol.BuildRequest, resp protocol.ImageBuil
384384
})
385385
additionalAuth, err = json.Marshal(ath)
386386
if err != nil {
387-
return xerrors.Errorf("cannot marshal additional auth: %w", err)
387+
return status.Errorf(codes.InvalidArgument, "cannot marshal additional auth: %v", err)
388388
}
389389
}
390390

@@ -476,8 +476,8 @@ func (o *Orchestrator) Build(req *protocol.BuildRequest, resp protocol.ImageBuil
476476

477477
err := resp.Send(update)
478478
if err != nil {
479-
log.WithError(err).Error("cannot forward build update - dropping listener")
480-
return status.Errorf(codes.Unknown, "cannot send update: %v", err)
479+
log.WithError(err).Info("cannot forward build update - dropping listener")
480+
return handleFailedBuildStreamResponse(err, "cannot send update")
481481
}
482482

483483
if update.Status == protocol.BuildStatus_done_failure || update.Status == protocol.BuildStatus_done_success {
@@ -555,8 +555,8 @@ func (o *Orchestrator) Logs(req *protocol.LogsRequest, resp protocol.ImageBuilde
555555

556556
err := resp.Send(update)
557557
if err != nil {
558-
log.WithError(err).Error("cannot forward log output - dropping listener")
559-
return status.Errorf(codes.Unknown, "cannot send log output: %v", err)
558+
log.WithError(err).Info("cannot forward log output - dropping listener")
559+
return handleFailedBuildStreamResponse(err, "cannot send log output")
560560
}
561561
}
562562

@@ -709,6 +709,20 @@ func (o *Orchestrator) getWorkspaceImageRef(ctx context.Context, baseref string)
709709
return fmt.Sprintf("%s:%x", o.Config.WorkspaceImageRepository, dst), nil
710710
}
711711

712+
func handleFailedBuildStreamResponse(err error, msg string) error {
713+
if status.Code(err) == codes.DeadlineExceeded {
714+
// client disconnected before we could send the response - fine with us
715+
return nil
716+
}
717+
log.WithError(err).WithField("code", status.Code(err)).Error(fmt.Sprintf("unexpected error while sending build response: %s", msg))
718+
719+
if _, ok := status.FromError(err); err != nil && ok {
720+
return err
721+
}
722+
723+
return status.Errorf(codes.Unavailable, "%s: %v", msg, err)
724+
}
725+
712726
// parentCantCancelContext is a bit of a hack. We have some operations which we want to keep alive even after clients
713727
// disconnect. gRPC cancels the context once a client disconnects, thus we intercept the cancelation and act as if
714728
// nothing had happened.

0 commit comments

Comments
 (0)