From efd1be30c7a62d850059c3b1e2a4b8d48e0a32a5 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Fri, 11 Jan 2019 10:40:41 -0500 Subject: [PATCH] Cull unknown migrations. --- .../migrations/OWSDatabaseMigrationRunner.m | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/SignalMessaging/environment/migrations/OWSDatabaseMigrationRunner.m b/SignalMessaging/environment/migrations/OWSDatabaseMigrationRunner.m index a19510996..9837b79bf 100644 --- a/SignalMessaging/environment/migrations/OWSDatabaseMigrationRunner.m +++ b/SignalMessaging/environment/migrations/OWSDatabaseMigrationRunner.m @@ -1,5 +1,5 @@ // -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. +// Copyright (c) 2019 Open Whisper Systems. All rights reserved. // #import "OWSDatabaseMigrationRunner.h" @@ -19,6 +19,17 @@ NS_ASSUME_NONNULL_BEGIN @implementation OWSDatabaseMigrationRunner +#pragma mark - Dependencies + +- (OWSPrimaryStorage *)primaryStorage +{ + OWSAssertDebug(SSKEnvironment.shared.primaryStorage); + + return SSKEnvironment.shared.primaryStorage; +} + +#pragma mark - + // This should all migrations which do NOT qualify as safeBlockingMigrations: - (NSArray *)allMigrations { @@ -50,9 +61,36 @@ NS_ASSUME_NONNULL_BEGIN - (void)runAllOutstandingWithCompletion:(OWSDatabaseMigrationCompletion)completion { + [self removeUnknownMigrations]; + [self runMigrations:[self.allMigrations mutableCopy] completion:completion]; } +// Some users (especially internal users) will move back and forth between +// app versions. Whenever they move "forward" in the version history, we +// want them to re-run any new migrations. Therefore, when they move "backward" +// in the version history, we cull any unknown migrations. +- (void)removeUnknownMigrations +{ + NSMutableSet *knownMigrationIds = [NSMutableSet new]; + for (OWSDatabaseMigration *migration in self.allMigrations) { + [knownMigrationIds addObject:migration.uniqueId]; + } + + [self.primaryStorage.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + NSArray *savedMigrationIds = [transaction allKeysInCollection:OWSDatabaseMigration.collection]; + + NSMutableSet *unknownMigrationIds = [NSMutableSet new]; + [unknownMigrationIds addObjectsFromArray:savedMigrationIds]; + [unknownMigrationIds minusSet:knownMigrationIds]; + + for (NSString *unknownMigrationId in unknownMigrationIds) { + OWSLogInfo(@"Culling unknown migration: %@", unknownMigrationId); + [transaction removeObjectForKey:unknownMigrationId inCollection:OWSDatabaseMigration.collection]; + } + }]; +} + // Run migrations serially to: // // * Ensure predictable ordering.