From ced919a32afaec2178767d116ccb5b5127830bd2 Mon Sep 17 00:00:00 2001 From: Adam Holmberg Date: Wed, 6 Apr 2016 13:56:30 -0500 Subject: [PATCH] DNS resolve contact points removes duplicate hosts, also expands A records PYTHON-103 PYTHON-415 --- cassandra/cluster.py | 8 ++++++-- cassandra/policies.py | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/cassandra/cluster.py b/cassandra/cluster.py index d8c1026e..c1773267 100644 --- a/cassandra/cluster.py +++ b/cassandra/cluster.py @@ -532,6 +532,10 @@ class Cluster(object): self.contact_points = contact_points self.port = port + + self.contact_points_resolved = [endpoint[4][0] for a in self.contact_points + for endpoint in socket.getaddrinfo(a, self.port, socket.AF_UNSPEC, socket.SOCK_STREAM)] + self.compression = compression self.protocol_version = protocol_version self.auth_provider = auth_provider @@ -830,7 +834,7 @@ class Cluster(object): self.contact_points, self.protocol_version) self.connection_class.initialize_reactor() atexit.register(partial(_shutdown_cluster, self)) - for address in self.contact_points: + for address in self.contact_points_resolved: host, new = self.add_host(address, signal=False) if new: host.set_up() @@ -2320,7 +2324,7 @@ class ControlConnection(object): if old_host.address != connection.host and old_host.address not in found_hosts: should_rebuild_token_map = True if old_host.address not in self._cluster.contact_points: - log.debug("[control connection] Found host that has been removed: %r", old_host) + log.debug("[control connection] Removing host not found in peers metadata: %r", old_host) self._cluster.remove_host(old_host) log.debug("[control connection] Finished fetching ring info") diff --git a/cassandra/policies.py b/cassandra/policies.py index 595717ca..48c850db 100644 --- a/cassandra/policies.py +++ b/cassandra/policies.py @@ -235,7 +235,7 @@ class DCAwareRoundRobinPolicy(LoadBalancingPolicy): self._dc_live_hosts[dc] = tuple(set(dc_hosts)) if not self.local_dc: - self._contact_points = cluster.contact_points + self._contact_points = cluster.contact_points_resolved self._position = randint(0, len(hosts) - 1) if hosts else 0