Skip to content

Commit 66ad130

Browse files
committed
Check for -1 controller_id in admin client
1 parent 1a1cc04 commit 66ad130

File tree

1 file changed

+26
-16
lines changed

1 file changed

+26
-16
lines changed

kafka/admin/client.py

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
from __future__ import absolute_import
1+
from __future__ import absolute_import, division
22

33
from collections import defaultdict
44
import copy
55
import logging
66
import socket
7+
import time
78

89
from . import ConfigResourceType
910
from kafka.vendor import six
@@ -273,24 +274,33 @@ def _validate_timeout(self, timeout_ms):
273274
"""
274275
return timeout_ms or self.config['request_timeout_ms']
275276

276-
def _refresh_controller_id(self):
277+
def _refresh_controller_id(self, timeout_ms=30000):
277278
"""Determine the Kafka cluster controller."""
278279
version = self._matching_api_version(MetadataRequest)
279280
if 1 <= version <= 6:
280-
request = MetadataRequest[version]()
281-
future = self._send_request_to_node(self._client.least_loaded_node(), request)
282-
283-
self._wait_for_futures([future])
284-
285-
response = future.value
286-
controller_id = response.controller_id
287-
# verify the controller is new enough to support our requests
288-
controller_version = self._client.check_version(controller_id, timeout=(self.config['api_version_auto_timeout_ms'] / 1000))
289-
if controller_version < (0, 10, 0):
290-
raise IncompatibleBrokerVersion(
291-
"The controller appears to be running Kafka {}. KafkaAdminClient requires brokers >= 0.10.0.0."
292-
.format(controller_version))
293-
self._controller_id = controller_id
281+
timeout_at = time.time() + timeout_ms / 1000
282+
while time.time() < timeout_at:
283+
request = MetadataRequest[version]()
284+
future = self._send_request_to_node(self._client.least_loaded_node(), request)
285+
286+
self._wait_for_futures([future])
287+
288+
response = future.value
289+
controller_id = response.controller_id
290+
if controller_id == -1:
291+
log.warning("Controller ID not available, got -1")
292+
time.sleep(1)
293+
continue
294+
# verify the controller is new enough to support our requests
295+
controller_version = self._client.check_version(controller_id, timeout=(self.config['api_version_auto_timeout_ms'] / 1000))
296+
if controller_version < (0, 10, 0):
297+
raise IncompatibleBrokerVersion(
298+
"The controller appears to be running Kafka {}. KafkaAdminClient requires brokers >= 0.10.0.0."
299+
.format(controller_version))
300+
self._controller_id = controller_id
301+
return
302+
else:
303+
raise Errors.NodeNotAvailableError('controller')
294304
else:
295305
raise UnrecognizedBrokerVersion(
296306
"Kafka Admin interface cannot determine the controller using MetadataRequest_v{}."

0 commit comments

Comments
 (0)