import logging import time import random from os.path import expanduser, abspath from petrel_client.client_base import ClientBase from petrel_client.common.io_profile import profile from petrel_client.common.io_retry import retry from petrel_client.common import exception from petrel_client.common.exception import ObjectNotFoundError, ResourceNotFoundError from petrel_client.common.config import Config from petrel_client.common.log import init_log from petrel_client.common.io_profile import Profiler LOG = logging.getLogger(__name__) class Client(ClientBase): def __init__(self, conf_path, name, count_disp): conf_path = abspath(expanduser(conf_path)) config = Config(conf_path) self._default_config = config.default() init_log(self._default_config) LOG.info('init io_retry_test.Client, conf_path %s', conf_path) Profiler.set_default_conf(self._default_config) super(Client, self).__init__(name=name, count_disp=count_disp) @profile('get') def get(self, key): def not_found(): raise ObjectNotFoundError(key) def resource_not_found(): raise ResourceNotFoundError() def error(): raise Exception(key) def found(): return 'content' action = random.choice([found, not_found, resource_not_found, error]) time.sleep(0.001) return action() @profile('put') def put(self, key, content): def normal(): return len(content) def error(): raise Exception(key) action = random.choice([normal, error]) return action() class FakeMixedClient(object): def __init__(self, client): self.client = client def get(self, uri, **kwargs): @retry('get', exceptions=(Exception,), raises=(exception.ResourceNotFoundError,), tries=3) def do_get(self, uri, **kwargs): try: self.client.get(uri) except exception.ObjectNotFoundError as err: LOG.debug(err) return None except exception.ResourceNotFoundError as err: raise except Exception as err: raise return do_get(self, uri, **kwargs) def put(self, uri, content, **kwargs): @retry('put', exceptions=(Exception,), tries=3) def do_put(self, uri, content, **kwargs): try: self.client.put(uri, content) except Exception as err: raise return do_put(self, uri, content, **kwargs) c = Client(conf_path='~/petreloss.conf', name='cluster1', count_disp=50) mc = FakeMixedClient(c) for _ in range(50): try: mc.get('key') except Exception: pass for _ in range(50): try: mc.put('key', '!@#$%'*10) except Exception: pass