summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDana Powers <dana.powers@gmail.com>2018-05-26 08:43:25 -0700
committerGitHub <noreply@github.com>2018-05-26 08:43:25 -0700
commitee26c3f547f357d639b421b3e38a74e87e21f346 (patch)
tree945cc585f23bbeb7a3b64361e7d069998848394c
parentc9d783a8211337205bc90c27d1f67beb65ac5d9e (diff)
downloadkafka-python-ee26c3f547f357d639b421b3e38a74e87e21f346.tar.gz
Ignore MetadataResponses with empty broker list (#1506)
-rw-r--r--kafka/cluster.py3
-rw-r--r--kafka/errors.py4
-rw-r--r--test/test_cluster.py22
3 files changed, 28 insertions, 1 deletions
diff --git a/kafka/cluster.py b/kafka/cluster.py
index 45f25ad..8078eb7 100644
--- a/kafka/cluster.py
+++ b/kafka/cluster.py
@@ -214,7 +214,8 @@ class ClusterMetadata(object):
return self.failed_update(error)
if not metadata.brokers:
- log.warning("No broker metadata found in MetadataResponse")
+ log.warning("No broker metadata found in MetadataResponse -- ignoring.")
+ return self.failed_update(Errors.MetadataEmptyBrokerList(metadata))
_new_brokers = {}
for broker in metadata.brokers:
diff --git a/kafka/errors.py b/kafka/errors.py
index f4c8740..93a9f40 100644
--- a/kafka/errors.py
+++ b/kafka/errors.py
@@ -54,6 +54,10 @@ class StaleMetadata(KafkaError):
invalid_metadata = True
+class MetadataEmptyBrokerList(KafkaError):
+ retriable = True
+
+
class UnrecognizedBrokerVersion(KafkaError):
pass
diff --git a/test/test_cluster.py b/test/test_cluster.py
new file mode 100644
index 0000000..f010c4f
--- /dev/null
+++ b/test/test_cluster.py
@@ -0,0 +1,22 @@
+# pylint: skip-file
+from __future__ import absolute_import
+
+import pytest
+
+from kafka.cluster import ClusterMetadata
+from kafka.protocol.metadata import MetadataResponse
+
+
+def test_empty_broker_list():
+ cluster = ClusterMetadata()
+ assert len(cluster.brokers()) == 0
+
+ cluster.update_metadata(MetadataResponse[0](
+ [(0, 'foo', 12), (1, 'bar', 34)], []))
+ assert len(cluster.brokers()) == 2
+
+ # empty broker list response should be ignored
+ cluster.update_metadata(MetadataResponse[0](
+ [], # empty brokers
+ [(17, 'foo', []), (17, 'bar', [])])) # topics w/ error
+ assert len(cluster.brokers()) == 2