This repository has been archived on 2022-03-12. You can view files and clone it, but cannot push or open issues or pull requests.
2021-04-02 02:24:13 +03:00

80 lines
3.2 KiB
Objective-C

// Copyright © 2019 650 Industries. All rights reserved.
#import <EXUpdates/EXUpdatesFileDownloader.h>
#import <EXUpdates/EXUpdatesReaper.h>
NS_ASSUME_NONNULL_BEGIN
@implementation EXUpdatesReaper
+ (void)reapUnusedUpdatesWithConfig:(EXUpdatesConfig *)config
database:(EXUpdatesDatabase *)database
directory:(NSURL *)directory
selectionPolicy:(id<EXUpdatesSelectionPolicy>)selectionPolicy
launchedUpdate:(EXUpdatesUpdate *)launchedUpdate
{
dispatch_async(database.databaseQueue, ^{
NSError *error;
NSDate *beginDeleteFromDatabase = [NSDate date];
[database markUpdateFinished:launchedUpdate error:&error];
if (error) {
NSLog(@"Error reaping updates: %@", error.localizedDescription);
return;
}
NSArray<EXUpdatesUpdate *> *allUpdates = [database allUpdatesWithConfig:config error:&error];
if (!allUpdates || error) {
NSLog(@"Error reaping updates: %@", error.localizedDescription);
return;
}
NSArray<EXUpdatesUpdate *> *updatesToDelete = [selectionPolicy updatesToDeleteWithLaunchedUpdate:launchedUpdate updates:allUpdates];
[database deleteUpdates:updatesToDelete error:&error];
if (error) {
NSLog(@"Error reaping updates: %@", error.localizedDescription);
return;
}
NSArray<EXUpdatesAsset *> *assetsForDeletion = [database deleteUnusedAssetsWithError:&error];
if (error) {
NSLog(@"Error reaping updates: %@", error.localizedDescription);
return;
}
NSLog(@"Deleted assets and updates from SQLite in %f ms", [beginDeleteFromDatabase timeIntervalSinceNow] * -1000);
dispatch_async([EXUpdatesFileDownloader assetFilesQueue], ^{
NSUInteger deletedAssets = 0;
NSMutableArray<EXUpdatesAsset *> *erroredAssets = [NSMutableArray new];
NSDate *beginDeleteAssets = [NSDate date];
for (EXUpdatesAsset *asset in assetsForDeletion) {
NSURL *localUrl = [directory URLByAppendingPathComponent:asset.filename];
NSError *error;
if ([NSFileManager.defaultManager fileExistsAtPath:localUrl.path] && ![NSFileManager.defaultManager removeItemAtURL:localUrl error:&error]) {
NSLog(@"Error deleting asset at %@: %@", localUrl, error.localizedDescription);
[erroredAssets addObject:asset];
} else {
deletedAssets++;
}
}
NSLog(@"Deleted %lu assets from disk in %f ms", (unsigned long)deletedAssets, [beginDeleteAssets timeIntervalSinceNow] * -1000);
NSDate *beginRetryDeletes = [NSDate date];
// retry errored deletions
for (EXUpdatesAsset *asset in erroredAssets) {
NSURL *localUrl = [directory URLByAppendingPathComponent:asset.filename];
NSError *error;
if ([NSFileManager.defaultManager fileExistsAtPath:localUrl.path] && ![NSFileManager.defaultManager removeItemAtURL:localUrl error:&error]) {
NSLog(@"Retried deleting asset at %@ and failed again: %@", localUrl, error.localizedDescription);
}
}
NSLog(@"Retried deleting assets from disk in %f ms", [beginRetryDeletes timeIntervalSinceNow] * -1000);
});
});
}
@end
NS_ASSUME_NONNULL_END