From c67efb88f3600b9a4f4784bd156c8ac15c3a8a93 Mon Sep 17 00:00:00 2001 From: Nikolay Edigaryev Date: Fri, 14 Oct 2022 01:43:37 +0400 Subject: [PATCH] Fix tart prune --cache-budget logic (#272) --- Sources/tart/Commands/Prune.swift | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/Sources/tart/Commands/Prune.swift b/Sources/tart/Commands/Prune.swift index 4836c7c..8b978e9 100644 --- a/Sources/tart/Commands/Prune.swift +++ b/Sources/tart/Commands/Prune.swift @@ -63,21 +63,25 @@ struct Prune: AsyncParsableCommand { let prunableStorages: [PrunableStorage] = [VMStorageOCI(), try IPSWCache()] let prunables: [Prunable] = try prunableStorages .flatMap { try $0.prunables() } - .sorted { try $0.accessDate() < $1.accessDate() } + .sorted { try $0.accessDate() > $1.accessDate() } - let cacheUsedBytes = try prunables.map { try $0.sizeBytes() }.reduce(0, +) - var cacheReclaimedBytes: Int = 0 + var cacheBudgetBytes = cacheBudgetBytes + var prunablesToDelete: [Prunable] = [] - var it = prunables.makeIterator() + for prunable in prunables { + let prunableSizeBytes = UInt64(try prunable.sizeBytes()) - while (cacheUsedBytes - cacheReclaimedBytes) > cacheBudgetBytes { - guard let prunable = it.next() else { - break + if prunableSizeBytes <= cacheBudgetBytes { + // Don't mark for deletion as + // there's a budget available + cacheBudgetBytes -= prunableSizeBytes + } else { + // Mark for deletion + prunablesToDelete.append(prunable) } - - cacheReclaimedBytes -= try prunable.sizeBytes() - try prunable.delete() } + + try prunablesToDelete.forEach { try $0.delete() } } static func pruneReclaim(reclaimBytes: UInt64) throws {