AdlsDotNetSDK/RetryPolicies/ExponentialRetryPolicy.cs (40 lines of code) (raw):

using System; using System.Threading; namespace Microsoft.Azure.DataLake.Store.RetryPolicies { /// <summary> /// Exponential retry policy. /// Does retries for following: /// For 5xx http status codes except 501 and 505 /// For 401, 408 and 429 status codes /// Any other unhandled exception from web- Request timeout for client, etc /// </summary> public class ExponentialRetryPolicy : RetryPolicy { /// <summary> /// Tracks the current number of retries /// </summary> private int NumberOfRetries { get; set; } /// <summary> /// Maximum number of retries /// </summary> private int MaxRetries { get; } /// <summary> /// Factor by which we will increase the interval /// </summary> private int ExponentialFactor { get; } /// <summary> /// Wait time /// </summary> private int ExponentialInterval { get; set; } /// <summary> /// Default settings of Exponential retry policies /// </summary> public ExponentialRetryPolicy() { NumberOfRetries = 0; MaxRetries = 4; ExponentialFactor = 4; ExponentialInterval = DefaultRetryInterval; } /// <summary> /// Exponential retry policies with specified maximum retries and interval /// </summary> /// <param name="maxRetries">Maximum retries</param> /// <param name="interval">Exponential time interval</param> public ExponentialRetryPolicy(int maxRetries, int interval) { NumberOfRetries = 0; MaxRetries = maxRetries; ExponentialFactor = 4; ExponentialInterval = interval; } /// <summary> /// Determines whether to retry exponentially. /// </summary> /// <param name="httpCode">Http status code</param> /// <param name="ex">Last exception that we saw during Httprequest</param> /// <returns>True if it should be retried else false</returns> public override bool ShouldRetry(int httpCode, Exception ex) { if (ShouldRetryBasedOnHttpOutput(httpCode,ex)) { if (NumberOfRetries < MaxRetries) { Thread.Sleep(ExponentialInterval); ExponentialInterval = ExponentialFactor * ExponentialInterval; NumberOfRetries++; return true; } } return false; } } }