kafka-python 2.2.12__tar.gz → 2.2.14__tar.gz

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.
Files changed (168) hide show
  1. {kafka_python-2.2.12 → kafka_python-2.2.14}/CHANGES.md +15 -0
  2. {kafka_python-2.2.12 → kafka_python-2.2.14}/PKG-INFO +2 -2
  3. {kafka_python-2.2.12 → kafka_python-2.2.14}/README.rst +1 -1
  4. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/admin/client.py +5 -7
  5. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/consumer/fetcher.py +2 -1
  6. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/coordinator/base.py +18 -17
  7. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/sasl/gssapi.py +2 -2
  8. kafka_python-2.2.14/kafka/version.py +1 -0
  9. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka_python.egg-info/PKG-INFO +2 -2
  10. kafka_python-2.2.12/kafka/version.py +0 -1
  11. {kafka_python-2.2.12 → kafka_python-2.2.14}/AUTHORS.md +0 -0
  12. {kafka_python-2.2.12 → kafka_python-2.2.14}/LICENSE +0 -0
  13. {kafka_python-2.2.12 → kafka_python-2.2.14}/MANIFEST.in +0 -0
  14. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/__init__.py +0 -0
  15. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/admin/__init__.py +0 -0
  16. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/admin/acl_resource.py +0 -0
  17. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/admin/config_resource.py +0 -0
  18. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/admin/new_partitions.py +0 -0
  19. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/admin/new_topic.py +0 -0
  20. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/benchmarks/__init__.py +0 -0
  21. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/benchmarks/consumer_performance.py +0 -0
  22. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/benchmarks/load_example.py +0 -0
  23. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/benchmarks/producer_performance.py +0 -0
  24. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/benchmarks/record_batch_compose.py +0 -0
  25. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/benchmarks/record_batch_read.py +0 -0
  26. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/benchmarks/varint_speed.py +0 -0
  27. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/client_async.py +0 -0
  28. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/cluster.py +0 -0
  29. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/codec.py +0 -0
  30. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/conn.py +0 -0
  31. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/consumer/__init__.py +0 -0
  32. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/consumer/group.py +0 -0
  33. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/consumer/subscription_state.py +0 -0
  34. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/coordinator/__init__.py +0 -0
  35. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/coordinator/assignors/__init__.py +0 -0
  36. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/coordinator/assignors/abstract.py +0 -0
  37. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/coordinator/assignors/range.py +0 -0
  38. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/coordinator/assignors/roundrobin.py +0 -0
  39. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/coordinator/assignors/sticky/__init__.py +0 -0
  40. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/coordinator/assignors/sticky/partition_movements.py +0 -0
  41. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/coordinator/assignors/sticky/sorted_set.py +0 -0
  42. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/coordinator/assignors/sticky/sticky_assignor.py +0 -0
  43. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/coordinator/consumer.py +0 -0
  44. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/coordinator/heartbeat.py +0 -0
  45. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/coordinator/protocol.py +0 -0
  46. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/errors.py +0 -0
  47. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/future.py +0 -0
  48. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/metrics/__init__.py +0 -0
  49. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/metrics/compound_stat.py +0 -0
  50. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/metrics/dict_reporter.py +0 -0
  51. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/metrics/kafka_metric.py +0 -0
  52. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/metrics/measurable.py +0 -0
  53. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/metrics/measurable_stat.py +0 -0
  54. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/metrics/metric_config.py +0 -0
  55. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/metrics/metric_name.py +0 -0
  56. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/metrics/metrics.py +0 -0
  57. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/metrics/metrics_reporter.py +0 -0
  58. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/metrics/quota.py +0 -0
  59. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/metrics/stat.py +0 -0
  60. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/metrics/stats/__init__.py +0 -0
  61. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/metrics/stats/avg.py +0 -0
  62. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/metrics/stats/count.py +0 -0
  63. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/metrics/stats/histogram.py +0 -0
  64. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/metrics/stats/max_stat.py +0 -0
  65. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/metrics/stats/min_stat.py +0 -0
  66. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/metrics/stats/percentile.py +0 -0
  67. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/metrics/stats/percentiles.py +0 -0
  68. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/metrics/stats/rate.py +0 -0
  69. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/metrics/stats/sampled_stat.py +0 -0
  70. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/metrics/stats/sensor.py +0 -0
  71. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/metrics/stats/total.py +0 -0
  72. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/partitioner/__init__.py +0 -0
  73. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/partitioner/default.py +0 -0
  74. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/producer/__init__.py +0 -0
  75. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/producer/future.py +0 -0
  76. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/producer/kafka.py +0 -0
  77. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/producer/record_accumulator.py +0 -0
  78. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/producer/sender.py +0 -0
  79. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/producer/transaction_manager.py +0 -0
  80. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/protocol/__init__.py +0 -0
  81. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/protocol/abstract.py +0 -0
  82. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/protocol/add_offsets_to_txn.py +0 -0
  83. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/protocol/add_partitions_to_txn.py +0 -0
  84. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/protocol/admin.py +0 -0
  85. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/protocol/api.py +0 -0
  86. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/protocol/api_versions.py +0 -0
  87. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/protocol/broker_api_versions.py +0 -0
  88. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/protocol/commit.py +0 -0
  89. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/protocol/end_txn.py +0 -0
  90. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/protocol/fetch.py +0 -0
  91. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/protocol/find_coordinator.py +0 -0
  92. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/protocol/frame.py +0 -0
  93. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/protocol/group.py +0 -0
  94. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/protocol/init_producer_id.py +0 -0
  95. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/protocol/list_offsets.py +0 -0
  96. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/protocol/message.py +0 -0
  97. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/protocol/metadata.py +0 -0
  98. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/protocol/offset_for_leader_epoch.py +0 -0
  99. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/protocol/parser.py +0 -0
  100. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/protocol/pickle.py +0 -0
  101. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/protocol/produce.py +0 -0
  102. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/protocol/sasl_authenticate.py +0 -0
  103. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/protocol/sasl_handshake.py +0 -0
  104. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/protocol/struct.py +0 -0
  105. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/protocol/txn_offset_commit.py +0 -0
  106. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/protocol/types.py +0 -0
  107. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/record/__init__.py +0 -0
  108. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/record/_crc32c.py +0 -0
  109. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/record/abc.py +0 -0
  110. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/record/default_records.py +0 -0
  111. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/record/legacy_records.py +0 -0
  112. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/record/memory_records.py +0 -0
  113. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/record/util.py +0 -0
  114. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/sasl/__init__.py +0 -0
  115. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/sasl/abc.py +0 -0
  116. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/sasl/msk.py +0 -0
  117. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/sasl/oauth.py +0 -0
  118. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/sasl/plain.py +0 -0
  119. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/sasl/scram.py +0 -0
  120. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/sasl/sspi.py +0 -0
  121. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/serializer/__init__.py +0 -0
  122. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/serializer/abstract.py +0 -0
  123. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/socks5_wrapper.py +0 -0
  124. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/structs.py +0 -0
  125. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/util.py +0 -0
  126. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/vendor/__init__.py +0 -0
  127. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/vendor/enum34.py +0 -0
  128. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/vendor/selectors34.py +0 -0
  129. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/vendor/six.py +0 -0
  130. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka/vendor/socketpair.py +0 -0
  131. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka_python.egg-info/SOURCES.txt +0 -0
  132. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka_python.egg-info/dependency_links.txt +0 -0
  133. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka_python.egg-info/requires.txt +0 -0
  134. {kafka_python-2.2.12 → kafka_python-2.2.14}/kafka_python.egg-info/top_level.txt +0 -0
  135. {kafka_python-2.2.12 → kafka_python-2.2.14}/pyproject.toml +0 -0
  136. {kafka_python-2.2.12 → kafka_python-2.2.14}/setup.cfg +0 -0
  137. {kafka_python-2.2.12 → kafka_python-2.2.14}/setup.py +0 -0
  138. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/integration/__init__.py +0 -0
  139. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/integration/conftest.py +0 -0
  140. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/integration/fixtures.py +0 -0
  141. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/integration/test_admin_integration.py +0 -0
  142. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/integration/test_consumer_group.py +0 -0
  143. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/integration/test_consumer_integration.py +0 -0
  144. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/integration/test_producer_integration.py +0 -0
  145. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/integration/test_sasl_integration.py +0 -0
  146. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/test_acl_comparisons.py +0 -0
  147. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/test_admin.py +0 -0
  148. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/test_api_object_implementation.py +0 -0
  149. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/test_assignors.py +0 -0
  150. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/test_client_async.py +0 -0
  151. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/test_cluster.py +0 -0
  152. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/test_codec.py +0 -0
  153. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/test_conn.py +0 -0
  154. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/test_consumer.py +0 -0
  155. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/test_coordinator.py +0 -0
  156. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/test_fetcher.py +0 -0
  157. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/test_metrics.py +0 -0
  158. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/test_object_conversion.py +0 -0
  159. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/test_package.py +0 -0
  160. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/test_partition_movements.py +0 -0
  161. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/test_partitioner.py +0 -0
  162. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/test_producer.py +0 -0
  163. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/test_protocol.py +0 -0
  164. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/test_record_accumulator.py +0 -0
  165. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/test_sender.py +0 -0
  166. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/test_subscription_state.py +0 -0
  167. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/test_util.py +0 -0
  168. {kafka_python-2.2.12 → kafka_python-2.2.14}/test/testutil.py +0 -0
@@ -1,3 +1,18 @@
1
+ # 2.2.14 (June 27, 2025)
2
+
3
+ Fixes
4
+ * python2 fixups (#2655)
5
+ * Fix coordinator lock contention during close() (#2652)
6
+
7
+ # 2.2.13 (June 20, 2025)
8
+
9
+ Fixes
10
+ * Use client.await_ready() to simplify blocking wait and add timeout to admin client (#2648)
11
+ * Fixup import style in example.py
12
+
13
+ Documentation
14
+ * update README kafka version badge to include 4.0
15
+
1
16
  # 2.2.12 (June 18, 2025)
2
17
 
3
18
  Fixes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kafka-python
3
- Version: 2.2.12
3
+ Version: 2.2.14
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
@@ -45,7 +45,7 @@ Requires-Dist: pyperf; extra == "benchmarks"
45
45
  Kafka Python client
46
46
  ------------------------
47
47
 
48
- .. image:: https://img.shields.io/badge/kafka-3.9--0.8-brightgreen.svg
48
+ .. image:: https://img.shields.io/badge/kafka-4.0--0.8-brightgreen.svg
49
49
  :target: https://kafka-python.readthedocs.io/en/master/compatibility.html
50
50
  .. image:: https://img.shields.io/pypi/pyversions/kafka-python.svg
51
51
  :target: https://pypi.python.org/pypi/kafka-python
@@ -1,7 +1,7 @@
1
1
  Kafka Python client
2
2
  ------------------------
3
3
 
4
- .. image:: https://img.shields.io/badge/kafka-3.9--0.8-brightgreen.svg
4
+ .. image:: https://img.shields.io/badge/kafka-4.0--0.8-brightgreen.svg
5
5
  :target: https://kafka-python.readthedocs.io/en/master/compatibility.html
6
6
  .. image:: https://img.shields.io/pypi/pyversions/kafka-python.svg
7
7
  :target: https://pypi.python.org/pypi/kafka-python
@@ -17,6 +17,7 @@ import kafka.errors as Errors
17
17
  from kafka.errors import (
18
18
  IncompatibleBrokerVersion, KafkaConfigurationError, UnknownTopicOrPartitionError,
19
19
  UnrecognizedBrokerVersion, IllegalArgumentError)
20
+ from kafka.future import Future
20
21
  from kafka.metrics import MetricConfig, Metrics
21
22
  from kafka.protocol.admin import (
22
23
  CreateTopicsRequest, DeleteTopicsRequest, DescribeConfigsRequest, AlterConfigsRequest, CreatePartitionsRequest,
@@ -358,14 +359,11 @@ class KafkaAdminClient(object):
358
359
 
359
360
  Returns:
360
361
  A future object that may be polled for status and results.
361
-
362
- Raises:
363
- The exception if the message could not be sent.
364
362
  """
365
- while not self._client.ready(node_id):
366
- # poll until the connection to broker is ready, otherwise send()
367
- # will fail with NodeNotReadyError
368
- self._client.poll(timeout_ms=200)
363
+ try:
364
+ self._client.await_ready(node_id)
365
+ except Errors.KafkaConnectionError as e:
366
+ return Future().failure(e)
369
367
  return self._client.send(node_id, request, wakeup)
370
368
 
371
369
  def _send_request_to_controller(self, request):
@@ -613,7 +613,8 @@ class Fetcher(six.Iterator):
613
613
  fetchable = self._subscriptions.fetchable_partitions()
614
614
  # do not fetch a partition if we have a pending fetch response to process
615
615
  # use copy.copy to avoid runtimeerror on mutation from different thread
616
- discard = {fetch.topic_partition for fetch in self._completed_fetches.copy()}
616
+ # TODO: switch to deque.copy() with py3
617
+ discard = {fetch.topic_partition for fetch in copy.copy(self._completed_fetches)}
617
618
  current = self._next_partition_records
618
619
  if current:
619
620
  discard.add(current.topic_partition)
@@ -857,14 +857,12 @@ class BaseCoordinator(object):
857
857
  self._heartbeat_thread.disable()
858
858
 
859
859
  def _close_heartbeat_thread(self, timeout_ms=None):
860
- with self._lock:
861
- if self._heartbeat_thread is not None:
862
- heartbeat_log.info('Stopping heartbeat thread')
863
- try:
864
- self._heartbeat_thread.close(timeout_ms=timeout_ms)
865
- except ReferenceError:
866
- pass
867
- self._heartbeat_thread = None
860
+ if self._heartbeat_thread is not None:
861
+ try:
862
+ self._heartbeat_thread.close(timeout_ms=timeout_ms)
863
+ except ReferenceError:
864
+ pass
865
+ self._heartbeat_thread = None
868
866
 
869
867
  def __del__(self):
870
868
  try:
@@ -1047,17 +1045,20 @@ class HeartbeatThread(threading.Thread):
1047
1045
  self.enabled = False
1048
1046
 
1049
1047
  def close(self, timeout_ms=None):
1050
- if self.closed:
1051
- return
1052
- self.closed = True
1048
+ with self.coordinator._lock:
1049
+ if self.closed:
1050
+ return
1053
1051
 
1054
- # Generally this should not happen - close() is triggered
1055
- # by the coordinator. But in some cases GC may close the coordinator
1056
- # from within the heartbeat thread.
1057
- if threading.current_thread() == self:
1058
- return
1052
+ heartbeat_log.info('Stopping heartbeat thread')
1053
+ self.closed = True
1059
1054
 
1060
- with self.coordinator._lock:
1055
+ # Generally this should not happen - close() is triggered
1056
+ # by the coordinator. But in some cases GC may close the coordinator
1057
+ # from within the heartbeat thread.
1058
+ if threading.current_thread() == self:
1059
+ return
1060
+
1061
+ # Notify coordinator lock to wake thread from sleep/lock.wait
1061
1062
  self.coordinator._lock.notify()
1062
1063
 
1063
1064
  if self.is_alive():
@@ -68,10 +68,10 @@ class SaslMechanismGSSAPI(SaslMechanism):
68
68
  # simply set QoP to 'auth' only (first octet). We reuse the max message size proposed
69
69
  # by the server
70
70
  client_flags = self.SASL_QOP_AUTH
71
- server_flags = msg[0]
71
+ server_flags = struct.Struct('>b').unpack(msg[0:1])[0]
72
72
  message_parts = [
73
73
  struct.Struct('>b').pack(client_flags & server_flags),
74
- msg[1:],
74
+ msg[1:], # always agree to max message size from server
75
75
  self.auth_id.encode('utf-8'),
76
76
  ]
77
77
  # add authorization identity to the response, and GSS-wrap
@@ -0,0 +1 @@
1
+ __version__ = '2.2.14'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kafka-python
3
- Version: 2.2.12
3
+ Version: 2.2.14
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
@@ -45,7 +45,7 @@ Requires-Dist: pyperf; extra == "benchmarks"
45
45
  Kafka Python client
46
46
  ------------------------
47
47
 
48
- .. image:: https://img.shields.io/badge/kafka-3.9--0.8-brightgreen.svg
48
+ .. image:: https://img.shields.io/badge/kafka-4.0--0.8-brightgreen.svg
49
49
  :target: https://kafka-python.readthedocs.io/en/master/compatibility.html
50
50
  .. image:: https://img.shields.io/pypi/pyversions/kafka-python.svg
51
51
  :target: https://pypi.python.org/pypi/kafka-python
@@ -1 +0,0 @@
1
- __version__ = '2.2.12'
File without changes
File without changes
File without changes
File without changes
File without changes