@@ -606,12 +606,22 @@ extension LinuxContainer {
606606 return
607607 }
608608
609- let startedState = try state. startedState ( " stop " )
610- let vm = startedState. vm
609+ let vm : any VirtualMachineInstance
610+ let relayManager : UnixSocketRelayManager
611+
612+ let startedState = try ? state. startedState ( " stop " )
613+ if let startedState {
614+ vm = startedState. vm
615+ relayManager = startedState. relayManager
616+ } else {
617+ let createdState = try state. createdState ( " stop " )
618+ vm = createdState. vm
619+ relayManager = createdState. relayManager
620+ }
611621
612622 var firstError : Error ?
613623 do {
614- try await startedState . relayManager. stopAll ( )
624+ try await relayManager. stopAll ( )
615625 } catch {
616626 self . logger? . error ( " failed to stop relay manager: \( error) " )
617627 firstError = firstError ?? error
@@ -634,15 +644,17 @@ extension LinuxContainer {
634644 }
635645 }
636646
637- // Now lets ensure every process is donezo.
638- try await agent. kill ( pid: - 1 , signal: SIGKILL)
647+ if let _ = startedState {
648+ // Now lets ensure every process is donezo.
649+ try await agent. kill ( pid: - 1 , signal: SIGKILL)
639650
640- // Wait on init proc exit. Give it 5 seconds of leeway.
641- _ = try await agent. waitProcess (
642- id: self . id,
643- containerID: self . id,
644- timeoutInSeconds: 5
645- )
651+ // Wait on init proc exit. Give it 5 seconds of leeway.
652+ _ = try await agent. waitProcess (
653+ id: self . id,
654+ containerID: self . id,
655+ timeoutInSeconds: 5
656+ )
657+ }
646658
647659 // Today, we leave EBUSY looping and other fun logic up to the
648660 // guest agent.
@@ -658,25 +670,27 @@ extension LinuxContainer {
658670 firstError = firstError ?? error
659671 }
660672
661- for process in startedState. vendedProcesses. values {
673+ if let startedState {
674+ for process in startedState. vendedProcesses. values {
675+ do {
676+ try await process. _delete ( )
677+ } catch {
678+ self . logger? . error ( " failed to delete process \( process. id) : \( error) " )
679+ firstError = firstError ?? error
680+ }
681+ }
682+
662683 do {
663- try await process. _delete ( )
684+ try await startedState . process. delete ( )
664685 } catch {
665- self . logger? . error ( " failed to delete process \( process. id ) : \( error) " )
686+ self . logger? . error ( " failed to delete init process: \( error) " )
666687 firstError = firstError ?? error
667688 }
668- }
669689
670- do {
671- try await startedState. process. delete ( )
672- } catch {
673- self . logger? . error ( " failed to delete init process: \( error) " )
674- firstError = firstError ?? error
690+ // Clean up file mount temporary directories.
691+ startedState. fileMountContext. cleanup ( )
675692 }
676693
677- // Clean up file mount temporary directories.
678- startedState. fileMountContext. cleanup ( )
679-
680694 do {
681695 try await vm. stop ( )
682696 state = . stopped
0 commit comments