VirtualMachineManager: Take in EventLoopGroup directly (#367)

This commit is contained in:
Danny Canter
2025-10-28 02:24:53 -07:00
committed by GitHub
parent 02fa190aeb
commit cc66529b59
4 changed files with 29 additions and 8 deletions
@@ -76,13 +76,14 @@ struct VZVirtualMachineInstance: Sendable {
// `vm` isn't used concurrently.
private nonisolated(unsafe) let vm: VZVirtualMachine
private let queue: DispatchQueue
private let group: MultiThreadedEventLoopGroup
private let lock: AsyncMutex<VendedConnections>
private let group: EventLoopGroup
private let ownsGroup: Bool
private let timeSyncer: TimeSyncer
private let logger: Logger?
public init(
group: MultiThreadedEventLoopGroup = MultiThreadedEventLoopGroup(numberOfThreads: System.coreCount),
group: EventLoopGroup? = nil,
logger: Logger? = nil,
with: (inout Configuration) throws -> Void
) throws {
@@ -91,9 +92,16 @@ struct VZVirtualMachineInstance: Sendable {
try self.init(group: group, config: config, logger: logger)
}
init(group: MultiThreadedEventLoopGroup, config: Configuration, logger: Logger?) throws {
init(group: EventLoopGroup?, config: Configuration, logger: Logger?) throws {
if let group {
self.ownsGroup = false
self.group = group
} else {
self.ownsGroup = true
self.group = MultiThreadedEventLoopGroup(numberOfThreads: System.coreCount)
}
self.config = config
self.group = group
self.lock = .init(VendedConnections())
self.queue = DispatchQueue(label: "com.apple.containerization.vzvm.\(UUID().uuidString)")
self.mounts = try config.mountAttachments()
@@ -160,7 +168,10 @@ extension VZVirtualMachineInstance: VirtualMachineInstance {
}
connections.agents.removeAll()
try await self.group.shutdownGracefully()
if self.ownsGroup {
try await self.group.shutdownGracefully()
}
try await self.vm.stop(queue: self.queue)
}
}
@@ -19,6 +19,7 @@ import ContainerizationError
import ContainerizationOCI
import Foundation
import Logging
import NIOCore
/// A virtualization.framework backed `VirtualMachineManager` implementation.
public struct VZVirtualMachineManager: VirtualMachineManager {
@@ -26,6 +27,7 @@ public struct VZVirtualMachineManager: VirtualMachineManager {
private let initialFilesystem: Mount
private let rosetta: Bool
private let nestedVirtualization: Bool
private let group: EventLoopGroup?
private let logger: Logger?
public init(
@@ -33,12 +35,14 @@ public struct VZVirtualMachineManager: VirtualMachineManager {
initialFilesystem: Mount,
rosetta: Bool = false,
nestedVirtualization: Bool = false,
group: EventLoopGroup? = nil,
logger: Logger? = nil
) {
self.kernel = kernel
self.initialFilesystem = initialFilesystem
self.rosetta = rosetta
self.nestedVirtualization = nestedVirtualization
self.group = group
self.logger = logger
}
@@ -49,6 +53,7 @@ public struct VZVirtualMachineManager: VirtualMachineManager {
let useNestedVirtualization = vmConfig.nestedVirtualization || self.nestedVirtualization
return try VZVirtualMachineInstance(
group: self.group,
logger: self.logger,
with: { instanceConfig in
instanceConfig.cpus = vmConfig.cpus
+4 -3
View File
@@ -19,6 +19,7 @@ import ContainerizationOCI
import ContainerizationOS
import Foundation
import GRPC
import NIOCore
import NIOPosix
/// A remote connection into the vminitd Linux guest agent via a port (vsock).
@@ -35,7 +36,7 @@ public struct Vminitd: Sendable {
self.client = client
}
public init(connection: FileHandle, group: MultiThreadedEventLoopGroup) {
public init(connection: FileHandle, group: EventLoopGroup) {
self.client = .init(connection: connection, group: group)
}
@@ -450,7 +451,7 @@ extension Hosts {
}
extension Vminitd.Client {
public init(socket: String, group: MultiThreadedEventLoopGroup) {
public init(socket: String, group: EventLoopGroup) {
var config = ClientConnection.Configuration.default(
target: .unixDomainSocket(socket),
eventLoopGroup: group
@@ -461,7 +462,7 @@ extension Vminitd.Client {
self = .init(channel: ClientConnection(configuration: config))
}
public init(connection: FileHandle, group: MultiThreadedEventLoopGroup) {
public init(connection: FileHandle, group: EventLoopGroup) {
var config = ClientConnection.Configuration.default(
target: .connectedSocket(connection.fileDescriptor),
eventLoopGroup: group
+4
View File
@@ -23,6 +23,7 @@ import ContainerizationOS
import Foundation
import Logging
import NIOCore
import NIOPosix
import Synchronization
actor UnpackCoordinator {
@@ -159,6 +160,8 @@ struct IntegrationSuite: AsyncParsableCommand {
.appendingPathComponent(name)
}
static let eventLoop = MultiThreadedEventLoopGroup(numberOfThreads: System.coreCount)
func bootstrap(_ testID: String) async throws -> (rootfs: Containerization.Mount, vmm: VirtualMachineManager, image: Containerization.Image, bootlog: URL) {
let reference = "ghcr.io/linuxcontainers/alpine:3.20"
let store = Self.imageStore
@@ -221,6 +224,7 @@ struct IntegrationSuite: AsyncParsableCommand {
VZVirtualMachineManager(
kernel: testKernel,
initialFilesystem: initfs,
group: Self.eventLoop
),
image,
bootlogURL