@platformatic/rdkafka 4.0.1 → 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 (292) hide show
  1. package/README.md +5 -5
  2. package/bench/seed.sh +0 -0
  3. package/binding.gyp +8 -1
  4. package/ci/prepublish.js +4 -4
  5. package/config.d.ts +126 -10
  6. package/configure +0 -0
  7. package/deps/librdkafka/.semaphore/run-all-tests.yml +77 -0
  8. package/deps/librdkafka/.semaphore/semaphore-integration.yml +250 -0
  9. package/deps/librdkafka/.semaphore/semaphore.yml +67 -44
  10. package/deps/librdkafka/.semaphore/verify-linux-packages.yml +41 -0
  11. package/deps/librdkafka/CHANGELOG.md +471 -1
  12. package/deps/librdkafka/CONFIGURATION.md +29 -9
  13. package/deps/librdkafka/INTRODUCTION.md +909 -601
  14. package/deps/librdkafka/LICENSES.txt +592 -1
  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/rules +0 -0
  37. package/deps/librdkafka/packaging/get_version.py +0 -0
  38. package/deps/librdkafka/packaging/homebrew/brew-update-pr.sh +0 -0
  39. package/deps/librdkafka/packaging/mingw-w64/{travis-before-install.sh → export-variables.sh} +0 -7
  40. package/deps/librdkafka/packaging/mingw-w64/semaphoreci-build.sh +1 -1
  41. package/deps/librdkafka/packaging/nuget/artifact.py +0 -0
  42. package/deps/librdkafka/packaging/nuget/cleanup-s3.py +0 -0
  43. package/deps/librdkafka/packaging/nuget/nuget.sh +0 -0
  44. package/deps/librdkafka/packaging/nuget/packaging.py +0 -0
  45. package/deps/librdkafka/packaging/nuget/push-to-nuget.sh +0 -0
  46. package/deps/librdkafka/packaging/nuget/release.py +0 -0
  47. package/deps/librdkafka/packaging/nuget/requirements.txt +3 -3
  48. package/deps/librdkafka/packaging/rpm/mock-on-docker.sh +0 -0
  49. package/deps/librdkafka/packaging/rpm/tests/run-test.sh +0 -0
  50. package/deps/librdkafka/packaging/rpm/tests/test-on-docker.sh +0 -0
  51. package/deps/librdkafka/packaging/tools/build-configurations-checks.sh +3 -1
  52. package/deps/librdkafka/packaging/tools/build-deb-package.sh +0 -0
  53. package/deps/librdkafka/packaging/tools/build-debian.sh +0 -0
  54. package/deps/librdkafka/packaging/tools/build-manylinux.sh +0 -0
  55. package/deps/librdkafka/packaging/tools/build-release-artifacts.sh +0 -0
  56. package/deps/librdkafka/packaging/tools/distro-build.sh +0 -0
  57. package/deps/librdkafka/packaging/tools/gh-release-checksums.py +0 -0
  58. package/deps/librdkafka/packaging/tools/rdutcoverage.sh +0 -0
  59. package/deps/librdkafka/packaging/tools/run-in-docker.sh +28 -0
  60. package/deps/librdkafka/packaging/tools/run-integration-tests.sh +31 -0
  61. package/deps/librdkafka/packaging/tools/run-style-check.sh +4 -0
  62. package/deps/librdkafka/packaging/tools/style-format.sh +6 -5
  63. package/deps/librdkafka/packaging/tools/update_rpcs_max_versions.py +100 -0
  64. package/deps/librdkafka/service.yml +154 -0
  65. package/deps/librdkafka/src/generate_proto.sh +0 -0
  66. package/deps/librdkafka/src/rd.h +145 -2
  67. package/deps/librdkafka/src/rdaddr.h +6 -7
  68. package/deps/librdkafka/src/rdatomic.h +15 -11
  69. package/deps/librdkafka/src/rdavg.h +3 -2
  70. package/deps/librdkafka/src/rdbase64.c +33 -2
  71. package/deps/librdkafka/src/rdbase64.h +2 -0
  72. package/deps/librdkafka/src/rdendian.h +10 -9
  73. package/deps/librdkafka/src/rdhttp.c +418 -100
  74. package/deps/librdkafka/src/rdhttp.h +23 -5
  75. package/deps/librdkafka/src/rdkafka.c +299 -145
  76. package/deps/librdkafka/src/rdkafka.h +89 -6
  77. package/deps/librdkafka/src/rdkafka_admin.c +482 -105
  78. package/deps/librdkafka/src/rdkafka_admin.h +42 -0
  79. package/deps/librdkafka/src/rdkafka_broker.c +463 -312
  80. package/deps/librdkafka/src/rdkafka_broker.h +68 -10
  81. package/deps/librdkafka/src/rdkafka_buf.c +8 -5
  82. package/deps/librdkafka/src/rdkafka_buf.h +4 -3
  83. package/deps/librdkafka/src/rdkafka_cert.c +25 -1
  84. package/deps/librdkafka/src/rdkafka_cert.h +4 -3
  85. package/deps/librdkafka/src/rdkafka_cgrp.c +468 -143
  86. package/deps/librdkafka/src/rdkafka_cgrp.h +36 -2
  87. package/deps/librdkafka/src/rdkafka_conf.c +526 -102
  88. package/deps/librdkafka/src/rdkafka_conf.h +68 -4
  89. package/deps/librdkafka/src/rdkafka_feature.c +472 -35
  90. package/deps/librdkafka/src/rdkafka_feature.h +2 -0
  91. package/deps/librdkafka/src/rdkafka_fetcher.c +22 -2
  92. package/deps/librdkafka/src/rdkafka_fetcher.h +2 -2
  93. package/deps/librdkafka/src/rdkafka_int.h +84 -46
  94. package/deps/librdkafka/src/rdkafka_metadata.c +221 -136
  95. package/deps/librdkafka/src/rdkafka_metadata.h +15 -11
  96. package/deps/librdkafka/src/rdkafka_metadata_cache.c +279 -73
  97. package/deps/librdkafka/src/rdkafka_mock.c +795 -19
  98. package/deps/librdkafka/src/rdkafka_mock.h +119 -0
  99. package/deps/librdkafka/src/rdkafka_mock_cgrp.c +1298 -132
  100. package/deps/librdkafka/src/rdkafka_mock_handlers.c +345 -49
  101. package/deps/librdkafka/src/rdkafka_mock_int.h +180 -61
  102. package/deps/librdkafka/src/rdkafka_msg.c +35 -19
  103. package/deps/librdkafka/src/rdkafka_msg.h +3 -3
  104. package/deps/librdkafka/src/rdkafka_msgset_writer.c +14 -10
  105. package/deps/librdkafka/src/rdkafka_offset.c +33 -5
  106. package/deps/librdkafka/src/rdkafka_op.c +1 -1
  107. package/deps/librdkafka/src/rdkafka_op.h +45 -21
  108. package/deps/librdkafka/src/rdkafka_partition.c +118 -23
  109. package/deps/librdkafka/src/rdkafka_partition.h +16 -7
  110. package/deps/librdkafka/src/rdkafka_proto.h +4 -1
  111. package/deps/librdkafka/src/rdkafka_protocol.h +1 -0
  112. package/deps/librdkafka/src/rdkafka_queue.c +125 -48
  113. package/deps/librdkafka/src/rdkafka_queue.h +19 -0
  114. package/deps/librdkafka/src/rdkafka_range_assignor.c +1 -1
  115. package/deps/librdkafka/src/rdkafka_request.c +336 -64
  116. package/deps/librdkafka/src/rdkafka_request.h +24 -1
  117. package/deps/librdkafka/src/rdkafka_sasl.c +5 -3
  118. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.c +14 -10
  119. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.c +1166 -89
  120. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.h +13 -3
  121. package/deps/librdkafka/src/rdkafka_sasl_plain.c +3 -3
  122. package/deps/librdkafka/src/rdkafka_sasl_scram.c +4 -3
  123. package/deps/librdkafka/src/rdkafka_ssl.c +306 -81
  124. package/deps/librdkafka/src/rdkafka_ssl.h +22 -0
  125. package/deps/librdkafka/src/rdkafka_sticky_assignor.c +4 -0
  126. package/deps/librdkafka/src/rdkafka_telemetry.c +80 -23
  127. package/deps/librdkafka/src/rdkafka_telemetry_encode.c +5 -1
  128. package/deps/librdkafka/src/rdkafka_telemetry_encode.h +20 -20
  129. package/deps/librdkafka/src/rdkafka_topic.c +220 -137
  130. package/deps/librdkafka/src/rdkafka_topic.h +14 -8
  131. package/deps/librdkafka/src/rdkafka_transport.c +59 -47
  132. package/deps/librdkafka/src/rdkafka_transport.h +5 -0
  133. package/deps/librdkafka/src/rdkafka_txnmgr.c +6 -1
  134. package/deps/librdkafka/src/rdmap.c +6 -1
  135. package/deps/librdkafka/src/rdrand.c +11 -1
  136. package/deps/librdkafka/src/rdtime.h +48 -17
  137. package/deps/librdkafka/src/rdunittest.c +42 -25
  138. package/deps/librdkafka/src/rdunittest.h +2 -0
  139. package/deps/librdkafka/src/rdwin32.h +1 -1
  140. package/deps/librdkafka/src/regexp.c +47 -42
  141. package/deps/librdkafka/src/tinycthread_extra.c +45 -21
  142. package/deps/librdkafka/src/tinycthread_extra.h +7 -3
  143. package/deps/librdkafka/src-cpp/rdkafkacpp.h +28 -2
  144. package/deps/librdkafka/tests/0001-multiobj.c +4 -0
  145. package/deps/librdkafka/tests/0004-conf.c +103 -36
  146. package/deps/librdkafka/tests/0009-mock_cluster.c +1 -0
  147. package/deps/librdkafka/tests/0011-produce_batch.c +2 -1
  148. package/deps/librdkafka/tests/0016-client_swname.c +18 -3
  149. package/deps/librdkafka/tests/0017-compression.c +6 -8
  150. package/deps/librdkafka/tests/0018-cgrp_term.c +8 -3
  151. package/deps/librdkafka/tests/0021-rkt_destroy.c +1 -0
  152. package/deps/librdkafka/tests/0022-consume_batch.c +4 -1
  153. package/deps/librdkafka/tests/0026-consume_pause.c +12 -14
  154. package/deps/librdkafka/tests/0028-long_topicnames.c +1 -1
  155. package/deps/librdkafka/tests/0029-assign_offset.c +6 -8
  156. package/deps/librdkafka/tests/0030-offset_commit.c +2 -2
  157. package/deps/librdkafka/tests/0033-regex_subscribe.c +33 -17
  158. package/deps/librdkafka/tests/0034-offset_reset.c +25 -4
  159. package/deps/librdkafka/tests/0036-partial_fetch.c +1 -0
  160. package/deps/librdkafka/tests/0038-performance.c +1 -0
  161. package/deps/librdkafka/tests/0040-io_event.c +11 -5
  162. package/deps/librdkafka/tests/0041-fetch_max_bytes.c +1 -0
  163. package/deps/librdkafka/tests/0044-partition_cnt.c +3 -2
  164. package/deps/librdkafka/tests/0045-subscribe_update.c +284 -20
  165. package/deps/librdkafka/tests/0047-partial_buf_tmout.c +1 -0
  166. package/deps/librdkafka/tests/0048-partitioner.c +1 -1
  167. package/deps/librdkafka/tests/0050-subscribe_adds.c +1 -0
  168. package/deps/librdkafka/tests/0051-assign_adds.c +1 -0
  169. package/deps/librdkafka/tests/0052-msg_timestamps.c +22 -4
  170. package/deps/librdkafka/tests/0053-stats_cb.cpp +12 -20
  171. package/deps/librdkafka/tests/0055-producer_latency.c +176 -3
  172. package/deps/librdkafka/tests/0056-balanced_group_mt.c +6 -2
  173. package/deps/librdkafka/tests/0058-log.cpp +3 -3
  174. package/deps/librdkafka/tests/0059-bsearch.cpp +8 -4
  175. package/deps/librdkafka/tests/0061-consumer_lag.cpp +25 -5
  176. package/deps/librdkafka/tests/0067-empty_topic.cpp +3 -0
  177. package/deps/librdkafka/tests/0068-produce_timeout.c +21 -23
  178. package/deps/librdkafka/tests/0069-consumer_add_parts.c +3 -7
  179. package/deps/librdkafka/tests/0075-retry.c +38 -1
  180. package/deps/librdkafka/tests/0076-produce_retry.c +2 -0
  181. package/deps/librdkafka/tests/0077-compaction.c +8 -2
  182. package/deps/librdkafka/tests/0080-admin_ut.c +34 -4
  183. package/deps/librdkafka/tests/0081-admin.c +455 -155
  184. package/deps/librdkafka/tests/0082-fetch_max_bytes.cpp +4 -0
  185. package/deps/librdkafka/tests/0083-cb_event.c +8 -3
  186. package/deps/librdkafka/tests/0084-destroy_flags.c +14 -18
  187. package/deps/librdkafka/tests/0085-headers.cpp +4 -0
  188. package/deps/librdkafka/tests/0086-purge.c +40 -7
  189. package/deps/librdkafka/tests/0088-produce_metadata_timeout.c +1 -1
  190. package/deps/librdkafka/tests/0089-max_poll_interval.c +12 -7
  191. package/deps/librdkafka/tests/0090-idempotence.c +1 -2
  192. package/deps/librdkafka/tests/0091-max_poll_interval_timeout.c +5 -7
  193. package/deps/librdkafka/tests/0092-mixed_msgver.c +6 -0
  194. package/deps/librdkafka/tests/0093-holb.c +8 -5
  195. package/deps/librdkafka/tests/0094-idempotence_msg_timeout.c +1 -0
  196. package/deps/librdkafka/tests/0097-ssl_verify.cpp +262 -70
  197. package/deps/librdkafka/tests/0098-consumer-txn.cpp +16 -16
  198. package/deps/librdkafka/tests/0099-commit_metadata.c +1 -1
  199. package/deps/librdkafka/tests/0101-fetch-from-follower.cpp +1 -1
  200. package/deps/librdkafka/tests/0102-static_group_rebalance.c +317 -16
  201. package/deps/librdkafka/tests/0103-transactions.c +7 -7
  202. package/deps/librdkafka/tests/0104-fetch_from_follower_mock.c +1 -0
  203. package/deps/librdkafka/tests/0105-transactions_mock.c +18 -11
  204. package/deps/librdkafka/tests/0106-cgrp_sess_timeout.c +35 -14
  205. package/deps/librdkafka/tests/0107-topic_recreate.c +2 -2
  206. package/deps/librdkafka/tests/0109-auto_create_topics.cpp +86 -26
  207. package/deps/librdkafka/tests/0110-batch_size.cpp +1 -2
  208. package/deps/librdkafka/tests/0112-assign_unknown_part.c +3 -14
  209. package/deps/librdkafka/tests/0113-cooperative_rebalance.cpp +248 -104
  210. package/deps/librdkafka/tests/0114-sticky_partitioning.cpp +3 -3
  211. package/deps/librdkafka/tests/0115-producer_auth.cpp +4 -1
  212. package/deps/librdkafka/tests/0116-kafkaconsumer_close.cpp +7 -5
  213. package/deps/librdkafka/tests/0117-mock_errors.c +15 -5
  214. package/deps/librdkafka/tests/0118-commit_rebalance.c +41 -8
  215. package/deps/librdkafka/tests/0119-consumer_auth.cpp +20 -1
  216. package/deps/librdkafka/tests/0120-asymmetric_subscription.c +8 -3
  217. package/deps/librdkafka/tests/0125-immediate_flush.c +1 -1
  218. package/deps/librdkafka/tests/0126-oauthbearer_oidc.c +323 -8
  219. package/deps/librdkafka/tests/0129-fetch_aborted_msgs.c +1 -0
  220. package/deps/librdkafka/tests/0132-strategy_ordering.c +12 -4
  221. package/deps/librdkafka/tests/0133-ssl_keys.c +28 -6
  222. package/deps/librdkafka/tests/0137-barrier_batch_consume.c +24 -14
  223. package/deps/librdkafka/tests/0139-offset_validation_mock.c +510 -2
  224. package/deps/librdkafka/tests/0140-commit_metadata.cpp +1 -1
  225. package/deps/librdkafka/tests/0142-reauthentication.c +37 -17
  226. package/deps/librdkafka/tests/0143-exponential_backoff_mock.c +39 -40
  227. package/deps/librdkafka/tests/0146-metadata_mock.c +76 -15
  228. package/deps/librdkafka/tests/0147-consumer_group_consumer_mock.c +952 -0
  229. package/deps/librdkafka/tests/0148-offset_fetch_commit_error_mock.c +563 -0
  230. package/deps/librdkafka/tests/0149-broker-same-host-port.c +140 -0
  231. package/deps/librdkafka/tests/0150-telemetry_mock.c +9 -6
  232. package/deps/librdkafka/tests/0151-purge-brokers.c +566 -0
  233. package/deps/librdkafka/tests/0152-rebootstrap.c +59 -0
  234. package/deps/librdkafka/tests/0153-memberid.c +128 -0
  235. package/deps/librdkafka/tests/CMakeLists.txt +6 -0
  236. package/deps/librdkafka/tests/LibrdkafkaTestApp.py +34 -9
  237. package/deps/librdkafka/tests/autotest.sh +0 -0
  238. package/deps/librdkafka/tests/broker_version_tests.py +0 -0
  239. package/deps/librdkafka/tests/buildbox.sh +0 -0
  240. package/deps/librdkafka/tests/cleanup-checker-tests.sh +0 -0
  241. package/deps/librdkafka/tests/cluster_testing.py +0 -0
  242. package/deps/librdkafka/tests/delete-test-topics.sh +0 -0
  243. package/deps/librdkafka/tests/fixtures/oauthbearer/jwt_assertion_template.json +10 -0
  244. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.intermediate.p12 +0 -0
  245. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.p12 +0 -0
  246. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.intermediate.pem +72 -0
  247. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.pem +42 -101
  248. package/deps/librdkafka/tests/fixtures/ssl/client2.intermediate.key +46 -0
  249. package/deps/librdkafka/tests/fixtures/ssl/client2.key +41 -29
  250. package/deps/librdkafka/tests/fixtures/ssl/create_keys.sh +112 -37
  251. package/deps/librdkafka/tests/gen-ssl-certs.sh +0 -0
  252. package/deps/librdkafka/tests/interactive_broker_version.py +0 -0
  253. package/deps/librdkafka/tests/java/Makefile +2 -1
  254. package/deps/librdkafka/tests/java/run-class.sh +0 -0
  255. package/deps/librdkafka/tests/lz4_manual_test.sh +0 -0
  256. package/deps/librdkafka/tests/multi-broker-version-test.sh +0 -0
  257. package/deps/librdkafka/tests/parse-refcnt.sh +0 -0
  258. package/deps/librdkafka/tests/performance_plot.py +0 -0
  259. package/deps/librdkafka/tests/requirements.txt +1 -1
  260. package/deps/librdkafka/tests/run-all-tests.sh +79 -0
  261. package/deps/librdkafka/tests/run-consumer-tests.sh +0 -0
  262. package/deps/librdkafka/tests/run-producer-tests.sh +0 -0
  263. package/deps/librdkafka/tests/run-test-batches.py +157 -0
  264. package/deps/librdkafka/tests/run-test.sh +0 -0
  265. package/deps/librdkafka/tests/sasl_test.py +0 -0
  266. package/deps/librdkafka/tests/test.c +478 -18
  267. package/deps/librdkafka/tests/test.h +62 -13
  268. package/deps/librdkafka/tests/testcpp.cpp +6 -1
  269. package/deps/librdkafka/tests/testcpp.h +30 -2
  270. package/deps/librdkafka/tests/testshared.h +16 -2
  271. package/deps/librdkafka/tests/tools/stats/graph.py +0 -0
  272. package/deps/librdkafka/tests/tools/stats/to_csv.py +1 -1
  273. package/deps/librdkafka/tests/trivup/trivup-0.14.0.tar.gz +0 -0
  274. package/deps/librdkafka/tests/until-fail.sh +0 -0
  275. package/deps/librdkafka/tests/xxxx-metadata.cpp +1 -1
  276. package/deps/librdkafka/vcpkg.json +1 -1
  277. package/deps/librdkafka/win32/setup-msys2.ps1 +24 -8
  278. package/deps/librdkafka/win32/setup-vcpkg.ps1 +28 -6
  279. package/deps/librdkafka/win32/tests/tests.vcxproj +6 -0
  280. package/deps/librdkafka/win32/wingetopt.h +5 -4
  281. package/errors.d.ts +27 -1
  282. package/lib/error.js +29 -3
  283. package/make_docs.sh +0 -0
  284. package/package.json +10 -11
  285. package/run_docker.sh +0 -0
  286. package/src/callbacks.cc +6 -9
  287. package/src/callbacks.h +1 -5
  288. package/test/kafka-consumer-worker.js +10 -7
  289. package/test/kafka-consumer.spec.js +32 -21
  290. package/deps/librdkafka/.semaphore/project.yml +0 -43
  291. package/deps/librdkafka/.semaphore/project_public.yml +0 -20
  292. package/deps/librdkafka/win32/install-openssl.ps1 +0 -33
@@ -61,4 +61,26 @@ int rd_kafka_ssl_hmac(rd_kafka_broker_t *rkb,
61
61
  int itcnt,
62
62
  rd_chariov_t *out);
63
63
 
64
+ int rd_kafka_ssl_read_cert_chain_from_BIO(BIO *in,
65
+ STACK_OF(X509) * chainp,
66
+ pem_password_cb *password_cb,
67
+ void *password_cb_opaque);
68
+
69
+ int rd_kafka_ssl_probe_and_set_default_ca_location(rd_kafka_t *rk,
70
+ const char *ctx_identifier,
71
+ SSL_CTX *ctx);
72
+
73
+ char *rd_kafka_ssl_error0(rd_kafka_t *rk,
74
+ rd_kafka_broker_t *rkb,
75
+ const char *ctx_identifier,
76
+ char *errstr,
77
+ size_t errstr_size);
78
+
79
+ #ifdef _WIN32
80
+ int rd_kafka_ssl_win_load_cert_stores(rd_kafka_t *rk,
81
+ const char *ctx_identifier,
82
+ SSL_CTX *ctx,
83
+ const char *store_names);
84
+ #endif
85
+
64
86
  #endif /* _RDKAFKA_SSL_H_ */
@@ -3027,6 +3027,10 @@ static int ut_testLargeAssignmentWithMultipleConsumersLeaving(
3027
3027
  rd_kafka_t *rk,
3028
3028
  const rd_kafka_assignor_t *rkas,
3029
3029
  rd_kafka_assignor_ut_rack_config_t parametrization) {
3030
+ if (rd_unittest_with_valgrind)
3031
+ RD_UT_SKIP(
3032
+ "Skipping large assignment test when using Valgrind");
3033
+
3030
3034
  rd_kafka_resp_err_t err;
3031
3035
  char errstr[512];
3032
3036
  rd_kafka_metadata_t *metadata;
@@ -33,6 +33,7 @@
33
33
  #include "nanopb/pb.h"
34
34
  #include "rdkafka_lz4.h"
35
35
  #include "snappy.h"
36
+ #include "rdunittest.h"
36
37
 
37
38
  #if WITH_ZSTD
38
39
  #include "rdkafka_zstd.h"
@@ -51,10 +52,8 @@
51
52
  static int
52
53
  rd_kafka_filter_broker_by_GetTelemetrySubscription(rd_kafka_broker_t *rkb,
53
54
  void *opaque) {
54
- int features;
55
- if (rd_kafka_broker_ApiVersion_supported0(
56
- rkb, RD_KAFKAP_GetTelemetrySubscriptions, 0, 0, &features,
57
- rd_false) != -1)
55
+ if (rd_kafka_broker_ApiVersion_at_least_no_lock(
56
+ rkb, RD_KAFKAP_GetTelemetrySubscriptions, 0))
58
57
  return 0;
59
58
  return 1;
60
59
  }
@@ -173,6 +172,9 @@ static void update_matched_metrics(rd_kafka_t *rk, size_t j) {
173
172
 
174
173
  static void rd_kafka_match_requested_metrics(rd_kafka_t *rk) {
175
174
  size_t metrics_cnt = RD_KAFKA_TELEMETRY_METRIC_CNT(rk), i;
175
+ rd_bool_t is_metric_included[RD_MAX(
176
+ (int)RD_KAFKA_TELEMETRY_PRODUCER_METRIC__CNT,
177
+ (int)RD_KAFKA_TELEMETRY_CONSUMER_METRIC__CNT)] = {0};
176
178
  const rd_kafka_telemetry_metric_info_t *info =
177
179
  RD_KAFKA_TELEMETRY_METRIC_INFO(rk);
178
180
 
@@ -193,6 +195,9 @@ static void rd_kafka_match_requested_metrics(rd_kafka_t *rk) {
193
195
  j;
194
196
 
195
197
  for (j = 0; j < metrics_cnt; j++) {
198
+ if (is_metric_included[j])
199
+ continue;
200
+
196
201
  /* Prefix matching the requested metrics with the
197
202
  * available metrics. */
198
203
  char full_metric_name
@@ -205,8 +210,10 @@ static void rd_kafka_match_requested_metrics(rd_kafka_t *rk) {
205
210
  rk->rk_telemetry.requested_metrics[i],
206
211
  name_len) == 0;
207
212
 
208
- if (name_matches)
213
+ if (name_matches) {
209
214
  update_matched_metrics(rk, j);
215
+ is_metric_included[j] = rd_true;
216
+ }
210
217
  }
211
218
  }
212
219
 
@@ -266,6 +273,24 @@ rd_kafka_push_telemetry_payload_compress(rd_kafka_t *rk,
266
273
  rd_slice_t payload_slice;
267
274
  size_t i;
268
275
  rd_kafka_resp_err_t r = RD_KAFKA_RESP_ERR_NO_ERROR;
276
+
277
+ if (payload->rbuf_len == 0) {
278
+ /* We can only initialize the slice to compress
279
+ * if not empty. */
280
+ rd_kafka_dbg(rk, TELEMETRY, "PUSH",
281
+ "Empty payload. "
282
+ "Sending uncompressed payload");
283
+
284
+ /* It's not important the payload isn't actually a segment
285
+ * inside the buffer, as size is 0, we can send any allocated
286
+ * memory here, but we chose the buffer because it's
287
+ * freed like the other COMPRESSION_NONE case, without
288
+ * memory leaks. */
289
+ *compressed_payload = payload;
290
+ *compressed_payload_size = 0;
291
+ return RD_KAFKA_COMPRESSION_NONE;
292
+ }
293
+
269
294
  rd_slice_init_full(&payload_slice, payload);
270
295
  for (i = 0; i < rk->rk_telemetry.accepted_compression_types_cnt; i++) {
271
296
  rd_kafka_compression_t compression_type =
@@ -359,21 +384,24 @@ static void rd_kafka_send_push_telemetry(rd_kafka_t *rk,
359
384
  compressed_metrics_payload_size,
360
385
  rk->rk_telemetry.telemetry_max_bytes);
361
386
  }
387
+
388
+ rd_kafka_dbg(
389
+ rk, TELEMETRY, "PUSH",
390
+ "Sending PushTelemetryRequest with terminating = %s",
391
+ RD_STR_ToF(terminating));
392
+ rd_kafka_PushTelemetryRequest(
393
+ rkb, &rk->rk_telemetry.client_instance_id,
394
+ rk->rk_telemetry.subscription_id, terminating,
395
+ compression_used, compressed_metrics_payload,
396
+ compressed_metrics_payload_size, NULL, 0,
397
+ RD_KAFKA_REPLYQ(rk->rk_ops, 0),
398
+ rd_kafka_handle_PushTelemetry, NULL);
362
399
  } else {
363
- rd_kafka_dbg(rk, TELEMETRY, "PUSH",
364
- "No metrics to push. Sending empty payload.");
400
+ rd_kafka_log(rk, LOG_WARNING, "PUSH",
401
+ "Telemetry metrics encode error, not sending "
402
+ "metrics");
365
403
  }
366
404
 
367
- rd_kafka_dbg(rk, TELEMETRY, "PUSH",
368
- "Sending PushTelemetryRequest with terminating = %s",
369
- RD_STR_ToF(terminating));
370
- rd_kafka_PushTelemetryRequest(
371
- rkb, &rk->rk_telemetry.client_instance_id,
372
- rk->rk_telemetry.subscription_id, terminating, compression_used,
373
- compressed_metrics_payload, compressed_metrics_payload_size, NULL,
374
- 0, RD_KAFKA_REPLYQ(rk->rk_ops, 0), rd_kafka_handle_PushTelemetry,
375
- NULL);
376
-
377
405
  if (metrics_payload)
378
406
  rd_buf_destroy_free(metrics_payload);
379
407
  if (compression_used != RD_KAFKA_COMPRESSION_NONE)
@@ -388,7 +416,7 @@ static void rd_kafka_send_push_telemetry(rd_kafka_t *rk,
388
416
  * @brief Progress the telemetry state machine.
389
417
  *
390
418
  * @locks none
391
- * @locks_acquired none
419
+ * @locks_acquired rd_kafka_rdlock()
392
420
  * @locality main thread
393
421
  */
394
422
  static void rd_kafka_telemetry_fsm(rd_kafka_t *rk) {
@@ -464,7 +492,7 @@ void rd_kafka_telemetry_fsm_tmr_cb(rd_kafka_timers_t *rkts, void *rk) {
464
492
  * @brief Handles parsed GetTelemetrySubscriptions response.
465
493
  *
466
494
  * @locks none
467
- * @locks_acquired none
495
+ * @locks_acquired rd_kafka_rdlock()
468
496
  * @locality main thread
469
497
  */
470
498
  void rd_kafka_handle_get_telemetry_subscriptions(rd_kafka_t *rk,
@@ -501,10 +529,12 @@ void rd_kafka_handle_get_telemetry_subscriptions(rd_kafka_t *rk,
501
529
  if (rk->rk_telemetry.rk_historic_c.ts_start == 0) {
502
530
  rk->rk_telemetry.rk_historic_c.ts_start = now_ns;
503
531
  rk->rk_telemetry.rk_historic_c.ts_last = now_ns;
532
+ rd_kafka_rdlock(rk);
504
533
  TAILQ_FOREACH(rkb, &rk->rk_brokers, rkb_link) {
505
534
  rkb->rkb_telemetry.rkb_historic_c.connects =
506
535
  rd_atomic32_get(&rkb->rkb_c.connects);
507
536
  }
537
+ rd_kafka_rdunlock(rk);
508
538
  }
509
539
 
510
540
  } else {
@@ -617,6 +647,7 @@ void rd_kafka_telemetry_await_termination(rd_kafka_t *rk) {
617
647
  return;
618
648
  }
619
649
 
650
+ mtx_lock(&rk->rk_telemetry.lock);
620
651
  rko = rd_kafka_op_new(RD_KAFKA_OP_TERMINATE_TELEMETRY);
621
652
  rko->rko_rk = rk;
622
653
  rd_kafka_q_enq(rk->rk_ops, rko);
@@ -624,12 +655,8 @@ void rd_kafka_telemetry_await_termination(rd_kafka_t *rk) {
624
655
  /* Await termination sequence completion. */
625
656
  rd_kafka_dbg(rk, TELEMETRY, "TERM",
626
657
  "Awaiting termination of telemetry.");
627
- mtx_lock(&rk->rk_telemetry.lock);
628
658
  cnd_timedwait_ms(&rk->rk_telemetry.termination_cnd,
629
659
  &rk->rk_telemetry.lock,
630
- /* TODO(milind): Evaluate this timeout after completion
631
- of all metrics push, is it too much, or too less if
632
- we include serialization? */
633
660
  1000 /* timeout for waiting */);
634
661
  mtx_unlock(&rk->rk_telemetry.lock);
635
662
  rd_kafka_dbg(rk, TELEMETRY, "TERM",
@@ -701,3 +728,33 @@ void rd_kafka_set_telemetry_broker_maybe(rd_kafka_t *rk,
701
728
  &rk->rk_timers, &rk->rk_telemetry.request_timer, rd_false,
702
729
  0 /* immediate */, rd_kafka_telemetry_fsm_tmr_cb, (void *)rk);
703
730
  }
731
+
732
+ /**
733
+ * @brief Overlapping prefixes should not match the metrics
734
+ * multiple times.
735
+ */
736
+ int unit_test_telemetry_match_requested_metrics_no_duplicates(void) {
737
+ rd_kafka_t *rk = rd_kafka_new(RD_KAFKA_PRODUCER, NULL, NULL, 0);
738
+ rk->rk_telemetry.requested_metrics_cnt = 3;
739
+ rk->rk_telemetry.requested_metrics =
740
+ rd_calloc(rk->rk_telemetry.requested_metrics_cnt, sizeof(char *));
741
+ rk->rk_telemetry.requested_metrics[0] = rd_strdup("org");
742
+ rk->rk_telemetry.requested_metrics[1] = rd_strdup("org.apache");
743
+ rk->rk_telemetry.requested_metrics[2] = rd_strdup("org.apache.kafka");
744
+ rd_kafka_match_requested_metrics(rk);
745
+
746
+ RD_UT_ASSERT(rk->rk_telemetry.matched_metrics_cnt ==
747
+ RD_KAFKA_TELEMETRY_PRODUCER_METRIC__CNT,
748
+ "Expected %d matched metrics, got %" PRIusz,
749
+ RD_KAFKA_TELEMETRY_PRODUCER_METRIC__CNT,
750
+ rk->rk_telemetry.matched_metrics_cnt);
751
+ rd_kafka_destroy(rk);
752
+ return 0;
753
+ }
754
+
755
+
756
+ int unittest_telemetry(void) {
757
+ int fails = 0;
758
+ fails += unit_test_telemetry_match_requested_metrics_no_duplicates();
759
+ return fails;
760
+ }
@@ -713,6 +713,10 @@ static void serialize_Metric(
713
713
  * @brief Encodes the metrics to opentelemetry_proto_metrics_v1_MetricsData and
714
714
  * returns the serialized data. Currently only supports encoding of connection
715
715
  * creation total by default
716
+ *
717
+ * @locks none
718
+ * @locks_acquired rd_kafka_rdlock()
719
+ * @locality main thread
716
720
  */
717
721
  rd_buf_t *rd_kafka_telemetry_encode_metrics(rd_kafka_t *rk) {
718
722
  rd_buf_t *rbuf = NULL;
@@ -731,7 +735,7 @@ rd_buf_t *rd_kafka_telemetry_encode_metrics(rd_kafka_t *rk) {
731
735
  size_t i, metric_idx = 0;
732
736
 
733
737
  if (!metrics_to_encode_count)
734
- return NULL;
738
+ return rd_buf_new(1, 1);
735
739
 
736
740
  opentelemetry_proto_metrics_v1_MetricsData metrics_data =
737
741
  opentelemetry_proto_metrics_v1_MetricsData_init_zero;
@@ -163,16 +163,16 @@ static const rd_kafka_telemetry_metric_info_t
163
163
  {.name = "producer.record.queue.time.avg",
164
164
  .description = "The average time in ms a record spends in the "
165
165
  "producer queue.",
166
- .unit = "ms",
167
- .is_int = rd_false,
166
+ .unit = "ms",
167
+ .is_int = rd_false,
168
168
  .is_per_broker = rd_false,
169
169
  .type = RD_KAFKA_TELEMETRY_METRIC_TYPE_GAUGE},
170
170
  [RD_KAFKA_TELEMETRY_METRIC_PRODUCER_RECORD_QUEUE_TIME_MAX] =
171
171
  {.name = "producer.record.queue.time.max",
172
172
  .description = "The maximum time in ms a record spends in the "
173
173
  "producer queue.",
174
- .unit = "ms",
175
- .is_int = rd_true,
174
+ .unit = "ms",
175
+ .is_int = rd_true,
176
176
  .is_per_broker = rd_false,
177
177
  .type = RD_KAFKA_TELEMETRY_METRIC_TYPE_GAUGE},
178
178
  [RD_KAFKA_TELEMETRY_METRIC_PRODUCER_PRODUCE_LATENCY_AVG] =
@@ -224,33 +224,33 @@ static const rd_kafka_telemetry_metric_info_t RD_KAFKA_TELEMETRY_CONSUMER_METRIC
224
224
  .is_per_broker = rd_true,
225
225
  .type = RD_KAFKA_TELEMETRY_METRIC_TYPE_GAUGE},
226
226
  [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_COORDINATOR_ASSIGNED_PARTITIONS] =
227
- {.name = "consumer.coordinator.assigned.partitions",
228
- .description = "The number of partitions currently assigned "
229
- "to this consumer.",
227
+ {.name = "consumer.coordinator.assigned.partitions",
228
+ .description = "The number of partitions currently assigned "
229
+ "to this consumer.",
230
230
  .unit = "1",
231
231
  .is_int = rd_true,
232
232
  .is_per_broker = rd_false,
233
233
  .type = RD_KAFKA_TELEMETRY_METRIC_TYPE_GAUGE},
234
234
  [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_COORDINATOR_REBALANCE_LATENCY_AVG] =
235
- {.name = "consumer.coordinator.rebalance.latency.avg",
236
- .description = "The average rebalance latency in ms for the "
237
- "consumer coordinator.",
235
+ {.name = "consumer.coordinator.rebalance.latency.avg",
236
+ .description = "The average rebalance latency in ms for the "
237
+ "consumer coordinator.",
238
238
  .unit = "ms",
239
239
  .is_int = rd_false,
240
240
  .is_per_broker = rd_false,
241
241
  .type = RD_KAFKA_TELEMETRY_METRIC_TYPE_GAUGE},
242
242
  [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_COORDINATOR_REBALANCE_LATENCY_MAX] =
243
- {.name = "consumer.coordinator.rebalance.latency.max",
244
- .description = "The maximum rebalance latency in ms for the "
245
- "consumer coordinator.",
243
+ {.name = "consumer.coordinator.rebalance.latency.max",
244
+ .description = "The maximum rebalance latency in ms for the "
245
+ "consumer coordinator.",
246
246
  .unit = "ms",
247
247
  .is_int = rd_true,
248
248
  .is_per_broker = rd_false,
249
249
  .type = RD_KAFKA_TELEMETRY_METRIC_TYPE_GAUGE},
250
250
  [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_COORDINATOR_REBALANCE_LATENCY_TOTAL] =
251
- {.name = "consumer.coordinator.rebalance.latency.total",
252
- .description = "The total rebalance latency in ms for the "
253
- "consumer coordinator.",
251
+ {.name = "consumer.coordinator.rebalance.latency.total",
252
+ .description = "The total rebalance latency in ms for the "
253
+ "consumer coordinator.",
254
254
  .unit = "ms",
255
255
  .is_int = rd_true,
256
256
  .is_per_broker = rd_false,
@@ -282,16 +282,16 @@ static const rd_kafka_telemetry_metric_info_t RD_KAFKA_TELEMETRY_CONSUMER_METRIC
282
282
  {.name = "consumer.coordinator.commit.latency.avg",
283
283
  .description = "The average commit latency in ms for the consumer "
284
284
  "coordinator.",
285
- .unit = "ms",
286
- .is_int = rd_false,
285
+ .unit = "ms",
286
+ .is_int = rd_false,
287
287
  .is_per_broker = rd_false,
288
288
  .type = RD_KAFKA_TELEMETRY_METRIC_TYPE_GAUGE},
289
289
  [RD_KAFKA_TELEMETRY_METRIC_CONSUMER_COORDINATOR_COMMIT_LATENCY_MAX] =
290
290
  {.name = "consumer.coordinator.commit.latency.max",
291
291
  .description = "The maximum commit latency in ms for the consumer "
292
292
  "coordinator.",
293
- .unit = "ms",
294
- .is_int = rd_true,
293
+ .unit = "ms",
294
+ .is_int = rd_true,
295
295
  .is_per_broker = rd_false,
296
296
  .type = RD_KAFKA_TELEMETRY_METRIC_TYPE_GAUGE},
297
297
  };