Skip to content

Commit d64ed82

Browse files
Fix a potential NullReferenceException in PlacementWorker (#9386)
1 parent 301fc11 commit d64ed82

File tree

1 file changed

+18
-22
lines changed

1 file changed

+18
-22
lines changed

src/Orleans.Runtime/Placement/PlacementService.cs

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Diagnostics;
34
using System.Linq;
45
using System.Runtime.CompilerServices;
56
using System.Runtime.InteropServices;
@@ -246,7 +247,7 @@ private class PlacementWorker
246247
#pragma warning restore IDE0052 // Remove unread private members
247248
private readonly object _lockObj = new();
248249
private readonly PlacementService _placementService;
249-
private List<(Message Message, TaskCompletionSource<bool> Completion)> _messages = new();
250+
private List<(Message Message, TaskCompletionSource Completion)> _messages = new();
250251

251252
public PlacementWorker(PlacementService placementService)
252253
{
@@ -259,7 +260,7 @@ public PlacementWorker(PlacementService placementService)
259260

260261
public Task AddressMessage(Message message)
261262
{
262-
var completion = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);
263+
var completion = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
263264

264265
lock (_lockObj)
265266
{
@@ -271,7 +272,7 @@ public Task AddressMessage(Message message)
271272
return completion.Task;
272273
}
273274

274-
private List<(Message Message, TaskCompletionSource<bool> Completion)> GetMessages()
275+
private List<(Message Message, TaskCompletionSource Completion)> GetMessages()
275276
{
276277
lock (_lockObj)
277278
{
@@ -346,36 +347,31 @@ private void AddressWaitingMessages(GrainPlacementWorkItem completedWorkItem)
346347
{
347348
var resultTask = completedWorkItem.Result;
348349
var messages = completedWorkItem.Messages;
349-
if (resultTask.IsCompletedSuccessfully)
350+
351+
try
350352
{
353+
var siloAddress = resultTask.Result;
351354
foreach (var message in messages)
352355
{
353-
var siloAddress = resultTask.Result;
354356
_placementService.SetMessageTargetPlacement(message.Message, siloAddress);
355-
message.Completion.TrySetResult(true);
357+
message.Completion.TrySetResult();
356358
}
357-
358-
messages.Clear();
359359
}
360-
else
360+
catch (Exception exception)
361361
{
362-
foreach (var message in messages)
362+
var originalException = exception switch
363363
{
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+
};
369367

370-
static Exception OriginalException(AggregateException exception)
371-
{
372-
if (exception.InnerExceptions.Count == 1)
368+
foreach (var message in messages)
373369
{
374-
return exception.InnerException;
370+
message.Completion.TrySetException(originalException);
375371
}
376-
377-
return exception;
378372
}
373+
374+
messages.Clear();
379375
}
380376

381377
private async Task<SiloAddress> GetOrPlaceActivationAsync(Message firstMessage)
@@ -411,7 +407,7 @@ private async Task<SiloAddress> GetOrPlaceActivationAsync(Message firstMessage)
411407

412408
private class GrainPlacementWorkItem
413409
{
414-
public List<(Message Message, TaskCompletionSource<bool> Completion)> Messages { get; } = new();
410+
public List<(Message Message, TaskCompletionSource Completion)> Messages { get; } = new();
415411

416412
public Task<SiloAddress> Result { get; set; }
417413
}

0 commit comments

Comments
 (0)