Skip to content

Commit 52e0b9c

Browse files
author
John Luo
committed
Fixup rate limiter
1 parent 8e48fbb commit 52e0b9c

File tree

1 file changed

+7
-9
lines changed

1 file changed

+7
-9
lines changed

src/Middleware/RequestLimiter/src/RateLimiter.cs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,10 @@ public override ValueTask<Resource> AcquireAsync(long requestedCount, Cancellati
4949
Interlocked.Add(ref _resourceCount, -requestedCount);
5050

5151
var registration = new RateLimitRequest(requestedCount);
52+
_queue.Enqueue(registration);
5253

53-
if (WaitHandle.WaitAny(new[] { registration.MRE.WaitHandle, cancellationToken.WaitHandle }) == 0)
54-
{
55-
return ValueTask.FromResult(Resource.NoopResource);
56-
}
57-
58-
throw new InvalidOperationException("Limit exceeded");
54+
// handle cancellation
55+
return new ValueTask<Resource>(registration.TCS.Task);
5956
}
6057

6158
private static void Replenish(object? state)
@@ -86,7 +83,7 @@ private static void Replenish(object? state)
8683
if (requestToFulfill == request)
8784
{
8885
// If requestToFulfill == request, the fulfillment is successful.
89-
requestToFulfill.MRE.Set();
86+
requestToFulfill.TCS.SetResult(Resource.NoopResource);
9087
}
9188
else
9289
{
@@ -114,12 +111,13 @@ private class RateLimitRequest
114111
public RateLimitRequest(long count)
115112
{
116113
Count = count;
117-
MRE = new ManualResetEventSlim();
114+
// Use VoidAsyncOperationWithData<T> instead
115+
TCS = new TaskCompletionSource<Resource>();
118116
}
119117

120118
public long Count { get; }
121119

122-
public ManualResetEventSlim MRE { get; }
120+
public TaskCompletionSource<Resource> TCS { get; }
123121
}
124122
}
125123
}

0 commit comments

Comments
 (0)