class Client(object):
    """On connection errors, tries to reconnect
    """
    def __init__(self,
                 address,
                 max_item_size=None,
                 max_connect_retries=5,
                 reconnect_delay=.5):
        self.address = address
        self.max_item_size = max_item_size
        self._client = None
        self.funcs = []
        self._create_client()
        self.max_connect_retries = max_connect_retries
        self.reconnect_delay = reconnect_delay

    def _create_connector(self):
        if self.max_item_size is not None:
            self._client = OriginalClient(self.address, self.max_item_size)
        else:
            self._client = OriginalClient(self.address)

        self.funcs = [
            func for func in dir(self._client) if not func.startswith('_')
        ]

    def _create_client(self):
        reconnect = self._client is not None

        if reconnect:
            try:
                self._client.close()
            except Exception:
                pass

        self._create_connector()

        if reconnect:
            retries = 0
            delay = self.reconnect_delay
            while retries < self.max_connect_retries:
                try:
                    return self._client.connect()
                except socket.error, exc:
                    if exc.errno == EISCONN:
                        return  # we're good
                    if exc.errno == EINVAL:
                        # we're doomed, retry
                        self._create_connector()

                    time.sleep(delay)
                    retries += 1
                    delay *= 2  # growing the delay

            raise exc
示例#2
0
 def testClose(self):
     c = Client(MEMCACHED_ADDRESS)
     c.connect()
     c.close()
     self.assertEquals(False, c.is_connected())
     pass