Lock frozen overlays during push

This commit is contained in:
Yibo Zhuang 2026-08-12 09:52:11 -07:00
parent 003bed0996
commit 10a151901c
No known key found for this signature in database
2 changed files with 30 additions and 2 deletions

View File

@ -250,9 +250,18 @@ extension VMDirectory {
))
}
let frozenOverlayURL = try Config().tartTmpDir.appendingPathComponent("\(UUID().uuidString).asif")
// Keep the snapshot out of startup GC while this potentially long push
// hashes, uploads, and inspects it.
let frozenOverlayDirectory = try VMDirectory.temporary()
let frozenOverlayLock = try FileLock(lockURL: frozenOverlayDirectory.baseURL)
try frozenOverlayLock.lock()
defer {
try? frozenOverlayLock.unlock()
try? FileManager.default.removeItem(at: frozenOverlayDirectory.baseURL)
}
let frozenOverlayURL = frozenOverlayDirectory.baseURL.appendingPathComponent("overlay.asif")
try FileManager.default.copyItem(at: overlayURL, to: frozenOverlayURL)
defer { try? FileManager.default.removeItem(at: frozenOverlayURL) }
let overlaySize = try FileManager.default.attributesOfItem(atPath: frozenOverlayURL.path)[.size] as! Int64
defaultLogger.appendNewLine("pushing overlay...")

View File

@ -62,6 +62,25 @@ final class CommandBehaviorTests: XCTestCase {
}
}
func testGarbageCollectionPreservesLockedTemporaryDirectory() throws {
try withTemporaryTartHome {
let temporaryVMDir = try VMDirectory.temporary()
let lock = try FileLock(lockURL: temporaryVMDir.baseURL)
try lock.lock()
XCTAssertTrue(FileManager.default.createFile(
atPath: temporaryVMDir.overlayURL.path,
contents: Data("overlay".utf8)
))
try Config().gc()
XCTAssertTrue(FileManager.default.fileExists(atPath: temporaryVMDir.overlayURL.path))
try lock.unlock()
try Config().gc()
XCTAssertFalse(FileManager.default.fileExists(atPath: temporaryVMDir.baseURL.path))
}
}
private func config() -> VMConfig {
VMConfig(
platform: Linux(),