@platformatic/rdkafka 4.0.0 → 4.1.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (293) hide show
  1. package/README.md +5 -5
  2. package/bench/seed.sh +0 -0
  3. package/binding.gyp +3 -3
  4. package/ci/prepublish.js +4 -3
  5. package/ci/update-version.js +123 -0
  6. package/config.d.ts +126 -10
  7. package/configure +0 -0
  8. package/deps/librdkafka/.semaphore/run-all-tests.yml +77 -0
  9. package/deps/librdkafka/.semaphore/semaphore-integration.yml +250 -0
  10. package/deps/librdkafka/.semaphore/semaphore.yml +67 -44
  11. package/deps/librdkafka/.semaphore/verify-linux-packages.yml +41 -0
  12. package/deps/librdkafka/CHANGELOG.md +471 -1
  13. package/deps/librdkafka/CONFIGURATION.md +29 -9
  14. package/deps/librdkafka/INTRODUCTION.md +909 -601
  15. package/deps/librdkafka/Makefile +2 -1
  16. package/deps/librdkafka/configure +0 -0
  17. package/deps/librdkafka/debian/rules +0 -0
  18. package/deps/librdkafka/dev-conf.sh +0 -0
  19. package/deps/librdkafka/examples/consumer.c +18 -8
  20. package/deps/librdkafka/examples/describe_consumer_groups.c +25 -6
  21. package/deps/librdkafka/examples/incremental_alter_configs.c +4 -5
  22. package/deps/librdkafka/examples/kafkatest_verifiable_client.cpp +26 -42
  23. package/deps/librdkafka/examples/openssl_engine_example.cpp +3 -4
  24. package/deps/librdkafka/examples/producer.cpp +2 -2
  25. package/deps/librdkafka/examples/user_scram.c +4 -5
  26. package/deps/librdkafka/examples/win_ssl_cert_store.cpp +4 -3
  27. package/deps/librdkafka/lds-gen.py +0 -0
  28. package/deps/librdkafka/mklove/Makefile.base +0 -0
  29. package/deps/librdkafka/packaging/RELEASE.md +8 -0
  30. package/deps/librdkafka/packaging/alpine/build-alpine.sh +0 -0
  31. package/deps/librdkafka/packaging/cp/README.md +4 -1
  32. package/deps/librdkafka/packaging/cp/check_features.c +12 -4
  33. package/deps/librdkafka/packaging/cp/verify-deb.sh +6 -6
  34. package/deps/librdkafka/packaging/cp/verify-packages.sh +52 -31
  35. package/deps/librdkafka/packaging/cp/verify-rpm.sh +6 -13
  36. package/deps/librdkafka/packaging/debian/docs +5 -0
  37. package/deps/librdkafka/packaging/debian/rules +0 -0
  38. package/deps/librdkafka/packaging/get_version.py +0 -0
  39. package/deps/librdkafka/packaging/homebrew/brew-update-pr.sh +0 -0
  40. package/deps/librdkafka/packaging/mingw-w64/{travis-before-install.sh → export-variables.sh} +0 -7
  41. package/deps/librdkafka/packaging/mingw-w64/semaphoreci-build.sh +1 -1
  42. package/deps/librdkafka/packaging/nuget/artifact.py +0 -0
  43. package/deps/librdkafka/packaging/nuget/cleanup-s3.py +0 -0
  44. package/deps/librdkafka/packaging/nuget/nuget.sh +0 -0
  45. package/deps/librdkafka/packaging/nuget/packaging.py +0 -0
  46. package/deps/librdkafka/packaging/nuget/push-to-nuget.sh +0 -0
  47. package/deps/librdkafka/packaging/nuget/release.py +0 -0
  48. package/deps/librdkafka/packaging/nuget/requirements.txt +3 -3
  49. package/deps/librdkafka/packaging/rpm/mock-on-docker.sh +0 -0
  50. package/deps/librdkafka/packaging/rpm/tests/run-test.sh +0 -0
  51. package/deps/librdkafka/packaging/rpm/tests/test-on-docker.sh +0 -0
  52. package/deps/librdkafka/packaging/tools/build-configurations-checks.sh +3 -1
  53. package/deps/librdkafka/packaging/tools/build-deb-package.sh +0 -0
  54. package/deps/librdkafka/packaging/tools/build-debian.sh +0 -0
  55. package/deps/librdkafka/packaging/tools/build-manylinux.sh +0 -0
  56. package/deps/librdkafka/packaging/tools/build-release-artifacts.sh +0 -0
  57. package/deps/librdkafka/packaging/tools/distro-build.sh +0 -0
  58. package/deps/librdkafka/packaging/tools/gh-release-checksums.py +0 -0
  59. package/deps/librdkafka/packaging/tools/rdutcoverage.sh +0 -0
  60. package/deps/librdkafka/packaging/tools/run-in-docker.sh +28 -0
  61. package/deps/librdkafka/packaging/tools/run-integration-tests.sh +31 -0
  62. package/deps/librdkafka/packaging/tools/run-style-check.sh +4 -0
  63. package/deps/librdkafka/packaging/tools/style-format.sh +6 -5
  64. package/deps/librdkafka/packaging/tools/update_rpcs_max_versions.py +100 -0
  65. package/deps/librdkafka/service.yml +154 -0
  66. package/deps/librdkafka/src/generate_proto.sh +0 -0
  67. package/deps/librdkafka/src/rd.h +145 -2
  68. package/deps/librdkafka/src/rdaddr.h +6 -7
  69. package/deps/librdkafka/src/rdatomic.h +15 -11
  70. package/deps/librdkafka/src/rdavg.h +3 -2
  71. package/deps/librdkafka/src/rdbase64.c +33 -2
  72. package/deps/librdkafka/src/rdbase64.h +2 -0
  73. package/deps/librdkafka/src/rdendian.h +10 -9
  74. package/deps/librdkafka/src/rdhttp.c +418 -100
  75. package/deps/librdkafka/src/rdhttp.h +23 -5
  76. package/deps/librdkafka/src/rdkafka.c +299 -145
  77. package/deps/librdkafka/src/rdkafka.h +89 -6
  78. package/deps/librdkafka/src/rdkafka_admin.c +482 -105
  79. package/deps/librdkafka/src/rdkafka_admin.h +42 -0
  80. package/deps/librdkafka/src/rdkafka_broker.c +463 -312
  81. package/deps/librdkafka/src/rdkafka_broker.h +68 -10
  82. package/deps/librdkafka/src/rdkafka_buf.c +8 -5
  83. package/deps/librdkafka/src/rdkafka_buf.h +4 -3
  84. package/deps/librdkafka/src/rdkafka_cert.c +25 -1
  85. package/deps/librdkafka/src/rdkafka_cert.h +4 -3
  86. package/deps/librdkafka/src/rdkafka_cgrp.c +468 -143
  87. package/deps/librdkafka/src/rdkafka_cgrp.h +36 -2
  88. package/deps/librdkafka/src/rdkafka_conf.c +526 -102
  89. package/deps/librdkafka/src/rdkafka_conf.h +68 -4
  90. package/deps/librdkafka/src/rdkafka_feature.c +472 -35
  91. package/deps/librdkafka/src/rdkafka_feature.h +2 -0
  92. package/deps/librdkafka/src/rdkafka_fetcher.c +22 -2
  93. package/deps/librdkafka/src/rdkafka_fetcher.h +2 -2
  94. package/deps/librdkafka/src/rdkafka_int.h +84 -46
  95. package/deps/librdkafka/src/rdkafka_metadata.c +221 -136
  96. package/deps/librdkafka/src/rdkafka_metadata.h +15 -11
  97. package/deps/librdkafka/src/rdkafka_metadata_cache.c +279 -73
  98. package/deps/librdkafka/src/rdkafka_mock.c +795 -19
  99. package/deps/librdkafka/src/rdkafka_mock.h +119 -0
  100. package/deps/librdkafka/src/rdkafka_mock_cgrp.c +1298 -132
  101. package/deps/librdkafka/src/rdkafka_mock_handlers.c +345 -49
  102. package/deps/librdkafka/src/rdkafka_mock_int.h +180 -61
  103. package/deps/librdkafka/src/rdkafka_msg.c +35 -19
  104. package/deps/librdkafka/src/rdkafka_msg.h +3 -3
  105. package/deps/librdkafka/src/rdkafka_msgset_writer.c +14 -10
  106. package/deps/librdkafka/src/rdkafka_offset.c +33 -5
  107. package/deps/librdkafka/src/rdkafka_op.c +1 -1
  108. package/deps/librdkafka/src/rdkafka_op.h +45 -21
  109. package/deps/librdkafka/src/rdkafka_partition.c +118 -23
  110. package/deps/librdkafka/src/rdkafka_partition.h +16 -7
  111. package/deps/librdkafka/src/rdkafka_proto.h +4 -1
  112. package/deps/librdkafka/src/rdkafka_protocol.h +1 -0
  113. package/deps/librdkafka/src/rdkafka_queue.c +125 -48
  114. package/deps/librdkafka/src/rdkafka_queue.h +19 -0
  115. package/deps/librdkafka/src/rdkafka_range_assignor.c +1 -1
  116. package/deps/librdkafka/src/rdkafka_request.c +336 -64
  117. package/deps/librdkafka/src/rdkafka_request.h +24 -1
  118. package/deps/librdkafka/src/rdkafka_sasl.c +5 -3
  119. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.c +14 -10
  120. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.c +1166 -89
  121. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.h +13 -3
  122. package/deps/librdkafka/src/rdkafka_sasl_plain.c +3 -3
  123. package/deps/librdkafka/src/rdkafka_sasl_scram.c +4 -3
  124. package/deps/librdkafka/src/rdkafka_ssl.c +306 -81
  125. package/deps/librdkafka/src/rdkafka_ssl.h +22 -0
  126. package/deps/librdkafka/src/rdkafka_sticky_assignor.c +4 -0
  127. package/deps/librdkafka/src/rdkafka_telemetry.c +80 -23
  128. package/deps/librdkafka/src/rdkafka_telemetry_encode.c +5 -1
  129. package/deps/librdkafka/src/rdkafka_telemetry_encode.h +20 -20
  130. package/deps/librdkafka/src/rdkafka_topic.c +220 -137
  131. package/deps/librdkafka/src/rdkafka_topic.h +14 -8
  132. package/deps/librdkafka/src/rdkafka_transport.c +59 -47
  133. package/deps/librdkafka/src/rdkafka_transport.h +5 -0
  134. package/deps/librdkafka/src/rdkafka_txnmgr.c +6 -1
  135. package/deps/librdkafka/src/rdmap.c +6 -1
  136. package/deps/librdkafka/src/rdrand.c +11 -1
  137. package/deps/librdkafka/src/rdtime.h +48 -17
  138. package/deps/librdkafka/src/rdunittest.c +42 -25
  139. package/deps/librdkafka/src/rdunittest.h +2 -0
  140. package/deps/librdkafka/src/rdwin32.h +1 -1
  141. package/deps/librdkafka/src/regexp.c +47 -42
  142. package/deps/librdkafka/src/tinycthread_extra.c +45 -21
  143. package/deps/librdkafka/src/tinycthread_extra.h +7 -3
  144. package/deps/librdkafka/src-cpp/rdkafkacpp.h +28 -2
  145. package/deps/librdkafka/tests/0001-multiobj.c +4 -0
  146. package/deps/librdkafka/tests/0004-conf.c +103 -36
  147. package/deps/librdkafka/tests/0009-mock_cluster.c +1 -0
  148. package/deps/librdkafka/tests/0011-produce_batch.c +2 -1
  149. package/deps/librdkafka/tests/0016-client_swname.c +18 -3
  150. package/deps/librdkafka/tests/0017-compression.c +6 -8
  151. package/deps/librdkafka/tests/0018-cgrp_term.c +8 -3
  152. package/deps/librdkafka/tests/0021-rkt_destroy.c +1 -0
  153. package/deps/librdkafka/tests/0022-consume_batch.c +4 -1
  154. package/deps/librdkafka/tests/0026-consume_pause.c +12 -14
  155. package/deps/librdkafka/tests/0028-long_topicnames.c +1 -1
  156. package/deps/librdkafka/tests/0029-assign_offset.c +6 -8
  157. package/deps/librdkafka/tests/0030-offset_commit.c +2 -2
  158. package/deps/librdkafka/tests/0033-regex_subscribe.c +33 -17
  159. package/deps/librdkafka/tests/0034-offset_reset.c +25 -4
  160. package/deps/librdkafka/tests/0036-partial_fetch.c +1 -0
  161. package/deps/librdkafka/tests/0038-performance.c +1 -0
  162. package/deps/librdkafka/tests/0040-io_event.c +11 -5
  163. package/deps/librdkafka/tests/0041-fetch_max_bytes.c +1 -0
  164. package/deps/librdkafka/tests/0044-partition_cnt.c +3 -2
  165. package/deps/librdkafka/tests/0045-subscribe_update.c +284 -20
  166. package/deps/librdkafka/tests/0047-partial_buf_tmout.c +1 -0
  167. package/deps/librdkafka/tests/0048-partitioner.c +1 -1
  168. package/deps/librdkafka/tests/0050-subscribe_adds.c +1 -0
  169. package/deps/librdkafka/tests/0051-assign_adds.c +1 -0
  170. package/deps/librdkafka/tests/0052-msg_timestamps.c +22 -4
  171. package/deps/librdkafka/tests/0053-stats_cb.cpp +12 -20
  172. package/deps/librdkafka/tests/0055-producer_latency.c +176 -3
  173. package/deps/librdkafka/tests/0056-balanced_group_mt.c +6 -2
  174. package/deps/librdkafka/tests/0058-log.cpp +3 -3
  175. package/deps/librdkafka/tests/0059-bsearch.cpp +8 -4
  176. package/deps/librdkafka/tests/0061-consumer_lag.cpp +25 -5
  177. package/deps/librdkafka/tests/0067-empty_topic.cpp +3 -0
  178. package/deps/librdkafka/tests/0068-produce_timeout.c +21 -23
  179. package/deps/librdkafka/tests/0069-consumer_add_parts.c +3 -7
  180. package/deps/librdkafka/tests/0075-retry.c +38 -1
  181. package/deps/librdkafka/tests/0076-produce_retry.c +2 -0
  182. package/deps/librdkafka/tests/0077-compaction.c +8 -2
  183. package/deps/librdkafka/tests/0080-admin_ut.c +34 -4
  184. package/deps/librdkafka/tests/0081-admin.c +455 -155
  185. package/deps/librdkafka/tests/0082-fetch_max_bytes.cpp +4 -0
  186. package/deps/librdkafka/tests/0083-cb_event.c +8 -3
  187. package/deps/librdkafka/tests/0084-destroy_flags.c +14 -18
  188. package/deps/librdkafka/tests/0085-headers.cpp +4 -0
  189. package/deps/librdkafka/tests/0086-purge.c +40 -7
  190. package/deps/librdkafka/tests/0088-produce_metadata_timeout.c +1 -1
  191. package/deps/librdkafka/tests/0089-max_poll_interval.c +12 -7
  192. package/deps/librdkafka/tests/0090-idempotence.c +1 -2
  193. package/deps/librdkafka/tests/0091-max_poll_interval_timeout.c +5 -7
  194. package/deps/librdkafka/tests/0092-mixed_msgver.c +6 -0
  195. package/deps/librdkafka/tests/0093-holb.c +8 -5
  196. package/deps/librdkafka/tests/0094-idempotence_msg_timeout.c +1 -0
  197. package/deps/librdkafka/tests/0097-ssl_verify.cpp +262 -70
  198. package/deps/librdkafka/tests/0098-consumer-txn.cpp +16 -16
  199. package/deps/librdkafka/tests/0099-commit_metadata.c +1 -1
  200. package/deps/librdkafka/tests/0101-fetch-from-follower.cpp +1 -1
  201. package/deps/librdkafka/tests/0102-static_group_rebalance.c +317 -16
  202. package/deps/librdkafka/tests/0103-transactions.c +7 -7
  203. package/deps/librdkafka/tests/0104-fetch_from_follower_mock.c +1 -0
  204. package/deps/librdkafka/tests/0105-transactions_mock.c +18 -11
  205. package/deps/librdkafka/tests/0106-cgrp_sess_timeout.c +35 -14
  206. package/deps/librdkafka/tests/0107-topic_recreate.c +2 -2
  207. package/deps/librdkafka/tests/0109-auto_create_topics.cpp +86 -26
  208. package/deps/librdkafka/tests/0110-batch_size.cpp +1 -2
  209. package/deps/librdkafka/tests/0112-assign_unknown_part.c +3 -14
  210. package/deps/librdkafka/tests/0113-cooperative_rebalance.cpp +248 -104
  211. package/deps/librdkafka/tests/0114-sticky_partitioning.cpp +3 -3
  212. package/deps/librdkafka/tests/0115-producer_auth.cpp +4 -1
  213. package/deps/librdkafka/tests/0116-kafkaconsumer_close.cpp +7 -5
  214. package/deps/librdkafka/tests/0117-mock_errors.c +15 -5
  215. package/deps/librdkafka/tests/0118-commit_rebalance.c +41 -8
  216. package/deps/librdkafka/tests/0119-consumer_auth.cpp +20 -1
  217. package/deps/librdkafka/tests/0120-asymmetric_subscription.c +8 -3
  218. package/deps/librdkafka/tests/0125-immediate_flush.c +1 -1
  219. package/deps/librdkafka/tests/0126-oauthbearer_oidc.c +323 -8
  220. package/deps/librdkafka/tests/0129-fetch_aborted_msgs.c +1 -0
  221. package/deps/librdkafka/tests/0132-strategy_ordering.c +12 -4
  222. package/deps/librdkafka/tests/0133-ssl_keys.c +28 -6
  223. package/deps/librdkafka/tests/0137-barrier_batch_consume.c +24 -14
  224. package/deps/librdkafka/tests/0139-offset_validation_mock.c +510 -2
  225. package/deps/librdkafka/tests/0140-commit_metadata.cpp +1 -1
  226. package/deps/librdkafka/tests/0142-reauthentication.c +37 -17
  227. package/deps/librdkafka/tests/0143-exponential_backoff_mock.c +39 -40
  228. package/deps/librdkafka/tests/0146-metadata_mock.c +76 -15
  229. package/deps/librdkafka/tests/0147-consumer_group_consumer_mock.c +952 -0
  230. package/deps/librdkafka/tests/0148-offset_fetch_commit_error_mock.c +563 -0
  231. package/deps/librdkafka/tests/0149-broker-same-host-port.c +140 -0
  232. package/deps/librdkafka/tests/0150-telemetry_mock.c +9 -6
  233. package/deps/librdkafka/tests/0151-purge-brokers.c +566 -0
  234. package/deps/librdkafka/tests/0152-rebootstrap.c +59 -0
  235. package/deps/librdkafka/tests/0153-memberid.c +128 -0
  236. package/deps/librdkafka/tests/CMakeLists.txt +6 -0
  237. package/deps/librdkafka/tests/LibrdkafkaTestApp.py +34 -9
  238. package/deps/librdkafka/tests/autotest.sh +0 -0
  239. package/deps/librdkafka/tests/broker_version_tests.py +0 -0
  240. package/deps/librdkafka/tests/buildbox.sh +0 -0
  241. package/deps/librdkafka/tests/cleanup-checker-tests.sh +0 -0
  242. package/deps/librdkafka/tests/cluster_testing.py +0 -0
  243. package/deps/librdkafka/tests/delete-test-topics.sh +0 -0
  244. package/deps/librdkafka/tests/fixtures/oauthbearer/jwt_assertion_template.json +10 -0
  245. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.intermediate.p12 +0 -0
  246. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.p12 +0 -0
  247. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.intermediate.pem +72 -0
  248. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.pem +42 -101
  249. package/deps/librdkafka/tests/fixtures/ssl/client2.intermediate.key +46 -0
  250. package/deps/librdkafka/tests/fixtures/ssl/client2.key +41 -29
  251. package/deps/librdkafka/tests/fixtures/ssl/create_keys.sh +112 -37
  252. package/deps/librdkafka/tests/gen-ssl-certs.sh +0 -0
  253. package/deps/librdkafka/tests/interactive_broker_version.py +0 -0
  254. package/deps/librdkafka/tests/java/Makefile +2 -1
  255. package/deps/librdkafka/tests/java/run-class.sh +0 -0
  256. package/deps/librdkafka/tests/lz4_manual_test.sh +0 -0
  257. package/deps/librdkafka/tests/multi-broker-version-test.sh +0 -0
  258. package/deps/librdkafka/tests/parse-refcnt.sh +0 -0
  259. package/deps/librdkafka/tests/performance_plot.py +0 -0
  260. package/deps/librdkafka/tests/requirements.txt +1 -1
  261. package/deps/librdkafka/tests/run-all-tests.sh +79 -0
  262. package/deps/librdkafka/tests/run-consumer-tests.sh +0 -0
  263. package/deps/librdkafka/tests/run-producer-tests.sh +0 -0
  264. package/deps/librdkafka/tests/run-test-batches.py +157 -0
  265. package/deps/librdkafka/tests/run-test.sh +0 -0
  266. package/deps/librdkafka/tests/sasl_test.py +0 -0
  267. package/deps/librdkafka/tests/test.c +478 -18
  268. package/deps/librdkafka/tests/test.h +62 -13
  269. package/deps/librdkafka/tests/testcpp.cpp +6 -1
  270. package/deps/librdkafka/tests/testcpp.h +30 -2
  271. package/deps/librdkafka/tests/testshared.h +16 -2
  272. package/deps/librdkafka/tests/tools/stats/graph.py +0 -0
  273. package/deps/librdkafka/tests/tools/stats/to_csv.py +1 -1
  274. package/deps/librdkafka/tests/trivup/trivup-0.14.0.tar.gz +0 -0
  275. package/deps/librdkafka/tests/until-fail.sh +0 -0
  276. package/deps/librdkafka/tests/xxxx-metadata.cpp +1 -1
  277. package/deps/librdkafka/vcpkg.json +1 -1
  278. package/deps/librdkafka/win32/setup-msys2.ps1 +24 -8
  279. package/deps/librdkafka/win32/setup-vcpkg.ps1 +28 -6
  280. package/deps/librdkafka/win32/tests/tests.vcxproj +6 -0
  281. package/deps/librdkafka/win32/wingetopt.h +5 -4
  282. package/errors.d.ts +27 -1
  283. package/lib/error.js +29 -3
  284. package/make_docs.sh +0 -0
  285. package/package.json +12 -13
  286. package/run_docker.sh +0 -0
  287. package/src/callbacks.cc +6 -9
  288. package/src/callbacks.h +1 -5
  289. package/test/kafka-consumer-worker.js +10 -7
  290. package/test/kafka-consumer.spec.js +32 -21
  291. package/deps/librdkafka/.semaphore/project.yml +0 -43
  292. package/deps/librdkafka/.semaphore/project_public.yml +0 -20
  293. package/deps/librdkafka/win32/install-openssl.ps1 +0 -33
@@ -30,6 +30,8 @@
30
30
  #ifndef _RDKAFKA_MOCK_INT_H_
31
31
  #define _RDKAFKA_MOCK_INT_H_
32
32
 
33
+ #include "rdkafka_request.h"
34
+
33
35
  /**
34
36
  * @name Mock cluster - internal data types
35
37
  *
@@ -65,33 +67,33 @@ typedef TAILQ_HEAD(rd_kafka_mock_error_stack_head_s,
65
67
  /**
66
68
  * @struct Consumer group protocol name and metadata.
67
69
  */
68
- typedef struct rd_kafka_mock_cgrp_proto_s {
70
+ typedef struct rd_kafka_mock_cgrp_classic_proto_s {
69
71
  rd_kafkap_str_t *name;
70
72
  rd_kafkap_bytes_t *metadata;
71
- } rd_kafka_mock_cgrp_proto_t;
73
+ } rd_kafka_mock_cgrp_classic_proto_t;
72
74
 
73
75
  /**
74
76
  * @struct Consumer group member
75
77
  */
76
- typedef struct rd_kafka_mock_cgrp_member_s {
77
- TAILQ_ENTRY(rd_kafka_mock_cgrp_member_s) link;
78
+ typedef struct rd_kafka_mock_cgrp_classic_member_s {
79
+ TAILQ_ENTRY(rd_kafka_mock_cgrp_classic_member_s) link;
78
80
  char *id; /**< MemberId */
79
81
  char *group_instance_id; /**< Group instance id */
80
82
  rd_ts_t ts_last_activity; /**< Last activity, e.g., Heartbeat */
81
- rd_kafka_mock_cgrp_proto_t *protos; /**< Protocol names */
82
- int proto_cnt; /**< Number of protocols */
83
- rd_kafkap_bytes_t *assignment; /**< Current assignment */
83
+ rd_kafka_mock_cgrp_classic_proto_t *protos; /**< Protocol names */
84
+ int proto_cnt; /**< Number of protocols */
85
+ rd_kafkap_bytes_t *assignment; /**< Current assignment */
84
86
  rd_kafka_buf_t *resp; /**< Current response buffer */
85
87
  struct rd_kafka_mock_connection_s *conn; /**< Connection, may be NULL
86
88
  * if there is no ongoing
87
89
  * request. */
88
- } rd_kafka_mock_cgrp_member_t;
90
+ } rd_kafka_mock_cgrp_classic_member_t;
89
91
 
90
92
  /**
91
- * @struct Consumer group.
93
+ * @struct Classic consumer group.
92
94
  */
93
- typedef struct rd_kafka_mock_cgrp_s {
94
- TAILQ_ENTRY(rd_kafka_mock_cgrp_s) link;
95
+ typedef struct rd_kafka_mock_cgrp_classic_s {
96
+ TAILQ_ENTRY(rd_kafka_mock_cgrp_classic_s) link;
95
97
  struct rd_kafka_mock_cluster_s *cluster; /**< Cluster */
96
98
  struct rd_kafka_mock_connection_s *conn; /**< Connection */
97
99
  char *id; /**< Group Id */
@@ -99,20 +101,83 @@ typedef struct rd_kafka_mock_cgrp_s {
99
101
  char *protocol_name; /**< Elected protocol name */
100
102
  int32_t generation_id; /**< Generation Id */
101
103
  int session_timeout_ms; /**< Session timeout */
102
- enum { RD_KAFKA_MOCK_CGRP_STATE_EMPTY, /* No members */
103
- RD_KAFKA_MOCK_CGRP_STATE_JOINING, /* Members are joining */
104
- RD_KAFKA_MOCK_CGRP_STATE_SYNCING, /* Syncing assignments */
105
- RD_KAFKA_MOCK_CGRP_STATE_REBALANCING, /* Rebalance triggered */
106
- RD_KAFKA_MOCK_CGRP_STATE_UP, /* Group is operational */
104
+ enum {
105
+ RD_KAFKA_MOCK_CGRP_STATE_EMPTY, /* No members */
106
+ RD_KAFKA_MOCK_CGRP_STATE_JOINING, /* Members are joining */
107
+ RD_KAFKA_MOCK_CGRP_STATE_SYNCING, /* Syncing assignments */
108
+ RD_KAFKA_MOCK_CGRP_STATE_REBALANCING, /* Rebalance triggered */
109
+ RD_KAFKA_MOCK_CGRP_STATE_UP, /* Group is operational */
107
110
  } state; /**< Consumer group state */
108
111
  rd_kafka_timer_t session_tmr; /**< Session timeout timer */
109
112
  rd_kafka_timer_t rebalance_tmr; /**< Rebalance state timer */
110
- TAILQ_HEAD(, rd_kafka_mock_cgrp_member_s) members; /**< Group members */
113
+ TAILQ_HEAD(, rd_kafka_mock_cgrp_classic_member_s)
114
+ members; /**< Group members */
111
115
  int member_cnt; /**< Number of group members */
112
116
  int last_member_cnt; /**< Mumber of group members at last election */
113
117
  int assignment_cnt; /**< Number of member assignments in last Sync */
114
- rd_kafka_mock_cgrp_member_t *leader; /**< Elected leader */
115
- } rd_kafka_mock_cgrp_t;
118
+ rd_kafka_mock_cgrp_classic_member_t *leader; /**< Elected leader */
119
+ } rd_kafka_mock_cgrp_classic_t;
120
+
121
+
122
+ /**
123
+ * @struct "Consumer" Consumer group (KIP-848).
124
+ */
125
+ typedef struct rd_kafka_mock_cgrp_consumer_s {
126
+ TAILQ_ENTRY(rd_kafka_mock_cgrp_consumer_s) link;
127
+ struct rd_kafka_mock_cluster_s *cluster; /**< Cluster */
128
+ char *id; /**< Group Id */
129
+ int32_t group_epoch; /**< Group epoch */
130
+ int session_timeout_ms; /**< Session timeout */
131
+ rd_kafka_timer_t session_tmr; /**< Session timeout timer */
132
+ int heartbeat_interval_ms; /**< Heartbeat interval */
133
+ TAILQ_HEAD(, rd_kafka_mock_cgrp_consumer_member_s)
134
+ members; /**< Group members */
135
+ int member_cnt; /**< Number of group members */
136
+ rd_bool_t manual_assignment; /**< Use manual assignment */
137
+ } rd_kafka_mock_cgrp_consumer_t;
138
+
139
+
140
+ /**
141
+ * @struct "Consumer" Consumer group member (KIP-848).
142
+ */
143
+ typedef struct rd_kafka_mock_cgrp_consumer_member_s {
144
+ TAILQ_ENTRY(rd_kafka_mock_cgrp_consumer_member_s) link;
145
+ char *id; /**< MemberId */
146
+ char *instance_id; /**< Group instance id */
147
+ rd_ts_t ts_last_activity; /**< Last activity, e.g.,
148
+ * ConsumerGroupHeartbeat */
149
+ int32_t current_member_epoch; /**< Current member epoch,
150
+ * updated only on heartbeat. */
151
+ int32_t
152
+ target_member_epoch; /**< Target member epoch,
153
+ * updated only when calling
154
+ * rd_kafka_mock_cgrp_consumer_target_assignment.
155
+ */
156
+ rd_kafka_topic_partition_list_t
157
+ *current_assignment; /**< Current assignment,
158
+ * only updated when reported by the client.
159
+ */
160
+ rd_kafka_topic_partition_list_t *
161
+ target_assignment; /**< Target assignment,
162
+ * only updated when calling
163
+ * rd_kafka_mock_cgrp_consumer_target_assignment.
164
+ */
165
+ rd_kafka_topic_partition_list_t
166
+ *returned_assignment; /**< Returned assignment */
167
+
168
+ rd_list_t *subscribed_topics; /**< Final list of Subscribed topics after
169
+ considering regex as well*/
170
+ rd_list_t *subscribed_topic_names; /**< Subscribed topic names received
171
+ in the heartbeat */
172
+ char *subscribed_topic_regex; /**< Subscribed regex */
173
+
174
+ rd_bool_t left_static_membership; /**< Member left the group
175
+ * with static membership. */
176
+ struct rd_kafka_mock_connection_s *conn; /**< Connection, may be NULL
177
+ * if there is no ongoing
178
+ * request. */
179
+ rd_kafka_mock_cgrp_consumer_t *mcgrp; /**< Consumer group */
180
+ } rd_kafka_mock_cgrp_consumer_member_t;
116
181
 
117
182
 
118
183
  /**
@@ -360,7 +425,9 @@ struct rd_kafka_mock_cluster_s {
360
425
  TAILQ_HEAD(, rd_kafka_mock_topic_s) topics;
361
426
  int topic_cnt;
362
427
 
363
- TAILQ_HEAD(, rd_kafka_mock_cgrp_s) cgrps;
428
+ TAILQ_HEAD(, rd_kafka_mock_cgrp_classic_s) cgrps_classic;
429
+
430
+ TAILQ_HEAD(, rd_kafka_mock_cgrp_consumer_s) cgrps_consumer;
364
431
 
365
432
  /** Explicit coordinators (set with mock_set_coordinator()) */
366
433
  TAILQ_HEAD(, rd_kafka_mock_coord_s) coords;
@@ -396,13 +463,17 @@ struct rd_kafka_mock_cluster_s {
396
463
  int replication_factor; /**< Auto topic create repl factor */
397
464
  /** Group initial rebalance delay */
398
465
  int32_t group_initial_rebalance_delay_ms;
466
+ /** Session timeout (KIP 848) */
467
+ int group_consumer_session_timeout_ms;
468
+ /** Heartbeat interval (KIP 848) */
469
+ int group_consumer_heartbeat_interval_ms;
399
470
  } defaults;
400
471
 
401
472
  /**< Dynamic array of IO handlers for corresponding fd in .fds */
402
473
  struct {
403
474
  rd_kafka_mock_io_handler_t *cb; /**< Callback */
404
475
  void *opaque; /**< Callbacks' opaque */
405
- } * handlers;
476
+ } *handlers;
406
477
 
407
478
  /**< Per-protocol request error stack. */
408
479
  rd_kafka_mock_error_stack_head_t errstacks;
@@ -538,47 +609,95 @@ rd_kafka_mock_pid_find(rd_kafka_mock_cluster_t *mcluster,
538
609
  * @name Mock consumer group (rdkafka_mock_cgrp.c)
539
610
  * @{
540
611
  */
541
- void rd_kafka_mock_cgrp_member_active(rd_kafka_mock_cgrp_t *mcgrp,
542
- rd_kafka_mock_cgrp_member_t *member);
543
- void rd_kafka_mock_cgrp_member_assignment_set(
544
- rd_kafka_mock_cgrp_t *mcgrp,
545
- rd_kafka_mock_cgrp_member_t *member,
612
+ void rd_kafka_mock_cgrp_classic_member_active(
613
+ rd_kafka_mock_cgrp_classic_t *mcgrp,
614
+ rd_kafka_mock_cgrp_classic_member_t *member);
615
+ void rd_kafka_mock_cgrp_classic_member_assignment_set(
616
+ rd_kafka_mock_cgrp_classic_t *mcgrp,
617
+ rd_kafka_mock_cgrp_classic_member_t *member,
546
618
  const rd_kafkap_bytes_t *Metadata);
547
- rd_kafka_resp_err_t
548
- rd_kafka_mock_cgrp_member_sync_set(rd_kafka_mock_cgrp_t *mcgrp,
549
- rd_kafka_mock_cgrp_member_t *member,
550
- rd_kafka_mock_connection_t *mconn,
551
- rd_kafka_buf_t *resp);
552
- rd_kafka_resp_err_t
553
- rd_kafka_mock_cgrp_member_leave(rd_kafka_mock_cgrp_t *mcgrp,
554
- rd_kafka_mock_cgrp_member_t *member);
555
- void rd_kafka_mock_cgrp_protos_destroy(rd_kafka_mock_cgrp_proto_t *protos,
556
- int proto_cnt);
557
- rd_kafka_resp_err_t
558
- rd_kafka_mock_cgrp_member_add(rd_kafka_mock_cgrp_t *mcgrp,
559
- rd_kafka_mock_connection_t *mconn,
560
- rd_kafka_buf_t *resp,
561
- const rd_kafkap_str_t *MemberId,
562
- const rd_kafkap_str_t *GroupInstanceId,
563
- const rd_kafkap_str_t *ProtocolType,
564
- rd_kafka_mock_cgrp_proto_t *protos,
565
- int proto_cnt,
566
- int session_timeout_ms);
567
- rd_kafka_resp_err_t
568
- rd_kafka_mock_cgrp_check_state(rd_kafka_mock_cgrp_t *mcgrp,
569
- rd_kafka_mock_cgrp_member_t *member,
570
- const rd_kafka_buf_t *request,
571
- int32_t generation_id);
572
- rd_kafka_mock_cgrp_member_t *
573
- rd_kafka_mock_cgrp_member_find(const rd_kafka_mock_cgrp_t *mcgrp,
574
- const rd_kafkap_str_t *MemberId);
575
- void rd_kafka_mock_cgrp_destroy(rd_kafka_mock_cgrp_t *mcgrp);
576
- rd_kafka_mock_cgrp_t *rd_kafka_mock_cgrp_find(rd_kafka_mock_cluster_t *mcluster,
577
- const rd_kafkap_str_t *GroupId);
578
- rd_kafka_mock_cgrp_t *
579
- rd_kafka_mock_cgrp_get(rd_kafka_mock_cluster_t *mcluster,
580
- const rd_kafkap_str_t *GroupId,
581
- const rd_kafkap_str_t *ProtocolType);
619
+ rd_kafka_resp_err_t rd_kafka_mock_cgrp_classic_member_sync_set(
620
+ rd_kafka_mock_cgrp_classic_t *mcgrp,
621
+ rd_kafka_mock_cgrp_classic_member_t *member,
622
+ rd_kafka_mock_connection_t *mconn,
623
+ rd_kafka_buf_t *resp);
624
+ rd_kafka_resp_err_t rd_kafka_mock_cgrp_classic_member_leave(
625
+ rd_kafka_mock_cgrp_classic_t *mcgrp,
626
+ rd_kafka_mock_cgrp_classic_member_t *member);
627
+ void rd_kafka_mock_cgrp_classic_protos_destroy(
628
+ rd_kafka_mock_cgrp_classic_proto_t *protos,
629
+ int proto_cnt);
630
+ rd_kafka_resp_err_t rd_kafka_mock_cgrp_classic_member_add(
631
+ rd_kafka_mock_cgrp_classic_t *mcgrp,
632
+ rd_kafka_mock_connection_t *mconn,
633
+ rd_kafka_buf_t *resp,
634
+ const rd_kafkap_str_t *MemberId,
635
+ const rd_kafkap_str_t *GroupInstanceId,
636
+ const rd_kafkap_str_t *ProtocolType,
637
+ rd_kafka_mock_cgrp_classic_proto_t *protos,
638
+ int proto_cnt,
639
+ int session_timeout_ms);
640
+ rd_kafka_resp_err_t rd_kafka_mock_cgrp_classic_check_state(
641
+ rd_kafka_mock_cgrp_classic_t *mcgrp,
642
+ rd_kafka_mock_cgrp_classic_member_t *member,
643
+ const rd_kafka_buf_t *request,
644
+ int32_t generation_id);
645
+ rd_kafka_mock_cgrp_classic_member_t *rd_kafka_mock_cgrp_classic_member_find(
646
+ const rd_kafka_mock_cgrp_classic_t *mcgrp,
647
+ const rd_kafkap_str_t *MemberId);
648
+ void rd_kafka_mock_cgrp_classic_destroy(rd_kafka_mock_cgrp_classic_t *mcgrp);
649
+ rd_kafka_mock_cgrp_classic_t *
650
+ rd_kafka_mock_cgrp_classic_find(rd_kafka_mock_cluster_t *mcluster,
651
+ const rd_kafkap_str_t *GroupId);
652
+ rd_kafka_mock_cgrp_classic_t *
653
+ rd_kafka_mock_cgrp_classic_get(rd_kafka_mock_cluster_t *mcluster,
654
+ const rd_kafkap_str_t *GroupId,
655
+ const rd_kafkap_str_t *ProtocolType);
656
+
657
+ /* "consumer" consumer group (KIP-848) */
658
+
659
+ rd_kafka_topic_partition_list_t *
660
+ rd_kafka_mock_cgrp_consumer_member_next_assignment(
661
+ rd_kafka_mock_cgrp_consumer_member_t *member,
662
+ rd_kafka_topic_partition_list_t *current_assignment,
663
+ int *member_epoch);
664
+
665
+ void rd_kafka_mock_cgrp_consumer_member_active(
666
+ rd_kafka_mock_cgrp_consumer_t *mcgrp,
667
+ rd_kafka_mock_cgrp_consumer_member_t *member);
668
+
669
+ void rd_kafka_mock_cgrp_consumer_destroy(rd_kafka_mock_cgrp_consumer_t *mcgrp);
670
+
671
+ rd_kafka_mock_cgrp_consumer_t *
672
+ rd_kafka_mock_cgrp_consumer_find(const rd_kafka_mock_cluster_t *mcluster,
673
+ const rd_kafkap_str_t *GroupId);
674
+
675
+ rd_kafka_mock_cgrp_consumer_t *
676
+ rd_kafka_mock_cgrp_consumer_get(rd_kafka_mock_cluster_t *mcluster,
677
+ const rd_kafkap_str_t *GroupId);
678
+
679
+ void rd_kafka_mock_cgrp_consumer_member_leave(
680
+ rd_kafka_mock_cgrp_consumer_t *mcgrp,
681
+ rd_kafka_mock_cgrp_consumer_member_t *member,
682
+ rd_bool_t static_leave);
683
+
684
+ void rd_kafka_mock_cgrp_consumer_member_fenced(
685
+ rd_kafka_mock_cgrp_consumer_t *mcgrp,
686
+ rd_kafka_mock_cgrp_consumer_member_t *member);
687
+
688
+ rd_kafka_mock_cgrp_consumer_member_t *rd_kafka_mock_cgrp_consumer_member_find(
689
+ const rd_kafka_mock_cgrp_consumer_t *mcgrp,
690
+ const rd_kafkap_str_t *MemberId);
691
+
692
+ rd_kafka_mock_cgrp_consumer_member_t *rd_kafka_mock_cgrp_consumer_member_add(
693
+ rd_kafka_mock_cgrp_consumer_t *mcgrp,
694
+ struct rd_kafka_mock_connection_s *conn,
695
+ const rd_kafkap_str_t *MemberId,
696
+ const rd_kafkap_str_t *InstanceId,
697
+ rd_kafkap_str_t *SubscribedTopicNames,
698
+ int32_t SubscribedTopicNamesCnt,
699
+ const rd_kafkap_str_t *SubscribedTopicRegex);
700
+
582
701
  void rd_kafka_mock_cgrps_connection_closed(rd_kafka_mock_cluster_t *mcluster,
583
702
  rd_kafka_mock_connection_t *mconn);
584
703
  /**
@@ -383,6 +383,7 @@ rd_kafka_produceva(rd_kafka_t *rk, const rd_kafka_vu_t *vus, size_t cnt) {
383
383
  rd_kafka_error_t *error = NULL;
384
384
  rd_kafka_headers_t *hdrs = NULL;
385
385
  rd_kafka_headers_t *app_hdrs = NULL; /* App-provided headers list */
386
+ int existing = 0;
386
387
  size_t i;
387
388
 
388
389
  if (unlikely(rd_kafka_check_produce(rk, &error)))
@@ -392,8 +393,11 @@ rd_kafka_produceva(rd_kafka_t *rk, const rd_kafka_vu_t *vus, size_t cnt) {
392
393
  const rd_kafka_vu_t *vu = &vus[i];
393
394
  switch (vu->vtype) {
394
395
  case RD_KAFKA_VTYPE_TOPIC:
395
- rkt =
396
- rd_kafka_topic_new0(rk, vu->u.cstr, NULL, NULL, 1);
396
+ rkt = rd_kafka_topic_new0(rk, vu->u.cstr, NULL,
397
+ &existing, 1);
398
+ if (!existing)
399
+ rd_kafka_topic_fast_leader_query(
400
+ rk, rd_true /* force */);
397
401
  break;
398
402
 
399
403
  case RD_KAFKA_VTYPE_RKT:
@@ -487,6 +491,8 @@ rd_kafka_produceva(rd_kafka_t *rk, const rd_kafka_vu_t *vus, size_t cnt) {
487
491
  rd_kafka_err2str(err));
488
492
  goto err;
489
493
  }
494
+ /* 'hdrs' is now owned by 'rkm' */
495
+ hdrs = NULL;
490
496
 
491
497
  /* Partition the message */
492
498
  err = rd_kafka_msg_partitioner(rkt, rkm, 1);
@@ -549,6 +555,7 @@ rd_kafka_resp_err_t rd_kafka_producev(rd_kafka_t *rk, ...) {
549
555
  rd_kafka_resp_err_t err;
550
556
  rd_kafka_headers_t *hdrs = NULL;
551
557
  rd_kafka_headers_t *app_hdrs = NULL; /* App-provided headers list */
558
+ int existing = 0;
552
559
 
553
560
  if (unlikely((err = rd_kafka_check_produce(rk, NULL))))
554
561
  return err;
@@ -559,7 +566,10 @@ rd_kafka_resp_err_t rd_kafka_producev(rd_kafka_t *rk, ...) {
559
566
  switch (vtype) {
560
567
  case RD_KAFKA_VTYPE_TOPIC:
561
568
  rkt = rd_kafka_topic_new0(rk, va_arg(ap, const char *),
562
- NULL, NULL, 1);
569
+ NULL, &existing, 1);
570
+ if (!existing)
571
+ rd_kafka_topic_fast_leader_query(
572
+ rk, rd_true /* force */);
563
573
  break;
564
574
 
565
575
  case RD_KAFKA_VTYPE_RKT:
@@ -2528,22 +2538,28 @@ int unittest_msg(void) {
2528
2538
  {10, 10},
2529
2539
  {33692865, 33692865},
2530
2540
  {0, 0}});
2531
- fails += unittest_msgq_insert_sort(
2532
- "many messages", insert_baseline, NULL,
2533
- (const struct ut_msg_range[]) {{100000, 200000},
2534
- {400000, 450000},
2535
- {900000, 920000},
2536
- {33692864, 33751992},
2537
- {33906868, 33993690},
2538
- {40000000, 44000000},
2539
- {0, 0}},
2540
- (const struct ut_msg_range[]) {{1, 199},
2541
- {350000, 360000},
2542
- {500000, 500010},
2543
- {1000000, 1000200},
2544
- {33751993, 33906867},
2545
- {50000001, 50000001},
2546
- {0, 0}});
2541
+ if (rd_unittest_with_valgrind) {
2542
+ RD_UT_WARN(
2543
+ "Skipping large message range test "
2544
+ "when using Valgrind");
2545
+ } else {
2546
+ fails += unittest_msgq_insert_sort(
2547
+ "many messages", insert_baseline, NULL,
2548
+ (const struct ut_msg_range[]) {{100000, 200000},
2549
+ {400000, 450000},
2550
+ {900000, 920000},
2551
+ {33692864, 33751992},
2552
+ {33906868, 33993690},
2553
+ {40000000, 44000000},
2554
+ {0, 0}},
2555
+ (const struct ut_msg_range[]) {{1, 199},
2556
+ {350000, 360000},
2557
+ {500000, 500010},
2558
+ {1000000, 1000200},
2559
+ {33751993, 33906867},
2560
+ {50000001, 50000001},
2561
+ {0, 0}});
2562
+ }
2547
2563
  fails += unittest_msgq_insert_sort(
2548
2564
  "issue #2508", insert_baseline, NULL,
2549
2565
  (const struct ut_msg_range[]) {
@@ -535,9 +535,9 @@ rd_kafka_msgq_overlap(const rd_kafka_msgq_t *a, const rd_kafka_msgq_t *b) {
535
535
  la = rd_kafka_msgq_last(a);
536
536
  lb = rd_kafka_msgq_last(b);
537
537
 
538
- return (rd_bool_t)(
539
- fa->rkm_u.producer.msgid <= lb->rkm_u.producer.msgid &&
540
- fb->rkm_u.producer.msgid <= la->rkm_u.producer.msgid);
538
+ return (
539
+ rd_bool_t)(fa->rkm_u.producer.msgid <= lb->rkm_u.producer.msgid &&
540
+ fb->rkm_u.producer.msgid <= la->rkm_u.producer.msgid);
541
541
  }
542
542
 
543
543
  /**
@@ -114,9 +114,9 @@ rd_kafka_msgset_writer_select_MsgVersion(rd_kafka_msgset_writer_t *msetw) {
114
114
  int feature;
115
115
  int16_t ApiVersion;
116
116
  } compr_req[RD_KAFKA_COMPRESSION_NUM] = {
117
- [RD_KAFKA_COMPRESSION_LZ4] = {RD_KAFKA_FEATURE_LZ4, 0},
117
+ [RD_KAFKA_COMPRESSION_LZ4] = {RD_KAFKA_FEATURE_LZ4, 0},
118
118
  #if WITH_ZSTD
119
- [RD_KAFKA_COMPRESSION_ZSTD] = {RD_KAFKA_FEATURE_ZSTD, 7},
119
+ [RD_KAFKA_COMPRESSION_ZSTD] = {RD_KAFKA_FEATURE_ZSTD, 7},
120
120
  #endif
121
121
  };
122
122
 
@@ -145,12 +145,16 @@ rd_kafka_msgset_writer_select_MsgVersion(rd_kafka_msgset_writer_t *msetw) {
145
145
  * by both client and broker, else disable compression.
146
146
  */
147
147
  if (msetw->msetw_compression &&
148
- (rd_kafka_broker_ApiVersion_supported(
149
- rkb, RD_KAFKAP_Produce, 0,
150
- compr_req[msetw->msetw_compression].ApiVersion, NULL) == -1 ||
151
- (compr_req[msetw->msetw_compression].feature &&
152
- !(msetw->msetw_rkb->rkb_features &
153
- compr_req[msetw->msetw_compression].feature)))) {
148
+ (
149
+ /* ApiVersion is smaller than the minimum one */
150
+ !rd_kafka_broker_ApiVersion_at_least(
151
+ rkb, RD_KAFKAP_Produce,
152
+ compr_req[msetw->msetw_compression].ApiVersion) ||
153
+ /* There's a corresponding feature and it isn't supported
154
+ * by this broker. */
155
+ (compr_req[msetw->msetw_compression].feature &&
156
+ !(msetw->msetw_rkb->rkb_features &
157
+ compr_req[msetw->msetw_compression].feature)))) {
154
158
  if (unlikely(
155
159
  rd_interval(&rkb->rkb_suppress.unsupported_compression,
156
160
  /* at most once per day */
@@ -705,8 +709,8 @@ rd_kafka_msgset_writer_write_msg_v2(rd_kafka_msgset_writer_t *msetw,
705
709
  sizeof(varint_OffsetDelta), Offset);
706
710
  sz_KeyLen = rd_uvarint_enc_i32(varint_KeyLen, sizeof(varint_KeyLen),
707
711
  rkm->rkm_key
708
- ? (int32_t)rkm->rkm_key_len
709
- : (int32_t)RD_KAFKAP_BYTES_LEN_NULL);
712
+ ? (int32_t)rkm->rkm_key_len
713
+ : (int32_t)RD_KAFKAP_BYTES_LEN_NULL);
710
714
  sz_ValueLen = rd_uvarint_enc_i32(
711
715
  varint_ValueLen, sizeof(varint_ValueLen),
712
716
  rkm->rkm_payload ? (int32_t)rkm->rkm_len
@@ -900,7 +900,21 @@ static void rd_kafka_offset_validate_tmr_cb(rd_kafka_timers_t *rkts,
900
900
  rd_kafka_toppar_t *rktp = arg;
901
901
 
902
902
  rd_kafka_toppar_lock(rktp);
903
- rd_kafka_offset_validate(rktp, "retrying offset validation");
903
+ /* Retry validation only when it's still needed.
904
+ * Even if validation can be started in fetch states ACTIVE and
905
+ * VALIDATE_EPOCH_WAIT, its retry should be done only
906
+ * in fetch state VALIDATE_EPOCH_WAIT. */
907
+ if (rktp->rktp_fetch_state == RD_KAFKA_TOPPAR_FETCH_VALIDATE_EPOCH_WAIT)
908
+ rd_kafka_offset_validate(rktp, "retrying offset validation");
909
+ else {
910
+ rd_kafka_dbg(rktp->rktp_rkt->rkt_rk, FETCH, "VALIDATE",
911
+ "%.*s [%" PRId32
912
+ "]: skipping offset "
913
+ "validation retry in fetch state %s",
914
+ RD_KAFKAP_STR_PR(rktp->rktp_rkt->rkt_topic),
915
+ rktp->rktp_partition,
916
+ rd_kafka_fetch_states[rktp->rktp_fetch_state]);
917
+ }
904
918
  rd_kafka_toppar_unlock(rktp);
905
919
  }
906
920
 
@@ -923,6 +937,9 @@ static void rd_kafka_toppar_handle_OffsetForLeaderEpoch(rd_kafka_t *rk,
923
937
  rd_kafka_topic_partition_t *rktpar;
924
938
  int64_t end_offset;
925
939
  int32_t end_offset_leader_epoch;
940
+ rd_kafka_toppar_lock(rktp);
941
+ rktp->rktp_flags &= ~RD_KAFKA_TOPPAR_F_VALIDATING;
942
+ rd_kafka_toppar_unlock(rktp);
926
943
 
927
944
  if (err == RD_KAFKA_RESP_ERR__DESTROY) {
928
945
  rd_kafka_toppar_destroy(rktp); /* Drop refcnt */
@@ -1142,12 +1159,10 @@ void rd_kafka_offset_validate(rd_kafka_toppar_t *rktp, const char *fmt, ...) {
1142
1159
  rd_kafka_dbg(rktp->rktp_rkt->rkt_rk, FETCH, "VALIDATE",
1143
1160
  "%.*s [%" PRId32
1144
1161
  "]: unable to perform offset "
1145
- "validation: partition leader not available",
1162
+ "validation: partition leader not available. "
1163
+ "Retrying when available",
1146
1164
  RD_KAFKAP_STR_PR(rktp->rktp_rkt->rkt_topic),
1147
1165
  rktp->rktp_partition);
1148
-
1149
- rd_kafka_toppar_set_fetch_state(rktp,
1150
- RD_KAFKA_TOPPAR_FETCH_ACTIVE);
1151
1166
  return;
1152
1167
  }
1153
1168
 
@@ -1169,8 +1184,21 @@ void rd_kafka_offset_validate(rd_kafka_toppar_t *rktp, const char *fmt, ...) {
1169
1184
  return;
1170
1185
  }
1171
1186
 
1187
+ if (rktp->rktp_flags & RD_KAFKA_TOPPAR_F_VALIDATING) {
1188
+ rd_kafka_dbg(
1189
+ rktp->rktp_rkt->rkt_rk, FETCH, "VALIDATE",
1190
+ "%.*s [%" PRId32
1191
+ "]: skipping offset "
1192
+ "validation for %s: validation is already ongoing",
1193
+ RD_KAFKAP_STR_PR(rktp->rktp_rkt->rkt_topic),
1194
+ rktp->rktp_partition,
1195
+ rd_kafka_fetch_pos2str(rktp->rktp_offset_validation_pos));
1196
+ return;
1197
+ }
1198
+
1172
1199
  rd_kafka_toppar_set_fetch_state(
1173
1200
  rktp, RD_KAFKA_TOPPAR_FETCH_VALIDATE_EPOCH_WAIT);
1201
+ rktp->rktp_flags |= RD_KAFKA_TOPPAR_F_VALIDATING;
1174
1202
 
1175
1203
  /* Construct and send OffsetForLeaderEpochRequest */
1176
1204
  parts = rd_kafka_topic_partition_list_new(1);
@@ -228,7 +228,7 @@ rd_kafka_op_t *rd_kafka_op_new0(const char *source, rd_kafka_op_type_t type) {
228
228
  [RD_KAFKA_OP_PARTITION_JOIN] = _RD_KAFKA_OP_EMPTY,
229
229
  [RD_KAFKA_OP_PARTITION_LEAVE] = _RD_KAFKA_OP_EMPTY,
230
230
  [RD_KAFKA_OP_REBALANCE] = sizeof(rko->rko_u.rebalance),
231
- [RD_KAFKA_OP_TERMINATE] = _RD_KAFKA_OP_EMPTY,
231
+ [RD_KAFKA_OP_TERMINATE] = sizeof(rko->rko_u.terminated),
232
232
  [RD_KAFKA_OP_COORD_QUERY] = _RD_KAFKA_OP_EMPTY,
233
233
  [RD_KAFKA_OP_SUBSCRIBE] = sizeof(rko->rko_u.subscribe),
234
234
  [RD_KAFKA_OP_ASSIGN] = sizeof(rko->rko_u.assign),