Skip to content

fix: backport non-breaking 0.16 fixes and advisories to 0.15 - #229

Merged
zannis merged 7 commits into
release/0.15from
zannis/fix/backport-to-0-15
Oct 28, 2026
Merged

zannis merged 7 commits into
release/0.15from
zannis/fix/backport-to-0-15

Conversation

@zannis

@zannis zannis commented Oct 28, 2026

Copy link
Copy Markdown
Owner

Backports the non-breaking changes from 0.16.0 onto release/0.15 (cut at v0.15.0) for a 0.15.1 patch release.

Included

Excluded

Verification

On this branch, locally:

  • cargo fmt -- --check; cargo clippy --all-features --all-targets -- -D warnings; cargo clippy --no-default-features --all-targets -- -D warnings
  • cargo audit --deny warnings: clean
  • cargo nextest run --no-default-features: 376 passed
  • cargo nextest run --features inmemory,metrics,sbe,env-config: 807 passed
  • cargo nextest run --no-default-features --features kafka,test-support,audit,metrics,sbe,env-config,inmemory --test-threads 4 (Docker): 1397 passed, 1 skipped, no retries
  • RabbitMQ external-topology tests: 6 passed

🤖 Generated with Claude Code

namikmesic-hub and others added 7 commits October 28, 2026 14:58
…223)

* fix(kafka): build the producer at the first publish, not at connect

## Summary

`KafkaClient::connect` built an idempotent producer for every client, and librdkafka requests a producer id 500 ms after creation.
A broker authorizes that as `IdempotentWrite` on the cluster or `Write` on a topic, which a service that only consumes lacks.

- The producer is now built at the first publish, on a blocking thread, and shared by every clone.
- `ping` uses one metadata consumer, built at the first probe under the probe's timeout, so a health check builds no producer.
- `shutdown` waits for every build in flight, a cancelled publish's included, and refuses a later one.
- A configuration librdkafka refuses is reported by the first client built.

## Tests

- New `kafka_consume_only_mock`: `a_client_that_only_consumes_sends_no_init_producer_id`, red before the fix with one `InitProducerId`, and `a_client_closed_before_any_publish_builds_no_producer`.
- Seven new `client::tests`: `connect_builds_no_producer_and_concurrent_clones_share_one`, `a_publish_after_shutdown_builds_no_producer`, `rejected_tls_material_fails_the_first_publish_and_leaves_the_cell_empty`, `a_producer_build_blocked_in_librdkafka_leaves_the_runtime_free`, `shutdown_waits_for_a_producer_build_in_flight`, `a_probe_times_out_while_its_metadata_consumer_is_built`, `shutdown_waits_for_a_build_whose_publish_was_cancelled`.

## Test plan

- `cargo nextest run --features <kafka set>` on the mock files and the Docker-backed `kafka_ping` (27 passed), `--lib` (641 passed), `--no-default-features` (379 passed)
- The five Docker-backed Kafka suites (109 passed)
- `cargo fmt -- --check` and `cargo clippy -D warnings` on every CI feature set, the nine `--lib` sets included

* fix(kafka): build the metadata client at connect and drop the build lock

`connect` builds the consumer-type metadata client `ping` probes with, where it used to build the producer. A connection setting librdkafka refuses therefore fails at startup again, and a client keeps one idle librdkafka client as before. The probe in `ping` fetches on that client, so the lazily built metadata cell and its timeout case are gone.

`shutdown` no longer holds a lock over producer builds. The failing initializer on the producer cell already waits for a build in flight. The cancelled token refuses every build that starts later, so the lock added nothing.

The doc comment on the producer config states the idempotence rationale in two sentences. The comments on the lazy producer shrink to what the code does not say. The ACL paragraph in the Kafka backend page narrows "a service that only consumes" to a service that never publishes, through `publisher()` or a republish.

Tests: `rejected_tls_material_fails_connect`, `a_probe_reports_a_refused_configuration` and `a_failed_producer_build_leaves_the_cell_empty_for_the_next_publish` cover the connect-time refusal and the producer build failure. Two tests cover the MSK IAM metadata client: `msk_iam_connect_rejects_tls_material_librdkafka_refuses` and `msk_iam_ping_times_out_against_a_non_routable_broker`. The tests `shutdown_waits_for_a_build_whose_publish_was_cancelled` and `a_probe_times_out_while_its_metadata_consumer_is_built` go with the code they tested.
(cherry picked from commit 026e782)
…d end the wait on revoke (#220)

(cherry picked from commit a69dfbf)
Bumps the cargo group with 1 update in the / directory: [xxhash-rust](https://github.com/DoumanAsh/xxhash-rust).

Updates `xxhash-rust` from 0.8.15 to 0.8.19
- [Commits](https://github.com/DoumanAsh/xxhash-rust/commits)

---
updated-dependencies:
- dependency-name: xxhash-rust
  dependency-version: 0.8.19
  dependency-type: indirect
  dependency-group: cargo
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit 62f95c4)
Bumps the cargo group with 1 update in the / directory: [hickory-resolver](https://github.com/hickory-dns/hickory-dns).

Updates `hickory-resolver` from 0.26.1 to 0.26.3
- [Release notes](https://github.com/hickory-dns/hickory-dns/releases)
- [Changelog](https://github.com/hickory-dns/hickory-dns/blob/main/CHANGELOG.md)
- [Commits](hickory-dns/hickory-dns@v0.26.1...v0.26.3)

---
updated-dependencies:
- dependency-name: hickory-resolver
  dependency-version: 0.26.3
  dependency-type: indirect
  dependency-group: cargo
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit 38355fb)
rustls 0.23.45 -> 0.23.46 (RUSTSEC-2026-0346/0347/0348/0349)
quinn-proto 0.11.15 -> 0.11.19 (RUSTSEC-2026-0338/0339/0340/0341/0342)

(cherry picked from commit ee70171)
…ology test (#228)

Bump ctutils, rustls-webpki, webpki-roots, webpki-root-certs, zstd-sys and
tokio past RUSTSEC-2026-0381/0382/0383/0385/0386/0410. Override the docs
site's transitive dompurify, hono, katex, source-map-js, compression, toml
and vite to patched versions; the blanket vite override was pinning 8.0.16.

The RabbitMQ external-topology test awaited a publisher confirm on a channel
that was never put in confirm mode, so the await resolved immediately and the
passive queue.declare could read the message count before the queue had
enqueued the message. Select confirm mode before the infra publish.

(cherry picked from commit 339d0c5)
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Oct 28, 2026 •

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
shove-docs d0ebcc6 Commit Preview URL

Branch Preview URL
Oct 28 2026, 01:12 PM

@codecov

codecov Bot commented Oct 28, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 82.73381% with 144 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/backends/kafka/consumer.rs 74.78% 144 Missing ⚠️

📢 Thoughts on this report? Let us know!

@zannis
zannis merged commit d0ebcc6 into release/0.15 Oct 28, 2026
14 of 15 checks passed
@zannis
zannis deleted the zannis/fix/backport-to-0-15 branch October 28, 2026 13:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants