瀏覽代碼

put a lock around refresh ops

Luke Pulverenti 10 年之前
父節點
當前提交
8a15ee6ab4
共有 1 個文件被更改,包括 34 次插入7 次删除
  1. 34 7
      MediaBrowser.Server.Implementations/Connect/ConnectManager.cs

+ 34 - 7
MediaBrowser.Server.Implementations/Connect/ConnectManager.cs

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