From afb3475ab3b34dbdfe43474dbd538582c237b9bf Mon Sep 17 00:00:00 2001 From: manuroe Date: Fri, 12 Aug 2016 16:30:24 +0200 Subject: [PATCH] MXFileStore: Be more robust on commit interruption: The metadata file needs to by backuped too. https://github.com/vector-im/vector-ios/issues/376 --- .../Data/Store/MXFileStore/MXFileStore.h | 14 ++++---- .../Data/Store/MXFileStore/MXFileStore.m | 36 ++++++++++++++++--- 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/MatrixSDK/Data/Store/MXFileStore/MXFileStore.h b/MatrixSDK/Data/Store/MXFileStore/MXFileStore.h index 5d8bcb59df..c99fa4d1ce 100644 --- a/MatrixSDK/Data/Store/MXFileStore/MXFileStore.h +++ b/MatrixSDK/Data/Store/MXFileStore/MXFileStore.h @@ -38,15 +38,17 @@ L accountData L receipts + ... - + roomsBackup: This folder contains backup of room files that are modified - during the commit process. It is flushed when the commit completes. + L MXFileStore : Information about the stored data + + backup : This folder contains backup of files that are modified during + the commit process. It is flushed when the commit completes. This allows to rollback to previous data if the commit process was interrupted. + {syncToken} : the token that corresponds to the backup data - + {roomIdA} - + {roomIdB} - + ... - L MXFileStore : Information about the stored data + + rooms + + {roomIdA} + + {roomIdB} + + ... + L MXFileStore */ @interface MXFileStore : MXMemoryStore diff --git a/MatrixSDK/Data/Store/MXFileStore/MXFileStore.m b/MatrixSDK/Data/Store/MXFileStore/MXFileStore.m index fad972ccd7..e218a6109b 100644 --- a/MatrixSDK/Data/Store/MXFileStore/MXFileStore.m +++ b/MatrixSDK/Data/Store/MXFileStore/MXFileStore.m @@ -24,11 +24,11 @@ NSString *const kMXFileStoreFolder = @"MXFileStore"; NSString *const kMXFileStoreMedaDataFile = @"MXFileStore"; +NSString *const kMXFileStoreBackupFolder = @"backup"; NSString *const kMXFileStoreSavingMarker = @"savingMarker"; NSString *const kMXFileStoreRoomsFolder = @"rooms"; -NSString *const kMXFileStoreRoomsBackupFolder = @"roomsBackup"; NSString *const kMXFileStoreRoomMessagesFile = @"messages"; NSString *const kMXFileStoreRoomStateFile = @"state"; NSString *const kMXFileStoreRoomAccountDataFile = @"accountData"; @@ -52,6 +52,9 @@ @interface MXFileStore () // The path of the MXFileStore folder NSString *storePath; + // The path of the backup folder + NSString *storeBackupPath; + // The path of the temporary file created during saving process. NSString *savingMarkerFile; @@ -111,7 +114,9 @@ - (void)openWithCredentials:(MXCredentials*)someCredentials onComplete:(void (^) storePath = [[cachePath stringByAppendingPathComponent:kMXFileStoreFolder] stringByAppendingPathComponent:credentials.userId]; savingMarkerFile = [storePath stringByAppendingPathComponent:kMXFileStoreSavingMarker]; storeRoomsPath = [storePath stringByAppendingPathComponent:kMXFileStoreRoomsFolder]; - storeRoomsBackupPath = [storePath stringByAppendingPathComponent:kMXFileStoreRoomsBackupFolder]; + + storeBackupPath = [storePath stringByAppendingPathComponent:kMXFileStoreBackupFolder]; + storeRoomsBackupPath = [storeBackupPath stringByAppendingPathComponent:kMXFileStoreRoomsFolder]; /* Mount data corresponding to the account credentials. @@ -541,6 +546,18 @@ - (NSString*)readReceiptsFileForRoom:(NSString*)roomId forBackup:(BOOL)backup return [[self folderForRoom:roomId forBackup:backup] stringByAppendingPathComponent:kMXFileStoreRoomReadReceiptsFile]; } +- (NSString*)metaDataFileForBackup:(BOOL)backup +{ + if (!backup) + { + return [storePath stringByAppendingPathComponent:kMXFileStoreMedaDataFile]; + } + else + { + return [storeBackupPath stringByAppendingPathComponent:kMXFileStoreMedaDataFile]; + } +} + #pragma mark - Storage validity - (BOOL)checkStorageValidity @@ -802,9 +819,18 @@ - (void)saveMetaData MXFileStoreMetaData *metaData2 = [metaData copy]; dispatch_async(dispatchQueue, ^(void){ - - NSString *metaDataFile = [storePath stringByAppendingPathComponent:kMXFileStoreMedaDataFile]; - [NSKeyedArchiver archiveRootObject:metaData2 toFile:metaDataFile]; + + NSString *file = [self metaDataFileForBackup:NO]; + NSString *backupFile = [self metaDataFileForBackup:YES]; + + // Backup the file + if ([[NSFileManager defaultManager] fileExistsAtPath:file]) + { + [[NSFileManager defaultManager] moveItemAtPath:file toPath:backupFile error:nil]; + } + + // Store new data + [NSKeyedArchiver archiveRootObject:metaData2 toFile:file]; }); } }