@@ -14,6 +14,7 @@ internal sealed partial class CallbackData
1414 private int completed ;
1515 private StatusResponse ? lastKnownStatus ;
1616 private ValueStopwatch stopwatch ;
17+ private CancellationToken _cancellationToken ;
1718 private CancellationTokenRegistration _cancellationTokenRegistration ;
1819
1920 public CallbackData (
@@ -33,7 +34,7 @@ public CallbackData(
3334
3435 public Message Message { get ; } // might hold metadata used by response pipeline
3536
36- public bool IsCompleted => this . completed == 1 ;
37+ public bool IsCompleted => Volatile . Read ( ref completed ) != 0 ;
3738
3839 public void SubscribeForCancellation ( CancellationToken cancellationToken )
3940 {
@@ -42,12 +43,26 @@ public void SubscribeForCancellation(CancellationToken cancellationToken)
4243 return ;
4344 }
4445
45- cancellationToken . ThrowIfCancellationRequested ( ) ;
46- _cancellationTokenRegistration = cancellationToken . UnsafeRegister ( static arg =>
46+ if ( IsCompleted )
47+ {
48+ return ;
49+ }
50+
51+ _cancellationToken = cancellationToken ;
52+ var registration = cancellationToken . UnsafeRegister ( static arg =>
4753 {
4854 var callbackData = ( CallbackData ) arg ! ;
4955 callbackData . OnCancellation ( ) ;
5056 } , this ) ;
57+
58+ if ( IsCompleted )
59+ {
60+ registration . Dispose ( ) ;
61+ }
62+ else
63+ {
64+ _cancellationTokenRegistration = registration ;
65+ }
5166 }
5267
5368 private void SignalCancellation ( )
@@ -112,9 +127,9 @@ private void OnCancellation()
112127 SignalCancellation ( ) ;
113128 shared . Unregister ( Message ) ;
114129 _applicationRequestInstruments . OnAppRequestsEnd ( ( long ) stopwatch . Elapsed . TotalMilliseconds ) ;
115- _applicationRequestInstruments . OnAppRequestsTimedOut ( GetTargetGrainType ( ) ) ;
130+ _applicationRequestInstruments . OnAppRequestsCanceled ( GetTargetGrainType ( ) ) ;
116131 OrleansCallBackDataEvent . Instance . OnCanceled ( Message ) ;
117- context . Complete ( Response . FromException ( new OperationCanceledException ( _cancellationTokenRegistration . Token ) ) ) ;
132+ context . Complete ( Response . FromException ( new OperationCanceledException ( _cancellationToken ) ) ) ;
118133 _cancellationTokenRegistration . Dispose ( ) ;
119134 ReleaseRequest ( "CallbackData.OnCancellation" ) ;
120135 }
0 commit comments