PopulateAsync gets stuck in while loop if any of the event upgraders throw an exception
Here is the code that I'm using to run IReadModelPopulator
var typeList = typeof(DependencyInjection).Assembly.DefinedTypes
.Where(type => !type.IsInterface && !type.IsAbstract &&
type.ImplementedInterfaces.Any(inter => inter == typeof(IReadModel))).ToList();
foreach (var x in typeList)
{
await populator.PurgeAsync(x, ct);
}
await populator.PopulateAsync(typeList, ct);
It happens that if any of the event upgraders throw an exception will get stuck ReadModelPopulator in a while loop waiting for more events to be enqueued to _pipedEvents.
When an exception occurs it will fail on ReadModelPopulator:144, meanwhile a ReadModelPopulator:173 while loop will run for an eternity.
What's worse I was not seeing any errors in the Logging, so it took me a while to figure it out (maybe my logging levels are wrong)
I assume that event upgraders should never ever throw any exceptions (it should just skip the event and log an error, right?)
Suggestions for a fix:
- Make sure it catches and logs exceptions
- Make sure ProcessEventQueue won't run infinitely
I verified that the read model populator indeed doesn't stop if there's an exception and fixed it by parsing the cancellation token. However I'm currently stuck in ensuring that the exception is throw when it occurs. Right now its only thrown when the cancellation happens.
See #1087
Thanks a lot. That was fast. Do you have an approximate date of the next release that will include this fix?
Btw - we love this library
I'll get this merged and release this weekend
Awesome thanks
Forgot to close this after releasing the fix
Thank you!