Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
ODE
  • Loading branch information
BrennanConroy committed Dec 3, 2021
commit 4b0709b804184253ee3c589af6c9d4aaf35f18b1
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,10 @@ protected override RateLimitLease AcquireCore(int permitCount)
throw new ArgumentOutOfRangeException(nameof(permitCount), permitCount, SR.Format(SR.PermitLimitExceeded, permitCount, _options.PermitLimit));
}

ThrowIfDisposed();

// Return SuccessfulLease or FailedLease to indicate limiter state
if (permitCount == 0 && !_disposed)
if (permitCount == 0)
{
return _permitCount > 0 ? SuccessfulLease : FailedLease;
}
Expand Down Expand Up @@ -120,11 +122,7 @@ protected override ValueTask<RateLimitLease> WaitAsyncCore(int permitCount, Canc

private bool TryLeaseUnsynchronized(int permitCount, [NotNullWhen(true)] out RateLimitLease? lease)
{
if (_disposed)
{
lease = FailedLease;
return true;
}
ThrowIfDisposed();

// if permitCount is 0 we want to queue it if there are no available permits
if (_permitCount >= permitCount && _permitCount != 0)
Expand Down Expand Up @@ -231,6 +229,14 @@ protected override ValueTask DisposeAsyncCore()
return default;
}

private void ThrowIfDisposed()
{
if (_disposed)
{
throw new ObjectDisposedException(nameof(ConcurrencyLimiter));
}
}

private sealed class ConcurrencyLease : RateLimitLease
{
private static readonly string[] s_allMetadataNames = new[] { MetadataName.ReasonPhrase.Name };
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ public ValueTask<RateLimitLease> WaitAsync(int permitCount = 1, CancellationToke
protected virtual void Dispose(bool disposing) { }

/// <summary>
/// Dispose the RateLimiter. This completes any queued acquires with a failed lease.
/// Disposes the RateLimiter. This completes any queued acquires with a failed lease.
/// </summary>
public void Dispose()
{
Expand All @@ -100,7 +100,7 @@ protected virtual ValueTask DisposeAsyncCore()
}

/// <summary>
/// Diposes the RateLimiter asynchronously.
/// Disposes the RateLimiter asynchronously.
/// </summary>
/// <returns>ValueTask representin the completion of the disposal.</returns>
public async ValueTask DisposeAsync()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,10 @@ protected override ValueTask<RateLimitLease> WaitAsyncCore(int tokenCount, Cance
throw new ArgumentOutOfRangeException(nameof(tokenCount), tokenCount, SR.Format(SR.TokenLimitExceeded, tokenCount, _options.TokenLimit));
}

ThrowIfDisposed();

// Return SuccessfulAcquisition if requestedCount is 0 and resources are available
if (tokenCount == 0 && _tokenCount > 0 && !_disposed)
if (tokenCount == 0 && _tokenCount > 0)
{
return new ValueTask<RateLimitLease>(SuccessfulLease);
}
Expand Down Expand Up @@ -139,11 +141,7 @@ private RateLimitLease CreateFailedTokenLease(int tokenCount)

private bool TryLeaseUnsynchronized(int tokenCount, [NotNullWhen(true)] out RateLimitLease? lease)
{
if (_disposed)
{
lease = FailedLease;
return true;
}
ThrowIfDisposed();

// if permitCount is 0 we want to queue it if there are no available permits
if (_tokenCount >= tokenCount && _tokenCount != 0)
Expand Down Expand Up @@ -313,6 +311,14 @@ protected override ValueTask DisposeAsyncCore()
return default;
}

private void ThrowIfDisposed()
{
if (_disposed)
{
throw new ObjectDisposedException(nameof(TokenBucketRateLimiter));
}
}

private sealed class TokenBucketLease : RateLimitLease
{
private static readonly string[] s_allMetadataNames = new[] { MetadataName.RetryAfter.Name };
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -380,9 +380,9 @@ public override async Task DisposeReleasesQueuedAcquires()

lease.Dispose();

// Can't acquire any leases after disposal
Assert.False(limiter.Acquire(1).IsAcquired);
Assert.False((await limiter.WaitAsync(1)).IsAcquired);
// Throws after disposal
Assert.Throws<ObjectDisposedException>(() => limiter.Acquire(1));
await Assert.ThrowsAsync<ObjectDisposedException>(() => limiter.WaitAsync(1).AsTask());
}

[Fact]
Expand All @@ -409,9 +409,9 @@ public override async Task DisposeAsyncReleasesQueuedAcquires()

lease.Dispose();

// Can't acquire any leases after disposal
Assert.False(limiter.Acquire(1).IsAcquired);
Assert.False((await limiter.WaitAsync(1)).IsAcquired);
// Throws after disposal
Assert.Throws<ObjectDisposedException>(() => limiter.Acquire(1));
await Assert.ThrowsAsync<ObjectDisposedException>(() => limiter.WaitAsync(1).AsTask());
}

[Fact]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -330,9 +330,9 @@ public override async Task DisposeReleasesQueuedAcquires()
lease = await wait3;
Assert.False(lease.IsAcquired);

// Can't acquire any leases after disposal
Assert.False(limiter.Acquire(1).IsAcquired);
Assert.False((await limiter.WaitAsync(1)).IsAcquired);
// Throws after disposal
Assert.Throws<ObjectDisposedException>(() => limiter.Acquire(1));
await Assert.ThrowsAsync<ObjectDisposedException>(() => limiter.WaitAsync(1).AsTask());
}

[Fact]
Expand All @@ -357,9 +357,9 @@ public override async Task DisposeAsyncReleasesQueuedAcquires()
lease = await wait3;
Assert.False(lease.IsAcquired);

// Can't acquire any leases after disposal
Assert.False(limiter.Acquire(1).IsAcquired);
Assert.False((await limiter.WaitAsync(1)).IsAcquired);
// Throws after disposal
Assert.Throws<ObjectDisposedException>(() => limiter.Acquire(1));
await Assert.ThrowsAsync<ObjectDisposedException>(() => limiter.WaitAsync(1).AsTask());
}

[Fact]
Expand Down