Skip to content

Commit 1159126

Browse files
authored
Avoid CancellationToken related allocations (#787)
1 parent 2cb89bf commit 1159126

File tree

3 files changed

+14
-13
lines changed

3 files changed

+14
-13
lines changed

src/Grpc.AspNetCore.Server/Internal/Deadline/ServerCallDeadlineManager.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ internal abstract class ServerCallDeadlineManager : IAsyncDisposable
3535
// Lock is to ensure deadline doesn't execute as call is completing
3636
internal SemaphoreSlim Lock { get; }
3737
// Internal for testing
38-
internal bool _callComplete;
38+
public bool CallComplete { get; private set; }
3939

4040
public CancellationToken CancellationToken => _deadlineCts!.Token;
4141

@@ -79,16 +79,16 @@ public void Initialize(ISystemClock clock, TimeSpan timeout, CancellationToken r
7979
_requestAbortedRegistration = requestAborted.Register(() =>
8080
{
8181
// Call is complete if the request has aborted
82-
_callComplete = true;
82+
CallComplete = true;
8383
_deadlineCts?.Cancel();
8484
});
8585
}
8686

8787
protected abstract CancellationTokenSource CreateCancellationTokenSource(TimeSpan timeout, ISystemClock clock);
8888

89-
public void SetCallComplete()
89+
public void SetCallEnded()
9090
{
91-
_callComplete = true;
91+
CallComplete = true;
9292
}
9393

9494
protected void DeadlineExceeded()
@@ -116,6 +116,7 @@ private async Task DeadlineExceededAsync()
116116
}
117117

118118
await ServerCallContext.DeadlineExceededAsync();
119+
CallComplete = true;
119120
}
120121
finally
121122
{
@@ -127,7 +128,7 @@ private bool CanExceedDeadline()
127128
{
128129
// Deadline callback could be raised by the CTS after call has been completed (either successfully, with error, or aborted)
129130
// but before deadline exceeded registration has been disposed
130-
return !_callComplete;
131+
return !CallComplete;
131132
}
132133

133134
public ValueTask DisposeAsync()

src/Grpc.AspNetCore.Server/Internal/HttpContextServerCallContext.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -180,14 +180,14 @@ private void ProcessHandlerError(Exception ex, string method)
180180
}
181181

182182
// Don't update trailers if request has exceeded deadline/aborted
183-
if (!CancellationToken.IsCancellationRequested)
183+
if (DeadlineManager == null || !DeadlineManager.CallComplete)
184184
{
185185
HttpContext.Response.ConsolidateTrailers(this);
186186
}
187187

188-
LogCallEnd();
188+
DeadlineManager?.SetCallEnded();
189189

190-
DeadlineManager?.SetCallComplete();
190+
LogCallEnd();
191191
}
192192

193193
// If there is a deadline then we need to have our own cancellation token.
@@ -266,14 +266,14 @@ private async Task EndCallAsyncCore(Task lockTask)
266266
private void EndCallCore()
267267
{
268268
// Don't set trailers if deadline exceeded or request aborted
269-
if (!CancellationToken.IsCancellationRequested)
269+
if (DeadlineManager == null || !DeadlineManager.CallComplete)
270270
{
271271
HttpContext.Response.ConsolidateTrailers(this);
272272
}
273273

274-
LogCallEnd();
274+
DeadlineManager?.SetCallEnded();
275275

276-
DeadlineManager?.SetCallComplete();
276+
LogCallEnd();
277277
}
278278

279279
private void LogCallEnd()

test/Grpc.AspNetCore.Server.Tests/HttpContextServerCallContextTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -608,15 +608,15 @@ private async Task LongRunningDeadline_WaitsUntilDeadlineIsFinished(string metho
608608
Assert.Fail($"{methodName} did not wait on lock taken by deadline cancellation.");
609609
}
610610

611-
Assert.IsFalse(serverCallContext.DeadlineManager!._callComplete);
611+
Assert.IsFalse(serverCallContext.DeadlineManager!.CallComplete);
612612

613613
// Wait for dispose to finish
614614
syncPoint.Continue();
615615
await methodTask.DefaultTimeout();
616616

617617
Assert.AreEqual(GrpcProtocolConstants.ResetStreamNoError, httpResetFeature.ErrorCode);
618618

619-
Assert.IsTrue(serverCallContext.DeadlineManager!._callComplete);
619+
Assert.IsTrue(serverCallContext.DeadlineManager!.CallComplete);
620620
}
621621

622622
[Test]

0 commit comments

Comments
 (0)