cleanup from PR feedback

This commit is contained in:
Dylan Dmitri Gray 2019-05-16 16:55:46 -07:00
parent 61f028ad32
commit ac305849e3
4 changed files with 30 additions and 21 deletions

View File

@ -12,8 +12,8 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace RequestQueueSample namespace RequestThrottlingSample
{ {
public class Startup public class Startup
{ {
// This method gets called by the runtime. Use this method to add services to the container. // This method gets called by the runtime. Use this method to add services to the container.

View File

@ -1,11 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<Description>ASP.NET Core middleware for queuing incoming HTTP requests, to avoid threadpool starvation.</Description> <Description>ASP.NET Core middleware for queuing incoming HTTP requests, to avoid threadpool starvation.</Description>
<TargetFramework>netcoreapp3.0</TargetFramework> <TargetFramework>netcoreapp3.0</TargetFramework>
<NoWarn>$(NoWarn);CS1591</NoWarn>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<GenerateDocumentationFile>true</GenerateDocumentationFile> <GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;queue;queuing</PackageTags>
<WarningsNotAsErrors>$(WarningsNotAsErrors);CS1591</WarningsNotAsErrors> <WarningsNotAsErrors>$(WarningsNotAsErrors);CS1591</WarningsNotAsErrors>
</PropertyGroup> </PropertyGroup>

View File

@ -4,30 +4,30 @@ using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace Microsoft.AspNetCore.RequestQueue namespace Microsoft.AspNetCore.RequestThrottling
{ {
internal class SemaphoreWrapper internal class SemaphoreWrapper
{ {
private static SemaphoreSlim semaphore; private SemaphoreSlim _semaphore;
public SemaphoreWrapper(int qlength) public SemaphoreWrapper(int queueLength)
{ {
semaphore = new SemaphoreSlim(qlength); _semaphore = new SemaphoreSlim(queueLength);
} }
public Task EnterQueue() public Task EnterQueue()
{ {
return semaphore.WaitAsync(); return _semaphore.WaitAsync();
} }
public void LeaveQueue() public void LeaveQueue()
{ {
semaphore.Release(); _semaphore.Release();
} }
public int SpotsLeft public int Count
{ {
get => semaphore.CurrentCount; get => _semaphore.CurrentCount;
} }
} }
} }

View File

@ -8,25 +8,25 @@ using System;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using Microsoft.AspNetCore.Testing; using Microsoft.AspNetCore.Testing;
namespace Microsoft.AspNetCore.RequestQueue.Tests namespace Microsoft.AspNetCore.RequestThrottling.Tests
{ {
public class SemaphoreWrapperTests public class SemaphoreWrapperTests
{ {
[Fact] [Fact]
public async Task TestBehavior() public async Task TracksQueueLength()
{ {
var s = new SemaphoreWrapper(1); var s = new SemaphoreWrapper(1);
Assert.Equal(1, s.SpotsLeft); Assert.Equal(1, s.Count);
await s.EnterQueue(); await s.EnterQueue();
Assert.Equal(0, s.SpotsLeft); Assert.Equal(0, s.Count);
s.LeaveQueue(); s.LeaveQueue();
Assert.Equal(1, s.SpotsLeft); Assert.Equal(1, s.Count);
} }
[Fact] [Fact]
public void TestQueueLength() public void DoesNotWaitIfSpaceAvailible()
{ {
var s = new SemaphoreWrapper(2); var s = new SemaphoreWrapper(2);
@ -41,7 +41,7 @@ namespace Microsoft.AspNetCore.RequestQueue.Tests
} }
[Fact] [Fact]
public async Task TestWaiting() public async Task WaitsIfNoSpaceAvailible()
{ {
var s = new SemaphoreWrapper(1); var s = new SemaphoreWrapper(1);
await s.EnterQueue(); await s.EnterQueue();
@ -50,7 +50,17 @@ namespace Microsoft.AspNetCore.RequestQueue.Tests
Assert.False(waitingTask.IsCompleted); Assert.False(waitingTask.IsCompleted);
s.LeaveQueue(); s.LeaveQueue();
await waitingTask.TimeoutAfter(TimeSpan.FromSeconds(1)); await waitingTask.TimeoutAfter(TimeSpan.FromSeconds(30));
}
[Fact]
public async Task IsEncapsulated()
{
var s1 = new SemaphoreWrapper(1);
var s2 = new SemaphoreWrapper(1);
await s1.EnterQueue();
await s2.EnterQueue().TimeoutAfter(TimeSpan.FromSeconds(30));
} }
} }
} }