2.15.1rc1 - #2353
Conversation
|
🎉 All Contributor License Agreements have been signed. Ready to merge. |
There was a problem hiding this comment.
🟡 Changes recommended
There are multiple correctness issues (e.g., broken close method, CEL bool conversion regression, and inconsistent/mismatched release metadata and documentation) that should be resolved before release.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
Prepares the 2.15.1 release candidate by bumping version metadata and reverting a set of “next-minor” Schema Registry/rules features (and their tests) out of the release branch.
Changes:
- Bump project/version references to
2.15.1rc1and update release notes for the RC. - Revert/remove Schema Registry rule-action / validation-rule related codepaths and associated test suite additions.
- Adjust deserialization behavior/tests for
DeserializingConsumer/DeserializingShareConsumer.
File summaries
| File | Description |
|---|---|
| tests/test_DeserializingShareConsumer.py | Updates unit tests and docstrings around share-consumer deserialization ordering/error behavior. |
| tests/test_DeserializingConsumer.py | Removes DeserializingConsumer unit tests. |
| tests/schema_registry/test_proto_transform.py | Removes protobuf transform tests (rules-related). |
| tests/schema_registry/test_inline_tags.py | Removes Avro inline-tag resolution tests. |
| tests/schema_registry/test_encrypt_executor.py | Removes encryption executor tests. |
| tests/schema_registry/test_dlq_action.py | Removes DLQ action tests. |
| tests/schema_registry/test_cel_validator.py | Removes CEL validator tests. |
| tests/schema_registry/test_azure_driver.py | Removes Azure driver tests. |
| tests/schema_registry/test_azure_client.py | Removes Azure client tests. |
| tests/schema_registry/test_azure_aead.py | Removes Azure AEAD tests. |
| tests/schema_registry/data/proto/validation_widget.proto | Removes test protobuf schema fixture. |
| tests/schema_registry/data/proto/validation_widget_pb2.py | Removes generated protobuf fixture module. |
| tests/schema_registry/data/proto/map_widget.proto | Removes map-field protobuf schema fixture. |
| tests/schema_registry/data/proto/map_widget_pb2.py | Removes generated map-field protobuf fixture module. |
| tests/schema_registry/_sync/test_validation_serdes.py | Removes sync inline-validation serde tests. |
| tests/schema_registry/_sync/test_proto_serdes.py | Removes map-field/CEL-field transform tests and related imports. |
| tests/schema_registry/_async/test_validation_serdes.py | Removes async inline-validation serde tests. |
| tests/schema_registry/_async/test_proto_serdes.py | Removes async map-field/CEL-field transform tests and related imports. |
| tests/integration/schema_registry/_sync/test_dlq.py | Removes sync DLQ integration test. |
| tests/integration/schema_registry/_async/test_dlq.py | Removes async DLQ integration test. |
| src/confluent_kafka/src/confluent_kafka.h | Updates CFL_VERSION_STR to 2.15.1rc1. |
| src/confluent_kafka/schema_registry/rules/encryption/encrypt_executor.py | Removes context-aware KEK calls and alters client/config handling; updates close behavior. |
| src/confluent_kafka/schema_registry/rules/encryption/dek_registry/mock_dek_registry_client.py | Removes KEK context support from mock client cache keys and APIs. |
| src/confluent_kafka/schema_registry/rules/encryption/dek_registry/dek_registry_client.py | Removes KEK context support from client/cache keys and REST calls. |
| src/confluent_kafka/schema_registry/rules/encryption/azurekms/azure_driver.py | Removes Azure key-version resolution helpers; inlines credential selection into driver. |
| src/confluent_kafka/schema_registry/rules/encryption/azurekms/azure_client.py | Simplifies AzureKmsClient; docstring currently incorrect. |
| src/confluent_kafka/schema_registry/rules/encryption/azurekms/azure_aead.py | Simplifies AzureKmsAead; docstring currently incorrect. |
| src/confluent_kafka/schema_registry/rules/dlq/dlq_action.py | Removes DLQ rule action implementation. |
| src/confluent_kafka/schema_registry/rules/dlq/init.py | Removes DLQ rules package init. |
| src/confluent_kafka/schema_registry/rules/cel/constraints.py | Removes wrapper-type null semantics and adjusts presence handling. |
| src/confluent_kafka/schema_registry/rules/cel/cel_validator.py | Removes CEL validation-rule executor implementation. |
| src/confluent_kafka/schema_registry/rules/cel/cel_executor.py | Alters protobuf field resolution and changes CEL scalar conversion ordering. |
| src/confluent_kafka/schema_registry/confluent/meta.proto | Removes rules from Meta and deletes Rule message. |
| src/confluent_kafka/schema_registry/confluent/meta_pb2.py | Updates generated protobuf for meta.proto changes. |
| src/confluent_kafka/schema_registry/common/serde.py | Removes DLQ header constants, original-key contextvar, and inline-validation rule plumbing. |
| src/confluent_kafka/schema_registry/common/protobuf.py | Reverts transform behavior and alters is_map_field implementation. |
| src/confluent_kafka/schema_registry/common/json_schema.py | Alters subtype/$ref transform behavior and removes inline-validation walk. |
| src/confluent_kafka/schema_registry/common/avro.py | Removes inline-validation walk and changes union/tag resolution behavior. |
| src/confluent_kafka/schema_registry/_sync/serde.py | Removes DLQ replay skip, validation wiring, and original-key plumbing. |
| src/confluent_kafka/schema_registry/_sync/protobuf.py | Removes inline-validation wiring and original-key plumbing; adjusts rule execution calls. |
| src/confluent_kafka/schema_registry/_sync/json_schema.py | Removes inline-validation wiring and original-key plumbing; adjusts rule execution calls. |
| src/confluent_kafka/schema_registry/_sync/avro.py | Removes inline-validation wiring and original-key plumbing; adjusts rule execution calls. |
| src/confluent_kafka/schema_registry/_async/serde.py | Async variant: removes DLQ replay skip, validation wiring, and original-key plumbing. |
| src/confluent_kafka/schema_registry/_async/protobuf.py | Async variant: removes inline-validation wiring and original-key plumbing. |
| src/confluent_kafka/schema_registry/_async/json_schema.py | Async variant: removes inline-validation wiring and original-key plumbing. |
| src/confluent_kafka/schema_registry/_async/avro.py | Async variant: removes inline-validation wiring and original-key plumbing. |
| src/confluent_kafka/deserializing_share_consumer.py | Changes share-consumer deserialization flow and updates docstring. |
| src/confluent_kafka/deserializing_consumer.py | Changes consumer deserialization ordering (value-before-key). |
| pyproject.toml | Bumps package version to 2.15.1rc1. |
| examples/docker/Dockerfile.alpine | Updates LIBRDKAFKA_VERSION (currently to v2.15.0-RC1). |
| CHANGELOG.md | Adds v2.15.1 (rc1) section and release notes; references librdkafka v2.15.1-RC1. |
| .semaphore/semaphore.yml | Updates CI LIBRDKAFKA_VERSION (currently to v2.15.0-RC1). |
Review details
Files not reviewed (1)
- src/confluent_kafka/schema_registry/confluent/meta_pb2.py: Generated file
Suppressed comments (2)
src/confluent_kafka/deserializing_share_consumer.py:149
- DeserializingShareConsumer._deserialize() deserializes value before key, but the v2.15.1 (rc1) changelog states key should be deserialized first and key errors should take precedence when both fail. With the current ordering (and early-return on first failure), key errors can never win over value errors if value deserialization fails.
ctx = SerializationContext(topic, MessageField.VALUE, msg.headers())
try:
value = msg.value()
if self._value_deserializer is not None:
value = self._value_deserializer(value, ctx)
src/confluent_kafka/deserializing_consumer.py:127
- DeserializingConsumer’s deserialization ordering and error behavior changed here, but the unit test file that covered _deserialize() (tests/test_DeserializingConsumer.py) was removed and there are no remaining tests exercising this logic. This makes it easy for regressions in key/value ordering and exception types to slip into the release.
ctx = SerializationContext(topic, MessageField.VALUE, msg.headers())
value = msg.value()
if self._value_deserializer is not None:
try:
value = self._value_deserializer(value, ctx)
except Exception as se:
raise ValueDeserializationError(exception=se, kafka_message=msg)
key = msg.key()
ctx.field = MessageField.KEY
if self._key_deserializer is not None:
try:
key = self._key_deserializer(key, ctx)
except Exception as se:
raise KeyDeserializationError(exception=se, kafka_message=msg)
- Files reviewed: 54/55 changed files
- Comments generated: 12
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| def close(self): | ||
| # Delegate to the wrapped EncryptionExecutor, which owns the client; | ||
| # this executor has none of its own. | ||
| self.executor.close() | ||
| if self.client is not None: | ||
| self.client.__exit__() | ||
|
|
| ctx = SerializationContext(topic, MessageField.VALUE, msg.headers()) | ||
|
|
||
| value = msg.value() | ||
| ctx.field = MessageField.VALUE | ||
| if self._value_deserializer is not None: | ||
| try: |
| # Ensure record_name is not None and doesn't already have namespace prefix | ||
| if record_name is not None and record_ns != '' and not record_name.startswith(record_ns): | ||
| record_name = f"{record_ns}.{record_name}" |
| elif isinstance(msg, int): | ||
| return celtypes.IntType(msg) | ||
| elif isinstance(msg, float): | ||
| return celtypes.DoubleType(msg) | ||
| elif isinstance(msg, bool): | ||
| return celtypes.BoolType(msg) |
| - `DeserializingConsumer` and `DeserializingShareConsumer` now deserialize the | ||
| message key before the value, matching `SerializingProducer` and the Java | ||
| client. When both key and value fail to deserialize, the key error is now | ||
| surfaced instead of the value error. |
| and acknowledgeable) instead of raising, so the rest of the batch is kept. | ||
| A message with no topic is a broken invariant, so it raises | ||
| :py:exc:`TypeError`. | ||
| Deserialize a single message's value and key. |
|
|
||
| import string | ||
| from typing import Callable, Optional, Tuple | ||
| """A client for Google Cloud KMS.""" |
|
|
||
| import logging | ||
| from typing import Any, Callable, Dict, Optional, Tuple | ||
| """A client for Google Cloud KMS.""" |
cb09159
64ae996
|


Release candidate for 2.15.1. Reverted the minor changes, moved them to
next-minorbranch.