Skip to content

Commit 8013708

Browse files
committed
GrainsRateLimiterTests
1 parent 75684df commit 8013708

14 files changed

+70
-293
lines changed

ManagedCode.Orleans.RateLimiting.Core/Attributes/ConcurrencyLimiterAttribute.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public class ConcurrencyLimiterAttribute : Attribute, ILimiterAttribute<Concurre
2626
/// <param name="queueProcessingOrder">Determines the behaviour of <see cref="RateLimiter.AcquireAsync"/> when not enough resources can be leased.</param>
2727
public ConcurrencyLimiterAttribute(KeyType keyType = KeyType.GrainId, string key = default,
2828
int permitLimit = default,
29-
int queueLimit = default,
29+
int queueLimit = 0,
3030
QueueProcessingOrder queueProcessingOrder = QueueProcessingOrder.OldestFirst)
3131
{
3232
Key = key;
@@ -39,14 +39,13 @@ public ConcurrencyLimiterAttribute(KeyType keyType = KeyType.GrainId, string key
3939
}
4040

4141
int? permitLimitNullable = permitLimit > 0 ? permitLimit : null;
42-
int? queueLimitNullable = queueLimit >= 0 ? queueLimit : null;
4342

44-
if (permitLimitNullable.HasValue || queueLimitNullable.HasValue)
43+
if (permitLimitNullable.HasValue)
4544
{
4645
Options = new ConcurrencyLimiterOptions()
4746
{
4847
PermitLimit = permitLimitNullable ?? 1,
49-
QueueLimit = queueLimitNullable ?? 1,
48+
QueueLimit = queueLimit,
5049
QueueProcessingOrder = queueProcessingOrder
5150
};
5251
}

ManagedCode.Orleans.RateLimiting.Core/Attributes/FixedWindowRateLimiterAttribute.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public class FixedWindowRateLimiterAttribute : Attribute, ILimiterAttribute<Fixe
3535
public FixedWindowRateLimiterAttribute(KeyType keyType = KeyType.GrainId, string key = default,
3636
TimeSpan window = default,
3737
int permitLimit = default,
38-
int queueLimit = default,
38+
int queueLimit = 0,
3939
bool autoReplenishment = true,
4040
QueueProcessingOrder queueProcessingOrder = QueueProcessingOrder.OldestFirst)
4141
{
@@ -49,16 +49,15 @@ public FixedWindowRateLimiterAttribute(KeyType keyType = KeyType.GrainId, string
4949
}
5050

5151
int? permitLimitNullable = permitLimit > 0 ? permitLimit : null;
52-
int? queueLimitNullable = queueLimit >= 0 ? queueLimit : null;
5352
TimeSpan? windowNullable = window > TimeSpan.Zero ? window : null;
5453

55-
if (permitLimitNullable.HasValue || queueLimitNullable.HasValue || windowNullable.HasValue)
54+
if (permitLimitNullable.HasValue || windowNullable.HasValue)
5655
{
5756
Options = new FixedWindowRateLimiterOptions()
5857
{
5958
Window = windowNullable ?? TimeSpan.FromSeconds(1),
6059
PermitLimit = permitLimitNullable ?? 1,
61-
QueueLimit = queueLimitNullable ?? 1,
60+
QueueLimit = queueLimit,
6261
AutoReplenishment = autoReplenishment,
6362
QueueProcessingOrder = queueProcessingOrder
6463
};

ManagedCode.Orleans.RateLimiting.Core/Attributes/SlidingWindowRateLimiterAttribute.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public class SlidingWindowRateLimiterAttribute : Attribute, ILimiterAttribute<Sl
3939
public SlidingWindowRateLimiterAttribute(KeyType keyType = KeyType.GrainId, string key = default,
4040
TimeSpan window = default,
4141
int permitLimit = default,
42-
int queueLimit = default,
42+
int queueLimit = 0,
4343
int segmentsPerWindow = default,
4444
bool autoReplenishment = true,
4545
QueueProcessingOrder queueProcessingOrder = QueueProcessingOrder.OldestFirst)
@@ -54,18 +54,17 @@ public SlidingWindowRateLimiterAttribute(KeyType keyType = KeyType.GrainId, stri
5454
}
5555

5656
int? permitLimitNullable = permitLimit > 0 ? permitLimit : null;
57-
int? queueLimitNullable = queueLimit >= 0 ? queueLimit : null;
5857
int? segmentsPerWindowNullable = segmentsPerWindow >= 0 ? segmentsPerWindow : null;
5958
TimeSpan? windowNullable = window > TimeSpan.Zero ? window : null;
6059

6160

62-
if (permitLimitNullable.HasValue || queueLimitNullable.HasValue || windowNullable.HasValue || segmentsPerWindowNullable.HasValue)
61+
if (permitLimitNullable.HasValue || windowNullable.HasValue || segmentsPerWindowNullable.HasValue)
6362
{
6463
Options = new SlidingWindowRateLimiterOptions()
6564
{
6665
Window = windowNullable ?? TimeSpan.FromSeconds(1),
6766
PermitLimit = permitLimitNullable ?? 1,
68-
QueueLimit = queueLimitNullable ?? 1,
67+
QueueLimit = queueLimit,
6968
SegmentsPerWindow = segmentsPerWindowNullable ?? 1,
7069
AutoReplenishment = autoReplenishment,
7170
QueueProcessingOrder = queueProcessingOrder

ManagedCode.Orleans.RateLimiting.Core/Attributes/TokenBucketRateLimiterAttribute.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public class TokenBucketRateLimiterAttribute : Attribute, ILimiterAttribute<Toke
3939
public TokenBucketRateLimiterAttribute(KeyType keyType = KeyType.GrainId, string key = default,
4040
TimeSpan replenishmentPeriod = default,
4141
int tokensPerPeriod = default,
42-
int queueLimit = default,
42+
int queueLimit = 0,
4343
int tokenLimit = default,
4444
bool autoReplenishment = true,
4545
QueueProcessingOrder queueProcessingOrder = QueueProcessingOrder.OldestFirst)
@@ -54,17 +54,16 @@ public TokenBucketRateLimiterAttribute(KeyType keyType = KeyType.GrainId, string
5454
}
5555

5656
int? tokensPerPeriodNullable = tokensPerPeriod > 0 ? tokensPerPeriod : null;
57-
int? queueLimitNullable = queueLimit >= 0 ? queueLimit : null;
5857
int? tokenLimitNullable = tokenLimit >= 0 ? tokenLimit : null;
5958
TimeSpan? replenishmentPeriodNullable = replenishmentPeriod > TimeSpan.Zero ? replenishmentPeriod : null;
6059

61-
if (tokensPerPeriodNullable.HasValue || queueLimitNullable.HasValue || tokenLimitNullable.HasValue || replenishmentPeriodNullable.HasValue)
60+
if (tokensPerPeriodNullable.HasValue || tokenLimitNullable.HasValue || replenishmentPeriodNullable.HasValue)
6261
{
6362
Options = new TokenBucketRateLimiterOptions()
6463
{
6564
ReplenishmentPeriod = replenishmentPeriodNullable ?? TimeSpan.FromSeconds(1),
6665
TokensPerPeriod = tokensPerPeriodNullable ?? 1,
67-
QueueLimit = queueLimitNullable ?? 1,
66+
QueueLimit = queueLimit,
6867
TokenLimit = tokenLimitNullable ?? 1,
6968
AutoReplenishment = autoReplenishment,
7069
QueueProcessingOrder = queueProcessingOrder

ManagedCode.Orleans.RateLimiting.Core/Models/OrleansRateLimitLease.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Diagnostics;
34
using System.Linq;
45
using System.Threading.Tasks;
56
using ManagedCode.Orleans.RateLimiting.Core.Interfaces;
@@ -8,6 +9,7 @@
89

910
namespace ManagedCode.Orleans.RateLimiting.Core.Models;
1011

12+
[DebuggerDisplay("IsAcquired = {IsAcquired}")]
1113
public class OrleansRateLimitLease : IDisposable, IAsyncDisposable
1214
{
1315
private readonly GrainId _grainId;

ManagedCode.Orleans.RateLimiting.Server/Extensions/SiloBuilderConcurrencyLimiterExtensions.cs

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,18 @@
22
using System.Threading.RateLimiting;
33
using ManagedCode.Orleans.RateLimiting.Server.GrainCallFilter;
44
using Microsoft.Extensions.DependencyInjection;
5+
using Microsoft.Extensions.Options;
56
using Orleans.Hosting;
67

78
namespace ManagedCode.Orleans.RateLimiting.Server.Extensions;
89

910
public static class SiloBuilderConcurrencyLimiterExtensions
1011
{
1112
public static ISiloBuilder AddOrleansConcurrencyLimiter(this ISiloBuilder siloBuilder,
12-
ConcurrencyLimiterOptions defaultOptions)
13+
Action<ConcurrencyLimiterOptions> defaultOptions)
1314
{
14-
siloBuilder.Services.AddSingleton(defaultOptions);
15+
siloBuilder.Services.AddOptions<ConcurrencyLimiterOptions>().Configure(defaultOptions.Invoke);
1516
siloBuilder.AddIncomingGrainCallFilter<ConcurrencyLimiterIncomingFilter>();
1617
return siloBuilder;
1718
}
18-
19-
public static ISiloBuilder AddOrleansConcurrencyLimiter(this ISiloBuilder siloBuilder,
20-
Action<ConcurrencyLimiterOptions> defaultOptions)
21-
{
22-
var fixedWindowRateLimiterOptions = new ConcurrencyLimiterOptions();
23-
defaultOptions.Invoke(fixedWindowRateLimiterOptions);
24-
return siloBuilder.AddOrleansConcurrencyLimiter(fixedWindowRateLimiterOptions);
25-
}
2619
}

ManagedCode.Orleans.RateLimiting.Server/Extensions/SiloBuilderFixedWindowRateLimiterExtensions.cs

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,10 @@ namespace ManagedCode.Orleans.RateLimiting.Server.Extensions;
99
public static class SiloBuilderFixedWindowRateLimiterExtensions
1010
{
1111
public static ISiloBuilder AddOrleansFixedWindowRateLimiter(this ISiloBuilder siloBuilder,
12-
FixedWindowRateLimiterOptions defaultOptions)
12+
Action<FixedWindowRateLimiterOptions> defaultOptions)
1313
{
14-
siloBuilder.Services.AddSingleton(defaultOptions);
14+
siloBuilder.Services.AddOptions<FixedWindowRateLimiterOptions>().Configure(defaultOptions.Invoke);
1515
siloBuilder.AddIncomingGrainCallFilter<FixedWindowRateLimiterIncomingFilter>();
1616
return siloBuilder;
1717
}
18-
19-
public static ISiloBuilder AddOrleansFixedWindowRateLimiter(this ISiloBuilder siloBuilder,
20-
Action<FixedWindowRateLimiterOptions> defaultOptions)
21-
{
22-
var fixedWindowRateLimiterOptions = new FixedWindowRateLimiterOptions();
23-
defaultOptions.Invoke(fixedWindowRateLimiterOptions);
24-
return siloBuilder.AddOrleansFixedWindowRateLimiter(fixedWindowRateLimiterOptions);
25-
}
2618
}

ManagedCode.Orleans.RateLimiting.Server/Extensions/SiloBuilderSlidingWindowRateLimiterExtensions.cs

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,10 @@ namespace ManagedCode.Orleans.RateLimiting.Server.Extensions;
99
public static class SiloBuilderSlidingWindowRateLimiterExtensions
1010
{
1111
public static ISiloBuilder AddOrleansSlidingWindowRateLimiter(this ISiloBuilder siloBuilder,
12-
SlidingWindowRateLimiterOptions defaultOptions)
12+
Action<SlidingWindowRateLimiterOptions> defaultOptions)
1313
{
14-
siloBuilder.Services.AddSingleton(defaultOptions);
14+
siloBuilder.Services.AddOptions<SlidingWindowRateLimiterOptions>().Configure(defaultOptions.Invoke);
1515
siloBuilder.AddIncomingGrainCallFilter<SlidingWindowRateLimiterIncomingFilter>();
1616
return siloBuilder;
1717
}
18-
19-
public static ISiloBuilder AddOrleansSlidingWindowRateLimiter(this ISiloBuilder siloBuilder,
20-
Action<SlidingWindowRateLimiterOptions> defaultOptions)
21-
{
22-
var fixedWindowRateLimiterOptions = new SlidingWindowRateLimiterOptions();
23-
defaultOptions.Invoke(fixedWindowRateLimiterOptions);
24-
return siloBuilder.AddOrleansSlidingWindowRateLimiter(fixedWindowRateLimiterOptions);
25-
}
2618
}

ManagedCode.Orleans.RateLimiting.Server/Extensions/SiloBuilderTokenBucketRateLimiterExtensions.cs

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,10 @@ namespace ManagedCode.Orleans.RateLimiting.Server.Extensions;
99
public static class SiloBuilderTokenBucketRateLimiterExtensions
1010
{
1111
public static ISiloBuilder AddOrleansTokenBucketRateLimiter(this ISiloBuilder siloBuilder,
12-
TokenBucketRateLimiterOptions defaultOptions)
12+
Action<TokenBucketRateLimiterOptions> defaultOptions)
1313
{
14-
siloBuilder.Services.AddSingleton(defaultOptions);
14+
siloBuilder.Services.AddOptions<TokenBucketRateLimiterOptions>().Configure(defaultOptions.Invoke);
1515
siloBuilder.AddIncomingGrainCallFilter<TokenBucketRateLimiterIncomingFilter>();
1616
return siloBuilder;
1717
}
18-
19-
public static ISiloBuilder AddOrleansTokenBucketRateLimiter(this ISiloBuilder siloBuilder,
20-
Action<TokenBucketRateLimiterOptions> defaultOptions)
21-
{
22-
var fixedWindowRateLimiterOptions = new TokenBucketRateLimiterOptions();
23-
defaultOptions.Invoke(fixedWindowRateLimiterOptions);
24-
return siloBuilder.AddOrleansTokenBucketRateLimiter(fixedWindowRateLimiterOptions);
25-
}
2618
}

ManagedCode.Orleans.RateLimiting.Tests/Cluster/Grains/ConcurrencyLimiterGrain.cs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,27 @@
44

55
namespace ManagedCode.Orleans.RateLimiting.Tests.Cluster.Grains
66
{
7-
public class ConcurrencyLimiterGrain : Grain, IConcurrencyLimiterGrain
7+
public class TestConcurrencyLimiterGrain : Grain, ITestConcurrencyLimiterGrain
88
{
99
[ConcurrencyLimiter] //GrainId, default options PermitLimit = 10; QueueLimit = 15;
10-
public Task<string> Do()
10+
public async Task<string> Do()
1111
{
12-
return Task.FromResult("Do");
12+
await Task.Delay(TimeSpan.FromSeconds(5));
13+
return "Do";
1314
}
1415

15-
[ConcurrencyLimiter(KeyType.Key, "go")] //GrainId, default options PermitLimit = 10; QueueLimit = 15;
16-
public Task<string> Go()
16+
[ConcurrencyLimiter(KeyType.Key, "go")] //Key, default options PermitLimit = 10; QueueLimit = 15;
17+
public async Task<string> Go()
1718
{
18-
return Task.FromResult("Go");
19+
await Task.Delay(TimeSpan.FromSeconds(5));
20+
return "Go";
1921
}
2022

21-
[ConcurrencyLimiter(KeyType.GrainType, permitLimit:5, queueLimit:5)]
22-
public Task<string> Take()
23+
[ConcurrencyLimiter(KeyType.GrainType, permitLimit:2, queueLimit:1)]
24+
public async Task<string> Take()
2325
{
24-
return Task.FromResult("Take");
26+
await Task.Delay(TimeSpan.FromSeconds(5));
27+
return "Take";
2528
}
2629
}
2730
}

0 commit comments

Comments
 (0)