improved update staggering

This commit is contained in:
Luke Pulverenti 2013-08-30 10:05:44 -04:00
parent 6d31204bcc
commit b9ab69f051
2 changed files with 25 additions and 23 deletions

View file

@ -282,7 +282,7 @@ namespace MediaBrowser.Common.Implementations
SecurityManager = new PluginSecurityManager(this, HttpClient, JsonSerializer, ApplicationPaths); SecurityManager = new PluginSecurityManager(this, HttpClient, JsonSerializer, ApplicationPaths);
RegisterSingleInstance(SecurityManager); 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); 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> /// <value><c>true</c> if this instance can self update; otherwise, <c>false</c>.</value>
public abstract bool CanSelfUpdate { get; } public abstract bool CanSelfUpdate { get; }
private Tuple<CheckForUpdateResult, DateTime> _lastUpdateCheckResult;
/// <summary> /// <summary>
/// Checks for update. /// Checks for update.
/// </summary> /// </summary>
@ -571,24 +569,9 @@ namespace MediaBrowser.Common.Implementations
public async Task<CheckForUpdateResult> CheckForApplicationUpdate(CancellationToken cancellationToken, public async Task<CheckForUpdateResult> CheckForApplicationUpdate(CancellationToken cancellationToken,
IProgress<double> progress) 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); var result = await CheckForApplicationUpdateInternal(cancellationToken, progress).ConfigureAwait(false);
_lastUpdateCheckResult = new Tuple<CheckForUpdateResult, DateTime>(result, DateTime.UtcNow); return result;
return _lastUpdateCheckResult.Item1;
} }
/// <summary> /// <summary>
@ -600,7 +583,7 @@ namespace MediaBrowser.Common.Implementations
private async Task<CheckForUpdateResult> CheckForApplicationUpdateInternal(CancellationToken cancellationToken, private async Task<CheckForUpdateResult> CheckForApplicationUpdateInternal(CancellationToken cancellationToken,
IProgress<double> progress) 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); var version = InstallationManager.GetLatestCompatibleVersion(availablePackages, ApplicationUpdatePackageName, ConfigurationManager.CommonConfiguration.SystemUpdateLevel);

View file

@ -1,5 +1,4 @@
using System.Security.Cryptography; using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.Events; using MediaBrowser.Common.Events;
using MediaBrowser.Common.Net; using MediaBrowser.Common.Net;
using MediaBrowser.Common.Plugins; using MediaBrowser.Common.Plugins;
@ -14,6 +13,7 @@ using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Security.Cryptography;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -104,6 +104,7 @@ namespace MediaBrowser.Common.Implementations.Updates
private readonly IJsonSerializer _jsonSerializer; private readonly IJsonSerializer _jsonSerializer;
private readonly ISecurityManager _securityManager; private readonly ISecurityManager _securityManager;
private readonly INetworkManager _networkManager; private readonly INetworkManager _networkManager;
private readonly IConfigurationManager _config;
/// <summary> /// <summary>
/// Gets the application host. /// Gets the application host.
@ -111,7 +112,7 @@ namespace MediaBrowser.Common.Implementations.Updates
/// <value>The application host.</value> /// <value>The application host.</value>
private readonly IApplicationHost _applicationHost; 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) if (logger == null)
{ {
@ -127,6 +128,7 @@ namespace MediaBrowser.Common.Implementations.Updates
_jsonSerializer = jsonSerializer; _jsonSerializer = jsonSerializer;
_securityManager = securityManager; _securityManager = securityManager;
_networkManager = networkManager; _networkManager = networkManager;
_config = config;
_logger = logger; _logger = logger;
} }
@ -153,6 +155,8 @@ namespace MediaBrowser.Common.Implementations.Updates
} }
} }
private Tuple<List<PackageInfo>, DateTime> _lastPackageListResult;
/// <summary> /// <summary>
/// Gets all available packages. /// Gets all available packages.
/// </summary> /// </summary>
@ -164,12 +168,27 @@ namespace MediaBrowser.Common.Implementations.Updates
PackageType? packageType = null, PackageType? packageType = null,
Version applicationVersion = 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)) using (var json = await _httpClient.Get(Constants.Constants.MbAdminUrl + "service/MB3Packages.json", cancellationToken).ConfigureAwait(false))
{ {
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
var packages = _jsonSerializer.DeserializeFromStream<List<PackageInfo>>(json).ToList(); var packages = _jsonSerializer.DeserializeFromStream<List<PackageInfo>>(json).ToList();
_lastPackageListResult = new Tuple<List<PackageInfo>, DateTime>(packages, DateTime.UtcNow);
return FilterPackages(packages, packageType, applicationVersion); return FilterPackages(packages, packageType, applicationVersion);
} }
} }