def call()

in mysqloperator/controller/shellutils.py [0:0]


    def call(self, f: Callable[..., T], *args, **kwargs) -> T:
        delay = 1
        tries = 0
        total_wait = 0
        while True:
            try:
                tries += 1
                return f(*args)
            except (kopf.PermanentError, kopf.TemporaryError) as err:
                # Don't retry kopf errors
                raise
            except GiveUp as err:
                self.logger.error(
                    f"Error executing {f.__qualname__}, giving up: {err.real_exc}")
                if err.real_exc:
                    raise err.real_exc
                else:
                    return None
            except mysqlsh.Error as err:
                #import traceback
                #print("=====")
                #print(traceback.format_exc())
                #print("=====")

                if self.is_retriable and not self.is_retriable(err):
                    raise

                if total_wait < self.timeout and (self.max_tries is None or tries < self.max_tries):
                    self.logger.info(
                        f"Error executing {f.__qualname__}, retrying after {delay}s: {err}")
                    time.sleep(delay)
                    total_wait += delay
                    delay = self.backoff(delay)

                    # TODO - do we want it this way? need it for debug now
                    import traceback
                    print(traceback.format_exc())
                else:
                    self.logger.error(
                        f"Error executing {f.__qualname__}, giving up: {err}")
                    raise