[MediaWiki-commits] [Gerrit] Core data performance improvements. Bug T99260 - change (apps...wikipedia)

2015-05-18 Thread Fjalapeno (Code Review)
Fjalapeno has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/211717

Change subject: Core data performance improvements. Bug T99260
..

Core data performance improvements. Bug T99260

Separate core data fetches into batches.
Reset context in-between fetches to reduce memory.
Move to async operations to allow UI to update progress during saves.

Change-Id: Iffdb31166dacde1caef5d89f2050f11b404a85c7
---
M Wikipedia/Data/OldDataSchemaMigrator.m
1 file changed, 98 insertions(+), 36 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/apps/ios/wikipedia 
refs/changes/17/211717/1

diff --git a/Wikipedia/Data/OldDataSchemaMigrator.m 
b/Wikipedia/Data/OldDataSchemaMigrator.m
index 616cb07..609bb32 100644
--- a/Wikipedia/Data/OldDataSchemaMigrator.m
+++ b/Wikipedia/Data/OldDataSchemaMigrator.m
@@ -105,48 +105,110 @@
 }
 
 - (void)migrateData {
-[self.context performBlock:^{
-NSFetchRequest* req = [NSFetchRequest 
fetchRequestWithEntityName:@Saved];
-req.sortDescriptors = @[[[NSSortDescriptor alloc] 
initWithKey:@dateSaved ascending:YES]];
-NSError* err;
-NSArray* savedEntries = [self.context executeFetchRequest:req 
error:err];
-
-if (err) {
-NSLog(@Error reading old Saved entries: %@, err);
+dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 
0), ^{
+if (![self migrateHistory]) {
 }
 
-NSFetchRequest* req2 = [NSFetchRequest 
fetchRequestWithEntityName:@History];
-req2.sortDescriptors = @[[[NSSortDescriptor alloc] 
initWithKey:@dateVisited ascending:YES]];
-NSError* err2;
-NSArray* historyEntries = [self.context executeFetchRequest:req2 
error:err2];
-
-if (err2) {
-NSLog(@Error reading old History entries: %@, err2);
-}
-
-NSUInteger totalArticlesToMigrate = [savedEntries count];
-__block NSUInteger numberOfArticlesMigrated = 0;
-
-void (^ incrementAndNotify)(void) = ^void (void) {
-numberOfArticlesMigrated++;
-dispatch_async(dispatch_get_main_queue(), ^{
-[self.progressDelegate oldDataSchema:self 
didUpdateProgressWithArticlesCompleted:numberOfArticlesMigrated 
total:totalArticlesToMigrate];
-});
-};
-
-for (History* history in historyEntries) {
-[self migrateHistory:history];
-}
-
-for (Saved* saved in savedEntries) {
-[self migrateSaved:saved];
-[self migrateArticle:saved.article];
-incrementAndNotify();
+if (![self migrateSavedPages]) {
 }
 
 [self moveOldDataToBackupLocation];
-[self.progressDelegate oldDataSchemaDidFinishMigration:self];
+
+dispatch_async(dispatch_get_main_queue(), ^{
+[self.progressDelegate oldDataSchemaDidFinishMigration:self];
+});
+});
+}
+
+- (BOOL)migrateHistory {
+__block NSError* error;
+
+[self.context performBlockAndWait:^{
+NSFetchRequest* req2 = [NSFetchRequest 
fetchRequestWithEntityName:@History];
+req2.sortDescriptors = @[[[NSSortDescriptor alloc] 
initWithKey:@dateVisited ascending:YES]];
+NSArray* historyEntries = [self.context executeFetchRequest:req2 
error:error];
+
+if (error) {
+NSLog(@Error reading old History entries: %@, error);
+}
+
+for (History* history in historyEntries) {
+@autoreleasepool {
+[self migrateHistory:history];
+}
+}
+
+[self.context reset];
 }];
+
+
+return error == nil;
+}
+
+- (BOOL)migrateSavedPages {
+__block NSError* error;
+__block NSUInteger totalArticlesToMigrate   = 0;
+__block NSUInteger numberOfArticlesMigrated = 0;
+
+[self.context performBlockAndWait:^{
+NSFetchRequest* req = [NSFetchRequest 
fetchRequestWithEntityName:@Saved];
+req.sortDescriptors = @[[[NSSortDescriptor alloc] 
initWithKey:@dateSaved ascending:YES]];
+totalArticlesToMigrate = [self.context countForFetchRequest:req 
error:error];
+NSLog(@total articles: %lu, totalArticlesToMigrate);
+}];
+
+NSUInteger fetchSize   = 25;
+__block BOOL moreSavedEntriesToProcess = YES;
+__block NSUInteger fetchOffset = 0;
+
+if (totalArticlesToMigrate  0) {
+while (moreSavedEntriesToProcess) {
+NSFetchRequest* req = [NSFetchRequest 
fetchRequestWithEntityName:@Saved];
+req.sortDescriptors = @[[[NSSortDescriptor alloc] 
initWithKey:@dateSaved ascending:YES]];
+req.fetchLimit  = fetchSize;
+req.fetchOffset = fetchOffset;
+
+[self.context performBlock:^{
+NSError* innerError;
+NSArray* savedEntries = [self.context executeFetchRequest:req 
error:innerError];
+
+if (savedEntries) {
+   

[MediaWiki-commits] [Gerrit] Core data performance improvements. Bug T99260 - change (apps...wikipedia)

2015-05-18 Thread Bgerstle (Code Review)
Bgerstle has submitted this change and it was merged.

Change subject: Core data performance improvements. Bug T99260
..


Core data performance improvements. Bug T99260

Separate core data fetches into batches.
Reset context in-between fetches to reduce memory.
Move to async operations to allow UI to update progress during saves.

Change-Id: Iffdb31166dacde1caef5d89f2050f11b404a85c7
---
M Wikipedia/Data/OldDataSchemaMigrator.m
1 file changed, 98 insertions(+), 36 deletions(-)

Approvals:
  Bgerstle: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/Wikipedia/Data/OldDataSchemaMigrator.m 
b/Wikipedia/Data/OldDataSchemaMigrator.m
index 616cb07..609bb32 100644
--- a/Wikipedia/Data/OldDataSchemaMigrator.m
+++ b/Wikipedia/Data/OldDataSchemaMigrator.m
@@ -105,48 +105,110 @@
 }
 
 - (void)migrateData {
-[self.context performBlock:^{
-NSFetchRequest* req = [NSFetchRequest 
fetchRequestWithEntityName:@Saved];
-req.sortDescriptors = @[[[NSSortDescriptor alloc] 
initWithKey:@dateSaved ascending:YES]];
-NSError* err;
-NSArray* savedEntries = [self.context executeFetchRequest:req 
error:err];
-
-if (err) {
-NSLog(@Error reading old Saved entries: %@, err);
+dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 
0), ^{
+if (![self migrateHistory]) {
 }
 
-NSFetchRequest* req2 = [NSFetchRequest 
fetchRequestWithEntityName:@History];
-req2.sortDescriptors = @[[[NSSortDescriptor alloc] 
initWithKey:@dateVisited ascending:YES]];
-NSError* err2;
-NSArray* historyEntries = [self.context executeFetchRequest:req2 
error:err2];
-
-if (err2) {
-NSLog(@Error reading old History entries: %@, err2);
-}
-
-NSUInteger totalArticlesToMigrate = [savedEntries count];
-__block NSUInteger numberOfArticlesMigrated = 0;
-
-void (^ incrementAndNotify)(void) = ^void (void) {
-numberOfArticlesMigrated++;
-dispatch_async(dispatch_get_main_queue(), ^{
-[self.progressDelegate oldDataSchema:self 
didUpdateProgressWithArticlesCompleted:numberOfArticlesMigrated 
total:totalArticlesToMigrate];
-});
-};
-
-for (History* history in historyEntries) {
-[self migrateHistory:history];
-}
-
-for (Saved* saved in savedEntries) {
-[self migrateSaved:saved];
-[self migrateArticle:saved.article];
-incrementAndNotify();
+if (![self migrateSavedPages]) {
 }
 
 [self moveOldDataToBackupLocation];
-[self.progressDelegate oldDataSchemaDidFinishMigration:self];
+
+dispatch_async(dispatch_get_main_queue(), ^{
+[self.progressDelegate oldDataSchemaDidFinishMigration:self];
+});
+});
+}
+
+- (BOOL)migrateHistory {
+__block NSError* error;
+
+[self.context performBlockAndWait:^{
+NSFetchRequest* req2 = [NSFetchRequest 
fetchRequestWithEntityName:@History];
+req2.sortDescriptors = @[[[NSSortDescriptor alloc] 
initWithKey:@dateVisited ascending:YES]];
+NSArray* historyEntries = [self.context executeFetchRequest:req2 
error:error];
+
+if (error) {
+NSLog(@Error reading old History entries: %@, error);
+}
+
+for (History* history in historyEntries) {
+@autoreleasepool {
+[self migrateHistory:history];
+}
+}
+
+[self.context reset];
 }];
+
+
+return error == nil;
+}
+
+- (BOOL)migrateSavedPages {
+__block NSError* error;
+__block NSUInteger totalArticlesToMigrate   = 0;
+__block NSUInteger numberOfArticlesMigrated = 0;
+
+[self.context performBlockAndWait:^{
+NSFetchRequest* req = [NSFetchRequest 
fetchRequestWithEntityName:@Saved];
+req.sortDescriptors = @[[[NSSortDescriptor alloc] 
initWithKey:@dateSaved ascending:YES]];
+totalArticlesToMigrate = [self.context countForFetchRequest:req 
error:error];
+NSLog(@total articles: %lu, totalArticlesToMigrate);
+}];
+
+NSUInteger fetchSize   = 25;
+__block BOOL moreSavedEntriesToProcess = YES;
+__block NSUInteger fetchOffset = 0;
+
+if (totalArticlesToMigrate  0) {
+while (moreSavedEntriesToProcess) {
+NSFetchRequest* req = [NSFetchRequest 
fetchRequestWithEntityName:@Saved];
+req.sortDescriptors = @[[[NSSortDescriptor alloc] 
initWithKey:@dateSaved ascending:YES]];
+req.fetchLimit  = fetchSize;
+req.fetchOffset = fetchOffset;
+
+[self.context performBlock:^{
+NSError* innerError;
+NSArray* savedEntries = [self.context executeFetchRequest:req 
error:innerError];
+
+if (savedEntries) {
+for (Saved* saved in savedEntries)