@@ -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,11 +322,12 @@ 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	}
327+ 	buildID  :=  randomUUID .String ()
328+ 	log  :=  log .WithField ("buildID" , buildID )
327329
328330	var  (
329- 		buildID         =  randomUUID .String ()
330331		buildBase       =  "false" 
331332		contextPath     =  "." 
332333		dockerfilePath  =  "Dockerfile" 
@@ -368,7 +369,7 @@ func (o *Orchestrator) Build(req *protocol.BuildRequest, resp protocol.ImageBuil
368369
369370	pbaseref , err  :=  reference .ParseNormalizedNamed (baseref )
370371	if  err  !=  nil  {
371- 		return  xerrors .Errorf ("cannot parse baseref: %v" , err )
372+ 		return  status .Errorf (codes . InvalidArgument ,  "cannot parse baseref: %v" , err )
372373	}
373374	bobBaseref  :=  "localhost:8080/base" 
374375	if  r , ok  :=  pbaseref .(reference.Digested ); ok  {
@@ -384,7 +385,7 @@ func (o *Orchestrator) Build(req *protocol.BuildRequest, resp protocol.ImageBuil
384385		})
385386		additionalAuth , err  =  json .Marshal (ath )
386387		if  err  !=  nil  {
387- 			return  xerrors .Errorf ("cannot marshal additional auth: %w " , err )
388+ 			return  status .Errorf (codes . InvalidArgument ,  "cannot marshal additional auth: %v " , err )
388389		}
389390	}
390391
@@ -432,7 +433,7 @@ func (o *Orchestrator) Build(req *protocol.BuildRequest, resp protocol.ImageBuil
432433						Name :  "WORKSPACEKIT_BOBPROXY_ADDITIONALAUTH" ,
433434						Value : string (additionalAuth ),
434435					},
435- 					{Name : "SUPERVISOR_DEBUG_ENABLE" , Value : fmt .Sprintf ("%v" , log .Log . Logger .IsLevelEnabled (logrus .DebugLevel ))},
436+ 					{Name : "SUPERVISOR_DEBUG_ENABLE" , Value : fmt .Sprintf ("%v" , log .Logger .IsLevelEnabled (logrus .DebugLevel ))},
436437				},
437438			},
438439			Type : wsmanapi .WorkspaceType_IMAGEBUILD ,
@@ -476,8 +477,8 @@ func (o *Orchestrator) Build(req *protocol.BuildRequest, resp protocol.ImageBuil
476477
477478		err  :=  resp .Send (update )
478479		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 )
480+ 			log .WithError (err ).Info ("cannot forward build update - dropping listener" )
481+ 			return  handleFailedBuildStreamResponse ( err , "cannot send update"  )
481482		}
482483
483484		if  update .Status  ==  protocol .BuildStatus_done_failure  ||  update .Status  ==  protocol .BuildStatus_done_success  {
@@ -555,8 +556,8 @@ func (o *Orchestrator) Logs(req *protocol.LogsRequest, resp protocol.ImageBuilde
555556
556557		err  :=  resp .Send (update )
557558		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 )
559+ 			log .WithError (err ).Info ("cannot forward log output - dropping listener" )
560+ 			return  handleFailedBuildStreamResponse ( err , "cannot send log output"  )
560561		}
561562	}
562563
@@ -709,6 +710,33 @@ func (o *Orchestrator) getWorkspaceImageRef(ctx context.Context, baseref string)
709710	return  fmt .Sprintf ("%s:%x" , o .Config .WorkspaceImageRepository , dst ), nil 
710711}
711712
713+ func  handleFailedBuildStreamResponse (err  error , msg  string ) error  {
714+ 	if  err  ==  nil  {
715+ 		// OK is OK 
716+ 		return  nil 
717+ 	}
718+ 
719+ 	// If the error is a context.DeadlineExceeded, we return nil (OK) as requested. 
720+ 	if  errors .Is (err , context .DeadlineExceeded ) {
721+ 		// Return nil (OK) for DeadlineExceeded 
722+ 		return  nil 
723+ 	}
724+ 
725+ 	// If it's already a gRPC status error, check for DeadlineExceeded 
726+ 	if  st , ok  :=  status .FromError (err ); ok  {
727+ 		if  st .Code () ==  codes .DeadlineExceeded  {
728+ 			// Return nil (OK) for DeadlineExceeded as requested 
729+ 			return  nil 
730+ 		}
731+ 
732+ 		log .WithError (err ).WithField ("code" , status .Code (err )).Error (fmt .Sprintf ("unexpected error while sending build response: %s" , msg ))
733+ 		return  err 
734+ 	}
735+ 
736+ 	log .WithError (err ).Error (fmt .Sprintf ("unexpected error while sending build response: %s" , msg ))
737+ 	return  status .Errorf (codes .Unavailable , "%s: %v" , msg , err )
738+ }
739+ 
712740// parentCantCancelContext is a bit of a hack. We have some operations which we want to keep alive even after clients 
713741// disconnect. gRPC cancels the context once a client disconnects, thus we intercept the cancelation and act as if 
714742// nothing had happened. 
0 commit comments