/// <summary> /// Cleanup the Azure storage including both queue and blob. /// </summary> private async Task Cleanup() { BrokerTracing.TraceVerbose( "[AzureStorageCleaner].Cleanup: Try to cleanup the Azure storage."); ClusterInfoContract clusterInfo = await this.helper.GetClusterInfoAsync(); string clusterName = clusterInfo.ClusterName; Guid clusterId; if (!Guid.TryParse(clusterInfo.ClusterId, out clusterId)) { BrokerTracing.TraceError( "[AzureStorageCleaner].Cleanup: clusterInfo.ClusterId is not a valid GUID string."); throw new ArgumentException("clusterInfo.ClusterId", "clusterInfo.ClusterId is not a valid GUID string."); } var connectionString = clusterInfo.AzureStorageConnectionString; if (string.IsNullOrEmpty(connectionString)) { BrokerTracing.TraceVerbose( "[AzureStorageCleaner].Cleanup: Azure storage connection string is not set."); // no need to do anything if the connection string is not set return; } string prefix = SoaHelper.GetResponseStoragePrefix(clusterId.ToString()); string prefixAQ = SoaHelper.GetAzureQueueStoragePrefix(clusterId.ToString().ToLower().GetHashCode()); CloudStorageAccount account = CloudStorageAccount.Parse(connectionString); CloudQueueClient queueClient = account.CreateCloudQueueClient(); queueClient.DefaultRequestOptions.RetryPolicy = DefaultRetryPolicy; var queues = queueClient.ListQueues(prefix); var queuesAQ = queueClient.ListQueues(prefixAQ); CloudBlobClient blobClient = account.CreateCloudBlobClient(); blobClient.DefaultRequestOptions.RetryPolicy = DefaultRetryPolicy; var containers = blobClient.ListContainers(prefix, ContainerListingDetails.None, null, null); var containersAQ = blobClient.ListContainers(prefixAQ, ContainerListingDetails.None, null, null); Dictionary <int, int> nonTerminatedSession; if (queues.Count <CloudQueue>() > 0 || containers.Count <CloudBlobContainer>() > 0 || queuesAQ.Count <CloudQueue>() > 0 || containersAQ.Count <CloudBlobContainer>() > 0) { // if there are queue/container candidates for deleting, get // following info from session service nonTerminatedSession = await this.helper.GetNonTerminatedSession(); } else { return; } // cleanup storage queue foreach (CloudQueue queue in queues) { BrokerTracing.TraceVerbose( "[AzureStorageCleaner].Cleanup: Azure storage queue name is {0}", queue.Name); if (this.IsSessionTerminated(nonTerminatedSession, prefix, queue.Name)) { try { queue.Delete(); } catch (Exception e) { BrokerTracing.TraceError( "[AzureStorageCleaner].Cleanup: Deleting queue {0} failed, {1}", queue.Name, e); } } } // cleanup storage blob container foreach (CloudBlobContainer container in containers) { BrokerTracing.TraceVerbose( "[AzureStorageCleaner].Cleanup: Azure storage container name is {0}", container.Name); if (this.IsSessionTerminated(nonTerminatedSession, prefix, container.Name)) { try { container.Delete(); } catch (Exception e) { BrokerTracing.TraceError( "[AzureStorageCleaner].Cleanup: Deleting container {0} failed, {1}", container.Name, e); } } } // cleanup storage queue for the http clients foreach (CloudQueue queue in queuesAQ) { BrokerTracing.TraceVerbose( "[AzureStorageCleaner].Cleanup: Azure storage queue name is {0}", queue.Name); if (this.IsSessionTerminatedAQ(nonTerminatedSession, prefixAQ, queue.Name)) { try { queue.Delete(); } catch (Exception e) { BrokerTracing.TraceError( "[AzureStorageCleaner].Cleanup: Deleting queue {0} failed, {1}", queue.Name, e); } } } // cleanup storage blob container for the http clients foreach (CloudBlobContainer container in containersAQ) { BrokerTracing.TraceVerbose( "[AzureStorageCleaner].Cleanup: Azure storage container name is {0}", container.Name); if (this.IsSessionTerminatedAQ(nonTerminatedSession, prefixAQ, container.Name)) { try { container.Delete(); } catch (Exception e) { BrokerTracing.TraceError( "[AzureStorageCleaner].Cleanup: Deleting container {0} failed, {1}", container.Name, e); } } } }