async def _get_routing_table(self):
        """ Update the routing table from the first router able to provide
        valid routing information.
        """
        # copied because it can be modified
        existing_routers = list(self._routing_table.routers)

        has_tried_initial_routers = False
        if self._missing_writer:
            has_tried_initial_routers = True
            rt = await self._get_routing_table_from(self._initial_routers)
            if rt:
                return rt

        rt = await self._get_routing_table_from(*existing_routers)
        if rt:
            return rt

        if not has_tried_initial_routers and self._initial_routers not in existing_routers:
            rt = await self._get_routing_table_from(self._initial_routers)
            if rt:
                return rt

        # None of the routers have been successful, so just fail
        log.error("Unable to retrieve routing information")
        raise Neo4jAvailabilityError("Unable to retrieve routing information")
Exemplo n.º 2
0
 async def _select_pool(self, readonly=False):
     """ Selects the pool with the fewest in-use connections.
     """
     await self._ensure_routing_table_is_fresh(readonly=readonly)
     if readonly:
         addresses = self._routing_table.readers
     else:
         addresses = self._routing_table.writers
     pools = [pool for address, pool in self._pools.items() if address in addresses]
     pools_by_usage = {}
     for pool in pools:
         pools_by_usage.setdefault(pool.in_use, []).append(pool)
     if not pools_by_usage:
         raise Neo4jAvailabilityError("No {} service currently "
                                      "available".format("read" if readonly else "write"))
     return choice(pools_by_usage[min(pools_by_usage)])
Exemplo n.º 3
0
 def _select_address(self, access_mode=None):
     from neo4j import READ_ACCESS
     """ Selects the address with the fewest in-use connections.
     """
     self.ensure_routing_table_is_fresh(access_mode)
     if access_mode == READ_ACCESS:
         addresses = self.routing_table.readers
     else:
         addresses = self.routing_table.writers
     addresses_by_usage = {}
     for address in addresses:
         addresses_by_usage.setdefault(
             self.in_use_connection_count(address), []).append(address)
     if not addresses_by_usage:
         raise Neo4jAvailabilityError(
             "No {} service currently available".format(
                 "read" if access_mode == READ_ACCESS else "write"))
     return choice(addresses_by_usage[min(addresses_by_usage)])
Exemplo n.º 4
0
 def on_write_failure(self, address):
     raise Neo4jAvailabilityError(
         "No write service available for pool {}".format(self))