Beispiel #1
0
        public async Task <BlobLease?> AcquireLeaseAsync(string blobName, TimeSpan timeout)
        {
            var watch    = new Stopwatch();
            var waitTime = TimeSpan.FromSeconds(1);

            watch.Start();

            while (watch.Elapsed < timeout)
            {
                var lease = await _storageFacade.AcquireLeaseAsync(blobName);

                if (lease != null)
                {
                    return(lease);
                }
                else
                {
                    waitTime = Min(timeout - watch.Elapsed, waitTime);
                    _logger.Display($"Blob {blobName} is locked for {watch.Elapsed}"
                                    + $", retry in {waitTime}");
                    _logger
                    .AddContext("duration", watch.Elapsed)
                    .WriteEvent("blob-locked");
                    await Task.Delay(waitTime);

                    waitTime = Min(waitTime * 2, TimeSpan.FromSeconds(5));
                }
            }

            _logger.Display($"Blob {blobName} is locked, timeout expired");

            return(null);
        }