Skip to content

Commit

Permalink
rebase
Browse files Browse the repository at this point in the history
  • Loading branch information
BrennanConroy committed Jul 20, 2022
1 parent 125a374 commit 68de958
Show file tree
Hide file tree
Showing 5 changed files with 81 additions and 67 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ public abstract partial class PartitionedRateLimiter<TResource> : System.IAsyncD
public System.Threading.Tasks.ValueTask DisposeAsync() { throw null; }
protected virtual System.Threading.Tasks.ValueTask DisposeAsyncCore() { throw null; }
public abstract int GetAvailablePermits(TResource resource);
public System.Threading.RateLimiting.PartitionedRateLimiter<TOuter> TranslateKey<TOuter>(System.Func<TOuter, TResource> keyAdapter) { throw null; }
public System.Threading.Tasks.ValueTask<System.Threading.RateLimiting.RateLimitLease> WaitAndAcquireAsync(TResource resource, int permitCount = 1, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
protected abstract System.Threading.Tasks.ValueTask<System.Threading.RateLimiting.RateLimitLease> WaitAndAcquireAsyncCore(TResource resource, int permitCount, System.Threading.CancellationToken cancellationToken);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>$(NetCoreAppCurrent);$(NetCoreAppMinimum);netstandard2.0;$(NetFrameworkMinimum)</TargetFrameworks>
<IsPackable>true</IsPackable>
Expand Down Expand Up @@ -37,6 +37,7 @@ System.Threading.RateLimiting.RateLimitLease</PackageDescription>
<Compile Include="System\Threading\RateLimiting\TokenBucketRateLimiter.cs" />
<Compile Include="System\Threading\RateLimiting\TokenBucketRateLimiterOptions.cs" />
<Compile Include="$(CommonPath)System\Collections\Generic\Deque.cs" Link="Common\System\Collections\Generic\Deque.cs" />
<Compile Include="System\Threading\RateLimiting\TranslatingLimiter.cs" />
</ItemGroup>

<ItemGroup Condition="'$(TargetFrameworkIdentifier)' != '.NETCoreApp'">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ public async ValueTask DisposeAsync()
/// <typeparam name="TOuter">The type to translate into <typeparamref name="TResource"/>.</typeparam>
/// <param name="keyAdapter">The function to be called every time a <typeparamref name="TOuter"/> is passed to
/// PartitionedRateLimiter&lt;TOuter&gt;.Acquire(TOuter, int) or PartitionedRateLimiter&lt;TOuter&gt;.WaitAsync(TOuter, int, CancellationToken).</param>
/// <remarks><see cref="PartitionedRateLimiter{TResource}.Dispose()"/> or <see cref="PartitionedRateLimiter{TResource}.DisposeAsync()"/> does not dispose the wrapped <see cref="PartitionedRateLimiter{TResource}"/>.</remarks>
/// <returns>A new PartitionedRateLimiter&lt;TOuter&gt; that translates <typeparamref name="TOuter"/>
/// to <typeparamref name="TResource"/> and calls the inner <see cref="PartitionedRateLimiter{TResource}"/>.</returns>
public PartitionedRateLimiter<TOuter> TranslateKey<TOuter>(Func<TOuter, TResource> keyAdapter)
Expand All @@ -137,59 +138,4 @@ public PartitionedRateLimiter<TOuter> TranslateKey<TOuter>(Func<TOuter, TResourc
return new TranslatingLimiter<TResource, TOuter>(this, keyAdapter);
}
}

internal sealed class TranslatingLimiter<TInner, TResource> : PartitionedRateLimiter<TResource>
{
private readonly PartitionedRateLimiter<TInner> _innerRateLimiter;
private readonly Func<TResource, TInner> _keyAdapter;

private bool _disposed;

public TranslatingLimiter(PartitionedRateLimiter<TInner> inner, Func<TResource, TInner> keyAdapter)
{
_innerRateLimiter = inner;
_keyAdapter = keyAdapter;
}

public override int GetAvailablePermits(TResource resourceID)
{
ThrowIfDispose();
TInner key = _keyAdapter(resourceID);
return _innerRateLimiter.GetAvailablePermits(key);
}

protected override RateLimitLease AcquireCore(TResource resourceID, int permitCount)
{
ThrowIfDispose();
TInner key = _keyAdapter(resourceID);
return _innerRateLimiter.Acquire(key, permitCount);
}

protected override ValueTask<RateLimitLease> WaitAsyncCore(TResource resourceID, int permitCount, CancellationToken cancellationToken)
{
ThrowIfDispose();
TInner key = _keyAdapter(resourceID);
return _innerRateLimiter.WaitAsync(key, permitCount, cancellationToken);
}

protected override void Dispose(bool disposing)
{
_disposed = true;
base.Dispose(disposing);
}

protected override ValueTask DisposeAsyncCore()
{
_disposed = true;
return base.DisposeAsyncCore();
}

private void ThrowIfDispose()
{
if (_disposed)
{
throw new ObjectDisposedException(nameof(PartitionedRateLimiter));
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace System.Threading.RateLimiting
{
internal sealed class TranslatingLimiter<TInner, TResource> : PartitionedRateLimiter<TResource>
{
private readonly PartitionedRateLimiter<TInner> _innerRateLimiter;
private readonly Func<TResource, TInner> _keyAdapter;

private bool _disposed;

public TranslatingLimiter(PartitionedRateLimiter<TInner> inner, Func<TResource, TInner> keyAdapter)
{
_innerRateLimiter = inner;
_keyAdapter = keyAdapter;
}

public override int GetAvailablePermits(TResource resource)
{
ThrowIfDispose();
TInner key = _keyAdapter(resource);
return _innerRateLimiter.GetAvailablePermits(key);
}

protected override RateLimitLease AcquireCore(TResource resource, int permitCount)
{
ThrowIfDispose();
TInner key = _keyAdapter(resource);
return _innerRateLimiter.Acquire(key, permitCount);
}

protected override ValueTask<RateLimitLease> WaitAndAcquireAsyncCore(TResource resource, int permitCount, CancellationToken cancellationToken)
{
ThrowIfDispose();
TInner key = _keyAdapter(resource);
return _innerRateLimiter.WaitAndAcquireAsync(key, permitCount, cancellationToken);
}

protected override void Dispose(bool disposing)
{
_disposed = true;
base.Dispose(disposing);
}

protected override ValueTask DisposeAsyncCore()
{
_disposed = true;
return base.DisposeAsyncCore();
}

private void ThrowIfDispose()
{
if (_disposed)
{
throw new ObjectDisposedException(nameof(PartitionedRateLimiter));
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -605,12 +605,12 @@ public void Translate_AcquirePassesThroughToInnerLimiter()
{
if (resource == "1")
{
return RateLimitPartition.CreateConcurrencyLimiter(1,
return RateLimitPartition.GetConcurrencyLimiter(1,
_ => new ConcurrencyLimiterOptions(1, QueueProcessingOrder.NewestFirst, 1));
}
else
{
return RateLimitPartition.CreateConcurrencyLimiter(1,
return RateLimitPartition.GetConcurrencyLimiter(1,
_ => new ConcurrencyLimiterOptions(1, QueueProcessingOrder.NewestFirst, 1));
}
});
Expand Down Expand Up @@ -644,12 +644,12 @@ public async Task Translate_WaitAsyncPassesThroughToInnerLimiter()
{
if (resource == "1")
{
return RateLimitPartition.CreateConcurrencyLimiter(1,
return RateLimitPartition.GetConcurrencyLimiter(1,
_ => new ConcurrencyLimiterOptions(1, QueueProcessingOrder.NewestFirst, 1));
}
else
{
return RateLimitPartition.CreateConcurrencyLimiter(1,
return RateLimitPartition.GetConcurrencyLimiter(1,
_ => new ConcurrencyLimiterOptions(1, QueueProcessingOrder.NewestFirst, 1));
}
});
Expand All @@ -661,7 +661,7 @@ public async Task Translate_WaitAsyncPassesThroughToInnerLimiter()
return i.ToString();
});

var lease = await translateLimiter.WaitAsync(1);
var lease = await translateLimiter.WaitAndAcquireAsync(1);
Assert.True(lease.IsAcquired);
Assert.Equal(1, translateCallCount);

Expand All @@ -683,12 +683,12 @@ public void Translate_GetAvailablePermitsPassesThroughToInnerLimiter()
{
if (resource == "1")
{
return RateLimitPartition.CreateConcurrencyLimiter(1,
return RateLimitPartition.GetConcurrencyLimiter(1,
_ => new ConcurrencyLimiterOptions(1, QueueProcessingOrder.NewestFirst, 1));
}
else
{
return RateLimitPartition.CreateConcurrencyLimiter(1,
return RateLimitPartition.GetConcurrencyLimiter(1,
_ => new ConcurrencyLimiterOptions(1, QueueProcessingOrder.NewestFirst, 1));
}
});
Expand Down Expand Up @@ -731,12 +731,12 @@ public void Translate_DisposeDoesNotDisposeInnerLimiter()
{
if (resource == "1")
{
return RateLimitPartition.CreateConcurrencyLimiter(1,
return RateLimitPartition.GetConcurrencyLimiter(1,
_ => new ConcurrencyLimiterOptions(1, QueueProcessingOrder.NewestFirst, 1));
}
else
{
return RateLimitPartition.CreateConcurrencyLimiter(1,
return RateLimitPartition.GetConcurrencyLimiter(1,
_ => new ConcurrencyLimiterOptions(1, QueueProcessingOrder.NewestFirst, 1));
}
});
Expand All @@ -763,12 +763,12 @@ public async Task Translate_DisposeAsyncDoesNotDisposeInnerLimiter()
{
if (resource == "1")
{
return RateLimitPartition.CreateConcurrencyLimiter(1,
return RateLimitPartition.GetConcurrencyLimiter(1,
_ => new ConcurrencyLimiterOptions(1, QueueProcessingOrder.NewestFirst, 1));
}
else
{
return RateLimitPartition.CreateConcurrencyLimiter(1,
return RateLimitPartition.GetConcurrencyLimiter(1,
_ => new ConcurrencyLimiterOptions(1, QueueProcessingOrder.NewestFirst, 1));
}
});
Expand Down

0 comments on commit 68de958

Please sign in to comment.