From 9eaad18c2c2145a6deccfd51d5fc8532f65d2bfc Mon Sep 17 00:00:00 2001 From: Claus Vium Date: Thu, 2 Feb 2023 14:02:57 +0100 Subject: [PATCH] fix: don't allow exceptions to propagate from Refresh progress event handlers (#9228) --- .../Manager/ProviderManager.cs | 41 +++++++++++++++---- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs index 0ce696edc6..c07839ff25 100644 --- a/MediaBrowser.Providers/Manager/ProviderManager.cs +++ b/MediaBrowser.Providers/Manager/ProviderManager.cs @@ -910,19 +910,34 @@ namespace MediaBrowser.Providers.Manager /// public void OnRefreshStart(BaseItem item) { - _logger.LogDebug("OnRefreshStart {Item}", item.Id.ToString("N", CultureInfo.InvariantCulture)); + _logger.LogDebug("OnRefreshStart {Item:N}", item.Id); _activeRefreshes[item.Id] = 0; - RefreshStarted?.Invoke(this, new GenericEventArgs(item)); + try + { + RefreshStarted?.Invoke(this, new GenericEventArgs(item)); + } + catch (Exception ex) + { + // EventHandlers should never propagate exceptions, but we have little control over plugins... + _logger.LogError(ex, "Invoking {RefreshEvent} event handlers failed", nameof(RefreshStarted)); + } } /// public void OnRefreshComplete(BaseItem item) { - _logger.LogDebug("OnRefreshComplete {Item}", item.Id.ToString("N", CultureInfo.InvariantCulture)); + _logger.LogDebug("OnRefreshComplete {Item:N}", item.Id); + _activeRefreshes.TryRemove(item.Id, out _); - _activeRefreshes.Remove(item.Id, out _); - - RefreshCompleted?.Invoke(this, new GenericEventArgs(item)); + try + { + RefreshCompleted?.Invoke(this, new GenericEventArgs(item)); + } + catch (Exception ex) + { + // EventHandlers should never propagate exceptions, but we have little control over plugins... + _logger.LogError(ex, "Invoking {RefreshEvent} event handlers failed", nameof(RefreshCompleted)); + } } /// @@ -940,12 +955,12 @@ namespace MediaBrowser.Providers.Manager public void OnRefreshProgress(BaseItem item, double progress) { var id = item.Id; - _logger.LogDebug("OnRefreshProgress {Id} {Progress}", id.ToString("N", CultureInfo.InvariantCulture), progress); + _logger.LogDebug("OnRefreshProgress {Id:N} {Progress}", id, progress); // TODO: Need to hunt down the conditions for this happening _activeRefreshes.AddOrUpdate( id, - (_) => throw new InvalidOperationException( + _ => throw new InvalidOperationException( string.Format( CultureInfo.InvariantCulture, "Cannot update refresh progress of item '{0}' ({1}) because a refresh for this item is not running", @@ -953,7 +968,15 @@ namespace MediaBrowser.Providers.Manager item.Id.ToString("N", CultureInfo.InvariantCulture))), (_, _) => progress); - RefreshProgress?.Invoke(this, new GenericEventArgs>(new Tuple(item, progress))); + try + { + RefreshProgress?.Invoke(this, new GenericEventArgs>(new Tuple(item, progress))); + } + catch (Exception ex) + { + // EventHandlers should never propagate exceptions, but we have little control over plugins... + _logger.LogError(ex, "Invoking {RefreshEvent} event handlers failed", nameof(RefreshProgress)); + } } ///