Sfoglia il codice sorgente

speed up db upgrade

Luke Pulverenti 9 anni fa
parent
commit
8629d509e4

+ 1 - 1
MediaBrowser.Api/StartupWizardService.cs

@@ -117,7 +117,7 @@ namespace MediaBrowser.Api
             config.EnableStandaloneMusicKeys = true;
             config.EnableStandaloneMusicKeys = true;
             config.EnableCaseSensitiveItemIds = true;
             config.EnableCaseSensitiveItemIds = true;
             //config.EnableFolderView = true;
             //config.EnableFolderView = true;
-            config.SchemaVersion = 101;
+            config.SchemaVersion = 107;
         }
         }
 
 
         public void Post(UpdateStartupConfiguration request)
         public void Post(UpdateStartupConfiguration request)

+ 58 - 33
MediaBrowser.Server.Implementations/Persistence/CleanDatabaseScheduledTask.cs

@@ -142,52 +142,77 @@ namespace MediaBrowser.Server.Implementations.Persistence
             }
             }
         }
         }
 
 
-        private async Task UpdateToLatestSchema(CancellationToken cancellationToken, IProgress<double> progress)
+        private Task UpdateToLatestSchema(CancellationToken cancellationToken, IProgress<double> progress)
         {
         {
-            var itemIds = _libraryManager.GetItemIds(new InternalItemsQuery
+            return UpdateToLatestSchema(0, 0, null, cancellationToken, progress);
+        }
+
+        private async Task UpdateToLatestSchema(int queryStartIndex, int progressStartIndex, int? totalRecordCount, CancellationToken cancellationToken, IProgress<double> progress)
+        {
+            IEnumerable<BaseItem> items;
+            int numItemsToSave;
+            var pageSize = 2000;
+
+            if (totalRecordCount.HasValue)
             {
             {
-                IsCurrentSchema = false,
-                ExcludeItemTypes = new[] { typeof(LiveTvProgram).Name }
-            });
+                var list = _libraryManager.GetItemList(new InternalItemsQuery
+                {
+                    IsCurrentSchema = false,
+                    ExcludeItemTypes = new[] { typeof(LiveTvProgram).Name },
+                    StartIndex = queryStartIndex,
+                    Limit = pageSize
 
 
-            var numComplete = 0;
-            var numItems = itemIds.Count;
+                }).ToList();
+
+                items = list;
+                numItemsToSave = list.Count;
+            }
+            else
+            {
+                var itemsResult = _libraryManager.GetItemsResult(new InternalItemsQuery
+                {
+                    IsCurrentSchema = false,
+                    ExcludeItemTypes = new[] { typeof(LiveTvProgram).Name },
+                    StartIndex = queryStartIndex,
+                    Limit = pageSize
+                });
+
+                totalRecordCount = itemsResult.TotalRecordCount;
+                items = itemsResult.Items;
+                numItemsToSave = itemsResult.Items.Length;
+            }
+
+            var numItems = totalRecordCount.Value;
 
 
             _logger.Debug("Upgrading schema for {0} items", numItems);
             _logger.Debug("Upgrading schema for {0} items", numItems);
 
 
-            foreach (var itemId in itemIds)
+            if (numItemsToSave > 0)
             {
             {
-                cancellationToken.ThrowIfCancellationRequested();
-
-                if (itemId != Guid.Empty)
+                try
                 {
                 {
-                    // Somehow some invalid data got into the db. It probably predates the boundary checking
-                    var item = _libraryManager.GetItemById(itemId);
-
-                    if (item != null)
-                    {
-                        try
-                        {
-                            await _itemRepo.SaveItem(item, cancellationToken).ConfigureAwait(false);
-                        }
-                        catch (OperationCanceledException)
-                        {
-                            throw;
-                        }
-                        catch (Exception ex)
-                        {
-                            _logger.ErrorException("Error saving item", ex);
-                        }
-                    }
+                    await _itemRepo.SaveItems(items, cancellationToken).ConfigureAwait(false);
+                }
+                catch (OperationCanceledException)
+                {
+                    throw;
+                }
+                catch (Exception ex)
+                {
+                    _logger.ErrorException("Error saving item", ex);
                 }
                 }
 
 
-                numComplete++;
-                double percent = numComplete;
+                progressStartIndex += pageSize;
+                double percent = progressStartIndex;
                 percent /= numItems;
                 percent /= numItems;
                 progress.Report(percent * 100);
                 progress.Report(percent * 100);
-            }
 
 
-            progress.Report(100);
+                var newStartIndex = queryStartIndex + (pageSize - numItemsToSave);
+                await UpdateToLatestSchema(newStartIndex, progressStartIndex, totalRecordCount, cancellationToken, progress).ConfigureAwait(false);
+            }
+            else
+            {
+                progress.Report(100);
+            }
         }
         }
 
 
         private async Task CleanDeadItems(CancellationToken cancellationToken, IProgress<double> progress)
         private async Task CleanDeadItems(CancellationToken cancellationToken, IProgress<double> progress)

+ 1 - 1
MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs

@@ -95,7 +95,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
         private IDbCommand _updateInheritedRatingCommand;
         private IDbCommand _updateInheritedRatingCommand;
         private IDbCommand _updateInheritedTagsCommand;
         private IDbCommand _updateInheritedTagsCommand;
 
 
-        public const int LatestSchemaVersion = 101;
+        public const int LatestSchemaVersion = 107;
 
 
         /// <summary>
         /// <summary>
         /// Initializes a new instance of the <see cref="SqliteItemRepository"/> class.
         /// Initializes a new instance of the <see cref="SqliteItemRepository"/> class.