var/opt/nydus/ops/primordial/__pycache__/flow.cpython-38.pyc000064400000011312147205574010020055 0ustar00U aðf®ã @s¨ddlZddlmZddlmZmZmZmZmZdZ dZ e  e ¡Z Gdd„deƒZdeeeeed œd d „Zdd d„e efeeeeeeeeeefedœdd„ZdS)éN)Úsleep)ÚAnyÚCallableÚTupleÚTypeÚUniongð?éc@seZdZdZdS)Ú RetryErrorz9A special type which signals the failure of a retry loop.N)Ú__name__Ú __module__Ú __qualname__Ú__doc__©rrú@/opt/nydus/tmp/pip-target-53d1vnqk/lib/python/primordial/flow.pyr sr é çà?)Ú test_functionÚ max_testsÚ sleep_secsÚ count_truesÚreturncCs~d}d}d}||kr"t d¡|}||kr\|ƒ}|dkrJ|d7}||krJq\|d7}t|ƒq"||krttd||fƒ‚|||fS)aöAttempt test_function over and over, waiting for a true value. Try a maximum of max_tests times. Sleep sleep_secs in between each test. Receive count_trues before moving on. wait_for_true is designed specifically to handle a design principle behind AWS or other clustered services: that you might succeed when making a request once and then fail very soon after. For example, when you make a REST API call against S3 to see if a bucket exists, the fact that you get a "True" response does not guarantee that you will get that same response to a request made very soon after. In other words, it's for cases in which the goal is to produce a wait time for an eventually consistent external service to resolve your request. That's why wait_for_true lets you specify a threshold of how many trues you want to get before you're satisfied. :param test_function: a function to run whose result we will test for truthiness :param max_tests: limit to how many times we'll try test_function :param sleep_secs: how long to wait between tests :param count_trues: how many true results we need until we're totally true; this is useful with e.g. cluster tests, where we want a quorum of true answers before we're happy that the entire cluster is consistent (e.g. s3 put) :returns: the return value of the test function, the number of time it tried, and how many true results it found :raises RetryError: if the function "never" returned sufficiently many trues rNz9count_trues > max_tests, bumping max_tests to count_truesTéz6wait_for_true never succeeded %s times for function %s)ÚLOGGERÚwarningrr )rrrrZ itercountÚretZtruesrrrÚ wait_for_trues"  rcCs|tS)N)ÚDELAY_INCREASE_SECS)ÚxrrrÚ<ór)Úaction_functionrÚbackoffÚ max_attemptsÚexceptions_to_ignorerc Csˆd}||kr„z|ƒWS|k r€}zN|d7}||krLtd|t|ƒfƒ|‚t d||t|ƒ¡t|ƒ||ƒ}W5d}~XYqXqdS)a•Retry an e.g. network connection until it doesn't throw an exception of any kind. This is for single-success retry cases (e.g. wow, that TCP connection didn't get established because of high latency, let's dial back and try again in a bit). The action_function is expected to be of a sort that any expected exceptions are caught, as this will retry under /any/ exception. The return value, if any, from the action_function is returned by retry on success. sleep_secs is the number of seconds to sleep between failures, and backoff defaults to adding DELAY_INCREASE_SECS to the prior value each time. max_attempts is the limit of the number of retries in any case. On failure to complete the action_function without exception, raises RetryError. :param action_function: a function to run that we will retry if it raises any exception :param sleep_secs: how long to wait between tries :param backoff: a function that will expand the sleep duration based on what iteration we are on :param max_attempts: limit to how many times we'll try action_function :param exceptions_to_ignore: exception type or types to ignore; by default, ignores all Exception-derived exceptions :returns: the return value of the test function, the number of time it tried, and how many true results it found :raises RetryError: if the function "never" returned without an exception rrzFailure to retry %s: %sz.retry: pausing %s secs before retrying %s (%s)N)r ÚstrrÚdebugr)r rr!r"r#ZattemptsÚerrrÚretry:sr')rrr)ÚloggingÚtimerÚtypingrrrrrrZ MAX_RETRIESÚ getLoggerr rÚ Exceptionr ÚintÚfloatrr'rrrrÚs$  *üü