From 92cd71143daa2d49abb0421a9cb641e9bf4489ae Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 24 Jun 2013 21:22:21 -0400 Subject: Only fire metadata savers when appropriate --- .../Providers/ProviderManager.cs | 97 ++++++---------------- 1 file changed, 27 insertions(+), 70 deletions(-) (limited to 'MediaBrowser.Server.Implementations/Providers') diff --git a/MediaBrowser.Server.Implementations/Providers/ProviderManager.cs b/MediaBrowser.Server.Implementations/Providers/ProviderManager.cs index 01c0659b6f..ee8bb4c096 100644 --- a/MediaBrowser.Server.Implementations/Providers/ProviderManager.cs +++ b/MediaBrowser.Server.Implementations/Providers/ProviderManager.cs @@ -60,8 +60,6 @@ namespace MediaBrowser.Server.Implementations.Providers /// The metadata providers enumerable. private BaseMetadataProvider[] MetadataProviders { get; set; } - private IEnumerable _savers; - /// /// Initializes a new instance of the class. /// @@ -79,44 +77,6 @@ namespace MediaBrowser.Server.Implementations.Providers _remoteImageCache = new FileSystemRepository(configurationManager.ApplicationPaths.DownloadedImagesDataPath); configurationManager.ConfigurationUpdated += configurationManager_ConfigurationUpdated; - - libraryManager.ItemUpdated += libraryManager_ItemUpdated; - } - - private readonly ConcurrentDictionary _fileLocks = new ConcurrentDictionary(); - - /// - /// Handles the ItemUpdated event of the libraryManager control. - /// - /// The source of the event. - /// The instance containing the event data. - async void libraryManager_ItemUpdated(object sender, ItemChangeEventArgs e) - { - var item = e.Item; - - foreach (var saver in _savers.Where(i => i.Supports(item))) - { - var path = saver.GetSavePath(item); - - var semaphore = _fileLocks.GetOrAdd(path, key => new SemaphoreSlim(1, 1)); - - await semaphore.WaitAsync().ConfigureAwait(false); - - try - { - _directoryWatchers.TemporarilyIgnore(path); - saver.Save(item, CancellationToken.None); - } - catch (Exception ex) - { - _logger.ErrorException("Error in metadata saver", ex); - } - finally - { - _directoryWatchers.RemoveTempIgnore(path); - semaphore.Release(); - } - } } /// @@ -134,12 +94,9 @@ namespace MediaBrowser.Server.Implementations.Providers /// Adds the metadata providers. /// /// The providers. - /// The savers. - public void AddParts(IEnumerable providers, - IEnumerable savers) + public void AddParts(IEnumerable providers) { MetadataProviders = providers.OrderBy(e => e.Priority).ToArray(); - _savers = savers; } /// @@ -150,18 +107,14 @@ namespace MediaBrowser.Server.Implementations.Providers /// if set to true [force]. /// if set to true [allow slow providers]. /// Task{System.Boolean}. - public async Task ExecuteMetadataProviders(BaseItem item, CancellationToken cancellationToken, bool force = false, bool allowSlowProviders = true) + public async Task ExecuteMetadataProviders(BaseItem item, CancellationToken cancellationToken, bool force = false, bool allowSlowProviders = true) { if (item == null) { throw new ArgumentNullException("item"); } - // Allow providers of the same priority to execute in parallel - MetadataProviderPriority? currentPriority = null; - var currentTasks = new List>(); - - var result = false; + ItemUpdateType? result = null; cancellationToken.ThrowIfCancellationRequested(); @@ -188,15 +141,6 @@ namespace MediaBrowser.Server.Implementations.Providers continue; } - // When a new priority is reached, await the ones that are currently running and clear the list - if (currentPriority.HasValue && currentPriority.Value != provider.Priority && currentTasks.Count > 0) - { - var results = await Task.WhenAll(currentTasks).ConfigureAwait(false); - result |= results.Contains(true); - - currentTasks.Clear(); - } - // Put this check below the await because the needs refresh of the next tier of providers may depend on the previous ones running // This is the case for the fan art provider which depends on the movie and tv providers having run before them if (provider.RequiresInternet && item.DontFetchMeta) @@ -216,14 +160,19 @@ namespace MediaBrowser.Server.Implementations.Providers _logger.Error("Error determining NeedsRefresh for {0}", ex, item.Path); } - currentTasks.Add(FetchAsync(provider, item, force, cancellationToken)); - currentPriority = provider.Priority; - } + var updateType = await FetchAsync(provider, item, force, cancellationToken).ConfigureAwait(false); - if (currentTasks.Count > 0) - { - var results = await Task.WhenAll(currentTasks).ConfigureAwait(false); - result |= results.Contains(true); + if (updateType.HasValue) + { + if (result.HasValue) + { + result = result.Value | updateType.Value; + } + else + { + result = updateType; + } + } } return result; @@ -238,7 +187,7 @@ namespace MediaBrowser.Server.Implementations.Providers /// The cancellation token. /// Task{System.Boolean}. /// - private async Task FetchAsync(BaseMetadataProvider provider, BaseItem item, bool force, CancellationToken cancellationToken) + private async Task FetchAsync(BaseMetadataProvider provider, BaseItem item, bool force, CancellationToken cancellationToken) { if (item == null) { @@ -256,7 +205,14 @@ namespace MediaBrowser.Server.Implementations.Providers try { - return await provider.FetchAsync(item, force, CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, innerCancellationTokenSource.Token).Token).ConfigureAwait(false); + var changed = await provider.FetchAsync(item, force, CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, innerCancellationTokenSource.Token).Token).ConfigureAwait(false); + + if (changed) + { + return provider.ItemUpdateType; + } + + return null; } catch (OperationCanceledException ex) { @@ -268,14 +224,15 @@ namespace MediaBrowser.Server.Implementations.Providers throw; } - return false; + return null; } catch (Exception ex) { _logger.ErrorException("{0} failed refreshing {1}", ex, provider.GetType().Name, item.Name); provider.SetLastRefreshed(item, DateTime.UtcNow, ProviderRefreshStatus.Failure); - return true; + + return ItemUpdateType.Unspecified; } finally { -- cgit v1.2.3