You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Hi there, first, thank you for all your hard work and this amazing framework.
I think I found an issue when having the AllowTimedOutFactoryBackgroundCompletion and having a FaillSafe Defined
Having something like this
return await cache.GetOrSetAsync<IReadOnlyList<Product>>(cacheKey, async (context, token) =>
{
var result = await this.GetProductsAsync(request, token);
if (!result.IsSuccess)
{
logger.LogWarning(result.Error, "Failed to get brands from Commerce API.");
return context.Fail("Failed to get brands from Commerce API.");
}
if (result.Value == null || !result.Value.Any())
{
logger.NoBrandsAvailable(request);
return context.Fail("Failed to get Products.");
}
return result.Value;
},
MaybeValue<IReadOnlyList<Product>>.FromValue([]),
cancellationToken);
When you have a synthetic timeout what happens is that the the task will be completed in the background the issue is when returning a context.Fail("Failed to get Products."); it will not take into consideration that the factory can also fail and by doing so it's setting a null value in the cache and instead of setting the logical expiration date with the FailSafeThrottleDuration + Jitter is setting with duration defined in the settings + jitter, for instance, 1h.
To Reproduce
To reproduce this just use something like this:
return await cache.GetOrSetAsync<IReadOnlyList<Product>>(cacheKey, async (context, token) =>
{
var result = await this.GetProductsAsync(request, token);
if (!result.IsSuccess)
{
logger.LogWarning(result.Error, "Failed to get brands from Commerce API.");
return context.Fail("Failed to get brands from Commerce API.");
}
if (result.Value == null || !result.Value.Any())
{
logger.NoBrandsAvailable(request);
return context.Fail("Failed to get Products.");
}
return result.Value;
},
MaybeValue<IReadOnlyList<Product>>.FromValue([]),
cancellationToken);
Expected behavior
I was expecting that even when running in the background if the factory fails it would still respect the fail-safe and set the expiration time accordingly
Versions
I've encountered this issue on:
fusion cache 1.4.1
.net 8
The text was updated successfully, but these errors were encountered:
Hi there, first, thank you for all your hard work and this amazing framework.
Thanks, I'm really glad you are liking it 🙂
I think I found an issue when having the AllowTimedOutFactoryBackgroundCompletion and having a FaillSafe Defined
[...]
I was expecting that even when running in the background if the factory fails it would still respect the fail-safe and set the expiration time accordingly
Damn, you are right! I'm currently handling the "soft fail" (eg: fail without throwing an exception) in the "normal flow" but not in the "background completion flow", good catch!
Can confirm all of the above: I've fixed it and now there are tests to verify that a fail in a background factory (both a throw and a soft one like ctx.Fail()) are handled correctly.
The new v2 will be out soon, and that version will include this fix, too.
Describe the bug
Hi there, first, thank you for all your hard work and this amazing framework.
I think I found an issue when having the AllowTimedOutFactoryBackgroundCompletion and having a FaillSafe Defined
Having something like this
When you have a synthetic timeout what happens is that the the task will be completed in the background the issue is when returning a
context.Fail("Failed to get Products.");
it will not take into consideration that the factory can also fail and by doing so it's setting a null value in the cache and instead of setting the logical expiration date with the FailSafeThrottleDuration + Jitter is setting with duration defined in the settings + jitter, for instance, 1h.To Reproduce
To reproduce this just use something like this:
Expected behavior
I was expecting that even when running in the background if the factory fails it would still respect the fail-safe and set the expiration time accordingly
Versions
I've encountered this issue on:
The text was updated successfully, but these errors were encountered: