Skip to content

Commit fca68d1

Browse files
Merge pull request #107 from SixLabors/js/stream-pooling
Use RecyclableMemoryStream
2 parents a11d088 + da5f5e7 commit fca68d1

File tree

13 files changed

+92
-713
lines changed

13 files changed

+92
-713
lines changed

Directory.Build.targets

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
<!--Src Dependencies-->
2525
<PackageReference Update="Azure.Storage.Blobs" Version="12.4.0" />
26+
<PackageReference Update="Microsoft.IO.RecyclableMemoryStream" Version="1.3.5" />
2627
<PackageReference Update="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All"/>
2728
<PackageReference Update="MinVer" PrivateAssets="All" Version="2.3.0" />
2829
<PackageReference Update="SixLabors.ImageSharp" Version="1.0.1" />

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ Install stable releases via Nuget; development releases are available via MyGet.
4545

4646
| Package Name | Release (NuGet) | Nightly (MyGet) |
4747
|--------------------------------|-----------------|-----------------|
48-
| `SixLabors.ImageSharp.Web` | [![NuGet](https://img.shields.io/nuget/v/SixLabors.ImageSharp.Web.svg)](https://www.nuget.org/packages/SixLabors.ImageSharp.Web/) | [![MyGet](https://img.shields.io/myget/sixlabors/v/SixLabors.ImageSharp.Web.svg)](https://www.myget.org/feed/sixlabors/package/nuget/SixLabors.ImageSharp.Web) |
48+
| `SixLabors.ImageSharp.Web` | [![NuGet](https://img.shields.io/nuget/v/SixLabors.ImageSharp.Web.svg)](https://www.nuget.org/packages/SixLabors.ImageSharp.Web/) | [![MyGet](https://img.shields.io/myget/sixlabors/vpre/SixLabors.ImageSharp.Web.svg)](https://www.myget.org/feed/sixlabors/package/nuget/SixLabors.ImageSharp.Web) |
4949

5050
## Manual build
5151

src/ImageSharp.Web.Providers.Azure/Providers/AzureBlobStorageImageProvider.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using Microsoft.AspNetCore.Http;
99
using Microsoft.AspNetCore.Http.Extensions;
1010
using Microsoft.Extensions.Options;
11+
using Microsoft.IO;
1112
using SixLabors.ImageSharp.Web.Resolvers;
1213
using SixLabors.ImageSharp.Web.Resolvers.Azure;
1314

@@ -34,6 +35,12 @@ private readonly Dictionary<string, BlobContainerClient> containers
3435
/// </summary>
3536
private readonly AzureBlobStorageImageProviderOptions storageOptions;
3637

38+
/// <summary>
39+
/// The recyclable memorystream manager used for managing pooled stream
40+
/// buffers independently from image buffer pooling.
41+
/// </summary>
42+
private readonly RecyclableMemoryStreamManager memoryStreamManager;
43+
3744
/// <summary>
3845
/// Contains various helper methods based on the current configuration.
3946
/// </summary>
@@ -48,14 +55,21 @@ private readonly Dictionary<string, BlobContainerClient> containers
4855
/// Initializes a new instance of the <see cref="AzureBlobStorageImageProvider"/> class.
4956
/// </summary>
5057
/// <param name="storageOptions">The blob storage options.</param>
58+
/// <param name="memoryStreamManager">
59+
/// The recyclable memorystream manager used for managing pooled stream
60+
/// buffers independently from image buffer pooling.
61+
/// </param>
5162
/// <param name="formatUtilities">Contains various format helper methods based on the current configuration.</param>
5263
public AzureBlobStorageImageProvider(
5364
IOptions<AzureBlobStorageImageProviderOptions> storageOptions,
65+
RecyclableMemoryStreamManager memoryStreamManager,
5466
FormatUtilities formatUtilities)
5567
{
5668
Guard.NotNull(storageOptions, nameof(storageOptions));
69+
Guard.NotNull(memoryStreamManager, nameof(memoryStreamManager));
5770

5871
this.storageOptions = storageOptions.Value;
72+
this.memoryStreamManager = memoryStreamManager;
5973
this.formatUtilities = formatUtilities;
6074

6175
foreach (AzureBlobContainerClientOptions container in this.storageOptions.BlobContainers)
@@ -122,7 +136,7 @@ public async Task<IImageResolver> GetAsync(HttpContext context)
122136
return null;
123137
}
124138

125-
return new AzureBlobStorageImageResolver(blob);
139+
return new AzureBlobStorageImageResolver(blob, this.memoryStreamManager);
126140
}
127141

128142
/// <inheritdoc/>

src/ImageSharp.Web.Providers.Azure/Resolvers/AzureBlobStorageImageResolver.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using Azure;
88
using Azure.Storage.Blobs;
99
using Azure.Storage.Blobs.Models;
10+
using Microsoft.IO;
1011

1112
namespace SixLabors.ImageSharp.Web.Resolvers.Azure
1213
{
@@ -15,13 +16,22 @@ namespace SixLabors.ImageSharp.Web.Resolvers.Azure
1516
/// </summary>
1617
public class AzureBlobStorageImageResolver : IImageResolver
1718
{
19+
private readonly RecyclableMemoryStreamManager memoryStreamManager;
1820
private readonly BlobClient blob;
1921

2022
/// <summary>
2123
/// Initializes a new instance of the <see cref="AzureBlobStorageImageResolver"/> class.
2224
/// </summary>
2325
/// <param name="blob">The Azure blob.</param>
24-
public AzureBlobStorageImageResolver(BlobClient blob) => this.blob = blob;
26+
/// <param name="memoryStreamManager">
27+
/// The recyclable memorystream manager used for managing pooled stream
28+
/// buffers independently from image buffer pooling.
29+
/// </param>
30+
public AzureBlobStorageImageResolver(BlobClient blob, RecyclableMemoryStreamManager memoryStreamManager)
31+
{
32+
this.blob = blob;
33+
this.memoryStreamManager = memoryStreamManager;
34+
}
2535

2636
/// <inheritdoc/>
2737
public async Task<ImageMetadata> GetMetaDataAsync()
@@ -36,7 +46,7 @@ public async Task<Stream> OpenReadAsync()
3646
// Copy to a MemoryStream first because RetriableStreamImpl
3747
// doesn't support Position.
3848
Stream blobStream = (await this.blob.DownloadAsync()).Value.Content;
39-
var memoryStream = new ChunkedMemoryStream();
49+
var memoryStream = new RecyclableMemoryStream(this.memoryStreamManager);
4050

4151
await blobStream.CopyToAsync(memoryStream);
4252
memoryStream.Seek(0, SeekOrigin.Begin);

0 commit comments

Comments
 (0)