Skip to content

Commit 2ea2665

Browse files
committed
Shutdown VM gracefully from created state
1 parent 7d4bd80 commit 2ea2665

1 file changed

Lines changed: 37 additions & 23 deletions

File tree

Sources/Containerization/LinuxContainer.swift

Lines changed: 37 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)