kafka-python 2.0.4__py2.py3-none-any.whl → 2.0.5__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
kafka/admin/client.py CHANGED
@@ -1,9 +1,10 @@
1
- from __future__ import absolute_import
1
+ from __future__ import absolute_import, division
2
2
 
3
3
  from collections import defaultdict
4
4
  import copy
5
5
  import logging
6
6
  import socket
7
+ import time
7
8
 
8
9
  from . import ConfigResourceType
9
10
  from kafka.vendor import six
@@ -212,11 +213,13 @@ class KafkaAdminClient(object):
212
213
  metric_group_prefix='admin',
213
214
  **self.config
214
215
  )
215
- self._client.check_version(timeout=(self.config['api_version_auto_timeout_ms'] / 1000))
216
216
 
217
217
  # Get auto-discovered version from client if necessary
218
218
  if self.config['api_version'] is None:
219
219
  self.config['api_version'] = self._client.config['api_version']
220
+ else:
221
+ # need to run check_version for get_api_versions()
222
+ self._client.check_version(timeout=(self.config['api_version_auto_timeout_ms'] / 1000))
220
223
 
221
224
  self._closed = False
222
225
  self._refresh_controller_id()
@@ -273,24 +276,33 @@ class KafkaAdminClient(object):
273
276
  """
274
277
  return timeout_ms or self.config['request_timeout_ms']
275
278
 
276
- def _refresh_controller_id(self):
279
+ def _refresh_controller_id(self, timeout_ms=30000):
277
280
  """Determine the Kafka cluster controller."""
278
281
  version = self._matching_api_version(MetadataRequest)
279
282
  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
283
+ timeout_at = time.time() + timeout_ms / 1000
284
+ while time.time() < timeout_at:
285
+ request = MetadataRequest[version]()
286
+ future = self._send_request_to_node(self._client.least_loaded_node(), request)
287
+
288
+ self._wait_for_futures([future])
289
+
290
+ response = future.value
291
+ controller_id = response.controller_id
292
+ if controller_id == -1:
293
+ log.warning("Controller ID not available, got -1")
294
+ time.sleep(1)
295
+ continue
296
+ # verify the controller is new enough to support our requests
297
+ controller_version = self._client.check_version(node_id=controller_id, timeout=(self.config['api_version_auto_timeout_ms'] / 1000))
298
+ if controller_version < (0, 10, 0):
299
+ raise IncompatibleBrokerVersion(
300
+ "The controller appears to be running Kafka {}. KafkaAdminClient requires brokers >= 0.10.0.0."
301
+ .format(controller_version))
302
+ self._controller_id = controller_id
303
+ return
304
+ else:
305
+ raise Errors.NodeNotAvailableError('controller')
294
306
  else:
295
307
  raise UnrecognizedBrokerVersion(
296
308
  "Kafka Admin interface cannot determine the controller using MetadataRequest_v{}."
@@ -390,7 +402,7 @@ class KafkaAdminClient(object):
390
402
  while not self._client.ready(node_id):
391
403
  # poll until the connection to broker is ready, otherwise send()
392
404
  # will fail with NodeNotReadyError
393
- self._client.poll()
405
+ self._client.poll(timeout_ms=200)
394
406
  return self._client.send(node_id, request, wakeup)
395
407
 
396
408
  def _send_request_to_controller(self, request):
kafka/client_async.py CHANGED
@@ -216,6 +216,8 @@ class KafkaClient(object):
216
216
  self._connecting = set()
217
217
  self._sending = set()
218
218
  self._refresh_on_disconnects = True
219
+
220
+ # Not currently used, but data is collected internally
219
221
  self._last_bootstrap = 0
220
222
  self._bootstrap_fails = 0
221
223
 
@@ -233,8 +235,6 @@ class KafkaClient(object):
233
235
  self.config['metric_group_prefix'],
234
236
  weakref.proxy(self._conns))
235
237
 
236
- self._num_bootstrap_hosts = len(collect_hosts(self.config['bootstrap_servers']))
237
-
238
238
  # Check Broker Version if not set explicitly
239
239
  if self.config['api_version'] is None:
240
240
  check_timeout = self.config['api_version_auto_timeout_ms'] / 1000
@@ -259,20 +259,6 @@ class KafkaClient(object):
259
259
  self._wake_r = None
260
260
  self._wake_w = None
261
261
 
262
- def _can_bootstrap(self):
263
- effective_failures = self._bootstrap_fails // self._num_bootstrap_hosts
264
- backoff_factor = 2 ** effective_failures
265
- backoff_ms = min(self.config['reconnect_backoff_ms'] * backoff_factor,
266
- self.config['reconnect_backoff_max_ms'])
267
-
268
- backoff_ms *= random.uniform(0.8, 1.2)
269
-
270
- next_at = self._last_bootstrap + backoff_ms / 1000.0
271
- now = time.time()
272
- if next_at > now:
273
- return False
274
- return True
275
-
276
262
  def _can_connect(self, node_id):
277
263
  if node_id not in self._conns:
278
264
  if self.cluster.broker_metadata(node_id):
kafka/conn.py CHANGED
@@ -1315,8 +1315,8 @@ class BrokerConnection(object):
1315
1315
  return version
1316
1316
 
1317
1317
  def __str__(self):
1318
- return "<BrokerConnection node_id=%s host=%s:%d %s [%s %s]>" % (
1319
- self.node_id, self.host, self.port, self.state,
1318
+ return "<BrokerConnection client_id=%s, node_id=%s host=%s:%d %s [%s %s]>" % (
1319
+ self.config['client_id'], self.node_id, self.host, self.port, self.state,
1320
1320
  AFI_NAMES[self._sock_afi], self._sock_addr)
1321
1321
 
1322
1322
 
kafka/coordinator/base.py CHANGED
@@ -371,7 +371,7 @@ class BaseCoordinator(object):
371
371
  while not self.coordinator_unknown():
372
372
  if not self._client.in_flight_request_count(self.coordinator_id):
373
373
  break
374
- self._client.poll()
374
+ self._client.poll(timeout_ms=200)
375
375
  else:
376
376
  continue
377
377
 
@@ -923,8 +923,6 @@ class HeartbeatThread(threading.Thread):
923
923
  if self.closed:
924
924
  return
925
925
  self.closed = True
926
- with self.coordinator._lock:
927
- self.coordinator._lock.notify()
928
926
 
929
927
  # Generally this should not happen - close() is triggered
930
928
  # by the coordinator. But in some cases GC may close the coordinator
@@ -932,6 +930,9 @@ class HeartbeatThread(threading.Thread):
932
930
  if threading.current_thread() == self:
933
931
  return
934
932
 
933
+ with self.coordinator._lock:
934
+ self.coordinator._lock.notify()
935
+
935
936
  if self.is_alive():
936
937
  self.join(self.coordinator.config['heartbeat_interval_ms'] / 1000)
937
938
  if self.is_alive():
kafka/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = '2.0.4'
1
+ __version__ = '2.0.5'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: kafka-python
3
- Version: 2.0.4
3
+ Version: 2.0.5
4
4
  Summary: Pure Python client for Apache Kafka
5
5
  Author-email: Dana Powers <dana.powers@gmail.com>
6
6
  Project-URL: Homepage, https://github.com/dpkp/kafka-python
@@ -41,7 +41,7 @@ Requires-Dist: pytest-mock; extra == "testing"
41
41
  Kafka Python client
42
42
  ------------------------
43
43
 
44
- .. image:: https://img.shields.io/badge/kafka-2.6%2C%202.5%2C%202.4%2C%202.3%2C%202.2%2C%202.1%2C%202.0%2C%201.1%2C%201.0%2C%200.11%2C%200.10%2C%200.9%2C%200.8-brightgreen.svg
44
+ .. image:: https://img.shields.io/badge/kafka-3.9--0.8-brightgreen.svg
45
45
  :target: https://kafka-python.readthedocs.io/en/master/compatibility.html
46
46
  .. image:: https://img.shields.io/pypi/pyversions/kafka-python.svg
47
47
  :target: https://pypi.python.org/pypi/kafka-python
@@ -1,17 +1,17 @@
1
1
  kafka/__init__.py,sha256=4dvHKZAxmD_4tfJ5wGcRV2X78vPcm8vsUoqceULevjA,1077
2
- kafka/client_async.py,sha256=OmYloiv0deK2-i_fypLUdkn62cPhAYDh19Ci17KeE7I,47064
2
+ kafka/client_async.py,sha256=wnEbViP9F7_6FtxOjvJJ7blTREoonjdjTLgodKffs68,46526
3
3
  kafka/cluster.py,sha256=LBSJGPO7wr1RQkMyTtAzVxPa5GCFl57u28-Q7oQ9Ieo,14841
4
4
  kafka/codec.py,sha256=8NZpnehzNrhSBIjzbPVSvyFbSeLAqEntE7BfVHu-_9I,10036
5
- kafka/conn.py,sha256=rmB46GCWl_o2XSVWOaFNvCunlA1joMob2nhcQ_eJOPs,69132
5
+ kafka/conn.py,sha256=NciLcgGZpku8I1PtsUSShLmywRY8HE8a7YLBTaMht-U,69172
6
6
  kafka/errors.py,sha256=yFzMajEiin_dwdlG7lQAOFKCSh80aIbsWBIiudp7k2I,34522
7
7
  kafka/future.py,sha256=uJJLfKMFsdEHgHSyvCzQe_AXNrToiZE-MynZVNhk9qc,2474
8
8
  kafka/scram.py,sha256=Ei9FPJ3ajfTQRRGaDs1RjDKTpplkoPQKvk-u6Dkbh_U,3034
9
9
  kafka/structs.py,sha256=m2o20GOJBDJIiP7YUj1Lhk2bAXKLt9H48NloBJ39Om8,2927
10
10
  kafka/util.py,sha256=nu0h9bXBv6Hl8v7MW07o8NFe4zoZNw6C6ehFBPazOpU,1856
11
- kafka/version.py,sha256=YuAuFLBrpl-SUl_UsvW1U1NTjqnldfuD1xUmSLmtaRw,22
11
+ kafka/version.py,sha256=dVcGCZ5wUWMpOJgTrQrOvt6L6HdIhykCRMVFZFr-q20,22
12
12
  kafka/admin/__init__.py,sha256=S_XxqyyV480_yXhttK79XZqNAmZyXRjspd3SoqYykE8,720
13
13
  kafka/admin/acl_resource.py,sha256=ak_dUsSni4SyP0ORbSKenZpwTy0Ykxq3FSt_9XgLR8k,8265
14
- kafka/admin/client.py,sha256=RZY91bLyHV_G28tIWsZT2JXX4JMdSWv5g_RcZku9JSc,71097
14
+ kafka/admin/client.py,sha256=f11x-OgSZYI5l3tdllj1l4NO5EJBnVqJ7dUeNIJf2Bw,71669
15
15
  kafka/admin/config_resource.py,sha256=_JZWN_Q7jbuTtq2kdfHxWyTt_jI1LI-xnVGsf6oYGyY,1039
16
16
  kafka/admin/new_partitions.py,sha256=rYSb7S6VL706ZauSmiN5J9GDsep0HYRmkkAZUgT2JIg,757
17
17
  kafka/admin/new_topic.py,sha256=fvezLP9JXumqX-nU27Fgo0tj4d85ybcJgKluQImm3-0,1306
@@ -20,7 +20,7 @@ kafka/consumer/fetcher.py,sha256=n7U83NTqGHj8CMUG4g_Sq4E5s8SbRsv78FOf7M020mc,479
20
20
  kafka/consumer/group.py,sha256=-q-TmdVlROumiHxJij960MA5qgBK9SuzjIv6AiyFCCw,58942
21
21
  kafka/consumer/subscription_state.py,sha256=2SgH37QISlIZh-v0KnNJW0n1d_sMLOxxW7UxkhsC5R0,21665
22
22
  kafka/coordinator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
- kafka/coordinator/base.py,sha256=hGG8dqHNQPTE8JopoWtdtqSQC-RIyRKmRluXv9hR5Kk,46757
23
+ kafka/coordinator/base.py,sha256=MIs_LDxQnJkFSITCgvMpu5sfUEdAp_5YNlwtJmsiHu8,46772
24
24
  kafka/coordinator/consumer.py,sha256=BCZlUHCf343K8w3CTd9Osqj9u1eE7b73wMa22_BHOVk,38920
25
25
  kafka/coordinator/heartbeat.py,sha256=WJqZGnXHG7TTq1Is3D0mKDis-bBwWVZlSgQiUoZv1jU,2304
26
26
  kafka/coordinator/protocol.py,sha256=wTaIOnUVbj0CKXZ82FktZo-zMRvOCk3hdQAoHJ62e3I,1041
@@ -96,7 +96,7 @@ kafka/vendor/enum34.py,sha256=-u-lxAiJMt6ru4Do7NUDY9OpeWkYJMksb2xengJawFE,31204
96
96
  kafka/vendor/selectors34.py,sha256=gxejLO4eXf8mRSGXaQiknPig3GdX1rtsZiYOQJVuAy8,20594
97
97
  kafka/vendor/six.py,sha256=lLBa9_HrANP5BMZ7twEzg1M3wofwPmXyptuWmHX0brY,34826
98
98
  kafka/vendor/socketpair.py,sha256=Fi3PoY1Okkppab720wFk1BhHXyjcw7hi5DwhqrYZH2Y,2737
99
- kafka_python-2.0.4.dist-info/METADATA,sha256=frDRrfLwF-2tZtdfYdATJPgSPSyU5r3kCC7K3LcZeHU,9103
100
- kafka_python-2.0.4.dist-info/WHEEL,sha256=9Hm2OB-j1QcCUq9Jguht7ayGIIZBRTdOXD1qg9cCgPM,109
101
- kafka_python-2.0.4.dist-info/top_level.txt,sha256=IivJz7l5WHdLNDT6RIiVAlhjQzYRwGqBBmKHZ7WjPeM,6
102
- kafka_python-2.0.4.dist-info/RECORD,,
99
+ kafka_python-2.0.5.dist-info/METADATA,sha256=CADbqxUBnhjsCKA6xvr71qQRz4svXRJXqazKdnufLRM,8998
100
+ kafka_python-2.0.5.dist-info/WHEEL,sha256=3HfeesdN7jshHPzN8HJ8UeFRlEd6ApplqndzbPTvPl8,109
101
+ kafka_python-2.0.5.dist-info/top_level.txt,sha256=IivJz7l5WHdLNDT6RIiVAlhjQzYRwGqBBmKHZ7WjPeM,6
102
+ kafka_python-2.0.5.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.0)
2
+ Generator: setuptools (75.8.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py2-none-any
5
5
  Tag: py3-none-any