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")
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)])
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)])
def on_write_failure(self, address): raise Neo4jAvailabilityError( "No write service available for pool {}".format(self))