diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-10-12 14:12:20 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-10-12 14:12:20 -0400 |
| commit | 8a15ee6ab4149cf59f8ff2724e3e415d34557da1 (patch) | |
| tree | f98e08e29090934be5f3f831284f1ea350a2b722 | |
| parent | 97582cef4f1afd9022a56c73ef927faa755b2f89 (diff) | |
put a lock around refresh ops
| -rw-r--r-- | MediaBrowser.Server.Implementations/Connect/ConnectManager.cs | 41 |
1 files changed, 34 insertions, 7 deletions
diff --git a/MediaBrowser.Server.Implementations/Connect/ConnectManager.cs b/MediaBrowser.Server.Implementations/Connect/ConnectManager.cs index 12a05c5b5..a4535a57c 100644 --- a/MediaBrowser.Server.Implementations/Connect/ConnectManager.cs +++ b/MediaBrowser.Server.Implementations/Connect/ConnectManager.cs @@ -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; @@ -111,6 +113,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; if (string.IsNullOrWhiteSpace(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"; @@ -440,6 +456,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"); var options = new HttpRequestOptions @@ -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 { |
