@@ -522,21 +522,18 @@ extension LinuxContainer {
522522 }
523523
524524 let startedState = try state. startedState ( " stop " )
525+ let vm = startedState. vm
525526
527+ var firstError : Error ?
526528 do {
527529 try await startedState. relayManager. stopAll ( )
530+ } catch {
531+ self . logger? . error ( " failed to stop relay manager: \( error) " )
532+ firstError = firstError ?? error
533+ }
528534
529- // It's possible the state of the vm is not in a great spot
530- // if the guest panicked or had any sort of bug/fault.
531- // First check if the vm is even still running, as trying to
532- // use a vsock handle like below here will cause NIO to
533- // fatalError because we'll get an EBADF.
534- if startedState. vm. state == . stopped {
535- state = . stopped
536- return
537- }
538-
539- try await startedState. vm. withAgent { agent in
535+ do {
536+ try await vm. withAgent { agent in
540537 // First, we need to stop any unix socket relays as this will
541538 // keep the rootfs from being able to umount (EBUSY).
542539 let sockets = self . config. sockets
@@ -571,19 +568,38 @@ extension LinuxContainer {
571568
572569 try await agent. sync ( )
573570 }
571+ } catch {
572+ self . logger? . error ( " failed during guest cleanup: \( error) " )
573+ firstError = firstError ?? error
574+ }
574575
575- for process in startedState. vendedProcesses. values {
576- try ? await process. _delete ( )
576+ for process in startedState. vendedProcesses. values {
577+ do {
578+ try await process. _delete ( )
579+ } catch {
580+ self . logger? . error ( " failed to delete process \( process. id) : \( error) " )
581+ firstError = firstError ?? error
577582 }
583+ }
578584
579- // Now delete the init proc
585+ do {
580586 try await startedState. process. delete ( )
587+ } catch {
588+ self . logger? . error ( " failed to delete init process: \( error) " )
589+ firstError = firstError ?? error
590+ }
581591
582- try await startedState. vm. stop ( )
592+ do {
593+ try await vm. stop ( )
583594 state = . stopped
595+ if let firstError {
596+ throw firstError
597+ }
584598 } catch {
585- state. setErrored ( error: error)
586- throw error
599+ self . logger? . error ( " failed to stop VM: \( error) " )
600+ let finalError = firstError ?? error
601+ state. setErrored ( error: finalError)
602+ throw finalError
587603 }
588604 }
589605 }
0 commit comments