private void AddOperation <T>(BackgroundOperation <T> operation) { if (BackgroundInternalOperations.Count > SimpleSettings.BackGroundQueueSize) { Task.Run(async() => { await Task.Delay(rand.Next(1000, 5000)); AddOperation(operation); }); } else { BackgroundInternalOperations.TryAdd(operation.OperationId, operation); operation.Task.ContinueWith(_ => HandleBackgroundOperation(operation)).ConfigureAwait(false); } }
private void HandleBackgroundOperation(BackgroundOperation operation) { BackgroundOperation temp; if (!BackgroundInternalOperations.TryRemove(operation.OperationId, out temp)) { return; } var subTask = temp as BackgroundOperation <Subscription>; var resourceGroupTask = temp as BackgroundOperation <ResourceGroup>; if ((subTask != null && subTask.Task.IsFaulted) || (resourceGroupTask != null && resourceGroupTask.Task.IsFaulted)) { //temp.RetryAction(); SimpleTrace.Diagnostics.Fatal("Losing ResourceGroup with {@exception}", resourceGroupTask?.Task?.Exception); return; } switch (operation.Type) { case OperationType.SubscriptionLoad: var subscription = subTask.Task.Result; var result = subscription.MakeTrialSubscription(); foreach (var resourceGroup in result.Ready) { PutResourceGroupInDesiredStateOperation(resourceGroup); } foreach (var geoRegion in result.ToCreateInRegions) { CreateResourceGroupOperation(subscription.SubscriptionId, geoRegion); } foreach (var resourceGroup in result.ToDelete) { DeleteResourceGroupOperation(resourceGroup); } break; case OperationType.ResourceGroupPutInDesiredState: case OperationType.ResourceGroupDeleteThenCreate: var readyToAddRg = resourceGroupTask.Task.Result; if (readyToAddRg.UserId != null) { if (!ResourceGroupsInUse.TryAdd(readyToAddRg.UserId, readyToAddRg)) { DeleteAndCreateResourceGroupOperation(readyToAddRg); } } else { FreeResourceGroups.Enqueue(readyToAddRg); } break; case OperationType.ResourceGroupCreate: PutResourceGroupInDesiredStateOperation(resourceGroupTask.Task.Result); break; case OperationType.LogUsageStatistics: DeleteAndCreateResourceGroupOperation(resourceGroupTask.Task.Result); break; case OperationType.ResourceGroupDelete: default: break; } }
private void AddOperation <T>(BackgroundOperation <T> operation) { BackgroundInternalOperations.TryAdd(operation.OperationId, operation); operation.Task.ContinueWith(_ => HandleBackgroundOperation(operation)).ConfigureAwait(false); }
private async Task HandleBackgroundOperation(BackgroundOperation operation) { BackgroundOperation temp; if (!BackgroundInternalOperations.TryRemove(operation.OperationId, out temp)) { return; } var subTask = temp as BackgroundOperation <Subscription>; var resourceGroupTask = temp as BackgroundOperation <ResourceGroup>; if ((subTask != null && subTask.Task.IsFaulted) || (resourceGroupTask != null && resourceGroupTask.Task.IsFaulted)) { //temp.RetryAction(); SimpleTrace.Diagnostics.Fatal("Losing ResourceGroup with {@exception}", resourceGroupTask?.Task?.Exception); return; } switch (operation.Type) { case OperationType.SubscriptionLoad: var subscription = subTask.Task.Result; var result = subscription.GetSubscriptionStats(); foreach (var resourceGroup in result.Ready) { PutResourceGroupInDesiredStateOperation(resourceGroup); } foreach (var resourceGroup in result.ToDelete) { DeleteResourceGroupOperation(resourceGroup); } break; case OperationType.ResourceGroupDeleteThenCreate: var readyToDeleteThenCreateRg = resourceGroupTask.Task.Result; if (readyToDeleteThenCreateRg.UserId != null) { if (!await StorageHelper.AssignResourceGroup(readyToDeleteThenCreateRg.UserId, readyToDeleteThenCreateRg)) { DeleteAndCreateResourceGroupOperation(readyToDeleteThenCreateRg); } } break; case OperationType.ResourceGroupPutInDesiredState: var readyToAddRg = resourceGroupTask.Task.Result; if (String.IsNullOrEmpty(readyToAddRg.UserId)) { if (!string.IsNullOrEmpty(readyToAddRg.DeployedTemplateName) && !string.IsNullOrEmpty(readyToAddRg.SiteGuid)) { //if (!FreeResourceGroups.ContainsKey(readyToAddRg.DeployedTemplateName)) //{ // readyToAddRg.TemplateName = readyToAddRg.DeployedTemplateName; // FreeResourceGroups.GetOrAdd(readyToAddRg.DeployedTemplateName, new ConcurrentQueue<ResourceGroup>()); //} readyToAddRg.TemplateName = readyToAddRg.DeployedTemplateName; await StorageHelper.AddQueueMessage(readyToAddRg.QueueName, readyToAddRg); } } break; case OperationType.ResourceGroupCreate: PutResourceGroupInDesiredStateOperation(resourceGroupTask.Task.Result); break; case OperationType.LogUsageStatistics: DeleteAndCreateResourceGroupOperation(resourceGroupTask.Task.Result); break; case OperationType.ResourceGroupDelete: default: break; } }
private void HandleBackgroundOperation(BackgroundOperation operation) { BackgroundOperation temp; if (!BackgroundInternalOperations.TryRemove(operation.OperationId, out temp)) { return; } var subTask = temp as BackgroundOperation <Subscription>; var resourceGroupTask = temp as BackgroundOperation <ResourceGroup>; if ((subTask != null && subTask.Task.IsFaulted) || (resourceGroupTask != null && resourceGroupTask.Task.IsFaulted)) { //temp.RetryAction(); SimpleTrace.Diagnostics.Fatal("Losing ResourceGroup with {@exception}", resourceGroupTask?.Task?.Exception); return; } switch (operation.Type) { case OperationType.LoadMonitoringToolSubscription: var monitoringToolsSubscription = subTask.Task.Result; var monitoringToolsResource = monitoringToolsSubscription.GetMonitoringToolsResource(); MonitoringResourceGroup = monitoringToolsResource.Ready.First(); break; case OperationType.SubscriptionLoad: var subscription = subTask.Task.Result; var result = subscription.MakeTrialSubscription(); foreach (var resourceGroup in result.Ready) { PutResourceGroupInDesiredStateOperation(resourceGroup); } if (result.ToCreateInRegions != null) { foreach (var geoRegion in result.ToCreateInRegions) { CreateResourceGroupOperation(subscription.SubscriptionId, geoRegion); } } if (result.ToCreateTemplates != null) { var rand = new Random(); foreach (var template in result.ToCreateTemplates) { for (int i = 0; i < template.RemainingCount; i++) { CreateResourceGroupOperation(subscription.SubscriptionId, subscription.GeoRegions.ElementAt(rand.Next(subscription.GeoRegions.Count())), template.TemplateName); } } } foreach (var resourceGroup in result.ToDelete) { DeleteResourceGroupOperation(resourceGroup); } break; case OperationType.ResourceGroupPutInDesiredState: case OperationType.ResourceGroupDeleteThenCreate: var readyToAddRg = resourceGroupTask.Task.Result; if (readyToAddRg.UserId != null) { if (!ResourceGroupsInUse.TryAdd(readyToAddRg.UserId, readyToAddRg)) { DeleteAndCreateResourceGroupOperation(readyToAddRg); } } else { if (readyToAddRg.SubscriptionType == SubscriptionType.AppService || readyToAddRg.SubscriptionType == SubscriptionType.MonitoringTools) { FreeResourceGroups.Enqueue(readyToAddRg); } else if (readyToAddRg.SubscriptionType == SubscriptionType.VSCodeLinux) { if (!FreeVSCodeLinuxResourceGroups.ContainsKey(readyToAddRg.DeployedTemplateName)) { readyToAddRg.TemplateName = readyToAddRg.DeployedTemplateName; FreeVSCodeLinuxResourceGroups.GetOrAdd(readyToAddRg.DeployedTemplateName, new ConcurrentQueue <ResourceGroup>()); } readyToAddRg.TemplateName = readyToAddRg.DeployedTemplateName; FreeVSCodeLinuxResourceGroups[readyToAddRg.DeployedTemplateName].Enqueue(readyToAddRg); } else if (readyToAddRg.SubscriptionType == SubscriptionType.Linux) { FreeLinuxResourceGroups.Enqueue(readyToAddRg); } } break; case OperationType.ResourceGroupCreate: PutResourceGroupInDesiredStateOperation(resourceGroupTask.Task.Result); break; case OperationType.LogUsageStatistics: DeleteAndCreateResourceGroupOperation(resourceGroupTask.Task.Result); break; case OperationType.ResourceGroupDelete: default: break; } }