@@ -1617,6 +1617,7 @@ impl DockerComputeDriver {
16171617 & created. id ,
16181618 & image,
16191619 & workload_identity,
1620+ gpu_devices. is_some ( ) ,
16201621 )
16211622 . await
16221623 {
@@ -4373,6 +4374,7 @@ async fn prepare_docker_boundary_files(
43734374 container_id : & str ,
43744375 image : & DockerImageMetadata ,
43754376 workload_identity : & ResolvedWorkloadIdentity ,
4377+ gpu_requested : bool ,
43764378) -> Result < ( ) , Status > {
43774379 let directory = docker_boundary_state_dir ( sandbox, config) ?;
43784380 let workspace_root = driver_mounts:: resolve_oci_workspace_root ( & image. working_dir )
@@ -4403,6 +4405,7 @@ async fn prepare_docker_boundary_files(
44034405 verification_keys,
44044406 container_id : container_id. to_string ( ) ,
44054407 image_identity : image. id . clone ( ) ,
4408+ gpu_requested,
44064409 listener_socket : PathBuf :: from ( BOUNDARY_SOCKET_MOUNT_PATH ) ,
44074410 control_socket : PathBuf :: from ( BOUNDARY_SOCKET_MOUNT_PATH ) ,
44084411 sandbox_tls : SandboxTlsServerConfig {
@@ -5044,6 +5047,7 @@ async fn spawn_docker_control_process(
50445047 let supervisor_id = created. id ;
50455048 let monitored_supervisor_id = supervisor_id. clone ( ) ;
50465049 let monitored_docker = failure_context. docker . clone ( ) ;
5050+ let readiness_sandbox_id = failure_context. container_id . clone ( ) ;
50475051 let task = tokio:: spawn ( async move {
50485052 let wait = async {
50495053 let mut stream = monitored_docker. wait_container (
@@ -5134,7 +5138,9 @@ async fn spawn_docker_control_process(
51345138 intentional_shutdown,
51355139 task,
51365140 } ;
5137- if let Err ( error) = wait_for_docker_supervisor_ready ( docker, & supervisor_id) . await {
5141+ if let Err ( error) =
5142+ wait_for_docker_supervisor_ready ( docker, & supervisor_id, & readiness_sandbox_id) . await
5143+ {
51385144 stop_docker_control_process ( process) . await ;
51395145 return Err ( error) ;
51405146 }
@@ -5144,9 +5150,23 @@ async fn spawn_docker_control_process(
51445150async fn wait_for_docker_supervisor_ready (
51455151 docker : & Docker ,
51465152 supervisor_id : & str ,
5153+ sandbox_id : & str ,
51475154) -> Result < ( ) , Status > {
51485155 let wait = async {
51495156 loop {
5157+ let sandbox = docker
5158+ . inspect_container ( sandbox_id, None )
5159+ . await
5160+ . map_err ( |error| {
5161+ Status :: internal ( format ! ( "inspect Docker sandbox container: {error}" ) )
5162+ } ) ?;
5163+ if sandbox. state . unwrap_or_default ( ) . running == Some ( false ) {
5164+ let sandbox_log_tail = docker_container_log_tail ( docker, sandbox_id) . await ;
5165+ return Err ( Status :: unavailable ( format ! (
5166+ "Docker sandbox exited before supervisor became ready{}" ,
5167+ format_named_log_tail( "sandbox log tail" , & sandbox_log_tail)
5168+ ) ) ) ;
5169+ }
51505170 let inspected = docker
51515171 . inspect_container ( supervisor_id, None )
51525172 . await
@@ -5158,16 +5178,20 @@ async fn wait_for_docker_supervisor_ready(
51585178 Some ( HealthStatusEnum :: HEALTHY ) => return Ok ( ( ) ) ,
51595179 Some ( HealthStatusEnum :: UNHEALTHY ) => {
51605180 let log_tail = docker_container_log_tail ( docker, supervisor_id) . await ;
5181+ let sandbox_log_tail = docker_container_log_tail ( docker, sandbox_id) . await ;
51615182 return Err ( Status :: unavailable ( format ! (
5162- "Docker supervisor failed its readiness check{}" ,
5163- format_log_tail( & log_tail)
5183+ "Docker supervisor failed its readiness check{}{}" ,
5184+ format_log_tail( & log_tail) ,
5185+ format_named_log_tail( "sandbox log tail" , & sandbox_log_tail)
51645186 ) ) ) ;
51655187 }
51665188 _ if state. running == Some ( false ) => {
51675189 let log_tail = docker_container_log_tail ( docker, supervisor_id) . await ;
5190+ let sandbox_log_tail = docker_container_log_tail ( docker, sandbox_id) . await ;
51685191 return Err ( Status :: unavailable ( format ! (
5169- "Docker supervisor exited before becoming ready{}" ,
5170- format_log_tail( & log_tail)
5192+ "Docker supervisor exited before becoming ready{}{}" ,
5193+ format_log_tail( & log_tail) ,
5194+ format_named_log_tail( "sandbox log tail" , & sandbox_log_tail)
51715195 ) ) ) ;
51725196 }
51735197 _ => tokio:: time:: sleep ( Duration :: from_millis ( 100 ) ) . await ,
@@ -5179,19 +5203,25 @@ async fn wait_for_docker_supervisor_ready(
51795203 result
51805204 } else {
51815205 let log_tail = docker_container_log_tail ( docker, supervisor_id) . await ;
5206+ let sandbox_log_tail = docker_container_log_tail ( docker, sandbox_id) . await ;
51825207 Err ( Status :: deadline_exceeded ( format ! (
5183- "Docker supervisor did not become ready within {} seconds{}" ,
5208+ "Docker supervisor did not become ready within {} seconds{}{} " ,
51845209 SUPERVISOR_READY_TIMEOUT . as_secs( ) ,
5185- format_log_tail( & log_tail)
5210+ format_log_tail( & log_tail) ,
5211+ format_named_log_tail( "sandbox log tail" , & sandbox_log_tail)
51865212 ) ) )
51875213 }
51885214}
51895215
51905216fn format_log_tail ( log_tail : & str ) -> String {
5217+ format_named_log_tail ( "log tail" , log_tail)
5218+ }
5219+
5220+ fn format_named_log_tail ( label : & str , log_tail : & str ) -> String {
51915221 if log_tail. is_empty ( ) {
51925222 String :: new ( )
51935223 } else {
5194- format ! ( "; log tail : {log_tail}" )
5224+ format ! ( "; {label} : {log_tail}" )
51955225 }
51965226}
51975227
0 commit comments