code: def retry(target_exception, tries=4, delay_s=1, backoff=2):
      """Retry calling the decorated function using an exponential backoff.
  
      http://www.saltycrane.com/blog/2009/11/trying-out-retry-decorator-python/
      original from: http://wiki.python.org/moin/PythonDecoratorLibrary#Retry
  
      :param target_exception: the exception to check. may be a tuple of
          exceptions to check
      :type target_exception: Exception or tuple
      :param tries: number of times to try (not retry) before giving up
      :type tries: int
      :param delay_s: initial delay between retries in seconds
      :type delay_s: int
      :param backoff: backoff multiplier e.g. value of 2 will double the delay
          each retry
      :type backoff: int
      """
      import time
      from functools import wraps
  
      def decorated_retry(f):
          @wraps(f)
          def f_retry(*args, **kwargs):
              mtries, mdelay = tries, delay_s
              while mtries > 1:
                  try:
                      return f(*args, **kwargs)
                  except target_exception as e:
                      logging.warning(
                          "Exception: %s, Retrying in %d seconds...",
                          str(e),
                          mdelay,
                      )
                      time.sleep(mdelay)
                      mtries -= 1
                      mdelay *= backoff
              return f(*args, **kwargs)
  
          return f_retry  # true decorator
  
      return decorated_retry
  
file_path: mxnet/ci/util.py
imports: import contextlib
  import logging
  import logging.config
  import os
  import subprocess
  import sys
  import requests
label_desc: Use image node_id 3 for calling a global function with example usage: retry(target_exception, tries, delay_s, backoff) and returns: decorated_retry, f_retry, f, f