Skip to content

Commit abb9e52

Browse files
authored
Do not call GetProperties on a blob when metadata is available via enumeration (#10400)
1 parent fc8c4c1 commit abb9e52

1 file changed

Lines changed: 29 additions & 30 deletions

File tree

src/NuGet.Services.Storage/AzureStorage.cs

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
using System.Threading;
1010
using System.Threading.Tasks;
1111
using Azure;
12-
using Azure.Data.Tables;
1312
using Azure.Storage.Blobs;
1413
using Azure.Storage.Blobs.Models;
1514
using Azure.Storage.Blobs.Specialized;
@@ -160,52 +159,70 @@ public override async Task<bool> ExistsAsync(string fileName, CancellationToken
160159

161160
public override IEnumerable<StorageListItem> List(bool getMetadata)
162161
{
163-
var blobTraits = new BlobTraits();
162+
var blobTraits = BlobTraits.None;
164163
if (getMetadata)
165164
{
166165
blobTraits |= BlobTraits.Metadata;
167166
}
168167

169-
foreach (BlobHierarchyItem blob in _directory.GetBlobsByHierarchy(traits: blobTraits, prefix: _path))
168+
foreach (BlobHierarchyItem item in _directory.GetBlobsByHierarchy(traits: blobTraits, prefix: _path))
170169
{
171-
yield return GetStorageListItem(_directory.GetBlockBlobClient(blob.Blob.Name));
170+
yield return ToStorageListItem(item);
172171
}
173172
}
174173

175174
public override async Task<IEnumerable<StorageListItem>> ListAsync(bool getMetadata, CancellationToken cancellationToken)
176175
{
177-
var blobTraits = new BlobTraits();
176+
var blobTraits = BlobTraits.None;
178177
if (getMetadata)
179178
{
180179
blobTraits |= BlobTraits.Metadata;
181180
}
182181

183182
var blobList = new List<StorageListItem>();
184183

185-
await foreach (BlobHierarchyItem blob in _directory.GetBlobsByHierarchyAsync(traits: blobTraits, prefix: _path))
184+
await foreach (BlobHierarchyItem item in _directory.GetBlobsByHierarchyAsync(traits: blobTraits, prefix: _path, cancellationToken: cancellationToken))
186185
{
187-
blobList.Add(await GetStorageListItemAsync(_directory.GetBlockBlobClient(blob.Blob.Name)));
186+
blobList.Add(ToStorageListItem(item));
188187
}
189188

190189
return blobList;
191190
}
192191

192+
private StorageListItem ToStorageListItem(BlobHierarchyItem item)
193+
{
194+
if (!item.IsBlob)
195+
{
196+
throw new ArgumentException(
197+
$"Unable to convert a non-blob {nameof(BlobHierarchyItem)} to a {nameof(StorageListItem)}. " +
198+
$"{nameof(item.IsPrefix)} = {item.IsPrefix}, {nameof(item.Prefix)} = '{item.Prefix}'.", nameof(item));
199+
}
200+
201+
var client = _directory.GetBlockBlobClient(item.Blob.Name);
202+
return new StorageListItem(client.Uri, item.Blob.Properties.LastModified, item.Blob.Metadata);
203+
}
204+
193205
public override async Task<IEnumerable<StorageListItem>> ListTopLevelAsync(bool getMetadata, CancellationToken cancellationToken)
194206
{
195-
var prefix = _path.Trim('/') + '/';
196-
var blobTraits = new BlobTraits();
207+
var prefix = _path.Trim('/');
208+
if (prefix.Length > 0)
209+
{
210+
prefix += '/';
211+
}
212+
213+
var blobTraits = BlobTraits.None;
197214
if (getMetadata)
198215
{
199216
blobTraits |= BlobTraits.Metadata;
200217
}
201218

202219
var blobList = new List<StorageListItem>();
203220

204-
await foreach (BlobHierarchyItem blob in _directory.GetBlobsByHierarchyAsync(traits: blobTraits, prefix: prefix, delimiter: "/"))
221+
await foreach (BlobHierarchyItem item in _directory.GetBlobsByHierarchyAsync(traits: blobTraits, prefix: prefix, delimiter: "/", cancellationToken: cancellationToken))
205222
{
206-
if (!blob.IsPrefix)
223+
if (!item.IsPrefix)
207224
{
208-
blobList.Add(await GetStorageListItemAsync(_directory.GetBlockBlobClient(blob.Blob.Name)));
225+
blobList.Add(ToStorageListItem(item));
209226
}
210227
}
211228

@@ -218,24 +235,6 @@ public override async Task SetMetadataAsync(Uri resourceUri, IDictionary<string,
218235
await blob.SetMetadataAsync(metadata);
219236
}
220237

221-
private async Task<StorageListItem> GetStorageListItemAsync(BlockBlobClient listBlobItem)
222-
{
223-
var blobPropertiesResponse = await listBlobItem.GetPropertiesAsync();
224-
var blobProperties = blobPropertiesResponse?.Value;
225-
var lastModified = blobProperties?.LastModified;
226-
227-
return new StorageListItem(listBlobItem.Uri, lastModified, blobProperties?.Metadata);
228-
}
229-
230-
private StorageListItem GetStorageListItem(BlockBlobClient listBlobItem)
231-
{
232-
var blobPropertiesResponse = listBlobItem.GetProperties();
233-
var blobProperties = blobPropertiesResponse?.Value;
234-
var lastModified = blobProperties?.LastModified;
235-
236-
return new StorageListItem(listBlobItem.Uri, lastModified, blobProperties?.Metadata);
237-
}
238-
239238
protected override async Task OnCopyAsync(
240239
Uri sourceUri,
241240
IStorage destinationStorage,

0 commit comments

Comments
 (0)