예제 #1
0
    async def fetch_cluster_info(self):
        logger.info('Loading cluster info from {}...'.format(self._nodes))
        tasks = [
            asyncio.ensure_future(
                self._get_raw_cluster_info_from_node(node), loop=self._loop
            ) for node in self._nodes
        ]
        try:
            for task in asyncio.as_completed(tasks, loop=self._loop):
                try:
                    nodes_raw_response = await task
                    self._cluster_manager = ClusterNodesManager.create(
                        nodes_raw_response)
                    logger.info('Cluster info loaded successfully: %s',
                                list(nodes_raw_response))
                    return
                except (ReplyError, ProtocolError,
                        ConnectionError, OSError) as exc:
                    logger.warning(
                        "Loading cluster info from a node failed with {}"
                        .format(repr(exc))
                    )
        finally:
            for task in tasks:
                task.cancel()
            # Wait until all tasks have closed their connection
            await asyncio.gather(
                *tasks, loop=self._loop, return_exceptions=True)

        raise RedisClusterError(
            "No cluster info could be loaded from any host")
예제 #2
0
파일: cluster.py 프로젝트: trezorg/aioredis
    async def fetch_cluster_info(self):
        logger.info('Loading cluster info from {}...'.format(self._nodes))
        tasks = [
            asyncio.ensure_future(
                self._get_raw_cluster_info_from_node(node), loop=self._loop
            ) for node in self._nodes
        ]
        try:
            for task in asyncio.as_completed(tasks, loop=self._loop):
                try:
                    nodes_raw_response = list(await task)
                    self._cluster_manager = ClusterNodesManager.create(
                        nodes_raw_response
                    )
                    logger.info('Cluster info loaded successfully: %s',
                                nodes_raw_response)
                    return
                except (ReplyError, ProtocolError,
                        ConnectionError, OSError) as exc:
                    logger.warning(
                        "Loading cluster info from a node failed with {}"
                        .format(repr(exc))
                    )
        finally:
            for task in tasks:
                task.cancel()
            # Wait until all tasks have closed their connection
            await asyncio.gather(
                *tasks, loop=self._loop, return_exceptions=True)

        raise RedisClusterError(
            "No cluster info could be loaded from any host")
예제 #3
0
    def _retry(self,
               method,
               arguments,
               error_message,
               max_errors=_MAX_RETRY_ERRORS,
               interval=_ATTEMPT_INTERVAL):
        results = [None] * len(arguments)
        successful_indexes = []
        errors = 0
        while len(successful_indexes) < len(arguments):
            for i, argument in enumerate(arguments):
                if i not in successful_indexes:
                    try:
                        results[i] = method(argument)
                        successful_indexes.append(i)
                    except (IOError, ConnectionRefusedError):
                        errors += 1
                        if errors >= max_errors:
                            raise IOError(error_message +
                                          ' Stop retrying after {} errors.'.
                                          format(errors))
                        else:
                            logger.info(
                                error_message +
                                ' Will retry after {}s.'.format(interval))
                            time.sleep(interval)

        return results
예제 #4
0
 async def reload_cluster_pool(self):
     logger.info('Reloading cluster...')
     await self.clear()
     self._moved_count = 0
     await self.fetch_cluster_info()
     logger.info('Connecting to cluster...')
     self._cluster_pool = await self.get_cluster_pool()
     logger.info('Reloaded cluster')
예제 #5
0
파일: cluster.py 프로젝트: trezorg/aioredis
 async def reload_cluster_pool(self):
     logger.info('Reloading cluster...')
     await self.clear()
     self._moved_count = 0
     await self.fetch_cluster_info()
     logger.info('Connecting to cluster...')
     self._cluster_pool = await self.get_cluster_pool()
     logger.info('Reloaded cluster')
예제 #6
0
 async def initialize(self):
     logger.info('Initializing cluster...')
     self._moved_count = 0
     await self.fetch_cluster_info()
     logger.info('Initialized cluster.\n{}'.format(self._cluster_manager))
예제 #7
0
파일: cluster.py 프로젝트: trezorg/aioredis
 async def initialize(self):
     logger.info('Initializing cluster...')
     self._moved_count = 0
     await self.fetch_cluster_info()
     logger.info('Initialized cluster.\n{}'.format(self._cluster_manager))