โ02-26-2021 05:26 AM
I believe I've uncovered a rather serious bug. Let's say I have a repeat action and if an error occurs during an iteration, I want to catch it, wait X seconds, then retry the whole repeat action again.
Simple Ruby program that demonstrates this:
Output: [0, 1, 2, 3, 4]
Here's the recipe version in Workato: https://app.workato.com/recipes/1443583?st=ff6418
This recipe outputs [2, 3, 4], which is not correct. What I would expect is for the entire loop to repeat from index 0 on every attempt. Note that the list and repeat helper list are created anew per each attempt. However, it appears as if the loop is continuing at a previously stored offset.
This has produced serious production bugs for us. Can someone explain if my assumptions here are incorrect or if I've built the recipe logic incorrectly?
โ02-26-2021 12:17 PM
Have you tried putting the error monitor outside the loop?
In order to retry the entire loop you would need to monitor the whole loop block.
โ02-26-2021 12:38 PM
Hi, thanks for the reply! There are 2 loops here. The outer loop is what controls the re-attempts and the inner loop is what's causing the issue. The entire inner loop is wrapped in a monitor block, which means it should be repeating in full each time. Is this what you mean?
โ02-26-2021 01:06 PM
Yes, that is what I meant
I tried your recipe, adding 1 list and seems like the recipe keeps track of the index and it retries the loop from that index, so the offset is correct. No?
BTW - curious to know why you use the Ruby 'sleep' function instead of the Retry on the 'error' block
โ02-26-2021 01:11 PM
Right, so I guess my question is why is it maintaining an offset? It should be recreating the list and the repeat helper list each time a new retry is executed. Ideally, this means the index is always reset to 0. If you refresh the recipe I shared, you should be able to see this.
In terms of why I use "sleep", I need more control of how much time I can "wait" per each successive runs (ex: to do something like exponential backoff). The error block retry only gives you a fixed number of seconds each retry. However, in this simple example, I could have used the error block retry.