@@ -317,6 +317,12 @@ impl VzLaunchOwner {
317317 } ;
318318 let turn_cleanup =
319319 std:: mem:: replace ( & mut self . turn_cleanup , TurnCleanupEvidence :: Indeterminate ) ;
320+ // Port availability is evidence only when this launch may have started TURN.
321+ // A foreign listener cannot create a cleanup obligation for this owner.
322+ let probe_turn_ports = matches ! (
323+ & turn_cleanup,
324+ TurnCleanupEvidence :: Owned ( _) | TurnCleanupEvidence :: Indeterminate
325+ ) ;
320326 let turn_child_absent = match turn_cleanup {
321327 TurnCleanupEvidence :: Owned ( mut turn) => turn. terminate_and_reap ( ) ,
322328 TurnCleanupEvidence :: AbsenceProved => true ,
@@ -336,8 +342,14 @@ impl VzLaunchOwner {
336342 . vm_id
337343 . as_str ( )
338344 . is_some_and ( |vm_id| remove_owned_vm_state ( & self . paths , vm_id, vm_absent) ) ;
339- let turn_listener_absent = turn_listener_port_absent ( & self . transport ) ;
340- let turn_relay_ports_absent = turn_relay_ports_absent ( & self . transport ) ;
345+ let ( turn_listener_absent, turn_relay_ports_absent) = if probe_turn_ports {
346+ (
347+ turn_listener_port_absent ( & self . transport ) ,
348+ turn_relay_ports_absent ( & self . transport ) ,
349+ )
350+ } else {
351+ ( true , true )
352+ } ;
341353 let child_absent = turn_child_absent
342354 && control_proxy_absent
343355 && ordinary_stream_bridge_absent
@@ -3838,6 +3850,9 @@ mod tests {
38383850 async fn post_effect_failure_emits_exact_terminal_cleanup ( ) {
38393851 let mut transport = transport_fixture ( 'f' ) ;
38403852 transport. authority [ "turn" ] [ "relay_host" ] = json ! ( "127.0.0.1" ) ;
3853+ let foreign_turn_listener = std:: net:: TcpListener :: bind ( ( "127.0.0.1" , 0 ) ) . unwrap ( ) ;
3854+ transport. authority [ "turn" ] [ "listen_port" ] =
3855+ json ! ( foreign_turn_listener. local_addr( ) . unwrap( ) . port( ) ) ;
38413856 transport
38423857 . authority
38433858 . as_object_mut ( )
@@ -3880,8 +3895,10 @@ mod tests {
38803895 assert_eq ! ( settlement[ "state" ] , "terminal_post_effect_cleanup" ) ;
38813896 assert_eq ! ( settlement[ "effects" ] [ "session_directory" ] , true ) ;
38823897 assert_eq ! ( settlement[ "effects" ] [ "control_socket" ] , true ) ;
3898+ assert_eq ! ( settlement[ "effects" ] [ "turn_process" ] , false ) ;
38833899 assert_eq ! ( settlement[ "absence" ] [ "session_directory_absent" ] , true ) ;
38843900 assert_eq ! ( settlement[ "absence" ] [ "control_socket_absent" ] , true ) ;
3901+ assert_eq ! ( settlement[ "absence" ] [ "turn_listener_absent" ] , true ) ;
38853902 assert_eq ! (
38863903 settlement[ "binding_hash" ] ,
38873904 launch[ "transport_authority" ] [ "binding_hash" ]
0 commit comments