@@ -40,35 +40,38 @@ ServerCallContext context
4040 throw new RpcException ( Status . DefaultCancelled , "Suspended" ) ;
4141 }
4242
43- using ( _endpointManager . CancellationToken . Register ( async ( ) => {
44- try
45- {
46- await responseStream . WriteAsync ( new RemoteMessage
47- {
48- DisconnectRequest = new DisconnectRequest ( )
49- }
50- ) . ConfigureAwait ( false ) ;
51- }
52- catch ( Exception x )
53- {
54- x . CheckFailFast ( ) ;
55- Logger . LogWarning ( "[EndpointReader][{SystemAddress}] Failed to write disconnect message to the stream" , _system . Address ) ;
56- }
57- }
58- ) )
43+ async void Disconnect ( )
44+ {
45+ try
46+ {
47+ var disconnectMsg = new RemoteMessage
48+ {
49+ DisconnectRequest = new DisconnectRequest ( )
50+ } ;
51+ await responseStream . WriteAsync ( disconnectMsg ) . ConfigureAwait ( false ) ;
52+ }
53+ catch ( Exception x )
54+ {
55+ x . CheckFailFast ( ) ;
56+ Logger . LogWarning ( "[EndpointReader][{SystemAddress}] Failed to write disconnect message to the stream" , _system . Address ) ;
57+ }
58+ }
59+
60+ await using ( _endpointManager . CancellationToken . Register ( Disconnect ) )
5961 {
6062 IEndpoint endpoint ;
6163 string ? address = null ;
6264 string systemId ;
63-
64-
65+
6566 Logger . LogInformation ( "[EndpointReader][{SystemAddress}] Accepted connection request from {Remote} to {Local}" ,
6667 _system . Address , context . Peer , context . Host
6768 ) ;
6869
69- if ( await requestStream . MoveNext ( ) . ConfigureAwait ( false ) &&
70+ if ( await requestStream . MoveNext ( _endpointManager . CancellationToken ) . ConfigureAwait ( false ) &&
7071 requestStream . Current . MessageTypeCase != RemoteMessage . MessageTypeOneofCase . ConnectRequest )
72+ {
7173 throw new RpcException ( Status . DefaultCancelled , "Expected connection message" ) ;
74+ }
7275
7376 var connectRequest = requestStream . Current . ConnectRequest ;
7477
@@ -104,54 +107,7 @@ await responseStream.WriteAsync(new RemoteMessage
104107 ) . ConfigureAwait ( false ) ;
105108 systemId = clientConnection . MemberId ;
106109 endpoint = _endpointManager . GetOrAddClientEndpoint ( systemId ) ;
107- _ = Task . Run ( async ( ) => {
108- try
109- {
110- while ( ! cancellationTokenSource . Token . IsCancellationRequested )
111- {
112- while ( ! cancellationTokenSource . Token . IsCancellationRequested &&
113- endpoint . OutgoingStash . TryPop ( out var message ) )
114- {
115- try
116- {
117- await responseStream . WriteAsync ( message ) . ConfigureAwait ( false ) ;
118- }
119- catch ( Exception )
120- {
121- _ = endpoint . OutgoingStash . Append ( message ) ;
122- throw ;
123- }
124- }
125-
126- while ( endpoint . OutgoingStash . IsEmpty && ! cancellationTokenSource . Token . IsCancellationRequested )
127- {
128- var message = await endpoint . Outgoing . Reader . ReadAsync ( cancellationTokenSource . Token )
129- . ConfigureAwait ( false ) ;
130-
131- try
132- {
133- // Logger.LogInformation($"Sending {message}");
134- await responseStream . WriteAsync ( message ) . ConfigureAwait ( false ) ;
135- }
136- catch ( Exception )
137- {
138- _ = endpoint . OutgoingStash . Append ( message ) ;
139- throw ;
140- }
141- }
142- }
143- }
144- catch ( OperationCanceledException )
145- {
146- Logger . LogDebug ( "[EndpointReader][{SystemAddress}] Writer closed for {SystemId}" , _system . Address , systemId ) ;
147- }
148- catch ( Exception e )
149- {
150- e . CheckFailFast ( ) ;
151- Logger . LogWarning ( e , "[EndpointReader][{SystemAddress}] Writing error to {SystemId}" , _system . Address , systemId ) ;
152- }
153- }
154- ) ;
110+ _ = Task . Run ( async ( ) => { await RunClientWriter ( responseStream , cancellationTokenSource , endpoint , systemId ) ; } ) ;
155111 }
156112 break ;
157113 case ConnectRequest . ConnectionTypeOneofCase . ServerConnection : {
@@ -207,24 +163,83 @@ await responseStream.WriteAsync(new RemoteMessage
207163 throw new ArgumentOutOfRangeException ( ) ;
208164 }
209165
210- try
166+ await RunReader ( requestStream , address , cancellationTokenSource , systemId ) ;
167+ }
168+ }
169+
170+ private async Task RunReader ( IAsyncStreamReader < RemoteMessage > requestStream , string ? address , CancellationTokenSource cancellationTokenSource , string systemId )
171+ {
172+ try
173+ {
174+ while ( await requestStream . MoveNext ( CancellationToken . None ) . ConfigureAwait ( false ) )
211175 {
212- while ( await requestStream . MoveNext ( ) . ConfigureAwait ( false ) )
176+ var currentMessage = requestStream . Current ;
177+ if ( _endpointManager . CancellationToken . IsCancellationRequested )
213178 {
214- var currentMessage = requestStream . Current ;
215- if ( _endpointManager . CancellationToken . IsCancellationRequested )
216- continue ;
217-
218- _endpointManager . RemoteMessageHandler . HandleRemoteMessage ( currentMessage , address ! ) ;
179+ continue ;
219180 }
181+
182+ _endpointManager . RemoteMessageHandler . HandleRemoteMessage ( currentMessage , address ! ) ;
220183 }
221- finally
184+ }
185+ finally
186+ {
187+ cancellationTokenSource . Cancel ( ) ;
188+
189+ if ( address is null && systemId is not null )
222190 {
223- cancellationTokenSource . Cancel ( ) ;
224- if ( address is null && systemId is not null )
225- _system . EventStream . Publish ( new EndpointTerminatedEvent ( false , null , systemId ) ) ;
191+ _system . EventStream . Publish ( new EndpointTerminatedEvent ( false , null , systemId ) ) ;
192+ }
193+ }
194+ }
195+
196+ private async Task RunClientWriter ( IAsyncStreamWriter < RemoteMessage > responseStream , CancellationTokenSource cancellationTokenSource , IEndpoint endpoint , string systemId )
197+ {
198+ try
199+ {
200+ while ( ! cancellationTokenSource . Token . IsCancellationRequested )
201+ {
202+ //consume stash
203+ while ( ! cancellationTokenSource . Token . IsCancellationRequested && endpoint . OutgoingStash . TryPop ( out var message ) )
204+ {
205+ try
206+ {
207+ await responseStream . WriteAsync ( message ) . ConfigureAwait ( false ) ;
208+ }
209+ catch ( Exception )
210+ {
211+ _ = endpoint . OutgoingStash . Append ( message ) ;
212+ throw ;
213+ }
214+ }
215+
216+ //
217+ while ( endpoint . OutgoingStash . IsEmpty && ! cancellationTokenSource . Token . IsCancellationRequested )
218+ {
219+ var message = await endpoint . Outgoing . Reader . ReadAsync ( cancellationTokenSource . Token ) . ConfigureAwait ( false ) ;
220+
221+ try
222+ {
223+ // Logger.LogInformation($"Sending {message}");
224+ await responseStream . WriteAsync ( message ) . ConfigureAwait ( false ) ;
225+ }
226+ catch ( Exception )
227+ {
228+ _ = endpoint . OutgoingStash . Append ( message ) ;
229+ throw ;
230+ }
231+ }
226232 }
227233 }
234+ catch ( OperationCanceledException )
235+ {
236+ Logger . LogDebug ( "[EndpointReader][{SystemAddress}] Writer closed for {SystemId}" , _system . Address , systemId ) ;
237+ }
238+ catch ( Exception e )
239+ {
240+ e . CheckFailFast ( ) ;
241+ Logger . LogWarning ( e , "[EndpointReader][{SystemAddress}] Writing error to {SystemId}" , _system . Address , systemId ) ;
242+ }
228243 }
229244
230245 public override Task < ListProcessesResponse > ListProcesses ( ListProcessesRequest request , ServerCallContext context )
0 commit comments