From 0fc56d8ec71ae5047c9e933f78f86182974660d8 Mon Sep 17 00:00:00 2001 From: Nigel Small Date: Thu, 30 Mar 2017 12:56:47 +0100 Subject: [PATCH 1/2] Try all resolved addresses for direct connection --- neo4j/bolt/connection.py | 2 +- neo4j/v1/direct.py | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/neo4j/bolt/connection.py b/neo4j/bolt/connection.py index ba49d56e6..ae3e7bb0e 100644 --- a/neo4j/bolt/connection.py +++ b/neo4j/bolt/connection.py @@ -359,7 +359,7 @@ def __enter__(self): def __exit__(self, exc_type, exc_value, traceback): self.close() - def acquire_direct(self, address): + def acquire_direct(self, address, *other_addresses): """ Acquire a connection to a given address from the pool. The address supplied should always be an IP address, not a host name. diff --git a/neo4j/v1/direct.py b/neo4j/v1/direct.py index 89b41e944..92376a72e 100644 --- a/neo4j/v1/direct.py +++ b/neo4j/v1/direct.py @@ -21,6 +21,7 @@ from neo4j.addressing import SocketAddress, resolve from neo4j.bolt import DEFAULT_PORT, ConnectionPool, connect +from neo4j.exceptions import ServiceUnavailable from neo4j.v1.api import Driver from neo4j.v1.security import SecurityPlan from neo4j.v1.session import BoltSession @@ -33,8 +34,14 @@ def __init__(self, connector, address): self.address = address def acquire(self, access_mode=None): - resolved_addresses = resolve(self.address) - return self.acquire_direct(resolved_addresses[0]) + for address in resolve(self.address): + try: + connection = self.acquire_direct(address) # should always be a resolved address + except ServiceUnavailable: + pass + else: + return connection + raise ServiceUnavailable("Cannot acquire connection to {!r}".format(self.address)) class DirectDriver(Driver): From 5037255e3d32873434a6180bb1fcae7947278cd1 Mon Sep 17 00:00:00 2001 From: Nigel Small Date: Thu, 30 Mar 2017 12:58:13 +0100 Subject: [PATCH 2/2] Removed extraneous argument --- neo4j/bolt/connection.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neo4j/bolt/connection.py b/neo4j/bolt/connection.py index ae3e7bb0e..ba49d56e6 100644 --- a/neo4j/bolt/connection.py +++ b/neo4j/bolt/connection.py @@ -359,7 +359,7 @@ def __enter__(self): def __exit__(self, exc_type, exc_value, traceback): self.close() - def acquire_direct(self, address, *other_addresses): + def acquire_direct(self, address): """ Acquire a connection to a given address from the pool. The address supplied should always be an IP address, not a host name.