From ee26c3f547f357d639b421b3e38a74e87e21f346 Mon Sep 17 00:00:00 2001 From: Dana Powers Date: Sat, 26 May 2018 08:43:25 -0700 Subject: Ignore MetadataResponses with empty broker list (#1506) --- kafka/cluster.py | 3 ++- kafka/errors.py | 4 ++++ test/test_cluster.py | 22 ++++++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 test/test_cluster.py 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 -- cgit v1.2.1