kafka-python 2.2.0__py2.py3-none-any.whl → 2.2.2__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
@@ -274,7 +274,7 @@ class KafkaAdminClient(object):
274
274
  self._controller_id = controller_id
275
275
  return
276
276
  else:
277
- raise Errors.NodeNotAvailableError('controller')
277
+ raise Errors.NodeNotReadyError('controller')
278
278
  else:
279
279
  raise UnrecognizedBrokerVersion(
280
280
  "Kafka Admin interface cannot determine the controller using MetadataRequest_v{}."
kafka/conn.py CHANGED
@@ -301,6 +301,7 @@ class BrokerConnection(object):
301
301
  if self.config['ssl_context'] is not None:
302
302
  self._ssl_context = self.config['ssl_context']
303
303
  self._api_versions_future = None
304
+ self._api_versions_check_timeout = self.config['api_version_auto_timeout_ms']
304
305
  self._sasl_auth_future = None
305
306
  self.last_attempt = 0
306
307
  self._gai = []
@@ -557,7 +558,8 @@ class BrokerConnection(object):
557
558
  else:
558
559
  request = ApiVersionsRequest[version]()
559
560
  future = Future()
560
- response = self._send(request, blocking=True, request_timeout_ms=(self.config['api_version_auto_timeout_ms'] * 0.8))
561
+ self._api_versions_check_timeout /= 2
562
+ response = self._send(request, blocking=True, request_timeout_ms=self._api_versions_check_timeout)
561
563
  response.add_callback(self._handle_api_versions_response, future)
562
564
  response.add_errback(self._handle_api_versions_failure, future)
563
565
  self._api_versions_future = future
@@ -566,7 +568,8 @@ class BrokerConnection(object):
566
568
  elif self._check_version_idx < len(self.VERSION_CHECKS):
567
569
  version, request = self.VERSION_CHECKS[self._check_version_idx]
568
570
  future = Future()
569
- response = self._send(request, blocking=True, request_timeout_ms=(self.config['api_version_auto_timeout_ms'] * 0.8))
571
+ self._api_versions_check_timeout /= 2
572
+ response = self._send(request, blocking=True, request_timeout_ms=self._api_versions_check_timeout)
570
573
  response.add_callback(self._handle_check_version_response, future, version)
571
574
  response.add_errback(self._handle_check_version_failure, future)
572
575
  self._api_versions_future = future
@@ -618,7 +621,13 @@ class BrokerConnection(object):
618
621
 
619
622
  def _handle_api_versions_failure(self, future, ex):
620
623
  future.failure(ex)
621
- self._check_version_idx = 0
624
+ # Modern brokers should not disconnect on unrecognized api-versions request,
625
+ # but in case they do we always want to try v0 as a fallback
626
+ # otherwise switch to check_version probe.
627
+ if self._api_versions_idx > 0:
628
+ self._api_versions_idx = 0
629
+ else:
630
+ self._check_version_idx = 0
622
631
  # after failure connection is closed, so state should already be DISCONNECTED
623
632
 
624
633
  def _handle_check_version_response(self, future, version, _response):
kafka/consumer/group.py CHANGED
@@ -877,7 +877,7 @@ class KafkaConsumer(six.Iterator):
877
877
 
878
878
  for tp in partitions:
879
879
  log.debug("Seeking to beginning of partition %s", tp)
880
- self._subscription.need_offset_reset(tp, OffsetResetStrategy.EARLIEST)
880
+ self._subscription.request_offset_reset(tp, OffsetResetStrategy.EARLIEST)
881
881
  self._iterator = None
882
882
 
883
883
  def seek_to_end(self, *partitions):
@@ -902,7 +902,7 @@ class KafkaConsumer(six.Iterator):
902
902
 
903
903
  for tp in partitions:
904
904
  log.debug("Seeking to end of partition %s", tp)
905
- self._subscription.need_offset_reset(tp, OffsetResetStrategy.LATEST)
905
+ self._subscription.request_offset_reset(tp, OffsetResetStrategy.LATEST)
906
906
  self._iterator = None
907
907
 
908
908
  def subscribe(self, topics=(), pattern=None, listener=None):
kafka/producer/sender.py CHANGED
@@ -315,7 +315,7 @@ class Sender(threading.Thread):
315
315
  return True
316
316
 
317
317
  except Exception as e:
318
- log.warn("%s: Got an exception when trying to find a node to send a transactional request to. Going to back off and retry", str(self), e)
318
+ log.warn("%s: Got an exception when trying to find a node to send a transactional request to. Going to back off and retry: %s", str(self), e)
319
319
  if next_request_handler.needs_coordinator():
320
320
  self._transaction_manager.lookup_coordinator_for_request(next_request_handler)
321
321
  break
@@ -260,7 +260,7 @@ class TransactionManager(object):
260
260
  with self._lock:
261
261
  if self._current_state == TransactionState.ABORTING_TRANSACTION:
262
262
  log.debug("Skipping transition to abortable error state since the transaction is already being "
263
- " aborted. Underlying exception: ", exc)
263
+ " aborted. Underlying exception: %s", exc)
264
264
  return
265
265
  self._transition_to(TransactionState.ABORTABLE_ERROR, error=exc)
266
266
 
@@ -687,7 +687,7 @@ class AddPartitionsToTxnHandler(TxnRequestHandler):
687
687
  if error is Errors.NoError:
688
688
  continue
689
689
  elif error in (Errors.CoordinatorNotAvailableError, Errors.NotCoordinatorError):
690
- self.transaction_manager._lookup_coordinator('transaction', self.transactiona_id)
690
+ self.transaction_manager._lookup_coordinator('transaction', self.transactional_id)
691
691
  self.reenqueue()
692
692
  return
693
693
  elif error is Errors.ConcurrentTransactionsError:
@@ -726,7 +726,7 @@ class AddPartitionsToTxnHandler(TxnRequestHandler):
726
726
  self.transaction_manager._pending_partitions_in_transaction -= partitions
727
727
 
728
728
  if unauthorized_topics:
729
- self.abortable_error(Errors.TopicAuthorizationError(unauthorized_topics))
729
+ self.abortable_error(Errors.TopicAuthorizationFailedError(unauthorized_topics))
730
730
  elif has_partition_errors:
731
731
  self.abortable_error(Errors.KafkaError("Could not add partitions to transaction due to errors: %s" % (results)))
732
732
  else:
@@ -795,7 +795,7 @@ class FindCoordinatorHandler(TxnRequestHandler):
795
795
  elif error is Errors.TransactionalIdAuthorizationFailedError:
796
796
  self.fatal_error(error())
797
797
  elif error is Errors.GroupAuthorizationFailedError:
798
- self.abortable_error(Errors.GroupAuthorizationError(self._coord_key))
798
+ self.abortable_error(error(self._coord_key))
799
799
  else:
800
800
  self.fatal_error(Errors.KafkaError(
801
801
  "Could not find a coordinator with type %s with key %s due to"
@@ -888,7 +888,7 @@ class AddOffsetsToTxnHandler(TxnRequestHandler):
888
888
  elif error is Errors.TransactionalIdAuthorizationFailedError:
889
889
  self.fatal_error(error())
890
890
  elif error is Errors.GroupAuthorizationFailedError:
891
- self.abortable_error(Errors.GroupAuthorizationError(self.consumer_group_id))
891
+ self.abortable_error(error(self.consumer_group_id))
892
892
  else:
893
893
  self.fatal_error(Errors.KafkaError("Unexpected error in AddOffsetsToTxnResponse: %s" % (error())))
894
894
 
@@ -955,7 +955,7 @@ class TxnOffsetCommitHandler(TxnRequestHandler):
955
955
  elif error is Errors.UnknownTopicOrPartitionError:
956
956
  retriable_failure = True
957
957
  elif error is Errors.GroupAuthorizationFailedError:
958
- self.abortable_error(Errors.GroupAuthorizationError(self.consumer_group_id))
958
+ self.abortable_error(error(self.consumer_group_id))
959
959
  return
960
960
  elif error in (Errors.TransactionalIdAuthorizationFailedError,
961
961
  Errors.InvalidProducerEpochError,
@@ -117,6 +117,8 @@ class DefaultRecordBase(object):
117
117
  checker, name = codecs.has_lz4, "lz4"
118
118
  elif compression_type == self.CODEC_ZSTD:
119
119
  checker, name = codecs.has_zstd, "zstd"
120
+ else:
121
+ raise UnsupportedCodecError("Unrecognized compression type: %s" % (compression_type,))
120
122
  if not checker():
121
123
  raise UnsupportedCodecError(
122
124
  "Libraries for {} compression codec not found".format(name))
kafka/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = '2.2.0'
1
+ __version__ = '2.2.2'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kafka-python
3
- Version: 2.2.0
3
+ Version: 2.2.2
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
@@ -138,6 +138,14 @@ that expose basic message attributes: topic, partition, offset, key, and value:
138
138
  for msg in consumer:
139
139
  print (msg.headers)
140
140
 
141
+ .. code-block:: python
142
+
143
+ # Read only committed messages from transactional topic
144
+ consumer = KafkaConsumer(isolation_level='read_committed')
145
+ consumer.subscribe(['txn_topic'])
146
+ for msg in consumer:
147
+ print(msg)
148
+
141
149
  .. code-block:: python
142
150
 
143
151
  # Get consumer metrics
@@ -197,6 +205,21 @@ for more details.
197
205
  for i in range(1000):
198
206
  producer.send('foobar', b'msg %d' % i)
199
207
 
208
+ .. code-block:: python
209
+
210
+ # Use transactions
211
+ producer = KafkaProducer(transactional_id='fizzbuzz')
212
+ producer.init_transactions()
213
+ producer.begin_transaction()
214
+ future = producer.send('txn_topic', value=b'yes')
215
+ future.get() # wait for successful produce
216
+ producer.commit_transaction() # commit the transaction
217
+
218
+ producer.begin_transaction()
219
+ future = producer.send('txn_topic', value=b'no')
220
+ future.get() # wait for successful produce
221
+ producer.abort_transaction() # abort the transaction
222
+
200
223
  .. code-block:: python
201
224
 
202
225
  # Include record headers. The format is list of tuples with string key
@@ -2,16 +2,16 @@ kafka/__init__.py,sha256=4dvHKZAxmD_4tfJ5wGcRV2X78vPcm8vsUoqceULevjA,1077
2
2
  kafka/client_async.py,sha256=joZB3AnL1mLwvV5fv61Pqn8mkP90FVvzcZ2tZsTGmvM,57060
3
3
  kafka/cluster.py,sha256=f9VNkWanz8X2Rn67XDdmunfx5aJ4s35JUsF5VYJ5hvk,16143
4
4
  kafka/codec.py,sha256=8NZpnehzNrhSBIjzbPVSvyFbSeLAqEntE7BfVHu-_9I,10036
5
- kafka/conn.py,sha256=Dw7v16R1nlbRagYNeBMJ4mbNXjdxCPd8owaPpRFoJ7w,69560
5
+ kafka/conn.py,sha256=IdWJTEYTalvsmnT74P0eu1Jzx6YdPyemvQovRoBQ8NM,70019
6
6
  kafka/errors.py,sha256=J3R7z2hkbWA1hsD-bGHdRjcz6BYjP6RNVSQswA2UMmE,33749
7
7
  kafka/future.py,sha256=ZQStbfUYIPJRrgMfAWxxjrIRVxsw4WCtSR0J0bkyGno,2847
8
8
  kafka/socks5_wrapper.py,sha256=6woOaCTJXJ5e89_zdyW5BjOpyE4rCbYFH-kd-FeuPuk,9827
9
9
  kafka/structs.py,sha256=SJGzmLdV21jZyQ7247k0WFy16UiusgTHK3I-e4qzI-E,3058
10
10
  kafka/util.py,sha256=LV6BlELC8-889FpWM1RECX25sccoVrY2U0r5dRZjLNo,3781
11
- kafka/version.py,sha256=Vyf6P6UCZKFeQtRzYujPmFfdlqSfnc01VEMWE3O0ZrA,22
11
+ kafka/version.py,sha256=jsJ9CNIuUt8dDFB4i0PiBf07nzBU0RtG1CVRQ7TdoQ0,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=Mg0iuTFLOwc34JNQs99JvC0uDI_ZwZhF7x2jaEVstT4,78933
14
+ kafka/admin/client.py,sha256=RabA8l8Im3iBEXgPVkiofNW6QyeatQHaymBWFZ8Sxkw,78929
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
@@ -24,7 +24,7 @@ kafka/benchmarks/record_batch_read.py,sha256=vlFaWU2YWI379n_2M8qieb_S2uHUWKV0Nqu
24
24
  kafka/benchmarks/varint_speed.py,sha256=s4CuvKgDZL-_zna5E3vM8RgHjhXuW6pcaO1z1WYZ_0Y,12585
25
25
  kafka/consumer/__init__.py,sha256=NDdvtyuJgFyQZahqL9i5sYXGP6rOMIXWwHQEaZ1fCcs,122
26
26
  kafka/consumer/fetcher.py,sha256=0SUg8_8W0b-sVDg8dMq06ydR3P_mIGvUwxfbYI8cUIE,67963
27
- kafka/consumer/group.py,sha256=srZ66Ai0gVubsCKgjHv8mQSJh8y9O-PGeEyiZY97tto,58851
27
+ kafka/consumer/group.py,sha256=Jvoal4SdOniweXeUhhYR_HxDUJmmUiKf4WrI_tuJfCQ,58857
28
28
  kafka/consumer/subscription_state.py,sha256=f_qJQMhTWQnUd_7lPj43gsagWSKGEmP4jpnEwA6s1Ec,23661
29
29
  kafka/coordinator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
30
  kafka/coordinator/base.py,sha256=a6GZKCz4kHKxHNhvwQXr2cTVKm3PH5A-ybDBIN_Dr3Y,50640
@@ -69,8 +69,8 @@ kafka/producer/__init__.py,sha256=i3Wxih0NHjmqCkRNE54ial8fBp9siqabUE6ZGyL6oX8,12
69
69
  kafka/producer/future.py,sha256=UC3-g9QlgVFmbitrtMXVpeP0Pbvr7xl2kcw6bAehKG8,2983
70
70
  kafka/producer/kafka.py,sha256=tDCw1qr--ij4T88h2bIGxH7JQaRukkTl_kgnU83rRio,53379
71
71
  kafka/producer/record_accumulator.py,sha256=a_mdSATxl-3dVT2rVFh1gTwAv0wUzNbGwVXScwWJ5AE,28072
72
- kafka/producer/sender.py,sha256=-QOIp74ony5VwTykxksoIIJVbqZy2N2RJidx2tozpMs,37686
73
- kafka/producer/transaction_manager.py,sha256=cZlKFEZI6CY5zXEcTmCQE7TOyvK5V3H4FZLS1BKKEdY,41603
72
+ kafka/producer/sender.py,sha256=2EeA3c7po89F2BLTPjex8-MFKzrCdbXAPvHHDa0SOec,37690
73
+ kafka/producer/transaction_manager.py,sha256=HNfJNZwNfJtYdftn9SeaDfi7I5MKk0LD3sK64inuPt0,41537
74
74
  kafka/protocol/__init__.py,sha256=T1RBBlTH3zze0Cr1RqemPD4Z1b3IUDRmLOBfZTsPgLs,1184
75
75
  kafka/protocol/abstract.py,sha256=uOnuf6D8OTkL31Tp2QXG3VlzDPHVELGzM_bpSVa-_iw,424
76
76
  kafka/protocol/add_offsets_to_txn.py,sha256=Hya7vg6yqsV9XGLKWi8rES_VuN47-H4fdycg6mx8GLY,1486
@@ -101,7 +101,7 @@ kafka/protocol/types.py,sha256=f-lwfCqsJulYnBT1loek_KbMnZZqItN4YRIONjg3kbE,10244
101
101
  kafka/record/__init__.py,sha256=Q20hP_R5XX3AEnAlPkpoWzTLShESvxUT2OLXmI-JYEQ,129
102
102
  kafka/record/_crc32c.py,sha256=Ok-P62Yvg6D6rMGM9Z56OMjZWQlnps4xBbakg-sdxvI,5761
103
103
  kafka/record/abc.py,sha256=z1UYURHbD2RyyGRpVXKP598jck5eXU9p4M6iUo6ZSFo,4110
104
- kafka/record/default_records.py,sha256=l4DoU9eAkSn_f-ISfrMS8AOVYc846oLV_yMV91hsXH8,25879
104
+ kafka/record/default_records.py,sha256=IuICFp0soETihkp8bUyjjksqTlzU45o-UYmo8joLBmo,25992
105
105
  kafka/record/legacy_records.py,sha256=bm1Y24PLVgLKtWqamESKvMk9P01uw3aQ8Z8q2QHxJy8,18858
106
106
  kafka/record/memory_records.py,sha256=b7RFxvaQ93drXSk3o3_YB3FQlVoESoBlGj3Z5PD25n8,8874
107
107
  kafka/record/util.py,sha256=LDajBWdYVetmXts_t9Q76CxEx7njgC9LnjMgz9yPEMM,3556
@@ -120,7 +120,7 @@ kafka/vendor/enum34.py,sha256=-u-lxAiJMt6ru4Do7NUDY9OpeWkYJMksb2xengJawFE,31204
120
120
  kafka/vendor/selectors34.py,sha256=gxejLO4eXf8mRSGXaQiknPig3GdX1rtsZiYOQJVuAy8,20594
121
121
  kafka/vendor/six.py,sha256=lLBa9_HrANP5BMZ7twEzg1M3wofwPmXyptuWmHX0brY,34826
122
122
  kafka/vendor/socketpair.py,sha256=Fi3PoY1Okkppab720wFk1BhHXyjcw7hi5DwhqrYZH2Y,2737
123
- kafka_python-2.2.0.dist-info/METADATA,sha256=x1LtFM2aZJ8q5xluEEbOZrUXI_l7ZAQtd_db0IPN9Zs,9198
124
- kafka_python-2.2.0.dist-info/WHEEL,sha256=XAkygS4h1cf0JYWV13kJhTWht2y9NqKAsZuiTHc2920,109
125
- kafka_python-2.2.0.dist-info/top_level.txt,sha256=IivJz7l5WHdLNDT6RIiVAlhjQzYRwGqBBmKHZ7WjPeM,6
126
- kafka_python-2.2.0.dist-info/RECORD,,
123
+ kafka_python-2.2.2.dist-info/METADATA,sha256=EuIBIkLV9AnC3o6uwA2Q958lceSJRuqr3AJw3gYyoKE,9951
124
+ kafka_python-2.2.2.dist-info/WHEEL,sha256=_itY3bZllKbLk93i0gzNzdweAt5eocJdfN7atrjOnvQ,109
125
+ kafka_python-2.2.2.dist-info/top_level.txt,sha256=IivJz7l5WHdLNDT6RIiVAlhjQzYRwGqBBmKHZ7WjPeM,6
126
+ kafka_python-2.2.2.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.0.0)
2
+ Generator: setuptools (80.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py2-none-any
5
5
  Tag: py3-none-any