kafka-python 3.0.4__tar.gz → 3.0.5__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.
- {kafka_python-3.0.4 → kafka_python-3.0.5}/CHANGES.md +14 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/PKG-INFO +1 -1
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/net/manager.py +5 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/fields/array.py +19 -4
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/fields/codecs/encode_buffer.py +40 -1
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/fields/codecs/tagged_fields.py +1 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/fields/codecs/types.py +31 -12
- kafka_python-3.0.5/kafka/protocol/schemas/fields/codegen.py +71 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/fields/struct.py +10 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/fields/struct_array.py +6 -1
- kafka_python-3.0.5/kafka/version.py +1 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka_python.egg-info/PKG-INFO +1 -1
- {kafka_python-3.0.4 → kafka_python-3.0.5}/test/net/test_manager.py +50 -2
- kafka_python-3.0.4/kafka/protocol/schemas/fields/codegen.py +0 -40
- kafka_python-3.0.4/kafka/version.py +0 -1
- {kafka_python-3.0.4 → kafka_python-3.0.5}/AUTHORS.md +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/LICENSE +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/MANIFEST.in +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/README.rst +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/__main__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/admin/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/admin/__main__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/admin/_acls.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/admin/_cluster.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/admin/_configs.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/admin/_groups.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/admin/_partitions.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/admin/_topics.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/admin/_transactions.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/admin/_users.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/admin/client.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/benchmarks/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/benchmarks/consumer_performance.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/benchmarks/load_example.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/benchmarks/producer_encode_path.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/benchmarks/producer_performance.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/benchmarks/profile_protocol.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/benchmarks/protocol_old_vs_new.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/benchmarks/record_batch_compose.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/benchmarks/record_batch_read.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/benchmarks/varint_speed.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/acls/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/acls/common.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/acls/create.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/acls/delete.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/acls/describe.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/cluster/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/cluster/describe.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/cluster/describe_quorum.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/cluster/features.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/cluster/log_dirs.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/cluster/versions.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/configs/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/configs/alter.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/configs/common.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/configs/describe.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/configs/list.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/configs/reset.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/groups/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/groups/alter_offsets.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/groups/delete.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/groups/delete_offsets.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/groups/describe.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/groups/list.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/groups/list_offsets.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/groups/remove_members.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/groups/reset_offsets.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/partitions/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/partitions/alter_reassignments.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/partitions/create.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/partitions/delete_records.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/partitions/describe.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/partitions/elect_leaders.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/partitions/list_offsets.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/partitions/list_reassignments.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/topics/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/topics/create.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/topics/delete.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/topics/describe.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/topics/list.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/transactions/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/transactions/abort.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/transactions/describe.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/transactions/describe_producers.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/transactions/find_hanging.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/transactions/list.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/users/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/users/alter_user_scram_credentials.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/admin/users/describe_user_scram_credentials.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/common.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/consumer/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cli/producer/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/cluster.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/codec.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/consumer/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/consumer/__main__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/consumer/fetcher.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/consumer/group.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/consumer/subscription_state.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/coordinator/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/coordinator/assignors/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/coordinator/assignors/abstract.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/coordinator/assignors/cooperative_sticky.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/coordinator/assignors/range.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/coordinator/assignors/roundrobin.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/coordinator/assignors/sticky/StickyAssignorUserData.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/coordinator/assignors/sticky/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/coordinator/assignors/sticky/partition_movements.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/coordinator/assignors/sticky/sorted_set.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/coordinator/assignors/sticky/sticky_assignor.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/coordinator/assignors/sticky/user_data.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/coordinator/base.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/coordinator/consumer.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/coordinator/heartbeat.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/coordinator/subscription.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/errors.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/future.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/metrics/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/metrics/compound_stat.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/metrics/dict_reporter.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/metrics/kafka_metric.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/metrics/measurable.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/metrics/measurable_stat.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/metrics/metric_config.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/metrics/metric_name.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/metrics/metrics.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/metrics/metrics_reporter.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/metrics/quota.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/metrics/stat.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/metrics/stats/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/metrics/stats/avg.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/metrics/stats/count.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/metrics/stats/histogram.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/metrics/stats/max_stat.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/metrics/stats/min_stat.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/metrics/stats/percentile.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/metrics/stats/percentiles.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/metrics/stats/rate.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/metrics/stats/sampled_stat.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/metrics/stats/sensor.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/metrics/stats/total.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/net/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/net/compat.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/net/connection.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/net/http_connect.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/net/inet.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/net/metrics.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/net/sasl/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/net/sasl/abc.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/net/sasl/gssapi.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/net/sasl/msk.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/net/sasl/oauth.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/net/sasl/plain.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/net/sasl/scram.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/net/sasl/sspi.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/net/selector.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/net/socks5.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/net/transport.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/net/wakeup_notifier.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/partitioner/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/partitioner/abc.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/partitioner/default.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/partitioner/sticky.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/producer/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/producer/__main__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/producer/future.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/producer/kafka.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/producer/producer_batch.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/producer/record_accumulator.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/producer/sender.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/producer/transaction_manager.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/admin/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/admin/acl.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/admin/acl.pyi +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/admin/client_quotas.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/admin/client_quotas.pyi +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/admin/cluster.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/admin/cluster.pyi +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/admin/configs.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/admin/configs.pyi +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/admin/groups.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/admin/groups.pyi +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/admin/topics.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/admin/topics.pyi +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/admin/transactions.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/admin/transactions.pyi +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/admin/users.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/admin/users.pyi +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/api_data.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/api_header.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/api_key.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/api_message.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/broker_version_data.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/consumer/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/consumer/fetch.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/consumer/fetch.pyi +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/consumer/group.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/consumer/group.pyi +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/consumer/metadata.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/consumer/metadata.pyi +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/consumer/offsets.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/consumer/offsets.pyi +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/data_container.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/frame.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/generate_stubs.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/metadata/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/metadata/api_versions.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/metadata/api_versions.pyi +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/metadata/find_coordinator.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/metadata/find_coordinator.pyi +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/metadata/metadata.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/metadata/metadata.pyi +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/old/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/old/abstract.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/old/add_offsets_to_txn.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/old/add_partitions_to_txn.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/old/admin.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/old/api.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/old/api_versions.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/old/commit.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/old/consumer_protocol.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/old/end_txn.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/old/fetch.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/old/find_coordinator.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/old/group.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/old/init_producer_id.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/old/list_offsets.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/old/metadata.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/old/offset_for_leader_epoch.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/old/produce.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/old/sasl_authenticate.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/old/sasl_handshake.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/old/struct.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/old/txn_offset_commit.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/old/types.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/parser.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/producer/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/producer/produce.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/producer/produce.pyi +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/producer/transaction.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/producer/transaction.pyi +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/sasl.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/sasl.pyi +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/fields/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/fields/base.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/fields/codecs/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/fields/simple.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/load_json.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/AddOffsetsToTxnRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/AddOffsetsToTxnResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/AddPartitionsToTxnRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/AddPartitionsToTxnResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/AlterClientQuotasRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/AlterClientQuotasResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/AlterConfigsRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/AlterConfigsResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/AlterPartitionReassignmentsRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/AlterPartitionReassignmentsResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/AlterReplicaLogDirsRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/AlterReplicaLogDirsResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/AlterUserScramCredentialsRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/AlterUserScramCredentialsResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/ApiVersionsRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/ApiVersionsResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/ConsumerProtocolAssignment.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/ConsumerProtocolSubscription.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/CreateAclsRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/CreateAclsResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/CreatePartitionsRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/CreatePartitionsResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/CreateTopicsRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/CreateTopicsResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/DeleteAclsRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/DeleteAclsResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/DeleteGroupsRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/DeleteGroupsResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/DeleteRecordsRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/DeleteRecordsResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/DeleteTopicsRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/DeleteTopicsResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/DescribeAclsRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/DescribeAclsResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/DescribeClientQuotasRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/DescribeClientQuotasResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/DescribeClusterRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/DescribeClusterResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/DescribeConfigsRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/DescribeConfigsResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/DescribeGroupsRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/DescribeGroupsResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/DescribeLogDirsRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/DescribeLogDirsResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/DescribeProducersRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/DescribeProducersResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/DescribeQuorumRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/DescribeQuorumResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/DescribeTopicPartitionsRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/DescribeTopicPartitionsResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/DescribeTransactionsRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/DescribeTransactionsResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/DescribeUserScramCredentialsRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/DescribeUserScramCredentialsResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/ElectLeadersRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/ElectLeadersResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/EndTxnRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/EndTxnResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/FetchRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/FetchResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/FindCoordinatorRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/FindCoordinatorResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/HeartbeatRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/HeartbeatResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/IncrementalAlterConfigsRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/IncrementalAlterConfigsResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/InitProducerIdRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/InitProducerIdResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/JoinGroupRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/JoinGroupResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/LeaveGroupRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/LeaveGroupResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/ListConfigResourcesRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/ListConfigResourcesResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/ListGroupsRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/ListGroupsResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/ListOffsetsRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/ListOffsetsResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/ListPartitionReassignmentsRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/ListPartitionReassignmentsResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/ListTransactionsRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/ListTransactionsResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/MetadataRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/MetadataResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/OffsetCommitRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/OffsetCommitResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/OffsetDeleteRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/OffsetDeleteResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/OffsetFetchRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/OffsetFetchResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/OffsetForLeaderEpochRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/OffsetForLeaderEpochResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/ProduceRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/ProduceResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/RequestHeader.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/ResponseHeader.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/SaslAuthenticateRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/SaslAuthenticateResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/SaslHandshakeRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/SaslHandshakeResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/SyncGroupRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/SyncGroupResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/TxnOffsetCommitRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/TxnOffsetCommitResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/UpdateFeaturesRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/UpdateFeaturesResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/WriteTxnMarkersRequest.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/WriteTxnMarkersResponse.json +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/resources/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/record/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/record/_crc32c.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/record/abc.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/record/default_records.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/record/legacy_records.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/record/memory_records.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/record/util.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/serializer/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/serializer/abstract.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/serializer/default.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/serializer/json.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/serializer/wrapper.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/structs.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/util.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/vendor/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka_python.egg-info/SOURCES.txt +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka_python.egg-info/dependency_links.txt +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka_python.egg-info/entry_points.txt +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka_python.egg-info/requires.txt +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/kafka_python.egg-info/top_level.txt +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/pyproject.toml +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/setup.cfg +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/test/integration/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/test/integration/conftest.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/test/integration/fixtures.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/test/integration/test_admin_integration.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/test/integration/test_consumer_integration.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/test/integration/test_producer_integration.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/test/integration/test_sasl_integration.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/test/integration/test_ssl_integration.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/test/net/__init__.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/test/net/test_compat.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/test/net/test_connection.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/test/net/test_http_connect.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/test/net/test_inet.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/test/net/test_sasl_reauthentication.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/test/net/test_selector.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/test/net/test_transport.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/test/net/test_wakeup_notifier.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/test/test_cluster.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/test/test_codec.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/test/test_future.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/test/test_metrics.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/test/test_mock_broker.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/test/test_package.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/test/test_util.py +0 -0
- {kafka_python-3.0.4 → kafka_python-3.0.5}/test/testutil.py +0 -0
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
# 3.0.5 (Jun 24, 2026)
|
|
2
|
+
|
|
3
|
+
### Fixes
|
|
4
|
+
* Reserve buffer capacity before every encode_into write (#3103)
|
|
5
|
+
* Fix backoff on bootstrap init failure after connection_made (#3098)
|
|
6
|
+
|
|
7
|
+
### CI
|
|
8
|
+
* Bump actions/cache from 5 to 6 (#3099)
|
|
9
|
+
* only save kafka dist cache on master (#3100)
|
|
10
|
+
* Fix flakey test: test_send_during_backoff
|
|
11
|
+
|
|
12
|
+
### Documentation
|
|
13
|
+
* Add new extended logging args to docs/cli
|
|
14
|
+
|
|
1
15
|
# 3.0.4 (Jun 23, 2026)
|
|
2
16
|
|
|
3
17
|
### Fixes
|
|
@@ -142,6 +142,9 @@ class KafkaConnectionManager:
|
|
|
142
142
|
raise
|
|
143
143
|
except Exception as exc:
|
|
144
144
|
self._conns.pop(bootstrap_broker.node_id, conn).close(exc)
|
|
145
|
+
backoff_ms = self.update_backoff(bootstrap_broker.node_id)
|
|
146
|
+
log.warning('Bootstrap connection to %s failed: %s (backoff %.2f secs)',
|
|
147
|
+
bootstrap_broker.node_id, exc, backoff_ms / 1000)
|
|
145
148
|
continue
|
|
146
149
|
|
|
147
150
|
try:
|
|
@@ -258,6 +261,8 @@ class KafkaConnectionManager:
|
|
|
258
261
|
return
|
|
259
262
|
conn.connection_made(transport)
|
|
260
263
|
transport = None # conn owns cleanup now; skip finally: transport.close()
|
|
264
|
+
# Note: conn.initialize does not currently raise on error;
|
|
265
|
+
# errors are pushed to conn.init_future and raised on await conn
|
|
261
266
|
await conn.initialize(timeout_at=timeout_at)
|
|
262
267
|
except Exception as exc:
|
|
263
268
|
log.error('Connection failed: %s', exc)
|
|
@@ -72,9 +72,10 @@ class ArrayField(BaseField):
|
|
|
72
72
|
if compact:
|
|
73
73
|
an = ctx.next_var('an')
|
|
74
74
|
ctx.emit(indent, '%s = len(%s) + 1 if %s is not None else 0' % (an, val_expr, val_expr))
|
|
75
|
-
UnsignedVarInt32.emit_encode_into(ctx, an, indent)
|
|
75
|
+
UnsignedVarInt32.emit_encode_into(ctx, an, indent) # reserves the length varint
|
|
76
76
|
ctx.emit(indent, 'if %s is not None:' % val_expr)
|
|
77
77
|
else:
|
|
78
|
+
ctx.emit_reserve(indent, 4)
|
|
78
79
|
ctx.emit(indent, 'if %s is None:' % val_expr)
|
|
79
80
|
ctx.emit(indent, " pack_into('>i', buf, pos, -1)")
|
|
80
81
|
ctx.emit(indent, ' pos += 4')
|
|
@@ -83,9 +84,23 @@ class ArrayField(BaseField):
|
|
|
83
84
|
ctx.emit(indent, ' pos += 4')
|
|
84
85
|
guard = indent + ' '
|
|
85
86
|
item_var = ctx.next_var('ai')
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
87
|
+
elem = self.array_of
|
|
88
|
+
if isinstance(elem, SimpleField) and elem.is_batchable():
|
|
89
|
+
# Fast path: array of fixed-size primitives (e.g. []int32). Reserve
|
|
90
|
+
# the whole run with a single ensure, then write each element inline
|
|
91
|
+
# without a per-element capacity check. The reserve sits inside the
|
|
92
|
+
# `is not None` branch (compact) / `else` branch (non-compact), so
|
|
93
|
+
# len() is always safe here.
|
|
94
|
+
be_fmt = elem._type._be_fmt
|
|
95
|
+
size = elem._type.size
|
|
96
|
+
ctx.emit_reserve(guard, '%d * len(%s)' % (size, val_expr))
|
|
97
|
+
ctx.emit(guard, 'for %s in %s:' % (item_var, val_expr))
|
|
98
|
+
ctx.emit(guard, " pack_into('%s', buf, pos, %s)" % (be_fmt, item_var))
|
|
99
|
+
ctx.emit(guard, ' pos += %d' % size)
|
|
100
|
+
else:
|
|
101
|
+
ctx.emit(guard, 'for %s in %s:' % (item_var, val_expr))
|
|
102
|
+
elem.emit_encode_into(ctx, item_var, guard + ' ',
|
|
103
|
+
version=version, compact=compact, tagged=tagged)
|
|
89
104
|
|
|
90
105
|
def emit_decode_from(self, ctx, var_name, indent, version=None, compact=False, tagged=False):
|
|
91
106
|
n = ctx.next_var('n')
|
{kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/fields/codecs/encode_buffer.py
RENAMED
|
@@ -2,7 +2,35 @@ import threading
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
class EncodeBuffer:
|
|
5
|
-
"""Growable buffer for encode_into
|
|
5
|
+
"""Growable byte buffer for the ``encode_into`` fast path.
|
|
6
|
+
|
|
7
|
+
The encoders write primitives directly into ``buf`` at offset ``pos``
|
|
8
|
+
rather than building and joining intermediate ``bytes`` objects. The
|
|
9
|
+
buffer starts at a fixed size and grows on demand via :meth:`ensure`.
|
|
10
|
+
|
|
11
|
+
Capacity contract
|
|
12
|
+
-----------------
|
|
13
|
+
Writing past the end of ``buf`` does not grow it automatically:
|
|
14
|
+
|
|
15
|
+
* single-byte index writes (``buf[pos] = x``) raise ``IndexError``,
|
|
16
|
+
* ``pack_into`` raises ``struct.error``,
|
|
17
|
+
* slice assignment (``buf[pos:pos+n] = data``) silently *resizes* the
|
|
18
|
+
bytearray, defeating the preallocation.
|
|
19
|
+
|
|
20
|
+
Therefore **every writer must call** ``ensure(n)`` to reserve ``n`` bytes
|
|
21
|
+
before writing ``n`` bytes at ``pos`` (where ``n`` is the maximum the write
|
|
22
|
+
can consume - e.g. ``5`` for a varint32, a fixed field's ``size``, or
|
|
23
|
+
``len(payload)`` for variable data). See the codecs in ``types.py`` for the
|
|
24
|
+
pattern, and ``CodegenContext.emit_reserve`` for the compiled equivalent.
|
|
25
|
+
|
|
26
|
+
Reallocation note
|
|
27
|
+
-----------------
|
|
28
|
+
``ensure`` may replace ``buf`` with a larger bytearray. Any caller (or
|
|
29
|
+
generated code) that caches ``buf`` in a local **must re-read** ``self.buf``
|
|
30
|
+
after a call that can grow it - including indirect growth through a nested
|
|
31
|
+
``encode_into`` / ``ensure``. Forgetting to re-read leaves writes targeting
|
|
32
|
+
the old, discarded buffer (silent data loss) or raises out of range.
|
|
33
|
+
"""
|
|
6
34
|
__slots__ = ('buf', 'pos')
|
|
7
35
|
|
|
8
36
|
def __init__(self, size=65536):
|
|
@@ -14,6 +42,16 @@ class EncodeBuffer:
|
|
|
14
42
|
self.pos = 0
|
|
15
43
|
|
|
16
44
|
def ensure(self, needed):
|
|
45
|
+
"""Guarantee at least ``needed`` writable bytes remain at ``pos``.
|
|
46
|
+
|
|
47
|
+
Call this *before* writing ``needed`` bytes at ``self.pos``. If the
|
|
48
|
+
current buffer cannot hold them it is grown (at least doubled) and the
|
|
49
|
+
existing ``[:pos]`` content is preserved.
|
|
50
|
+
|
|
51
|
+
WARNING: this may rebind ``self.buf`` to a new bytearray, so re-read
|
|
52
|
+
``self.buf`` afterwards if you hold a local reference to it (see the
|
|
53
|
+
class docstring).
|
|
54
|
+
"""
|
|
17
55
|
if self.pos + needed > len(self.buf):
|
|
18
56
|
new_size = max(len(self.buf) * 2, self.pos + needed)
|
|
19
57
|
new_buf = bytearray(new_size)
|
|
@@ -21,6 +59,7 @@ class EncodeBuffer:
|
|
|
21
59
|
self.buf = new_buf
|
|
22
60
|
|
|
23
61
|
def result(self):
|
|
62
|
+
"""Return the encoded bytes written so far (``buf[:pos]``)."""
|
|
24
63
|
# Return a bytearray slice (one copy) rather than bytes(self.buf[:pos])
|
|
25
64
|
# (two copies - the slice creates a bytearray, then bytes() copies
|
|
26
65
|
# again). Downstream consumers (protocol codec slice assignment,
|
{kafka_python-3.0.4 → kafka_python-3.0.5}/kafka/protocol/schemas/fields/codecs/tagged_fields.py
RENAMED
|
@@ -60,6 +60,7 @@ class TaggedFields:
|
|
|
60
60
|
# Encode value into buffer after reserving space for size prefix.
|
|
61
61
|
# Strategy: assume size fits in 1 byte (< 128), encode value,
|
|
62
62
|
# then fix up if the size varint is larger.
|
|
63
|
+
out.ensure(1) # reserve the assumed 1-byte size prefix
|
|
63
64
|
size_pos = out.pos
|
|
64
65
|
out.pos += 1 # reserve 1 byte for size
|
|
65
66
|
val_start = out.pos
|
|
@@ -26,6 +26,7 @@ class FixedCodec:
|
|
|
26
26
|
|
|
27
27
|
@classmethod
|
|
28
28
|
def encode_into(cls, out, value, compact=False):
|
|
29
|
+
out.ensure(cls.size)
|
|
29
30
|
pack_into(cls._be_fmt, out.buf, out.pos, value)
|
|
30
31
|
out.pos += cls.size
|
|
31
32
|
|
|
@@ -40,6 +41,7 @@ class FixedCodec:
|
|
|
40
41
|
|
|
41
42
|
@classmethod
|
|
42
43
|
def emit_encode_into(cls, ctx, val_expr, indent, compact=False):
|
|
44
|
+
ctx.emit_reserve(indent, cls.size)
|
|
43
45
|
ctx.emit(indent, "pack_into('%s', buf, pos, %s)" % (cls._be_fmt, val_expr))
|
|
44
46
|
ctx.emit(indent, 'pos += %d' % cls.size)
|
|
45
47
|
|
|
@@ -101,6 +103,7 @@ class UUID:
|
|
|
101
103
|
b = value.bytes
|
|
102
104
|
else:
|
|
103
105
|
b = uuid.UUID(value).bytes
|
|
106
|
+
out.ensure(16)
|
|
104
107
|
pos = out.pos
|
|
105
108
|
out.buf[pos:pos+16] = b
|
|
106
109
|
out.pos = pos + 16
|
|
@@ -111,6 +114,7 @@ class UUID:
|
|
|
111
114
|
v = ctx.next_var('uv')
|
|
112
115
|
ctx.emit(indent, '%s = %s' % (v, val_expr))
|
|
113
116
|
ctx.emit(indent, 'if %s is None: %s = _ZERO_UUID' % (v, v))
|
|
117
|
+
ctx.emit_reserve(indent, 16)
|
|
114
118
|
ctx.emit(indent, 'buf[pos:pos+16] = %s.bytes if hasattr(%s, "bytes") else __import__("uuid").UUID(%s).bytes' % (v, v, v))
|
|
115
119
|
ctx.emit(indent, 'pos += 16')
|
|
116
120
|
|
|
@@ -151,43 +155,52 @@ class String:
|
|
|
151
155
|
def encode_into(self, out, value, compact=False):
|
|
152
156
|
if compact:
|
|
153
157
|
if value is None:
|
|
154
|
-
UnsignedVarInt32.encode_into(out,0)
|
|
158
|
+
UnsignedVarInt32.encode_into(out, 0) # ensures internally
|
|
155
159
|
return
|
|
156
160
|
value = str(value).encode(self.encoding)
|
|
157
|
-
UnsignedVarInt32.encode_into(out,len(value) + 1)
|
|
161
|
+
UnsignedVarInt32.encode_into(out, len(value) + 1) # ensures internally
|
|
158
162
|
else:
|
|
159
163
|
if value is None:
|
|
164
|
+
out.ensure(2)
|
|
160
165
|
pack_into('>h', out.buf, out.pos, -1)
|
|
161
166
|
out.pos += 2
|
|
162
167
|
return
|
|
163
168
|
value = str(value).encode(self.encoding)
|
|
169
|
+
out.ensure(2)
|
|
164
170
|
pack_into('>h', out.buf, out.pos, len(value))
|
|
165
171
|
out.pos += 2
|
|
166
172
|
n = len(value)
|
|
173
|
+
out.ensure(n)
|
|
167
174
|
pos = out.pos
|
|
168
175
|
out.buf[pos:pos+n] = value
|
|
169
176
|
out.pos = pos + n
|
|
170
177
|
|
|
171
178
|
def emit_encode_into(self, ctx, val_expr, indent, compact=False):
|
|
172
179
|
sv = ctx.next_var('sv')
|
|
180
|
+
body = indent + ' '
|
|
173
181
|
ctx.emit(indent, 'if %s is None:' % val_expr)
|
|
174
182
|
if compact:
|
|
183
|
+
ctx.emit_reserve(body, 1)
|
|
175
184
|
ctx.emit(indent, ' buf[pos] = 0')
|
|
176
185
|
ctx.emit(indent, ' pos += 1')
|
|
177
186
|
ctx.emit(indent, 'else:')
|
|
178
187
|
sn = ctx.next_var('sn')
|
|
179
188
|
ctx.emit(indent, ' %s = str(%s).encode("utf-8")' % (sv, val_expr))
|
|
180
189
|
ctx.emit(indent, ' %s = len(%s) + 1' % (sn, sv))
|
|
181
|
-
UnsignedVarInt32.emit_encode_into(ctx, sn,
|
|
190
|
+
UnsignedVarInt32.emit_encode_into(ctx, sn, body) # reserves the length varint
|
|
191
|
+
ctx.emit_reserve(body, 'len(%s)' % sv)
|
|
182
192
|
ctx.emit(indent, ' buf[pos:pos+len(%s)] = %s' % (sv, sv))
|
|
183
193
|
ctx.emit(indent, ' pos += len(%s)' % sv)
|
|
184
194
|
else:
|
|
195
|
+
ctx.emit_reserve(body, 2)
|
|
185
196
|
ctx.emit(indent, " pack_into('>h', buf, pos, -1)")
|
|
186
197
|
ctx.emit(indent, ' pos += 2')
|
|
187
198
|
ctx.emit(indent, 'else:')
|
|
188
199
|
ctx.emit(indent, ' %s = str(%s).encode("utf-8")' % (sv, val_expr))
|
|
200
|
+
ctx.emit_reserve(body, 2)
|
|
189
201
|
ctx.emit(indent, " pack_into('>h', buf, pos, len(%s))" % sv)
|
|
190
202
|
ctx.emit(indent, ' pos += 2')
|
|
203
|
+
ctx.emit_reserve(body, 'len(%s)' % sv)
|
|
191
204
|
ctx.emit(indent, ' buf[pos:pos+len(%s)] = %s' % (sv, sv))
|
|
192
205
|
ctx.emit(indent, ' pos += len(%s)' % sv)
|
|
193
206
|
|
|
@@ -240,14 +253,16 @@ class Bytes:
|
|
|
240
253
|
value = value.encode()
|
|
241
254
|
if compact:
|
|
242
255
|
if value is None:
|
|
243
|
-
UnsignedVarInt32.encode_into(out, 0)
|
|
256
|
+
UnsignedVarInt32.encode_into(out, 0) # ensures internally
|
|
244
257
|
return
|
|
245
|
-
UnsignedVarInt32.encode_into(out, len(value) + 1)
|
|
258
|
+
UnsignedVarInt32.encode_into(out, len(value) + 1) # ensures internally
|
|
246
259
|
else:
|
|
247
260
|
if value is None:
|
|
261
|
+
out.ensure(4)
|
|
248
262
|
pack_into('>i', out.buf, out.pos, -1)
|
|
249
263
|
out.pos += 4
|
|
250
264
|
return
|
|
265
|
+
out.ensure(4)
|
|
251
266
|
pack_into('>i', out.buf, out.pos, len(value))
|
|
252
267
|
out.pos += 4
|
|
253
268
|
n = len(value)
|
|
@@ -260,35 +275,35 @@ class Bytes:
|
|
|
260
275
|
def emit_encode_into(cls, ctx, val_expr, indent, compact=False):
|
|
261
276
|
bv = ctx.next_var('bv')
|
|
262
277
|
bn = ctx.next_var('bn')
|
|
278
|
+
body = indent + ' '
|
|
263
279
|
if compact:
|
|
264
280
|
ctx.emit(indent, '%s = %s' % (bv, val_expr))
|
|
265
281
|
ctx.emit(indent, 'if %s is not None and not isinstance(%s, (bytes, bytearray, memoryview)): %s = %s.encode()' % (bv, bv, bv, bv))
|
|
266
282
|
ctx.emit(indent, 'if %s is None:' % bv)
|
|
283
|
+
ctx.emit_reserve(body, 1)
|
|
267
284
|
ctx.emit(indent, ' buf[pos] = 0')
|
|
268
285
|
ctx.emit(indent, ' pos += 1')
|
|
269
286
|
ctx.emit(indent, 'else:')
|
|
270
287
|
ctx.emit(indent, ' %s = len(%s)' % (bn, bv))
|
|
271
288
|
sn = ctx.next_var('sn')
|
|
272
289
|
ctx.emit(indent, ' %s = %s + 1' % (sn, bn))
|
|
273
|
-
UnsignedVarInt32.emit_encode_into(ctx, sn,
|
|
274
|
-
ctx.
|
|
275
|
-
ctx.emit(indent, ' out.ensure(%s)' % bn)
|
|
276
|
-
ctx.emit(indent, ' buf = out.buf')
|
|
290
|
+
UnsignedVarInt32.emit_encode_into(ctx, sn, body) # reserves the length varint
|
|
291
|
+
ctx.emit_reserve(body, bn)
|
|
277
292
|
ctx.emit(indent, ' buf[pos:pos+%s] = %s' % (bn, bv))
|
|
278
293
|
ctx.emit(indent, ' pos += %s' % bn)
|
|
279
294
|
else:
|
|
280
295
|
ctx.emit(indent, '%s = %s' % (bv, val_expr))
|
|
281
296
|
ctx.emit(indent, 'if %s is not None and not isinstance(%s, (bytes, bytearray, memoryview)): %s = %s.encode()' % (bv, bv, bv, bv))
|
|
282
297
|
ctx.emit(indent, 'if %s is None:' % bv)
|
|
298
|
+
ctx.emit_reserve(body, 4)
|
|
283
299
|
ctx.emit(indent, " pack_into('>i', buf, pos, -1)")
|
|
284
300
|
ctx.emit(indent, ' pos += 4')
|
|
285
301
|
ctx.emit(indent, 'else:')
|
|
286
302
|
ctx.emit(indent, ' %s = len(%s)' % (bn, bv))
|
|
303
|
+
ctx.emit_reserve(body, 4)
|
|
287
304
|
ctx.emit(indent, " pack_into('>i', buf, pos, %s)" % bn)
|
|
288
305
|
ctx.emit(indent, ' pos += 4')
|
|
289
|
-
ctx.
|
|
290
|
-
ctx.emit(indent, ' out.ensure(%s)' % bn)
|
|
291
|
-
ctx.emit(indent, ' buf = out.buf')
|
|
306
|
+
ctx.emit_reserve(body, bn)
|
|
292
307
|
ctx.emit(indent, ' buf[pos:pos+%s] = %s' % (bn, bv))
|
|
293
308
|
ctx.emit(indent, ' pos += %s' % bn)
|
|
294
309
|
|
|
@@ -341,6 +356,7 @@ class UnsignedVarInt32:
|
|
|
341
356
|
|
|
342
357
|
@classmethod
|
|
343
358
|
def encode_into(cls, out, value):
|
|
359
|
+
out.ensure(5) # a varint32 is at most 5 bytes
|
|
344
360
|
buf = out.buf
|
|
345
361
|
pos = out.pos
|
|
346
362
|
while (value & 0xffffff80) != 0:
|
|
@@ -352,6 +368,7 @@ class UnsignedVarInt32:
|
|
|
352
368
|
|
|
353
369
|
@classmethod
|
|
354
370
|
def emit_encode_into(cls, ctx, val_expr, indent, compact=False):
|
|
371
|
+
ctx.emit_reserve(indent, 5) # a varint32 is at most 5 bytes
|
|
355
372
|
ctx.emit(indent, 'while (%s & 0xffffff80) != 0:' % val_expr)
|
|
356
373
|
ctx.emit(indent, ' buf[pos] = (%s & 0x7f) | 0x80' % val_expr)
|
|
357
374
|
ctx.emit(indent, ' %s >>= 7' % val_expr)
|
|
@@ -462,6 +479,7 @@ class BitField:
|
|
|
462
479
|
def encode_into(cls, out, vals, compact=False):
|
|
463
480
|
if vals is None:
|
|
464
481
|
vals = {31}
|
|
482
|
+
out.ensure(4)
|
|
465
483
|
pack_into('>I', out.buf, out.pos, cls.to_32_bit_field(vals))
|
|
466
484
|
out.pos += 4
|
|
467
485
|
|
|
@@ -473,6 +491,7 @@ class BitField:
|
|
|
473
491
|
ctx.emit(indent, 'if %s is None: %s = {31}' % (bf, bf))
|
|
474
492
|
ctx.emit(indent, '%s = 0' % bfi)
|
|
475
493
|
ctx.emit(indent, 'for _b in %s: %s |= 1 << _b' % (bf, bfi))
|
|
494
|
+
ctx.emit_reserve(indent, 4)
|
|
476
495
|
ctx.emit(indent, "pack_into('>I', buf, pos, %s)" % bfi)
|
|
477
496
|
ctx.emit(indent, 'pos += 4')
|
|
478
497
|
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"""Generate flat encode/decode functions for a StructField + version.
|
|
2
|
+
|
|
3
|
+
Given a StructField and a protocol version, generates Python functions
|
|
4
|
+
that encode/decode directly with zero dispatch overhead - no intermediate
|
|
5
|
+
SimpleField/ArrayField/StructField method calls.
|
|
6
|
+
|
|
7
|
+
Usage:
|
|
8
|
+
from kafka.protocol.schemas.fields.codegen import CodegenContext
|
|
9
|
+
# Encode: see StructField.compiled_encode_into()
|
|
10
|
+
# Decode: see StructField.compiled_decode_from()
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from struct import pack_into, unpack_from
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class CodegenContext:
|
|
17
|
+
"""Shared state for code generation."""
|
|
18
|
+
|
|
19
|
+
def __init__(self):
|
|
20
|
+
self.lines = []
|
|
21
|
+
self.globs = {'pack_into': pack_into, 'unpack_from': unpack_from}
|
|
22
|
+
self._var_counter = 0
|
|
23
|
+
|
|
24
|
+
def next_var(self, prefix='v'):
|
|
25
|
+
self._var_counter += 1
|
|
26
|
+
return f'_{prefix}{self._var_counter}'
|
|
27
|
+
|
|
28
|
+
def emit(self, indent, line):
|
|
29
|
+
self.lines.append(f'{indent}{line}')
|
|
30
|
+
|
|
31
|
+
def emit_reserve(self, indent, nbytes):
|
|
32
|
+
"""Emit an inline capacity check before a write of up to ``nbytes`` bytes.
|
|
33
|
+
|
|
34
|
+
Generated encode functions keep three locals in sync:
|
|
35
|
+
|
|
36
|
+
* ``buf`` - the destination bytearray (``out.buf``),
|
|
37
|
+
* ``pos`` - the current write offset,
|
|
38
|
+
* ``_cap`` - ``len(buf)``, the cached capacity.
|
|
39
|
+
|
|
40
|
+
These are not set up per fragment: they are declared once by the
|
|
41
|
+
``def _encode(item, out):`` preamble in
|
|
42
|
+
``StructField.encode_into__optimized_context`` (the sole generator of
|
|
43
|
+
the compiled encode function), and every emitted fragment - including
|
|
44
|
+
this one - is spliced into that function body. Emit fragments are
|
|
45
|
+
therefore only valid inside that body; they cannot stand alone.
|
|
46
|
+
|
|
47
|
+
``nbytes`` is the MAXIMUM number of bytes the following write can
|
|
48
|
+
consume (an ``int`` for fixed/varint fields, or a string expression
|
|
49
|
+
such as ``'len(_bv1)'`` for a variable payload). The fast path is a
|
|
50
|
+
single comparison; only on overflow do we sync ``out.pos``, grow via
|
|
51
|
+
:meth:`EncodeBuffer.ensure`, and re-read the (possibly reallocated)
|
|
52
|
+
buffer back into ``buf``/``_cap``.
|
|
53
|
+
|
|
54
|
+
Because :meth:`EncodeBuffer.ensure` may rebind ``out.buf``, code that
|
|
55
|
+
instead delegates to a runtime ``encode_into`` (e.g. tagged fields)
|
|
56
|
+
must re-bind ``buf``/``_cap`` itself afterwards - ``emit_reserve`` only
|
|
57
|
+
covers writes emitted inline.
|
|
58
|
+
"""
|
|
59
|
+
self.emit(indent, 'if pos + %s > _cap:' % nbytes)
|
|
60
|
+
self.emit(indent, ' out.pos = pos; out.ensure(%s); buf = out.buf; _cap = len(buf)' % nbytes)
|
|
61
|
+
|
|
62
|
+
def source(self):
|
|
63
|
+
return '\n'.join(self.lines)
|
|
64
|
+
|
|
65
|
+
def print(self):
|
|
66
|
+
print('GLOBALS:')
|
|
67
|
+
for var in self.globs:
|
|
68
|
+
print(f' {var}={self.globs[var]}')
|
|
69
|
+
print('\nSOURCE:')
|
|
70
|
+
for i, line in enumerate(self.lines):
|
|
71
|
+
print(f'{i+1:<4} {line}')
|
|
@@ -116,6 +116,7 @@ class StructField(BaseField):
|
|
|
116
116
|
and not tuple_access
|
|
117
117
|
)
|
|
118
118
|
if inline_nullable:
|
|
119
|
+
ctx.emit_reserve(indent, 1)
|
|
119
120
|
ctx.emit(indent, 'if %s is None:' % item_expr)
|
|
120
121
|
ctx.emit(indent, ' buf[pos] = 0xff')
|
|
121
122
|
ctx.emit(indent, ' pos += 1')
|
|
@@ -136,8 +137,13 @@ class StructField(BaseField):
|
|
|
136
137
|
ctx.globs[tf_var] = self.tagged_fields(version)
|
|
137
138
|
ctx.emit(indent, 'out.pos = pos')
|
|
138
139
|
ctx.emit(indent, '%s.encode_into(%s, out, version=%d)' % (tf_var, item_expr, version))
|
|
140
|
+
# TaggedFields.encode_into may grow (reallocate) out.buf, so re-bind
|
|
141
|
+
# the cached buf/_cap locals before any further inline writes.
|
|
139
142
|
ctx.emit(indent, 'pos = out.pos')
|
|
143
|
+
ctx.emit(indent, 'buf = out.buf')
|
|
144
|
+
ctx.emit(indent, '_cap = len(buf)')
|
|
140
145
|
elif tagged is None:
|
|
146
|
+
ctx.emit_reserve(indent, 1)
|
|
141
147
|
ctx.emit(indent, 'buf[pos] = 0')
|
|
142
148
|
ctx.emit(indent, 'pos += 1')
|
|
143
149
|
|
|
@@ -170,9 +176,13 @@ class StructField(BaseField):
|
|
|
170
176
|
def encode_into__optimized_context(self, version, compact=False, tagged=False):
|
|
171
177
|
ctx = CodegenContext()
|
|
172
178
|
indent = ' '
|
|
179
|
+
# Preamble: declare the buf/pos/_cap locals that every emitted fragment
|
|
180
|
+
# relies on (see CodegenContext.emit_reserve). Fragments are spliced
|
|
181
|
+
# into this function body and are not valid outside it.
|
|
173
182
|
ctx.lines.append('def _encode(item, out):')
|
|
174
183
|
ctx.emit(indent, 'buf = out.buf')
|
|
175
184
|
ctx.emit(indent, 'pos = out.pos')
|
|
185
|
+
ctx.emit(indent, '_cap = len(buf) # cached len(buf); kept in sync by emit_reserve')
|
|
176
186
|
self.emit_encode_into(ctx, 'item', indent, version=version, compact=compact, tagged=tagged)
|
|
177
187
|
ctx.emit(indent, 'out.pos = pos')
|
|
178
188
|
return ctx
|
|
@@ -92,9 +92,10 @@ class StructArrayField(ArrayField):
|
|
|
92
92
|
if compact:
|
|
93
93
|
an = ctx.next_var('an')
|
|
94
94
|
ctx.emit(indent, '%s = len(%s) + 1 if %s is not None else 0' % (an, val_expr, val_expr))
|
|
95
|
-
UnsignedVarInt32.emit_encode_into(ctx, an, indent)
|
|
95
|
+
UnsignedVarInt32.emit_encode_into(ctx, an, indent) # reserves the length varint
|
|
96
96
|
ctx.emit(indent, 'if %s is not None:' % val_expr)
|
|
97
97
|
else:
|
|
98
|
+
ctx.emit_reserve(indent, 4)
|
|
98
99
|
ctx.emit(indent, 'if %s is None:' % val_expr)
|
|
99
100
|
ctx.emit(indent, " pack_into('>i', buf, pos, -1)")
|
|
100
101
|
ctx.emit(indent, ' pos += 4')
|
|
@@ -118,8 +119,12 @@ class StructArrayField(ArrayField):
|
|
|
118
119
|
ctx.emit(scalar_indent, 'out.pos = pos')
|
|
119
120
|
ctx.emit(scalar_indent, '# tagged fields for single-field struct')
|
|
120
121
|
ctx.emit(scalar_indent, '%s.encode_into(%s, out, version=%d)' % (tf_var, item_var, version))
|
|
122
|
+
# encode_into may reallocate out.buf - re-bind cached locals.
|
|
121
123
|
ctx.emit(scalar_indent, 'pos = out.pos')
|
|
124
|
+
ctx.emit(scalar_indent, 'buf = out.buf')
|
|
125
|
+
ctx.emit(scalar_indent, '_cap = len(buf)')
|
|
122
126
|
elif tagged is None:
|
|
127
|
+
ctx.emit_reserve(scalar_indent, 1)
|
|
123
128
|
ctx.emit(scalar_indent, 'buf[pos] = 0')
|
|
124
129
|
ctx.emit(scalar_indent, 'pos += 1')
|
|
125
130
|
else:
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = '3.0.5'
|
|
@@ -197,8 +197,9 @@ class TestKafkaConnectionManagerGetConnection:
|
|
|
197
197
|
|
|
198
198
|
class TestKafkaConnectionManagerSend:
|
|
199
199
|
def test_send_during_backoff(self, manager):
|
|
200
|
-
|
|
201
|
-
|
|
200
|
+
with patch("time.monotonic", return_value=100.0):
|
|
201
|
+
manager.update_backoff('bootstrap-0')
|
|
202
|
+
f = manager.send(MagicMock(), node_id='bootstrap-0')
|
|
202
203
|
assert f.failed()
|
|
203
204
|
assert isinstance(f.exception, Errors.NodeNotReadyError)
|
|
204
205
|
|
|
@@ -255,6 +256,53 @@ class TestKafkaConnectionManagerBootstrap:
|
|
|
255
256
|
failures, _, _ = manager._backoff['bootstrap-0']
|
|
256
257
|
assert failures > 1
|
|
257
258
|
|
|
259
|
+
def test_bootstrap_handshake_failure_backs_off(self, net):
|
|
260
|
+
"""A broker that accepts the TCP connection but drops it during the
|
|
261
|
+
version handshake must not cause the bootstrap loop to spin. Each such
|
|
262
|
+
failure has to record backoff so retries are spaced out (otherwise the
|
|
263
|
+
loop burns the entire bootstrap timeout retrying thousands of times)."""
|
|
264
|
+
accepts = []
|
|
265
|
+
stop = threading.Event()
|
|
266
|
+
|
|
267
|
+
listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
268
|
+
listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
269
|
+
listener.bind(('127.0.0.1', 0))
|
|
270
|
+
listener.listen(128)
|
|
271
|
+
listener.settimeout(0.1)
|
|
272
|
+
_, port = listener.getsockname()
|
|
273
|
+
|
|
274
|
+
def serve():
|
|
275
|
+
while not stop.is_set():
|
|
276
|
+
try:
|
|
277
|
+
sock, _ = listener.accept()
|
|
278
|
+
except socket.timeout:
|
|
279
|
+
continue
|
|
280
|
+
except OSError:
|
|
281
|
+
break
|
|
282
|
+
accepts.append(1)
|
|
283
|
+
sock.close() # drop the connection mid-handshake
|
|
284
|
+
|
|
285
|
+
server = threading.Thread(target=serve)
|
|
286
|
+
server.start()
|
|
287
|
+
try:
|
|
288
|
+
manager = KafkaConnectionManager(net,
|
|
289
|
+
bootstrap_servers=['127.0.0.1:%d' % port],
|
|
290
|
+
reconnect_backoff_ms=50,
|
|
291
|
+
reconnect_backoff_max_ms=200)
|
|
292
|
+
with pytest.raises(Errors.KafkaTimeoutError):
|
|
293
|
+
manager.bootstrap(timeout_ms=1000)
|
|
294
|
+
finally:
|
|
295
|
+
stop.set()
|
|
296
|
+
server.join()
|
|
297
|
+
listener.close()
|
|
298
|
+
|
|
299
|
+
# Backoff must have been recorded for the repeatedly-dropped bootstrap node.
|
|
300
|
+
failures, _, _ = manager._backoff['bootstrap-0']
|
|
301
|
+
assert failures > 1
|
|
302
|
+
# With backoff applied, a 1s window allows only a handful of attempts.
|
|
303
|
+
# Without it the loop spins (hundreds/thousands of connects).
|
|
304
|
+
assert len(accepts) < 50, 'bootstrap spun without backoff: %d attempts' % len(accepts)
|
|
305
|
+
|
|
258
306
|
def test_bootstrapped_property(self, manager):
|
|
259
307
|
assert not manager.bootstrapped
|
|
260
308
|
manager._bootstrap_future = Future()
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
"""Generate flat encode/decode functions for a StructField + version.
|
|
2
|
-
|
|
3
|
-
Given a StructField and a protocol version, generates Python functions
|
|
4
|
-
that encode/decode directly with zero dispatch overhead - no intermediate
|
|
5
|
-
SimpleField/ArrayField/StructField method calls.
|
|
6
|
-
|
|
7
|
-
Usage:
|
|
8
|
-
from kafka.protocol.schemas.fields.codegen import CodegenContext
|
|
9
|
-
# Encode: see StructField.compiled_encode_into()
|
|
10
|
-
# Decode: see StructField.compiled_decode_from()
|
|
11
|
-
"""
|
|
12
|
-
|
|
13
|
-
from struct import pack_into, unpack_from
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class CodegenContext:
|
|
17
|
-
"""Shared state for code generation."""
|
|
18
|
-
|
|
19
|
-
def __init__(self):
|
|
20
|
-
self.lines = []
|
|
21
|
-
self.globs = {'pack_into': pack_into, 'unpack_from': unpack_from}
|
|
22
|
-
self._var_counter = 0
|
|
23
|
-
|
|
24
|
-
def next_var(self, prefix='v'):
|
|
25
|
-
self._var_counter += 1
|
|
26
|
-
return f'_{prefix}{self._var_counter}'
|
|
27
|
-
|
|
28
|
-
def emit(self, indent, line):
|
|
29
|
-
self.lines.append(f'{indent}{line}')
|
|
30
|
-
|
|
31
|
-
def source(self):
|
|
32
|
-
return '\n'.join(self.lines)
|
|
33
|
-
|
|
34
|
-
def print(self):
|
|
35
|
-
print('GLOBALS:')
|
|
36
|
-
for var in self.globs:
|
|
37
|
-
print(f' {var}={self.globs[var]}')
|
|
38
|
-
print('\nSOURCE:')
|
|
39
|
-
for i, line in enumerate(self.lines):
|
|
40
|
-
print(f'{i+1:<4} {line}')
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = '3.0.4'
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|