put a lock around refresh ops

This commit is contained in:
Luke Pulverenti 2014-10-12 14:12:20 -04:00
parent 97582cef4f
commit 8a15ee6ab4
1 changed files with 34 additions and 7 deletions

View File

@ -24,6 +24,8 @@ namespace MediaBrowser.Server.Implementations.Connect
{
public class ConnectManager : IConnectManager
{
private SemaphoreSlim _operationLock = new SemaphoreSlim(1,1);
private readonly ILogger _logger;
private readonly IApplicationPaths _appPaths;
private readonly IJsonSerializer _json;
@ -110,6 +112,20 @@ namespace MediaBrowser.Server.Implementations.Connect
}
private async void UpdateConnectInfo()
{
await _operationLock.WaitAsync().ConfigureAwait(false);
try
{
await UpdateConnectInfoInternal().ConfigureAwait(false);
}
finally
{
_operationLock.Release();
}
}
private async Task UpdateConnectInfoInternal()
{
var wanApiAddress = WanApiAddress;
@ -148,14 +164,14 @@ namespace MediaBrowser.Server.Implementations.Connect
await CreateServerRegistration(wanApiAddress).ConfigureAwait(false);
}
await RefreshAuthorizations(CancellationToken.None).ConfigureAwait(false);
await RefreshAuthorizationsInternal(CancellationToken.None).ConfigureAwait(false);
}
catch (Exception ex)
{
_logger.ErrorException("Error registering with Connect", ex);
}
}
private async Task CreateServerRegistration(string wanApiAddress)
{
var url = "Servers";
@ -439,6 +455,20 @@ namespace MediaBrowser.Server.Implementations.Connect
}
public async Task RefreshAuthorizations(CancellationToken cancellationToken)
{
await _operationLock.WaitAsync(cancellationToken).ConfigureAwait(false);
try
{
await RefreshAuthorizationsInternal(cancellationToken).ConfigureAwait(false);
}
finally
{
_operationLock.Release();
}
}
private async Task RefreshAuthorizationsInternal(CancellationToken cancellationToken)
{
var url = GetConnectUrl("ServerAuthorizations");
@ -459,7 +489,6 @@ namespace MediaBrowser.Server.Implementations.Connect
try
{
// No need to examine the response
using (var stream = (await _httpClient.SendAsync(options, "POST").ConfigureAwait(false)).Content)
{
var list = _json.DeserializeFromStream<List<ServerUserAuthorizationResponse>>(stream);
@ -491,14 +520,12 @@ namespace MediaBrowser.Server.Implementations.Connect
user.ConnectAccessKey = null;
user.ConnectUserName = null;
await _userManager.UpdateUser(user).ConfigureAwait(false);
if (user.ConnectLinkType == UserLinkType.Guest)
{
await _userManager.DeleteUser(user).ConfigureAwait(false);
}
else
{
await _userManager.UpdateUser(user).ConfigureAwait(false);
}
}
else
{