Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 18 additions & 12 deletions MatrixSDK/Data/Store/MXFileStore/MXFileStore.m
Original file line number Diff line number Diff line change
Expand Up @@ -2178,14 +2178,14 @@ - (void)saveReceipts
{
NSArray *roomsToCommit = [[NSArray alloc] initWithArray:roomsToCommitForReceipts copyItems:YES];
[roomsToCommitForReceipts removeAllObjects];

#if DEBUG
MXLogDebug(@"[MXFileStore commit] queuing saveReceipts for %tu rooms", roomsToCommit.count);
#endif
MXWeakify(self);
dispatch_async(dispatchQueue, ^(void){
MXStrongifyAndReturnIfNil(self);

#if DEBUG
NSDate *startDate = [NSDate date];
#endif
Expand All @@ -2199,31 +2199,37 @@ - (void)saveReceipts
{
NSString *file = [self threadedReadReceiptsFileForRoom:roomId forBackup:NO];
NSString *backupFile = [self threadedReadReceiptsFileForRoom:roomId forBackup:YES];

// Backup the file
if (backupFile && [[NSFileManager defaultManager] fileExistsAtPath:file])
{
[self checkFolderExistenceForRoom:roomId forBackup:YES];
[[NSFileManager defaultManager] moveItemAtPath:file toPath:backupFile error:nil];
}

// Store new data
[self checkFolderExistenceForRoom:roomId forBackup:NO];

NSError *error = nil;
NSData *result = [NSKeyedArchiver archivedDataWithRootObject:receiptsStore requiringSecureCoding:false error:&error];
__block NSData *result = nil;
__block NSError *archiveError = nil;

if (error != nil)
{
MXLogErrorDetails(@"Failed archiving receipts store", error);
dispatch_sync(dispatch_get_main_queue(), ^{
result = [NSKeyedArchiver
archivedDataWithRootObject:receiptsStore
requiringSecureCoding:NO
error:&archiveError];
});

if (archiveError) {
MXLogErrorDetails(@"Failed archiving receipts store", archiveError);
continue;
}

[result writeToURL:[NSURL fileURLWithPath:file] options: NSDataWritingAtomic error: &error];
[result writeToURL:[NSURL fileURLWithPath:file] options: NSDataWritingAtomic error: &archiveError];

if (error != nil)
if (archiveError != nil)
{
MXLogErrorDetails(@"Failed writing receipts store to file", error);
MXLogErrorDetails(@"Failed writing receipts store to file", archiveError);
continue;
}
}
Expand Down
1 change: 1 addition & 0 deletions changelog.d/1810.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
MXFileStore.saveReceipts: Fixed a race condition involving multiple saves to the RoomThreadedReceiptsStore while commiting more receipts. Contributed by the Connect v3 Team at @powerhome