@@ -2529,13 +2529,15 @@ private class Holder<T>
2529
2529
{
2530
2530
private readonly Action < Holder < T > > _callback ;
2531
2531
2532
- public Holder ( Result < T > element , Action < Holder < T > > callback )
2532
+ public Holder ( object message , Result < T > element , Action < Holder < T > > callback )
2533
2533
{
2534
2534
_callback = callback ;
2535
+ Message = message ;
2535
2536
Element = element ;
2536
2537
}
2537
2538
2538
2539
public Result < T > Element { get ; private set ; }
2540
+ public object Message { get ; }
2539
2541
2540
2542
public void SetElement ( Result < T > result )
2541
2543
{
@@ -2575,7 +2577,7 @@ public override void OnPush()
2575
2577
try
2576
2578
{
2577
2579
var task = _stage . _mapFunc ( message ) ;
2578
- var holder = new Holder < TOut > ( NotYetThere , _taskCallback ) ;
2580
+ var holder = new Holder < TOut > ( message , NotYetThere , _taskCallback ) ;
2579
2581
_buffer . Enqueue ( holder ) ;
2580
2582
2581
2583
// We dispatch the task if it's ready to optimize away
@@ -2642,9 +2644,29 @@ private void PushOne()
2642
2644
}
2643
2645
else
2644
2646
{
2645
- var result = _buffer . Dequeue ( ) . Element ;
2647
+ var holder = _buffer . Dequeue ( ) ;
2648
+ var result = holder . Element ;
2646
2649
if ( ! result . IsSuccess )
2650
+ {
2651
+ // this could happen if we are looping in PushOne and end up on a failed Task before the
2652
+ // HolderCompleted callback has run
2653
+ var strategy = _decider ( result . Exception ) ;
2654
+ Log . Error ( result . Exception , "An exception occured inside SelectAsync while processing message [{0}]. Supervision strategy: {1}" , holder . Message , strategy ) ;
2655
+ switch ( strategy )
2656
+ {
2657
+ case Directive . Stop :
2658
+ FailStage ( result . Exception ) ;
2659
+ return ;
2660
+
2661
+ case Directive . Resume :
2662
+ case Directive . Restart :
2663
+ break ;
2664
+
2665
+ default :
2666
+ throw new AggregateException ( $ "Unknown SupervisionStrategy directive: { strategy } ", result . Exception ) ;
2667
+ }
2647
2668
continue ;
2669
+ }
2648
2670
2649
2671
Push ( _stage . Out , result . Value ) ;
2650
2672
if ( Todo < _stage . _parallelism && ! HasBeenPulled ( inlet ) )
0 commit comments