Skip to content

Commit de1abf5

Browse files
Lease client updates itself (Azure#20513)
* Lease client updates itself Lease client now retains the latest leaseID response as it's internal property for the lease ID. * Datalake tests for lease client changes * Volatile lease id * Volatile fix Co-authored-by: jschrepp-MSFT <41338290+jschrepp-MSFT@users.noreply.github.com>
1 parent 253e346 commit de1abf5

File tree

4 files changed

+73
-43
lines changed

4 files changed

+73
-43
lines changed

sdk/storage/Azure.Storage.Blobs/src/BlobLeaseClient.cs

Lines changed: 53 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,15 @@ public class BlobLeaseClient
4444
/// </summary>
4545
public Uri Uri => BlobClient?.Uri ?? BlobContainerClient?.Uri;
4646

47+
private string _leaseId;
4748
/// <summary>
4849
/// Gets the Lease ID for this lease.
4950
/// </summary>
50-
public virtual string LeaseId { get; private set; }
51+
public virtual string LeaseId
52+
{
53+
get => Volatile.Read(ref _leaseId);
54+
private set => Volatile.Write(ref _leaseId, value);
55+
}
5156

5257
/// <summary>
5358
/// The <see cref="HttpPipeline"/> transport pipeline used to send
@@ -299,13 +304,14 @@ private async Task<Response<BlobLease>> AcquireInternal(
299304
tagCondition = leaseConditions?.TagConditions;
300305
}
301306

307+
Response<BlobLease> response;
302308
if (BlobClient != null)
303309
{
304-
ResponseWithHeaders<BlobAcquireLeaseHeaders> response;
310+
ResponseWithHeaders<BlobAcquireLeaseHeaders> blobClientResponse;
305311

306312
if (async)
307313
{
308-
response = await BlobClient.BlobRestClient.AcquireLeaseAsync(
314+
blobClientResponse = await BlobClient.BlobRestClient.AcquireLeaseAsync(
309315
duration: serviceDuration,
310316
proposedLeaseId: LeaseId,
311317
ifModifiedSince: conditions?.IfModifiedSince,
@@ -318,7 +324,7 @@ private async Task<Response<BlobLease>> AcquireInternal(
318324
}
319325
else
320326
{
321-
response = BlobClient.BlobRestClient.AcquireLease(
327+
blobClientResponse = BlobClient.BlobRestClient.AcquireLease(
322328
duration: serviceDuration,
323329
proposedLeaseId: LeaseId,
324330
ifModifiedSince: conditions?.IfModifiedSince,
@@ -329,9 +335,9 @@ private async Task<Response<BlobLease>> AcquireInternal(
329335
cancellationToken: cancellationToken);
330336
}
331337

332-
return Response.FromValue(
333-
response.ToBlobLease(),
334-
response.GetRawResponse());
338+
response = Response.FromValue(
339+
blobClientResponse.ToBlobLease(),
340+
blobClientResponse.GetRawResponse());
335341
}
336342
else
337343
{
@@ -342,11 +348,11 @@ private async Task<Response<BlobLease>> AcquireInternal(
342348
nameof(conditions.IfNoneMatch));
343349
}
344350

345-
ResponseWithHeaders<ContainerAcquireLeaseHeaders> response;
351+
ResponseWithHeaders<ContainerAcquireLeaseHeaders> containerClientResponse;
346352

347353
if (async)
348354
{
349-
response = await BlobContainerClient.ContainerRestClient.AcquireLeaseAsync(
355+
containerClientResponse = await BlobContainerClient.ContainerRestClient.AcquireLeaseAsync(
350356
duration: serviceDuration,
351357
proposedLeaseId: LeaseId,
352358
ifModifiedSince: conditions?.IfModifiedSince,
@@ -356,18 +362,20 @@ private async Task<Response<BlobLease>> AcquireInternal(
356362
}
357363
else
358364
{
359-
response = BlobContainerClient.ContainerRestClient.AcquireLease(
365+
containerClientResponse = BlobContainerClient.ContainerRestClient.AcquireLease(
360366
duration: serviceDuration,
361367
proposedLeaseId: LeaseId,
362368
ifModifiedSince: conditions?.IfModifiedSince,
363369
ifUnmodifiedSince: conditions?.IfUnmodifiedSince,
364370
cancellationToken: cancellationToken);
365371
}
366372

367-
return Response.FromValue(
368-
response.ToBlobLease(),
369-
response.GetRawResponse());
373+
response = Response.FromValue(
374+
containerClientResponse.ToBlobLease(),
375+
containerClientResponse.GetRawResponse());
370376
}
377+
LeaseId = response.Value.LeaseId;
378+
return response;
371379
}
372380
catch (Exception ex)
373381
{
@@ -518,13 +526,14 @@ private async Task<Response<BlobLease>> RenewInternal(
518526
tagConditions = ((BlobLeaseRequestConditions)conditions).TagConditions;
519527
}
520528

529+
Response<BlobLease> response;
521530
if (BlobClient != null)
522531
{
523-
ResponseWithHeaders<BlobRenewLeaseHeaders> response;
532+
ResponseWithHeaders<BlobRenewLeaseHeaders> blobClientResponse;
524533

525534
if (async)
526535
{
527-
response = await BlobClient.BlobRestClient.RenewLeaseAsync(
536+
blobClientResponse = await BlobClient.BlobRestClient.RenewLeaseAsync(
528537
leaseId: LeaseId,
529538
ifModifiedSince: conditions?.IfModifiedSince,
530539
ifUnmodifiedSince: conditions?.IfUnmodifiedSince,
@@ -536,7 +545,7 @@ private async Task<Response<BlobLease>> RenewInternal(
536545
}
537546
else
538547
{
539-
response = BlobClient.BlobRestClient.RenewLease(
548+
blobClientResponse = BlobClient.BlobRestClient.RenewLease(
540549
leaseId: LeaseId,
541550
ifModifiedSince: conditions?.IfModifiedSince,
542551
ifUnmodifiedSince: conditions?.IfUnmodifiedSince,
@@ -546,9 +555,9 @@ private async Task<Response<BlobLease>> RenewInternal(
546555
cancellationToken: cancellationToken);
547556
}
548557

549-
return Response.FromValue(
550-
response.ToBlobLease(),
551-
response.GetRawResponse());
558+
response = Response.FromValue(
559+
blobClientResponse.ToBlobLease(),
560+
blobClientResponse.GetRawResponse());
552561
}
553562
else
554563
{
@@ -559,11 +568,11 @@ private async Task<Response<BlobLease>> RenewInternal(
559568
nameof(conditions.IfNoneMatch));
560569
}
561570

562-
ResponseWithHeaders<ContainerRenewLeaseHeaders> response;
571+
ResponseWithHeaders<ContainerRenewLeaseHeaders> containerClientResponse;
563572

564573
if (async)
565574
{
566-
response = await BlobContainerClient.ContainerRestClient.RenewLeaseAsync(
575+
containerClientResponse = await BlobContainerClient.ContainerRestClient.RenewLeaseAsync(
567576
leaseId: LeaseId,
568577
ifModifiedSince: conditions?.IfModifiedSince,
569578
ifUnmodifiedSince: conditions?.IfUnmodifiedSince,
@@ -572,17 +581,20 @@ private async Task<Response<BlobLease>> RenewInternal(
572581
}
573582
else
574583
{
575-
response = BlobContainerClient.ContainerRestClient.RenewLease(
584+
containerClientResponse = BlobContainerClient.ContainerRestClient.RenewLease(
576585
leaseId: LeaseId,
577586
ifModifiedSince: conditions?.IfModifiedSince,
578587
ifUnmodifiedSince: conditions?.IfUnmodifiedSince,
579588
cancellationToken: cancellationToken);
580589
}
581590

582-
return Response.FromValue(
583-
response.ToBlobLease(),
584-
response.GetRawResponse());
591+
response = Response.FromValue(
592+
containerClientResponse.ToBlobLease(),
593+
containerClientResponse.GetRawResponse());
585594
}
595+
596+
LeaseId = response.Value.LeaseId;
597+
return response;
586598
}
587599
catch (Exception ex)
588600
{
@@ -960,13 +972,14 @@ private async Task<Response<BlobLease>> ChangeInternal(
960972
tagCondition = ((BlobLeaseRequestConditions)conditions).TagConditions;
961973
}
962974

975+
Response<BlobLease> response;
963976
if (BlobClient != null)
964977
{
965-
ResponseWithHeaders<BlobChangeLeaseHeaders> response;
978+
ResponseWithHeaders<BlobChangeLeaseHeaders> blobClientResponse;
966979

967980
if (async)
968981
{
969-
response = await BlobClient.BlobRestClient.ChangeLeaseAsync(
982+
blobClientResponse = await BlobClient.BlobRestClient.ChangeLeaseAsync(
970983
leaseId: LeaseId,
971984
proposedLeaseId: proposedId,
972985
ifModifiedSince: conditions?.IfModifiedSince,
@@ -979,7 +992,7 @@ private async Task<Response<BlobLease>> ChangeInternal(
979992
}
980993
else
981994
{
982-
response = BlobClient.BlobRestClient.ChangeLease(
995+
blobClientResponse = BlobClient.BlobRestClient.ChangeLease(
983996
leaseId: LeaseId,
984997
proposedLeaseId: proposedId,
985998
ifModifiedSince: conditions?.IfModifiedSince,
@@ -990,9 +1003,9 @@ private async Task<Response<BlobLease>> ChangeInternal(
9901003
cancellationToken: cancellationToken);
9911004
}
9921005

993-
return Response.FromValue(
994-
response.ToBlobLease(),
995-
response.GetRawResponse());
1006+
response = Response.FromValue(
1007+
blobClientResponse.ToBlobLease(),
1008+
blobClientResponse.GetRawResponse());
9961009
}
9971010
else
9981011
{
@@ -1003,11 +1016,11 @@ private async Task<Response<BlobLease>> ChangeInternal(
10031016
nameof(conditions.IfNoneMatch));
10041017
}
10051018

1006-
ResponseWithHeaders<ContainerChangeLeaseHeaders> response;
1019+
ResponseWithHeaders<ContainerChangeLeaseHeaders> containerClientResponse;
10071020

10081021
if (async)
10091022
{
1010-
response = await BlobContainerClient.ContainerRestClient.ChangeLeaseAsync(
1023+
containerClientResponse = await BlobContainerClient.ContainerRestClient.ChangeLeaseAsync(
10111024
leaseId: LeaseId,
10121025
proposedLeaseId: proposedId,
10131026
ifModifiedSince: conditions?.IfModifiedSince,
@@ -1017,18 +1030,21 @@ private async Task<Response<BlobLease>> ChangeInternal(
10171030
}
10181031
else
10191032
{
1020-
response = BlobContainerClient.ContainerRestClient.ChangeLease(
1033+
containerClientResponse = BlobContainerClient.ContainerRestClient.ChangeLease(
10211034
leaseId: LeaseId,
10221035
proposedLeaseId: proposedId,
10231036
ifModifiedSince: conditions?.IfModifiedSince,
10241037
ifUnmodifiedSince: conditions?.IfUnmodifiedSince,
10251038
cancellationToken: cancellationToken);
10261039
}
10271040

1028-
return Response.FromValue(
1029-
response.ToBlobLease(),
1030-
response.GetRawResponse());
1041+
response = Response.FromValue(
1042+
containerClientResponse.ToBlobLease(),
1043+
containerClientResponse.GetRawResponse());
10311044
}
1045+
1046+
LeaseId = response.Value.LeaseId;
1047+
return response;
10321048
}
10331049
catch (Exception ex)
10341050
{

sdk/storage/Azure.Storage.Blobs/tests/BlobBaseClientTests.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4982,12 +4982,14 @@ public async Task AcquireLeaseAsync()
49824982

49834983
var leaseId = Recording.Random.NewGuid().ToString();
49844984
var duration = TimeSpan.FromSeconds(15);
4985+
var leaseClient = InstrumentClient(blob.GetBlobLeaseClient(leaseId));
49854986

49864987
// Act
4987-
Response<BlobLease> response = await InstrumentClient(blob.GetBlobLeaseClient(leaseId)).AcquireAsync(duration);
4988+
Response<BlobLease> response = await leaseClient.AcquireAsync(duration);
49884989

49894990
// Assert
49904991
Assert.IsNotNull(response.GetRawResponse().Headers.RequestId);
4992+
Assert.AreEqual(response.Value.LeaseId, leaseClient.LeaseId);
49914993
}
49924994

49934995
[RecordedTest]
@@ -5147,6 +5149,7 @@ public async Task RenewLeaseAsync()
51475149

51485150
// Assert
51495151
Assert.IsNotNull(response.GetRawResponse().Headers.RequestId);
5152+
Assert.AreEqual(response.Value.LeaseId, lease.LeaseId);
51505153
}
51515154

51525155
[RecordedTest]
@@ -5591,6 +5594,8 @@ public async Task ChangeLeaseAsync()
55915594

55925595
// Assert
55935596
Assert.IsNotNull(response.GetRawResponse().Headers.RequestId);
5597+
Assert.AreEqual(newLeaseId, response.Value.LeaseId);
5598+
Assert.AreEqual(response.Value.LeaseId, lease.LeaseId);
55945599
}
55955600

55965601
[RecordedTest]

sdk/storage/Azure.Storage.Blobs/tests/ContainerClientTests.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1288,12 +1288,14 @@ public async Task AcquireLeaseAsync()
12881288
await container.CreateIfNotExistsAsync();
12891289
var id = Recording.Random.NewGuid().ToString();
12901290
var duration = TimeSpan.FromSeconds(15);
1291+
var leaseClient = InstrumentClient(container.GetBlobLeaseClient(id));
12911292

12921293
// Act
1293-
Response<BlobLease> response = await InstrumentClient(container.GetBlobLeaseClient(id)).AcquireAsync(duration: duration);
1294+
Response<BlobLease> response = await leaseClient.AcquireAsync(duration: duration);
12941295

12951296
// Assert
12961297
Assert.AreEqual(id, response.Value.LeaseId);
1298+
Assert.AreEqual(response.Value.LeaseId, leaseClient.LeaseId);
12971299

12981300
// Cleanup
12991301
await container.DeleteIfExistsAsync(conditions: new BlobRequestConditions { LeaseId = response.Value.LeaseId });
@@ -1394,15 +1396,16 @@ public async Task RenewLeaseAsync()
13941396

13951397
var id = Recording.Random.NewGuid().ToString();
13961398
var duration = TimeSpan.FromSeconds(15);
1399+
var leaseClient = InstrumentClient(container.GetBlobLeaseClient(id));
13971400

1398-
Response<BlobLease> leaseResponse = await InstrumentClient(container.GetBlobLeaseClient(id)).AcquireAsync(
1399-
duration: duration);
1401+
Response<BlobLease> leaseResponse = await leaseClient.AcquireAsync(duration: duration);
14001402

14011403
// Act
14021404
Response<BlobLease> renewResponse = await InstrumentClient(container.GetBlobLeaseClient(leaseResponse.Value.LeaseId)).RenewAsync();
14031405

14041406
// Assert
14051407
Assert.IsNotNull(renewResponse.GetRawResponse().Headers.RequestId);
1408+
Assert.AreEqual(renewResponse.Value.LeaseId, leaseClient.LeaseId);
14061409

14071410
// Cleanup
14081411
await container.DeleteIfExistsAsync(conditions: new BlobRequestConditions { LeaseId = renewResponse.Value.LeaseId });
@@ -1679,12 +1682,14 @@ public async Task ChangeLeaseAsync()
16791682
var duration = TimeSpan.FromSeconds(15);
16801683
Response<BlobLease> leaseResponse = await InstrumentClient(test.Container.GetBlobLeaseClient(id)).AcquireAsync(duration);
16811684
var newId = Recording.Random.NewGuid().ToString();
1685+
var leaseClient = InstrumentClient(test.Container.GetBlobLeaseClient(id));
16821686

16831687
// Act
1684-
Response<BlobLease> changeResponse = await InstrumentClient(test.Container.GetBlobLeaseClient(id)).ChangeAsync(newId);
1688+
Response<BlobLease> changeResponse = await leaseClient.ChangeAsync(newId);
16851689

16861690
// Assert
16871691
Assert.AreEqual(newId, changeResponse.Value.LeaseId);
1692+
Assert.AreEqual(changeResponse.Value.LeaseId, leaseClient.LeaseId);
16881693

16891694
// Cleanup
16901695
await InstrumentClient(test.Container.GetBlobLeaseClient(changeResponse.Value.LeaseId)).ReleaseAsync();

sdk/storage/Azure.Storage.Files.DataLake/tests/FileClientTests.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2262,12 +2262,14 @@ public async Task AcquireLeaseAsync()
22622262

22632263
var leaseId = Recording.Random.NewGuid().ToString();
22642264
var duration = TimeSpan.FromSeconds(15);
2265+
var leaseClient = InstrumentClient(file.GetDataLakeLeaseClient(leaseId));
22652266

22662267
// Act
2267-
Response<DataLakeLease> response = await InstrumentClient(file.GetDataLakeLeaseClient(leaseId)).AcquireAsync(duration);
2268+
Response<DataLakeLease> response = await leaseClient.AcquireAsync(duration);
22682269

22692270
// Assert
22702271
Assert.IsNotNull(response.GetRawResponse().Headers.RequestId);
2272+
Assert.AreEqual(response.Value.LeaseId, leaseClient.LeaseId);
22712273
}
22722274

22732275
[RecordedTest]
@@ -2357,6 +2359,7 @@ public async Task RenewLeaseAsync()
23572359

23582360
// Assert
23592361
Assert.IsNotNull(response.GetRawResponse().Headers.RequestId);
2362+
Assert.AreEqual(response.Value.LeaseId, lease.LeaseId);
23602363
}
23612364

23622365
[RecordedTest]
@@ -2538,6 +2541,7 @@ public async Task ChangeLeaseAsync()
25382541

25392542
// Assert
25402543
Assert.IsNotNull(response.GetRawResponse().Headers.RequestId);
2544+
Assert.AreEqual(response.Value.LeaseId, lease.LeaseId);
25412545
}
25422546

25432547
[RecordedTest]

0 commit comments

Comments
 (0)