From 01437a44a23478418c0018238c9f73bae59fe128 Mon Sep 17 00:00:00 2001 From: Danny Canter Date: Wed, 12 Nov 2025 09:39:46 -0800 Subject: [PATCH] Vminitd: Sync(2) on shutdown (#400) --- Sources/Containerization/LinuxContainer.swift | 2 ++ Sources/Containerization/VirtualMachineAgent.swift | 5 +++++ vminitd/Sources/vminitd/Application.swift | 6 +++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Sources/Containerization/LinuxContainer.swift b/Sources/Containerization/LinuxContainer.swift index 2ff55169..5519b2bf 100644 --- a/Sources/Containerization/LinuxContainer.swift +++ b/Sources/Containerization/LinuxContainer.swift @@ -563,6 +563,8 @@ extension LinuxContainer { path: Self.guestRootfsPath(self.id), flags: 0 ) + + try await agent.sync() } // Lets free up the init procs resources, as this includes the open agent conn. diff --git a/Sources/Containerization/VirtualMachineAgent.swift b/Sources/Containerization/VirtualMachineAgent.swift index 024f1a52..80c6da48 100644 --- a/Sources/Containerization/VirtualMachineAgent.swift +++ b/Sources/Containerization/VirtualMachineAgent.swift @@ -42,6 +42,7 @@ public protocol VirtualMachineAgent: Sendable { func mkdir(path: String, all: Bool, perms: UInt32) async throws @discardableResult func kill(pid: Int32, signal: Int32) async throws -> Int32 + func sync() async throws func writeFile(path: String, data: Data, flags: WriteFileFlags, mode: UInt32) async throws // Process lifecycle @@ -89,4 +90,8 @@ extension VirtualMachineAgent { public func containerStatistics(containerIDs: [String]) async throws -> [ContainerStatistics] { throw ContainerizationError(.unsupported, message: "containerStatistics") } + + public func sync() async throws { + throw ContainerizationError(.unsupported, message: "sync") + } } diff --git a/vminitd/Sources/vminitd/Application.swift b/vminitd/Sources/vminitd/Application.swift index af04ef2c..fd93fde4 100644 --- a/vminitd/Sources/vminitd/Application.swift +++ b/vminitd/Sources/vminitd/Application.swift @@ -114,7 +114,11 @@ struct Application { do { log.info("serving vminitd API") try await server.serve(port: vsockPort) - log.info("vminitd API returned") + log.info("vminitd API returned, syncing filesystems") + + #if os(Linux) + Musl.sync() + #endif } catch { log.error("vminitd boot error \(error)") exit(1)