Introduce backoff to RetryByNumberOfTimes
authorHelga Velroyen <helgav@google.com>
Mon, 11 Jan 2016 14:32:47 +0000 (15:32 +0100)
committerHelga Velroyen <helgav@google.com>
Mon, 11 Jan 2016 16:02:34 +0000 (17:02 +0100)
commitef1443103f7475038aae2789cea9de02d6e7cd8b
treedf42c3ca23f64b585ec9d5e19b6699968ac45b26
parent8bc5b4e5ed07044cd935d70efd582f28fa1a6bc5
Introduce backoff to RetryByNumberOfTimes

This patch adds a backing-off mechanism to the function
RetryByNumberOfTimes. This is useful for example when SSH
connections fail in a flaky network. The original version of
RetryByNumberOfTimes immediately retried failed SSH calls,
but that might not be enough to recover from a network
problem.

The patch adds an additional parameter 'backoff' which
specifies the base number of seconds of the backoff. That
means after the first failed try, a delay is added as long
as the backoff parameter specifies. With each additional
failed try, the delay is doubled until the maximum
number of retries is hit.

Note that the backoff parameter is not a keyword argument,
which might have been more convenient. That's because
otherwise RetryByNumberOfTimes would no longer be able
to propagate *args and **kwargs to the function to be
called with retries.

Also note that there is a function "Retry" in the same
package, which already provides somewhat complicated
timeout capabilities. However, we did not merge these
two functions, because Retry also does not propagate
*args and **kwargs properly which is something we
depend on in backend.py.

This patch also updates the unit tests and mocks the
sleep function in the backend.py's unit tests to not
slow down the tests.

This fixes issue 1078.

Signed-off-by: Helga Velroyen <helgav@google.com>
Reviewed-by: Klaus Aehlig <aehlig@google.com>
lib/backend.py
lib/utils/retry.py
test/py/ganeti.backend_unittest.py
test/py/ganeti.utils.retry_unittest.py