Add @retry decorator and use it to retry connection on PDC on IOError and in SCM's retry_run.
Signed-off-by: Jan Kaluza <jkaluza@redhat.com>
This commit is contained in:
parent
dc410b58b5
commit
68351fa5a8
@ -21,7 +21,7 @@ import json
|
|||||||
import pungi.wrappers.kojiwrapper
|
import pungi.wrappers.kojiwrapper
|
||||||
import pungi.phases.pkgset.pkgsets
|
import pungi.phases.pkgset.pkgsets
|
||||||
from pungi.arch import get_valid_arches
|
from pungi.arch import get_valid_arches
|
||||||
from pungi.util import is_arch_multilib
|
from pungi.util import is_arch_multilib, retry
|
||||||
|
|
||||||
from pungi.phases.pkgset.common import create_arch_repos, create_global_repo, populate_arch_pkgsets
|
from pungi.phases.pkgset.common import create_arch_repos, create_global_repo, populate_arch_pkgsets
|
||||||
|
|
||||||
@ -62,6 +62,7 @@ def variant_dict_from_str(module_str):
|
|||||||
return module_info
|
return module_info
|
||||||
|
|
||||||
|
|
||||||
|
@retry(wait_on=IOError)
|
||||||
def get_module(session, module_info, strict=False):
|
def get_module(session, module_info, strict=False):
|
||||||
"""
|
"""
|
||||||
:param session : PDCClient instance
|
:param session : PDCClient instance
|
||||||
|
@ -28,6 +28,7 @@ import contextlib
|
|||||||
import traceback
|
import traceback
|
||||||
import tempfile
|
import tempfile
|
||||||
import time
|
import time
|
||||||
|
import functools
|
||||||
|
|
||||||
from kobo.shortcuts import run, force_list
|
from kobo.shortcuts import run, force_list
|
||||||
from productmd.common import get_major_version
|
from productmd.common import get_major_version
|
||||||
@ -756,3 +757,22 @@ def version_generator(compose, gen):
|
|||||||
if gen and gen[0] == '!':
|
if gen and gen[0] == '!':
|
||||||
raise RuntimeError("Unknown version generator '%s'" % gen)
|
raise RuntimeError("Unknown version generator '%s'" % gen)
|
||||||
return gen
|
return gen
|
||||||
|
|
||||||
|
|
||||||
|
def retry(timeout=120, interval=30, wait_on=Exception):
|
||||||
|
""" A decorator that allows to retry a section of code until success or
|
||||||
|
timeout.
|
||||||
|
"""
|
||||||
|
def wrapper(function):
|
||||||
|
@functools.wraps(function)
|
||||||
|
def inner(*args, **kwargs):
|
||||||
|
start = time.time()
|
||||||
|
while True:
|
||||||
|
if (time.time() - start) >= timeout:
|
||||||
|
raise # This re-raises the last exception.
|
||||||
|
try:
|
||||||
|
return function(*args, **kwargs)
|
||||||
|
except wait_on:
|
||||||
|
time.sleep(interval)
|
||||||
|
return inner
|
||||||
|
return wrapper
|
||||||
|
@ -19,36 +19,25 @@ import os
|
|||||||
import shutil
|
import shutil
|
||||||
import pipes
|
import pipes
|
||||||
import glob
|
import glob
|
||||||
import time
|
|
||||||
|
|
||||||
import kobo.log
|
import kobo.log
|
||||||
from kobo.shortcuts import run, force_list
|
from kobo.shortcuts import run, force_list
|
||||||
from pungi.util import explode_rpm_package, makedirs, copy_all, temp_dir
|
from pungi.util import (explode_rpm_package, makedirs, copy_all, temp_dir,
|
||||||
|
retry)
|
||||||
|
|
||||||
|
|
||||||
class ScmBase(kobo.log.LoggingBase):
|
class ScmBase(kobo.log.LoggingBase):
|
||||||
def __init__(self, logger=None):
|
def __init__(self, logger=None):
|
||||||
kobo.log.LoggingBase.__init__(self, logger=logger)
|
kobo.log.LoggingBase.__init__(self, logger=logger)
|
||||||
|
|
||||||
def retry_run(self, cmd, retries=5, timeout=60, **kwargs):
|
@retry(interval=60, timeout=300, wait_on=RuntimeError)
|
||||||
|
def retry_run(self, cmd, **kwargs):
|
||||||
"""
|
"""
|
||||||
@param cmd - cmd passed to kobo.shortcuts.run()
|
@param cmd - cmd passed to kobo.shortcuts.run()
|
||||||
@param retries=5 - attempt to execute n times
|
|
||||||
@param timeout=60 - seconds before next try
|
|
||||||
@param **kwargs - args passed to kobo.shortcuts.run()
|
@param **kwargs - args passed to kobo.shortcuts.run()
|
||||||
"""
|
"""
|
||||||
|
|
||||||
for n in range(1, retries + 1):
|
return run(cmd, **kwargs)
|
||||||
try:
|
|
||||||
self.log_debug("Retrying execution %s/%s of '%s'" % (n, retries, cmd))
|
|
||||||
return run(cmd, **kwargs)
|
|
||||||
except RuntimeError as ex:
|
|
||||||
if n == retries:
|
|
||||||
raise ex
|
|
||||||
self.log_debug("Waiting %s seconds to retry execution of '%s'" % (timeout, cmd))
|
|
||||||
time.sleep(timeout)
|
|
||||||
|
|
||||||
raise RuntimeError("Something went wrong during execution of '%s'" % cmd)
|
|
||||||
|
|
||||||
|
|
||||||
class FileWrapper(ScmBase):
|
class FileWrapper(ScmBase):
|
||||||
|
Loading…
Reference in New Issue
Block a user