1
1
using System ;
2
2
using System . Collections . Generic ;
3
+ using System . Diagnostics ;
3
4
using System . Linq ;
4
5
using System . Runtime . CompilerServices ;
5
6
using System . Runtime . InteropServices ;
@@ -246,7 +247,7 @@ private class PlacementWorker
246
247
#pragma warning restore IDE0052 // Remove unread private members
247
248
private readonly object _lockObj = new ( ) ;
248
249
private readonly PlacementService _placementService ;
249
- private List < ( Message Message , TaskCompletionSource < bool > Completion ) > _messages = new ( ) ;
250
+ private List < ( Message Message , TaskCompletionSource Completion ) > _messages = new ( ) ;
250
251
251
252
public PlacementWorker ( PlacementService placementService )
252
253
{
@@ -259,7 +260,7 @@ public PlacementWorker(PlacementService placementService)
259
260
260
261
public Task AddressMessage ( Message message )
261
262
{
262
- var completion = new TaskCompletionSource < bool > ( TaskCreationOptions . RunContinuationsAsynchronously ) ;
263
+ var completion = new TaskCompletionSource ( TaskCreationOptions . RunContinuationsAsynchronously ) ;
263
264
264
265
lock ( _lockObj )
265
266
{
@@ -271,7 +272,7 @@ public Task AddressMessage(Message message)
271
272
return completion . Task ;
272
273
}
273
274
274
- private List < ( Message Message , TaskCompletionSource < bool > Completion ) > GetMessages ( )
275
+ private List < ( Message Message , TaskCompletionSource Completion ) > GetMessages ( )
275
276
{
276
277
lock ( _lockObj )
277
278
{
@@ -346,36 +347,31 @@ private void AddressWaitingMessages(GrainPlacementWorkItem completedWorkItem)
346
347
{
347
348
var resultTask = completedWorkItem . Result ;
348
349
var messages = completedWorkItem . Messages ;
349
- if ( resultTask . IsCompletedSuccessfully )
350
+
351
+ try
350
352
{
353
+ var siloAddress = resultTask . Result ;
351
354
foreach ( var message in messages )
352
355
{
353
- var siloAddress = resultTask . Result ;
354
356
_placementService . SetMessageTargetPlacement ( message . Message , siloAddress ) ;
355
- message . Completion . TrySetResult ( true ) ;
357
+ message . Completion . TrySetResult ( ) ;
356
358
}
357
-
358
- messages . Clear ( ) ;
359
359
}
360
- else
360
+ catch ( Exception exception )
361
361
{
362
- foreach ( var message in messages )
362
+ var originalException = exception switch
363
363
{
364
- message . Completion . TrySetException ( OriginalException ( resultTask . Exception ) ) ;
365
- }
366
-
367
- messages . Clear ( ) ;
368
- }
364
+ AggregateException ae when ae . InnerExceptions . Count == 1 => ae . InnerException ,
365
+ _ => exception ,
366
+ } ;
369
367
370
- static Exception OriginalException ( AggregateException exception )
371
- {
372
- if ( exception . InnerExceptions . Count == 1 )
368
+ foreach ( var message in messages )
373
369
{
374
- return exception . InnerException ;
370
+ message . Completion . TrySetException ( originalException ) ;
375
371
}
376
-
377
- return exception ;
378
372
}
373
+
374
+ messages . Clear ( ) ;
379
375
}
380
376
381
377
private async Task < SiloAddress > GetOrPlaceActivationAsync ( Message firstMessage )
@@ -411,7 +407,7 @@ private async Task<SiloAddress> GetOrPlaceActivationAsync(Message firstMessage)
411
407
412
408
private class GrainPlacementWorkItem
413
409
{
414
- public List < ( Message Message , TaskCompletionSource < bool > Completion ) > Messages { get ; } = new ( ) ;
410
+ public List < ( Message Message , TaskCompletionSource Completion ) > Messages { get ; } = new ( ) ;
415
411
416
412
public Task < SiloAddress > Result { get ; set ; }
417
413
}
0 commit comments