< Summary

Class:Azure.Storage.GeoRedundantReadPolicy
Assembly:Azure.Storage.Common
File(s):C:\Git\azure-sdk-for-net\sdk\storage\Azure.Storage.Common\src\Shared\GeoRedundantReadPolicy.cs
Covered lines:28
Uncovered lines:1
Coverable lines:29
Total lines:79
Line coverage:96.5% (28 of 29)
Covered branches:19
Total branches:20
Branch coverage:95% (19 of 20)

Metrics

MethodCyclomatic complexity Line coverage Branch coverage
.ctor(...)-80%50%
OnSendingRequest(...)-100%100%

File(s)

C:\Git\azure-sdk-for-net\sdk\storage\Azure.Storage.Common\src\Shared\GeoRedundantReadPolicy.cs

#LineLine coverage
 1// Copyright (c) Microsoft Corporation. All rights reserved.
 2// Licensed under the MIT License.
 3
 4using System;
 5using Azure.Core;
 6using Azure.Core.Pipeline;
 7
 8namespace Azure.Storage
 9{
 10    /// <summary>
 11    /// This policy is used if the SecondaryUri property is passed in on the clientOptions. It allows for storage
 12    /// accounts configured with RA-GRS to retry GET or HEAD requests against the secondary storage Uri.
 13    /// </summary>
 14    internal class GeoRedundantReadPolicy : HttpPipelineSynchronousPolicy
 15    {
 16        private readonly string _secondaryStorageHost;
 17
 1218        public GeoRedundantReadPolicy(Uri secondaryStorageUri)
 19        {
 1220            if (secondaryStorageUri == null)
 21            {
 022                throw Errors.ArgumentNull(nameof(secondaryStorageUri));
 23            }
 1224            _secondaryStorageHost = secondaryStorageUri.Host;
 1225        }
 26
 27        public override void OnSendingRequest(HttpMessage message)
 28        {
 1229            if (message.Request.Method != RequestMethod.Get && message.Request.Method != RequestMethod.Head)
 30            {
 231                return;
 32            }
 33
 34            // Look up what the alternate host is set to in the message properties. For the initial request, this will
 35            // not be set.
 1036            string alternateHost =
 1037                message.TryGetProperty(
 1038                    Constants.GeoRedundantRead.AlternateHostKey,
 1039                    out var alternateHostObj)
 1040                ? alternateHostObj as string
 1041                : null;
 1042            if (alternateHost == null)
 43            {
 44                // queue up the secondary host for subsequent retries
 245                message.SetProperty(Constants.GeoRedundantRead.AlternateHostKey, _secondaryStorageHost);
 246                return;
 47            }
 48
 49            // Check the flag that indicates whether the resource has not been propagated to the secondary host yet.
 50            // If this flag is set, we don't want to retry against the secondary host again for any subsequent retries.
 51            // Also, the flag being set implies that the current request must already be set to the primary host, so we
 52            // are safe to return without checking if the current host is secondary or primary.
 853            var resourceNotReplicated =
 854                message.TryGetProperty(Constants.GeoRedundantRead.ResourceNotReplicated, out var value)
 855                && (bool)value;
 856            if (resourceNotReplicated)
 57            {
 258                return;
 59            }
 60
 61            // If alternateHost was not null that means the message is being retried. Hence what is stored in the Host
 62            // property of UriBuilder is actually the host from the last try.
 663            var lastTriedHost = message.Request.Uri.Host;
 64
 65            // If necessary, set the flag to indicate that the resource has not yet been propagated to the secondary hos
 666            if (message.HasResponse
 667                && message.Response.Status == Constants.HttpStatusCode.NotFound
 668                && lastTriedHost == _secondaryStorageHost)
 69            {
 270                message.SetProperty(Constants.GeoRedundantRead.ResourceNotReplicated, true);
 71            }
 72
 73            // Toggle the host set in the request to use the alternate host for the upcoming attempt, and update the
 74            // the property for the AlternateHostKey to be the host used in the last try.
 675            message.Request.Uri.Host = alternateHost;
 676            message.SetProperty(Constants.GeoRedundantRead.AlternateHostKey, lastTriedHost);
 677        }
 78    }
 79}

Methods/Properties

.ctor(...)
OnSendingRequest(...)