Browse Source

improved update staggering

Luke Pulverenti 11 years ago
parent
commit
b9ab69f051

+ 3 - 20
MediaBrowser.Common.Implementations/BaseApplicationHost.cs

@@ -282,7 +282,7 @@ namespace MediaBrowser.Common.Implementations
                 SecurityManager = new PluginSecurityManager(this, HttpClient, JsonSerializer, ApplicationPaths);
                 RegisterSingleInstance(SecurityManager);
 
-                InstallationManager = new InstallationManager(Logger, this, ApplicationPaths, HttpClient, JsonSerializer, SecurityManager, NetworkManager);
+                InstallationManager = new InstallationManager(Logger, this, ApplicationPaths, HttpClient, JsonSerializer, SecurityManager, NetworkManager, ConfigurationManager);
                 RegisterSingleInstance(InstallationManager);
             });
         }
@@ -560,8 +560,6 @@ namespace MediaBrowser.Common.Implementations
         /// <value><c>true</c> if this instance can self update; otherwise, <c>false</c>.</value>
         public abstract bool CanSelfUpdate { get; }
 
-        private Tuple<CheckForUpdateResult, DateTime> _lastUpdateCheckResult;
-
         /// <summary>
         /// Checks for update.
         /// </summary>
@@ -571,24 +569,9 @@ namespace MediaBrowser.Common.Implementations
         public async Task<CheckForUpdateResult> CheckForApplicationUpdate(CancellationToken cancellationToken,
                                                                     IProgress<double> progress)
         {
-            if (_lastUpdateCheckResult != null)
-            {
-                // Let dev users get results more often for testing purposes
-                var cacheLength = ConfigurationManager.CommonConfiguration.SystemUpdateLevel == PackageVersionClass.Dev
-                                      ? TimeSpan.FromHours(1)
-                                      : TimeSpan.FromHours(12);
-
-                if ((DateTime.UtcNow - _lastUpdateCheckResult.Item2) < cacheLength)
-                {
-                    return _lastUpdateCheckResult.Item1;
-                }
-            }
-
             var result = await CheckForApplicationUpdateInternal(cancellationToken, progress).ConfigureAwait(false);
 
-            _lastUpdateCheckResult = new Tuple<CheckForUpdateResult, DateTime>(result, DateTime.UtcNow);
-
-            return _lastUpdateCheckResult.Item1;
+            return result;
         }
 
         /// <summary>
@@ -600,7 +583,7 @@ namespace MediaBrowser.Common.Implementations
         private async Task<CheckForUpdateResult> CheckForApplicationUpdateInternal(CancellationToken cancellationToken,
                                                                    IProgress<double> progress)
         {
-            var availablePackages = await InstallationManager.GetAvailablePackagesWithoutRegistrationInfo(CancellationToken.None).ConfigureAwait(false);
+            var availablePackages = await InstallationManager.GetAvailablePackagesWithoutRegistrationInfo(cancellationToken).ConfigureAwait(false);
 
             var version = InstallationManager.GetLatestCompatibleVersion(availablePackages, ApplicationUpdatePackageName, ConfigurationManager.CommonConfiguration.SystemUpdateLevel);
 

+ 22 - 3
MediaBrowser.Common.Implementations/Updates/InstallationManager.cs

@@ -1,5 +1,4 @@
-using System.Security.Cryptography;
-using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Events;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Common.Plugins;
@@ -14,6 +13,7 @@ using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.IO;
 using System.Linq;
+using System.Security.Cryptography;
 using System.Threading;
 using System.Threading.Tasks;
 
@@ -104,6 +104,7 @@ namespace MediaBrowser.Common.Implementations.Updates
         private readonly IJsonSerializer _jsonSerializer;
         private readonly ISecurityManager _securityManager;
         private readonly INetworkManager _networkManager;
+        private readonly IConfigurationManager _config;
 
         /// <summary>
         /// Gets the application host.
@@ -111,7 +112,7 @@ namespace MediaBrowser.Common.Implementations.Updates
         /// <value>The application host.</value>
         private readonly IApplicationHost _applicationHost;
 
-        public InstallationManager(ILogger logger, IApplicationHost appHost, IApplicationPaths appPaths, IHttpClient httpClient, IJsonSerializer jsonSerializer, ISecurityManager securityManager, INetworkManager networkManager)
+        public InstallationManager(ILogger logger, IApplicationHost appHost, IApplicationPaths appPaths, IHttpClient httpClient, IJsonSerializer jsonSerializer, ISecurityManager securityManager, INetworkManager networkManager, IConfigurationManager config)
         {
             if (logger == null)
             {
@@ -127,6 +128,7 @@ namespace MediaBrowser.Common.Implementations.Updates
             _jsonSerializer = jsonSerializer;
             _securityManager = securityManager;
             _networkManager = networkManager;
+            _config = config;
             _logger = logger;
         }
 
@@ -153,6 +155,8 @@ namespace MediaBrowser.Common.Implementations.Updates
             }
         }
 
+        private Tuple<List<PackageInfo>, DateTime> _lastPackageListResult;
+        
         /// <summary>
         /// Gets all available packages.
         /// </summary>
@@ -164,12 +168,27 @@ namespace MediaBrowser.Common.Implementations.Updates
             PackageType? packageType = null,
             Version applicationVersion = null)
         {
+            if (_lastPackageListResult != null)
+            {
+                // Let dev users get results more often for testing purposes
+                var cacheLength = _config.CommonConfiguration.SystemUpdateLevel == PackageVersionClass.Dev
+                                      ? TimeSpan.FromMinutes(10)
+                                      : TimeSpan.FromHours(12);
+
+                if ((DateTime.UtcNow - _lastPackageListResult.Item2) < cacheLength)
+                {
+                    return _lastPackageListResult.Item1;
+                }
+            }
+            
             using (var json = await _httpClient.Get(Constants.Constants.MbAdminUrl + "service/MB3Packages.json", cancellationToken).ConfigureAwait(false))
             {
                 cancellationToken.ThrowIfCancellationRequested();
 
                 var packages = _jsonSerializer.DeserializeFromStream<List<PackageInfo>>(json).ToList();
 
+                _lastPackageListResult = new Tuple<List<PackageInfo>, DateTime>(packages, DateTime.UtcNow);
+
                 return FilterPackages(packages, packageType, applicationVersion);
             }
         }