@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
@@ -400,6 +400,8 @@ struct rd_kafka_op_s {
400
400
  struct {
401
401
  rd_kafka_metadata_t *md;
402
402
  rd_kafka_metadata_internal_t *mdi;
403
+ /* subscription version for this call */
404
+ int32_t subscription_version;
403
405
  int force; /* force request regardless of outstanding
404
406
  * metadata requests. */
405
407
  } metadata;
@@ -413,7 +415,6 @@ struct rd_kafka_op_s {
413
415
  } dr;
414
416
 
415
417
  struct {
416
- int32_t nodeid;
417
418
  char nodename[RD_KAFKA_NODENAME_SIZE];
418
419
  } node;
419
420
 
@@ -470,13 +471,14 @@ struct rd_kafka_op_s {
470
471
  struct rd_kafka_admin_worker_cbs *cbs;
471
472
 
472
473
  /** Worker state */
473
- enum { RD_KAFKA_ADMIN_STATE_INIT,
474
- RD_KAFKA_ADMIN_STATE_WAIT_BROKER,
475
- RD_KAFKA_ADMIN_STATE_WAIT_CONTROLLER,
476
- RD_KAFKA_ADMIN_STATE_WAIT_FANOUTS,
477
- RD_KAFKA_ADMIN_STATE_CONSTRUCT_REQUEST,
478
- RD_KAFKA_ADMIN_STATE_WAIT_RESPONSE,
479
- RD_KAFKA_ADMIN_STATE_WAIT_BROKER_LIST,
474
+ enum {
475
+ RD_KAFKA_ADMIN_STATE_INIT,
476
+ RD_KAFKA_ADMIN_STATE_WAIT_BROKER,
477
+ RD_KAFKA_ADMIN_STATE_WAIT_CONTROLLER,
478
+ RD_KAFKA_ADMIN_STATE_WAIT_FANOUTS,
479
+ RD_KAFKA_ADMIN_STATE_CONSTRUCT_REQUEST,
480
+ RD_KAFKA_ADMIN_STATE_WAIT_RESPONSE,
481
+ RD_KAFKA_ADMIN_STATE_WAIT_BROKER_LIST,
480
482
  } state;
481
483
 
482
484
  int32_t broker_id; /**< Requested broker id to
@@ -544,6 +546,11 @@ struct rd_kafka_op_s {
544
546
  /** Result cb for this op */
545
547
  void (*result_cb)(rd_kafka_op_t *);
546
548
 
549
+ struct rd_kafka_admin_worker_cbs
550
+ *cbs; /**< Worker Callbacks
551
+ * Moved from admin request
552
+ */
553
+
547
554
  rd_list_t results; /**< Type depends on request type:
548
555
  *
549
556
  * (rd_kafka_topic_result_t *):
@@ -570,19 +577,22 @@ struct rd_kafka_op_s {
570
577
 
571
578
  /**< Mock cluster command */
572
579
  struct {
573
- enum { RD_KAFKA_MOCK_CMD_TOPIC_SET_ERROR,
574
- RD_KAFKA_MOCK_CMD_TOPIC_CREATE,
575
- RD_KAFKA_MOCK_CMD_PART_SET_LEADER,
576
- RD_KAFKA_MOCK_CMD_PART_SET_FOLLOWER,
577
- RD_KAFKA_MOCK_CMD_PART_SET_FOLLOWER_WMARKS,
578
- RD_KAFKA_MOCK_CMD_PART_PUSH_LEADER_RESPONSE,
579
- RD_KAFKA_MOCK_CMD_BROKER_SET_UPDOWN,
580
- RD_KAFKA_MOCK_CMD_BROKER_SET_RTT,
581
- RD_KAFKA_MOCK_CMD_BROKER_SET_RACK,
582
- RD_KAFKA_MOCK_CMD_COORD_SET,
583
- RD_KAFKA_MOCK_CMD_APIVERSION_SET,
584
- RD_KAFKA_MOCK_CMD_REQUESTED_METRICS_SET,
585
- RD_KAFKA_MOCK_CMD_TELEMETRY_PUSH_INTERVAL_SET,
580
+ enum {
581
+ RD_KAFKA_MOCK_CMD_TOPIC_SET_ERROR,
582
+ RD_KAFKA_MOCK_CMD_TOPIC_CREATE,
583
+ RD_KAFKA_MOCK_CMD_PART_SET_LEADER,
584
+ RD_KAFKA_MOCK_CMD_PART_SET_FOLLOWER,
585
+ RD_KAFKA_MOCK_CMD_PART_SET_FOLLOWER_WMARKS,
586
+ RD_KAFKA_MOCK_CMD_PART_PUSH_LEADER_RESPONSE,
587
+ RD_KAFKA_MOCK_CMD_BROKER_SET_UPDOWN,
588
+ RD_KAFKA_MOCK_CMD_BROKER_SET_RTT,
589
+ RD_KAFKA_MOCK_CMD_BROKER_SET_RACK,
590
+ RD_KAFKA_MOCK_CMD_BROKER_DECOMMISSION,
591
+ RD_KAFKA_MOCK_CMD_BROKER_ADD,
592
+ RD_KAFKA_MOCK_CMD_COORD_SET,
593
+ RD_KAFKA_MOCK_CMD_APIVERSION_SET,
594
+ RD_KAFKA_MOCK_CMD_REQUESTED_METRICS_SET,
595
+ RD_KAFKA_MOCK_CMD_TELEMETRY_PUSH_INTERVAL_SET,
586
596
  } cmd;
587
597
 
588
598
  rd_kafka_resp_err_t err; /**< Error for:
@@ -610,6 +620,8 @@ struct rd_kafka_op_s {
610
620
  * PART_SET_LEADER
611
621
  * BROKER_SET_UPDOWN
612
622
  * BROKER_SET_RACK
623
+ * BROKER_DECOMMISSION
624
+ * BROKER_ADD
613
625
  * COORD_SET */
614
626
  int64_t lo; /**< Low offset, for:
615
627
  * TOPIC_CREATE (part cnt)
@@ -700,6 +712,18 @@ struct rd_kafka_op_s {
700
712
  rd_kafka_broker_t *rkb;
701
713
  } telemetry_broker;
702
714
 
715
+ struct {
716
+ /**
717
+ * Terminated and freed broker pointer,
718
+ * can only be used for pointer comparison.
719
+ */
720
+ void *rkb;
721
+
722
+ /** Termination callback to trigger
723
+ * on the op handler's thread. */
724
+ void (*cb)(rd_kafka_t *rk, void *rkb);
725
+ } terminated;
726
+
703
727
  } rko_u;
704
728
  };
705
729
 
@@ -146,8 +146,8 @@ static void rd_kafka_toppar_consumer_lag_req(rd_kafka_toppar_t *rktp) {
146
146
  * broker supports FETCH >= v5, since this will be set when
147
147
  * doing fetch requests.
148
148
  */
149
- if (rd_kafka_broker_ApiVersion_supported(
150
- rktp->rktp_broker, RD_KAFKAP_Fetch, 0, 5, NULL) == 5) {
149
+ if (rd_kafka_broker_ApiVersion_at_least(rktp->rktp_broker,
150
+ RD_KAFKAP_Fetch, 5)) {
151
151
  rd_kafka_toppar_unlock(rktp);
152
152
  return;
153
153
  }
@@ -376,14 +376,24 @@ void rd_kafka_toppar_set_fetch_state(rd_kafka_toppar_t *rktp, int fetch_state) {
376
376
 
377
377
  rktp->rktp_fetch_state = fetch_state;
378
378
 
379
- if (fetch_state == RD_KAFKA_TOPPAR_FETCH_ACTIVE)
379
+ if (fetch_state == RD_KAFKA_TOPPAR_FETCH_ACTIVE) {
380
+ rktp->rktp_ts_fetch_backoff = 0;
381
+
382
+ /* Wake-up broker thread which might be idling on IO */
383
+ if (rktp->rktp_broker)
384
+ rd_kafka_broker_wakeup(rktp->rktp_broker,
385
+ "fetch start");
386
+
380
387
  rd_kafka_dbg(
381
388
  rktp->rktp_rkt->rkt_rk, CONSUMER | RD_KAFKA_DBG_TOPIC,
382
389
  "FETCH",
383
390
  "Partition %.*s [%" PRId32 "] start fetching at %s",
384
391
  RD_KAFKAP_STR_PR(rktp->rktp_rkt->rkt_topic),
385
392
  rktp->rktp_partition,
386
- rd_kafka_fetch_pos2str(rktp->rktp_next_fetch_start));
393
+ rd_kafka_fetch_pos2str(
394
+ rd_kafka_toppar_fetch_decide_next_fetch_start_pos(
395
+ rktp)));
396
+ }
387
397
  }
388
398
 
389
399
 
@@ -1225,7 +1235,8 @@ void rd_kafka_toppar_broker_delegate(rd_kafka_toppar_t *rktp,
1225
1235
 
1226
1236
  /* Undelegated toppars are delgated to the internal
1227
1237
  * broker for bookkeeping. */
1228
- if (!rkb && !rd_kafka_terminating(rk)) {
1238
+ if (!rd_kafka_terminating(rk) &&
1239
+ (!rkb || rd_kafka_broker_termination_in_progress(rkb))) {
1229
1240
  rkb = rd_kafka_broker_internal(rk);
1230
1241
  internal_fallback = 1;
1231
1242
  }
@@ -1338,7 +1349,7 @@ void rd_kafka_toppar_next_offset_handle(rd_kafka_toppar_t *rktp,
1338
1349
  if (rktp->rktp_query_pos.offset <= RD_KAFKA_OFFSET_TAIL_BASE) {
1339
1350
  int64_t orig_offset = next_pos.offset;
1340
1351
  int64_t tail_cnt = llabs(rktp->rktp_query_pos.offset -
1341
- RD_KAFKA_OFFSET_TAIL_BASE);
1352
+ RD_KAFKA_OFFSET_TAIL_BASE);
1342
1353
 
1343
1354
  if (tail_cnt > next_pos.offset)
1344
1355
  next_pos.offset = 0;
@@ -1359,10 +1370,6 @@ void rd_kafka_toppar_next_offset_handle(rd_kafka_toppar_t *rktp,
1359
1370
  rd_kafka_toppar_set_next_fetch_position(rktp, next_pos);
1360
1371
 
1361
1372
  rd_kafka_toppar_set_fetch_state(rktp, RD_KAFKA_TOPPAR_FETCH_ACTIVE);
1362
-
1363
- /* Wake-up broker thread which might be idling on IO */
1364
- if (rktp->rktp_broker)
1365
- rd_kafka_broker_wakeup(rktp->rktp_broker, "ready to fetch");
1366
1373
  }
1367
1374
 
1368
1375
 
@@ -1746,11 +1753,6 @@ static void rd_kafka_toppar_fetch_start(rd_kafka_toppar_t *rktp,
1746
1753
 
1747
1754
  rd_kafka_toppar_set_fetch_state(rktp,
1748
1755
  RD_KAFKA_TOPPAR_FETCH_ACTIVE);
1749
-
1750
- /* Wake-up broker thread which might be idling on IO */
1751
- if (rktp->rktp_broker)
1752
- rd_kafka_broker_wakeup(rktp->rktp_broker,
1753
- "fetch start");
1754
1756
  }
1755
1757
 
1756
1758
  rktp->rktp_offsets_fin.eof_offset = RD_KAFKA_OFFSET_INVALID;
@@ -2160,6 +2162,7 @@ static rd_kafka_op_res_t rd_kafka_toppar_op_serve(rd_kafka_t *rk,
2160
2162
  rd_kafka_toppar_lock(rktp);
2161
2163
 
2162
2164
  if (rko->rko_err) {
2165
+ int actions;
2163
2166
  rd_kafka_dbg(
2164
2167
  rktp->rktp_rkt->rkt_rk, TOPIC, "OFFSET",
2165
2168
  "Failed to fetch offset for "
@@ -2174,10 +2177,15 @@ static rd_kafka_op_res_t rd_kafka_toppar_op_serve(rd_kafka_t *rk,
2174
2177
  rd_kafka_toppar_unlock(rktp);
2175
2178
 
2176
2179
 
2177
- /* Propagate error to application */
2180
+ actions = rd_kafka_handle_OffsetFetch_err_action(
2181
+ NULL, rko->rko_err, NULL);
2182
+ /* Propagate error to application. Exclude
2183
+ * permanent errors that caused a coordinator
2184
+ * refresh like `NOT_COORDINATOR` */
2178
2185
  if (rko->rko_err != RD_KAFKA_RESP_ERR__WAIT_COORD &&
2179
2186
  rko->rko_err !=
2180
- RD_KAFKA_RESP_ERR_UNSTABLE_OFFSET_COMMIT)
2187
+ RD_KAFKA_RESP_ERR_UNSTABLE_OFFSET_COMMIT &&
2188
+ !(actions & RD_KAFKA_ERR_ACTION_REFRESH))
2181
2189
  rd_kafka_consumer_err(
2182
2190
  rktp->rktp_fetchq, RD_KAFKA_NODEID_UA,
2183
2191
  rko->rko_err, 0, NULL, rktp,
@@ -2582,7 +2590,8 @@ void rd_kafka_toppar_leader_unavailable(rd_kafka_toppar_t *rktp,
2582
2590
  rkt->rkt_flags |= RD_KAFKA_TOPIC_F_LEADER_UNAVAIL;
2583
2591
  rd_kafka_topic_wrunlock(rkt);
2584
2592
 
2585
- rd_kafka_topic_fast_leader_query(rkt->rkt_rk);
2593
+ rd_kafka_topic_fast_leader_query(rkt->rkt_rk,
2594
+ rd_false /* don't force */);
2586
2595
  }
2587
2596
 
2588
2597
 
@@ -3674,11 +3683,12 @@ static rd_bool_t rd_kafka_topic_partition_list_get_leaders(
3674
3683
  struct rd_kafka_partition_leader *leader;
3675
3684
  const rd_kafka_metadata_topic_t *mtopic;
3676
3685
  const rd_kafka_metadata_partition_t *mpart;
3686
+ const rd_kafka_metadata_partition_internal_t *mdpi;
3677
3687
  rd_bool_t topic_wait_cache;
3678
3688
 
3679
3689
  rd_kafka_metadata_cache_topic_partition_get(
3680
- rk, &mtopic, &mpart, rktpar->topic, rktpar->partition,
3681
- 0 /*negative entries too*/);
3690
+ rk, &mtopic, &mpart, &mdpi, rktpar->topic,
3691
+ rktpar->partition, 0 /*negative entries too*/);
3682
3692
 
3683
3693
  topic_wait_cache =
3684
3694
  !mtopic ||
@@ -3746,9 +3756,11 @@ static rd_bool_t rd_kafka_topic_partition_list_get_leaders(
3746
3756
  rd_kafka_topic_partition_update(rktpar2, rktpar);
3747
3757
  } else {
3748
3758
  /* Make a copy of rktpar and add to partitions list */
3749
- rd_kafka_topic_partition_list_add_copy(
3759
+ rktpar2 = rd_kafka_topic_partition_list_add_copy(
3750
3760
  leader->partitions, rktpar);
3751
3761
  }
3762
+ rd_kafka_topic_partition_set_current_leader_epoch(
3763
+ rktpar2, mdpi->leader_epoch);
3752
3764
 
3753
3765
  rktpar->err = RD_KAFKA_RESP_ERR_NO_ERROR;
3754
3766
 
@@ -3872,7 +3884,7 @@ rd_kafka_topic_partition_list_query_leaders_async_worker(rd_kafka_op_t *rko) {
3872
3884
  rd_kafka_metadata_refresh_topics(
3873
3885
  rk, NULL, &query_topics, rd_true /*force*/,
3874
3886
  rd_false /*!allow_auto_create*/, rd_false /*!cgrp_update*/,
3875
- "query partition leaders");
3887
+ -1, "query partition leaders");
3876
3888
  }
3877
3889
 
3878
3890
  rd_list_destroy(leaders);
@@ -4061,7 +4073,7 @@ rd_kafka_resp_err_t rd_kafka_topic_partition_list_query_leaders(
4061
4073
  rd_kafka_metadata_refresh_topics(
4062
4074
  rk, NULL, &query_topics, rd_true /*force*/,
4063
4075
  rd_false /*!allow_auto_create*/,
4064
- rd_false /*!cgrp_update*/,
4076
+ rd_false /*!cgrp_update*/, -1,
4065
4077
  "query partition leaders");
4066
4078
  ts_query = now;
4067
4079
  query_cnt++;
@@ -4421,6 +4433,89 @@ int rd_kafka_topic_partition_list_regex_cnt(
4421
4433
  }
4422
4434
 
4423
4435
 
4436
+ /**
4437
+ * @brief Match function that returns true if topic is not a regex.
4438
+ */
4439
+ static int rd_kafka_topic_partition_not_regex(const void *elem,
4440
+ const void *opaque) {
4441
+ const rd_kafka_topic_partition_t *rktpar = elem;
4442
+ return *rktpar->topic != '^';
4443
+ }
4444
+
4445
+ /**
4446
+ * @brief Return a new list with all regex topics removed.
4447
+ *
4448
+ * @remark The caller is responsible for freeing the returned list.
4449
+ */
4450
+ rd_kafka_topic_partition_list_t *rd_kafka_topic_partition_list_remove_regexes(
4451
+ const rd_kafka_topic_partition_list_t *rktparlist) {
4452
+ return rd_kafka_topic_partition_list_match(
4453
+ rktparlist, rd_kafka_topic_partition_not_regex, NULL);
4454
+ }
4455
+
4456
+
4457
+ /**
4458
+ * @brief Combine regexes present in the list into a single regex.
4459
+ */
4460
+ rd_kafkap_str_t *rd_kafka_topic_partition_list_combine_regexes(
4461
+ const rd_kafka_topic_partition_list_t *rktparlist) {
4462
+ int i;
4463
+ int combined_regex_len = 1; /* 1 for null-terminator */
4464
+ int regex_cnt = 0;
4465
+ int j = 1;
4466
+ rd_bool_t is_first_regex = rd_true;
4467
+ char *combined_regex_str;
4468
+ rd_kafkap_str_t *combined_regex_kstr;
4469
+
4470
+ // Count the number of characters needed for the combined regex string
4471
+ for (i = 0; i < rktparlist->cnt; i++) {
4472
+ const rd_kafka_topic_partition_t *rktpar =
4473
+ &(rktparlist->elems[i]);
4474
+ if (*rktpar->topic == '^') {
4475
+ combined_regex_len += strlen(rktpar->topic);
4476
+ regex_cnt++;
4477
+ }
4478
+ }
4479
+
4480
+ if (regex_cnt == 0)
4481
+ return rd_kafkap_str_new("", 0);
4482
+
4483
+ combined_regex_len +=
4484
+ 3 * (regex_cnt - 1); /* 1 for each ')|(' separator */
4485
+ combined_regex_len += 2; /* 2 for enclosing brackets */
4486
+
4487
+ // memory allocation for the combined regex string
4488
+ combined_regex_str = rd_malloc(combined_regex_len);
4489
+
4490
+ // Construct the combined regex string
4491
+ combined_regex_str[0] = '(';
4492
+ for (i = 0; i < rktparlist->cnt; i++) {
4493
+ const rd_kafka_topic_partition_t *rktpar =
4494
+ &(rktparlist->elems[i]);
4495
+ char *topic = rktpar->topic;
4496
+ if (*topic == '^') {
4497
+ if (!is_first_regex) {
4498
+ combined_regex_str[j++] = ')';
4499
+ combined_regex_str[j++] = '|';
4500
+ combined_regex_str[j++] = '(';
4501
+ }
4502
+ while (*topic) {
4503
+ combined_regex_str[j++] = *topic;
4504
+ topic++;
4505
+ }
4506
+ is_first_regex = rd_false;
4507
+ }
4508
+ }
4509
+ combined_regex_str[j++] = ')';
4510
+ combined_regex_str[j] = '\0';
4511
+
4512
+ combined_regex_kstr =
4513
+ rd_kafkap_str_new(combined_regex_str, combined_regex_len - 1);
4514
+ rd_free(combined_regex_str);
4515
+ return combined_regex_kstr;
4516
+ }
4517
+
4518
+
4424
4519
  /**
4425
4520
  * @brief Reset base sequence for this toppar.
4426
4521
  *
@@ -292,13 +292,14 @@ struct rd_kafka_toppar_s { /* rd_kafka_toppar_t */
292
292
  int32_t rktp_fetch_version; /* Op version of curr fetch.
293
293
  (broker thread) */
294
294
 
295
- enum { RD_KAFKA_TOPPAR_FETCH_NONE = 0,
296
- RD_KAFKA_TOPPAR_FETCH_STOPPING,
297
- RD_KAFKA_TOPPAR_FETCH_STOPPED,
298
- RD_KAFKA_TOPPAR_FETCH_OFFSET_QUERY,
299
- RD_KAFKA_TOPPAR_FETCH_OFFSET_WAIT,
300
- RD_KAFKA_TOPPAR_FETCH_VALIDATE_EPOCH_WAIT,
301
- RD_KAFKA_TOPPAR_FETCH_ACTIVE,
295
+ enum {
296
+ RD_KAFKA_TOPPAR_FETCH_NONE = 0,
297
+ RD_KAFKA_TOPPAR_FETCH_STOPPING,
298
+ RD_KAFKA_TOPPAR_FETCH_STOPPED,
299
+ RD_KAFKA_TOPPAR_FETCH_OFFSET_QUERY,
300
+ RD_KAFKA_TOPPAR_FETCH_OFFSET_WAIT,
301
+ RD_KAFKA_TOPPAR_FETCH_VALIDATE_EPOCH_WAIT,
302
+ RD_KAFKA_TOPPAR_FETCH_ACTIVE,
302
303
  } rktp_fetch_state; /* Broker thread's state */
303
304
 
304
305
  #define RD_KAFKA_TOPPAR_FETCH_IS_STARTED(fetch_state) \
@@ -433,6 +434,8 @@ struct rd_kafka_toppar_s { /* rd_kafka_toppar_t */
433
434
  #define RD_KAFKA_TOPPAR_F_ASSIGNED \
434
435
  0x2000 /**< Toppar is part of the consumer \
435
436
  * assignment. */
437
+ #define RD_KAFKA_TOPPAR_F_VALIDATING \
438
+ 0x4000 /**< Toppar is currently requesting validation. */
436
439
 
437
440
  /*
438
441
  * Timers
@@ -1008,6 +1011,12 @@ rd_kafka_resp_err_t rd_kafka_topic_partition_list_get_err(
1008
1011
  int rd_kafka_topic_partition_list_regex_cnt(
1009
1012
  const rd_kafka_topic_partition_list_t *rktparlist);
1010
1013
 
1014
+ rd_kafka_topic_partition_list_t *rd_kafka_topic_partition_list_remove_regexes(
1015
+ const rd_kafka_topic_partition_list_t *rktparlist);
1016
+
1017
+ rd_kafkap_str_t *rd_kafka_topic_partition_list_combine_regexes(
1018
+ const rd_kafka_topic_partition_list_t *rktparlist);
1019
+
1011
1020
  void *rd_kafka_topic_partition_list_copy_opaque(const void *src, void *opaque);
1012
1021
 
1013
1022
  /**
@@ -172,6 +172,7 @@ static RD_UNUSED const char *rd_kafka_ApiKey2str(int16_t ApiKey) {
172
172
  [RD_KAFKAP_ListTransactions] = "ListTransactions",
173
173
  [RD_KAFKAP_AllocateProducerIds] = "AllocateProducerIds",
174
174
  [RD_KAFKAP_ConsumerGroupHeartbeat] = "ConsumerGroupHeartbeat",
175
+ [RD_KAFKAP_ConsumerGroupDescribe] = "ConsumerGroupDescribe",
175
176
  [RD_KAFKAP_GetTelemetrySubscriptions] = "GetTelemetrySubscriptions",
176
177
  [RD_KAFKAP_PushTelemetry] = "PushTelemetry",
177
178
 
@@ -283,6 +284,8 @@ typedef struct rd_kafkap_str_s {
283
284
  #define RD_KAFKAP_STR_INITIALIZER \
284
285
  { .len = RD_KAFKAP_STR_LEN_NULL, .str = NULL }
285
286
 
287
+ #define RD_KAFKAP_STR_INITIALIZER_EMPTY \
288
+ { .len = 0, .str = "" }
286
289
  /**
287
290
  * Frees a Kafka string previously allocated with `rd_kafkap_str_new()`
288
291
  */
@@ -620,7 +623,7 @@ static RD_INLINE RD_UNUSED int rd_kafka_Uuid_ptr_cmp(void *a, void *b) {
620
623
 
621
624
  rd_kafka_Uuid_t rd_kafka_Uuid_random();
622
625
 
623
- const char *rd_kafka_Uuid_str(const rd_kafka_Uuid_t *uuid);
626
+ char *rd_kafka_Uuid_str(const rd_kafka_Uuid_t *uuid);
624
627
 
625
628
  unsigned int rd_kafka_Uuid_hash(const rd_kafka_Uuid_t *uuid);
626
629
 
@@ -123,5 +123,6 @@
123
123
 
124
124
  #define RD_KAFKAP__NUM 74
125
125
 
126
+ #define RD_KAFKAP_RPC_VERSION_MAX INT16_MAX
126
127
 
127
128
  #endif /* _RDKAFKA_PROTOCOL_H_ */