/// <summary> /// Puts the lease on the given container in a broken state due to a break period of zero. /// </summary> /// <param name="container">The container with the lease.</param> /// <returns>The lease ID of the broken lease.</returns> internal static async Task<string> SetInstantBrokenStateAsync(CloudBlobContainer container) { string leaseId = await SetLeasedStateAsync(container, null /* infinite lease */); await container.BreakLeaseAsync(TimeSpan.Zero); return leaseId; }
/// <summary> /// Puts the lease on the given container in an unleased state (either available or broken). /// </summary> /// <param name="container">The container with the lease.</param> internal static async Task SetUnleasedStateAsync(CloudBlobContainer container) { if (!await container.CreateIfNotExistsAsync()) { OperationContext operationContext = new OperationContext(); try { await container.BreakLeaseAsync(TimeSpan.Zero, null, null, operationContext); } catch (Exception) { if (operationContext.LastResult.ExtendedErrorInformation.ErrorCode == BlobErrorCodeStrings.LeaseAlreadyBroken || operationContext.LastResult.ExtendedErrorInformation.ErrorCode == BlobErrorCodeStrings.LeaseNotPresentWithLeaseOperation) { } else { throw; } } } }
/// <summary> /// Puts the lease on the given container in a broken state due to the break period expiring. /// </summary> /// <param name="container">The container with the lease.</param> /// <returns>The lease ID of the broken lease.</returns> internal static async Task<string> SetTimeBrokenStateAsync(CloudBlobContainer container) { string leaseId = await SetLeasedStateAsync(container, null /* infinite lease */); await container.BreakLeaseAsync(TimeSpan.FromSeconds(1)); await Task.Delay(TimeSpan.FromSeconds(2)); return leaseId; }
private async Task<HttpResponseMessage> SetContainerLease(CloudBlobContainer container) { IEnumerable<string> action; string leaseId = null; string proposedLeaseId = null; HttpResponseMessage response = new HttpResponseMessage(); AccessCondition condition; string serverLeaseId; await AddBasicContainerHeaders(response, container); //If an action is not provided, it's not a valid call. if (!Request.Headers.TryGetValues("x-ms-lease-action", out action)) { response.StatusCode = HttpStatusCode.BadRequest; return response; } if (Request.Headers.Contains("x-ms-lease-id")) { leaseId = Request.Headers.GetValues("x-ms-lease-id").FirstOrDefault(); } if (Request.Headers.Contains("x-ms-proposed-lease-id")) { proposedLeaseId = Request.Headers.GetValues("x-ms-proposed-lease-id").FirstOrDefault(); } switch (action.First().ToLower()) { case "acquire": int leaseDuration = Int32.Parse(Request.Headers.GetValues("x-ms-lease-duration").First()); TimeSpan? leaseDurationSpan; if (leaseDuration == -1) { leaseDurationSpan = null; } else if (leaseDuration >= 15 && leaseDuration <= 60) { leaseDurationSpan = new TimeSpan(0, 0, leaseDuration); } else { response.StatusCode = HttpStatusCode.BadRequest; return response; } serverLeaseId = await container.AcquireLeaseAsync(leaseDurationSpan, proposedLeaseId); response = new DelegatedResponse(await ContainerHandler.DoForDataContainersAsync(container.Name, HttpStatusCode.Created, async containerObj => await containerObj.AcquireLeaseAsync(leaseDurationSpan, serverLeaseId), true)).CreateResponse(); await AddBasicContainerHeaders(response, container); response.Headers.Add("x-ms-lease-id", serverLeaseId); return response; case "renew": condition = new AccessCondition() { LeaseId = leaseId }; response = new DelegatedResponse(await ContainerHandler.DoForAllContainersAsync(container.Name, HttpStatusCode.OK, async containerObj => await containerObj.RenewLeaseAsync(condition), true)).CreateResponse(); await AddBasicContainerHeaders(response, container); response.Headers.Add("x-ms-lease-id", leaseId); return response; case "change": condition = new AccessCondition() { LeaseId = leaseId }; serverLeaseId = await container.ChangeLeaseAsync(proposedLeaseId, condition); response = new DelegatedResponse(await ContainerHandler.DoForDataContainersAsync(container.Name, HttpStatusCode.OK, async containerObj => await containerObj.ChangeLeaseAsync(proposedLeaseId, condition), true)).CreateResponse(); await AddBasicContainerHeaders(response, container); response.Headers.Add("x-ms-lease-id", container.ChangeLease(proposedLeaseId, condition)); return response; case "release": condition = new AccessCondition() { LeaseId = leaseId }; response = new DelegatedResponse(await ContainerHandler.DoForAllContainersAsync(container.Name, HttpStatusCode.OK, async containerObj => await containerObj.ReleaseLeaseAsync(condition), true)).CreateResponse(); await AddBasicContainerHeaders(response, container); return response; case "break": int breakDuration = 0; if (Request.Headers.Contains("x-ms-lease-break-period")) { breakDuration = Int32.Parse(Request.Headers.GetValues("x-ms-lease-break-period").FirstOrDefault()); } TimeSpan breakDurationSpan = new TimeSpan(0, 0, breakDuration); TimeSpan remainingTime = await container.BreakLeaseAsync(breakDurationSpan); response = new DelegatedResponse(await ContainerHandler.DoForDataContainersAsync(container.Name, HttpStatusCode.Accepted, async containerObj => await containerObj.BreakLeaseAsync(breakDurationSpan), true)).CreateResponse(); await AddBasicContainerHeaders(response, container); response.Headers.Add("x-ms-lease-time", remainingTime.Seconds.ToString()); return response; default: //Not a recognized action response.StatusCode = HttpStatusCode.BadRequest; return response; } }