Exemplo n.º 1
0
        /// <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);
                    }
                }
            }
        }