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")
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")
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
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')
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))