From 07a4a7c403ce01e7290821af7e2b4439f04f5580 Mon Sep 17 00:00:00 2001 From: Adam Holmberg Date: Mon, 24 Nov 2014 16:49:12 -0600 Subject: [PATCH 1/2] Don't try to connect to peers with incomplete meta PYTHON-163 --- cassandra/cluster.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/cassandra/cluster.py b/cassandra/cluster.py index 4e099b1d72..7d02c3f6dc 100644 --- a/cassandra/cluster.py +++ b/cassandra/cluster.py @@ -2060,19 +2060,25 @@ def _refresh_node_list_and_token_map(self, connection, preloaded_results=None, if not addr or addr in ["0.0.0.0", "::"]: addr = row.get("peer") - found_hosts.add(addr) + tokens = row.get("tokens") + peer_meta_complete = bool(tokens) host = self._cluster.metadata.get_host(addr) datacenter = row.get("data_center") rack = row.get("rack") if host is None: log.debug("[control connection] Found new host to connect to: %s", addr) - host = self._cluster.add_host(addr, datacenter, rack, signal=True) - should_rebuild_token_map = True + host = self._cluster.add_host(addr, datacenter, rack, signal=peer_meta_complete) + should_rebuild_token_map |= peer_meta_complete else: - should_rebuild_token_map |= self._update_location_info(host, datacenter, rack) + should_rebuild_token_map |= self._update_location_info(host, datacenter, rack) and peer_meta_complete + + if not peer_meta_complete: + log.warn("Excluding host (%s) with no tokens in system.peers table of %s." % (addr, connection.host)) + continue + + found_hosts.add(addr) - tokens = row.get("tokens") if partitioner and tokens: token_map[host] = tokens From 4f7dfe330716ab683f83d1bc6b04c2169b95dadb Mon Sep 17 00:00:00 2001 From: Adam Holmberg Date: Wed, 3 Dec 2014 23:17:04 +0000 Subject: [PATCH 2/2] Bail on host with not metadata before adding/removing peer review input --- cassandra/cluster.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/cassandra/cluster.py b/cassandra/cluster.py index 7d02c3f6dc..de4b43b35b 100644 --- a/cassandra/cluster.py +++ b/cassandra/cluster.py @@ -2061,23 +2061,21 @@ def _refresh_node_list_and_token_map(self, connection, preloaded_results=None, addr = row.get("peer") tokens = row.get("tokens") - peer_meta_complete = bool(tokens) + if not tokens: + log.warn("Excluding host (%s) with no tokens in system.peers table of %s." % (addr, connection.host)) + continue + + found_hosts.add(addr) host = self._cluster.metadata.get_host(addr) datacenter = row.get("data_center") rack = row.get("rack") if host is None: log.debug("[control connection] Found new host to connect to: %s", addr) - host = self._cluster.add_host(addr, datacenter, rack, signal=peer_meta_complete) - should_rebuild_token_map |= peer_meta_complete + host = self._cluster.add_host(addr, datacenter, rack, signal=True) + should_rebuild_token_map = True else: - should_rebuild_token_map |= self._update_location_info(host, datacenter, rack) and peer_meta_complete - - if not peer_meta_complete: - log.warn("Excluding host (%s) with no tokens in system.peers table of %s." % (addr, connection.host)) - continue - - found_hosts.add(addr) + should_rebuild_token_map |= self._update_location_info(host, datacenter, rack) if partitioner and tokens: token_map[host] = tokens