@platformatic/rdkafka 4.0.0

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 (767) hide show
  1. package/.editorconfig +5 -0
  2. package/.jshintignore +1 -0
  3. package/.jshintrc +23 -0
  4. package/CONTRIBUTING.md +237 -0
  5. package/LICENSE.txt +21 -0
  6. package/Makefile +94 -0
  7. package/README.md +630 -0
  8. package/bench/consumer-raw-rdkafka.js +76 -0
  9. package/bench/consumer-subscribe.js +77 -0
  10. package/bench/kafka-consumer-stream.js +100 -0
  11. package/bench/producer-raw-rdkafka.js +125 -0
  12. package/bench/producer-rdkafka.js +117 -0
  13. package/bench/seed.sh +38 -0
  14. package/binding.gyp +155 -0
  15. package/ci/checks/librdkafka-correct-version.js +67 -0
  16. package/ci/checks/librdkafka-exists.js +13 -0
  17. package/ci/librdkafka-defs-generator.js +193 -0
  18. package/ci/prepublish.js +3 -0
  19. package/config.d.ts +1132 -0
  20. package/configure +15 -0
  21. package/cpplint.py +6325 -0
  22. package/deploy.enc +0 -0
  23. package/deps/librdkafka/.clang-format +136 -0
  24. package/deps/librdkafka/.clang-format-cpp +103 -0
  25. package/deps/librdkafka/.dir-locals.el +10 -0
  26. package/deps/librdkafka/.formatignore +33 -0
  27. package/deps/librdkafka/.gdbmacros +19 -0
  28. package/deps/librdkafka/.semaphore/project.yml +43 -0
  29. package/deps/librdkafka/.semaphore/project_public.yml +20 -0
  30. package/deps/librdkafka/.semaphore/semaphore.yml +355 -0
  31. package/deps/librdkafka/CHANGELOG.md +1738 -0
  32. package/deps/librdkafka/CMakeLists.txt +291 -0
  33. package/deps/librdkafka/CODE_OF_CONDUCT.md +46 -0
  34. package/deps/librdkafka/CONFIGURATION.md +189 -0
  35. package/deps/librdkafka/CONTRIBUTING.md +431 -0
  36. package/deps/librdkafka/Doxyfile +2375 -0
  37. package/deps/librdkafka/INTRODUCTION.md +2173 -0
  38. package/deps/librdkafka/LICENSE +26 -0
  39. package/deps/librdkafka/LICENSE.cjson +22 -0
  40. package/deps/librdkafka/LICENSE.crc32c +28 -0
  41. package/deps/librdkafka/LICENSE.fnv1a +18 -0
  42. package/deps/librdkafka/LICENSE.hdrhistogram +27 -0
  43. package/deps/librdkafka/LICENSE.lz4 +26 -0
  44. package/deps/librdkafka/LICENSE.murmur2 +25 -0
  45. package/deps/librdkafka/LICENSE.nanopb +22 -0
  46. package/deps/librdkafka/LICENSE.opentelemetry +203 -0
  47. package/deps/librdkafka/LICENSE.pycrc +23 -0
  48. package/deps/librdkafka/LICENSE.queue +31 -0
  49. package/deps/librdkafka/LICENSE.regexp +5 -0
  50. package/deps/librdkafka/LICENSE.snappy +36 -0
  51. package/deps/librdkafka/LICENSE.tinycthread +26 -0
  52. package/deps/librdkafka/LICENSE.wingetopt +49 -0
  53. package/deps/librdkafka/LICENSES.txt +625 -0
  54. package/deps/librdkafka/Makefile +124 -0
  55. package/deps/librdkafka/README.md +199 -0
  56. package/deps/librdkafka/README.win32 +26 -0
  57. package/deps/librdkafka/STATISTICS.md +624 -0
  58. package/deps/librdkafka/configure +214 -0
  59. package/deps/librdkafka/configure.self +331 -0
  60. package/deps/librdkafka/debian/changelog +111 -0
  61. package/deps/librdkafka/debian/compat +1 -0
  62. package/deps/librdkafka/debian/control +71 -0
  63. package/deps/librdkafka/debian/copyright +99 -0
  64. package/deps/librdkafka/debian/gbp.conf +9 -0
  65. package/deps/librdkafka/debian/librdkafka++1.install +1 -0
  66. package/deps/librdkafka/debian/librdkafka-dev.examples +2 -0
  67. package/deps/librdkafka/debian/librdkafka-dev.install +9 -0
  68. package/deps/librdkafka/debian/librdkafka1.docs +5 -0
  69. package/deps/librdkafka/debian/librdkafka1.install +1 -0
  70. package/deps/librdkafka/debian/librdkafka1.symbols +135 -0
  71. package/deps/librdkafka/debian/rules +19 -0
  72. package/deps/librdkafka/debian/source/format +1 -0
  73. package/deps/librdkafka/debian/watch +2 -0
  74. package/deps/librdkafka/dev-conf.sh +123 -0
  75. package/deps/librdkafka/examples/CMakeLists.txt +79 -0
  76. package/deps/librdkafka/examples/Makefile +167 -0
  77. package/deps/librdkafka/examples/README.md +42 -0
  78. package/deps/librdkafka/examples/alter_consumer_group_offsets.c +338 -0
  79. package/deps/librdkafka/examples/consumer.c +261 -0
  80. package/deps/librdkafka/examples/delete_records.c +233 -0
  81. package/deps/librdkafka/examples/describe_cluster.c +322 -0
  82. package/deps/librdkafka/examples/describe_consumer_groups.c +436 -0
  83. package/deps/librdkafka/examples/describe_topics.c +427 -0
  84. package/deps/librdkafka/examples/elect_leaders.c +317 -0
  85. package/deps/librdkafka/examples/globals.json +11 -0
  86. package/deps/librdkafka/examples/idempotent_producer.c +344 -0
  87. package/deps/librdkafka/examples/incremental_alter_configs.c +348 -0
  88. package/deps/librdkafka/examples/kafkatest_verifiable_client.cpp +961 -0
  89. package/deps/librdkafka/examples/list_consumer_group_offsets.c +359 -0
  90. package/deps/librdkafka/examples/list_consumer_groups.c +365 -0
  91. package/deps/librdkafka/examples/list_offsets.c +327 -0
  92. package/deps/librdkafka/examples/misc.c +287 -0
  93. package/deps/librdkafka/examples/openssl_engine_example.cpp +249 -0
  94. package/deps/librdkafka/examples/producer.c +251 -0
  95. package/deps/librdkafka/examples/producer.cpp +228 -0
  96. package/deps/librdkafka/examples/rdkafka_complex_consumer_example.c +617 -0
  97. package/deps/librdkafka/examples/rdkafka_complex_consumer_example.cpp +467 -0
  98. package/deps/librdkafka/examples/rdkafka_consume_batch.cpp +264 -0
  99. package/deps/librdkafka/examples/rdkafka_example.c +853 -0
  100. package/deps/librdkafka/examples/rdkafka_example.cpp +679 -0
  101. package/deps/librdkafka/examples/rdkafka_performance.c +1781 -0
  102. package/deps/librdkafka/examples/transactions-older-broker.c +668 -0
  103. package/deps/librdkafka/examples/transactions.c +665 -0
  104. package/deps/librdkafka/examples/user_scram.c +492 -0
  105. package/deps/librdkafka/examples/win_ssl_cert_store.cpp +395 -0
  106. package/deps/librdkafka/lds-gen.py +73 -0
  107. package/deps/librdkafka/mainpage.doxy +40 -0
  108. package/deps/librdkafka/mklove/Makefile.base +329 -0
  109. package/deps/librdkafka/mklove/modules/configure.atomics +144 -0
  110. package/deps/librdkafka/mklove/modules/configure.base +2484 -0
  111. package/deps/librdkafka/mklove/modules/configure.builtin +70 -0
  112. package/deps/librdkafka/mklove/modules/configure.cc +186 -0
  113. package/deps/librdkafka/mklove/modules/configure.cxx +8 -0
  114. package/deps/librdkafka/mklove/modules/configure.fileversion +65 -0
  115. package/deps/librdkafka/mklove/modules/configure.gitversion +29 -0
  116. package/deps/librdkafka/mklove/modules/configure.good_cflags +18 -0
  117. package/deps/librdkafka/mklove/modules/configure.host +132 -0
  118. package/deps/librdkafka/mklove/modules/configure.lib +49 -0
  119. package/deps/librdkafka/mklove/modules/configure.libcurl +99 -0
  120. package/deps/librdkafka/mklove/modules/configure.libsasl2 +36 -0
  121. package/deps/librdkafka/mklove/modules/configure.libssl +147 -0
  122. package/deps/librdkafka/mklove/modules/configure.libzstd +58 -0
  123. package/deps/librdkafka/mklove/modules/configure.parseversion +95 -0
  124. package/deps/librdkafka/mklove/modules/configure.pic +16 -0
  125. package/deps/librdkafka/mklove/modules/configure.socket +20 -0
  126. package/deps/librdkafka/mklove/modules/configure.zlib +61 -0
  127. package/deps/librdkafka/mklove/modules/patches/README.md +8 -0
  128. package/deps/librdkafka/mklove/modules/patches/libcurl.0000-no-runtime-linking-check.patch +11 -0
  129. package/deps/librdkafka/mklove/modules/patches/libssl.0000-osx-rand-include-fix-OpenSSL-PR16409.patch +56 -0
  130. package/deps/librdkafka/packaging/RELEASE.md +311 -0
  131. package/deps/librdkafka/packaging/alpine/build-alpine.sh +38 -0
  132. package/deps/librdkafka/packaging/archlinux/PKGBUILD +30 -0
  133. package/deps/librdkafka/packaging/cmake/Config.cmake.in +37 -0
  134. package/deps/librdkafka/packaging/cmake/Modules/FindLZ4.cmake +38 -0
  135. package/deps/librdkafka/packaging/cmake/Modules/FindZSTD.cmake +27 -0
  136. package/deps/librdkafka/packaging/cmake/Modules/LICENSE.FindZstd +178 -0
  137. package/deps/librdkafka/packaging/cmake/README.md +38 -0
  138. package/deps/librdkafka/packaging/cmake/config.h.in +52 -0
  139. package/deps/librdkafka/packaging/cmake/parseversion.cmake +60 -0
  140. package/deps/librdkafka/packaging/cmake/rdkafka.pc.in +12 -0
  141. package/deps/librdkafka/packaging/cmake/try_compile/atomic_32_test.c +8 -0
  142. package/deps/librdkafka/packaging/cmake/try_compile/atomic_64_test.c +8 -0
  143. package/deps/librdkafka/packaging/cmake/try_compile/c11threads_test.c +14 -0
  144. package/deps/librdkafka/packaging/cmake/try_compile/crc32c_hw_test.c +27 -0
  145. package/deps/librdkafka/packaging/cmake/try_compile/dlopen_test.c +11 -0
  146. package/deps/librdkafka/packaging/cmake/try_compile/libsasl2_test.c +7 -0
  147. package/deps/librdkafka/packaging/cmake/try_compile/pthread_setname_darwin_test.c +6 -0
  148. package/deps/librdkafka/packaging/cmake/try_compile/pthread_setname_freebsd_test.c +7 -0
  149. package/deps/librdkafka/packaging/cmake/try_compile/pthread_setname_gnu_test.c +5 -0
  150. package/deps/librdkafka/packaging/cmake/try_compile/rand_r_test.c +7 -0
  151. package/deps/librdkafka/packaging/cmake/try_compile/rdkafka_setup.cmake +122 -0
  152. package/deps/librdkafka/packaging/cmake/try_compile/regex_test.c +10 -0
  153. package/deps/librdkafka/packaging/cmake/try_compile/strndup_test.c +5 -0
  154. package/deps/librdkafka/packaging/cmake/try_compile/sync_32_test.c +8 -0
  155. package/deps/librdkafka/packaging/cmake/try_compile/sync_64_test.c +8 -0
  156. package/deps/librdkafka/packaging/cp/README.md +13 -0
  157. package/deps/librdkafka/packaging/cp/check_features.c +64 -0
  158. package/deps/librdkafka/packaging/cp/verify-deb.sh +33 -0
  159. package/deps/librdkafka/packaging/cp/verify-packages.sh +48 -0
  160. package/deps/librdkafka/packaging/cp/verify-rpm.sh +39 -0
  161. package/deps/librdkafka/packaging/debian/changelog +66 -0
  162. package/deps/librdkafka/packaging/debian/compat +1 -0
  163. package/deps/librdkafka/packaging/debian/control +49 -0
  164. package/deps/librdkafka/packaging/debian/copyright +84 -0
  165. package/deps/librdkafka/packaging/debian/gbp.conf +9 -0
  166. package/deps/librdkafka/packaging/debian/librdkafka-dev.dirs +2 -0
  167. package/deps/librdkafka/packaging/debian/librdkafka-dev.examples +2 -0
  168. package/deps/librdkafka/packaging/debian/librdkafka-dev.install +6 -0
  169. package/deps/librdkafka/packaging/debian/librdkafka-dev.substvars +1 -0
  170. package/deps/librdkafka/packaging/debian/librdkafka.dsc +16 -0
  171. package/deps/librdkafka/packaging/debian/librdkafka1-dbg.substvars +1 -0
  172. package/deps/librdkafka/packaging/debian/librdkafka1.dirs +1 -0
  173. package/deps/librdkafka/packaging/debian/librdkafka1.install +2 -0
  174. package/deps/librdkafka/packaging/debian/librdkafka1.postinst.debhelper +5 -0
  175. package/deps/librdkafka/packaging/debian/librdkafka1.postrm.debhelper +5 -0
  176. package/deps/librdkafka/packaging/debian/librdkafka1.symbols +64 -0
  177. package/deps/librdkafka/packaging/debian/rules +19 -0
  178. package/deps/librdkafka/packaging/debian/source/format +1 -0
  179. package/deps/librdkafka/packaging/debian/watch +2 -0
  180. package/deps/librdkafka/packaging/get_version.py +21 -0
  181. package/deps/librdkafka/packaging/homebrew/README.md +15 -0
  182. package/deps/librdkafka/packaging/homebrew/brew-update-pr.sh +31 -0
  183. package/deps/librdkafka/packaging/mingw-w64/configure-build-msys2-mingw-static.sh +52 -0
  184. package/deps/librdkafka/packaging/mingw-w64/configure-build-msys2-mingw.sh +21 -0
  185. package/deps/librdkafka/packaging/mingw-w64/run-tests.sh +6 -0
  186. package/deps/librdkafka/packaging/mingw-w64/semaphoreci-build.sh +38 -0
  187. package/deps/librdkafka/packaging/mingw-w64/travis-before-install.sh +20 -0
  188. package/deps/librdkafka/packaging/nuget/README.md +84 -0
  189. package/deps/librdkafka/packaging/nuget/artifact.py +177 -0
  190. package/deps/librdkafka/packaging/nuget/cleanup-s3.py +143 -0
  191. package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-win32__bldtype-Release/msvcr120.zip +0 -0
  192. package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-win32__bldtype-Release/msvcr140.zip +0 -0
  193. package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-x64__bldtype-Release/msvcr120.zip +0 -0
  194. package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-x64__bldtype-Release/msvcr140.zip +0 -0
  195. package/deps/librdkafka/packaging/nuget/nuget.sh +21 -0
  196. package/deps/librdkafka/packaging/nuget/nugetpackage.py +278 -0
  197. package/deps/librdkafka/packaging/nuget/packaging.py +448 -0
  198. package/deps/librdkafka/packaging/nuget/push-to-nuget.sh +21 -0
  199. package/deps/librdkafka/packaging/nuget/release.py +167 -0
  200. package/deps/librdkafka/packaging/nuget/requirements.txt +3 -0
  201. package/deps/librdkafka/packaging/nuget/staticpackage.py +178 -0
  202. package/deps/librdkafka/packaging/nuget/templates/librdkafka.redist.nuspec +21 -0
  203. package/deps/librdkafka/packaging/nuget/templates/librdkafka.redist.props +18 -0
  204. package/deps/librdkafka/packaging/nuget/templates/librdkafka.redist.targets +19 -0
  205. package/deps/librdkafka/packaging/nuget/zfile/__init__.py +0 -0
  206. package/deps/librdkafka/packaging/nuget/zfile/zfile.py +98 -0
  207. package/deps/librdkafka/packaging/rpm/Makefile +92 -0
  208. package/deps/librdkafka/packaging/rpm/README.md +23 -0
  209. package/deps/librdkafka/packaging/rpm/el7-x86_64.cfg +40 -0
  210. package/deps/librdkafka/packaging/rpm/librdkafka.spec +118 -0
  211. package/deps/librdkafka/packaging/rpm/mock-on-docker.sh +96 -0
  212. package/deps/librdkafka/packaging/rpm/tests/Makefile +25 -0
  213. package/deps/librdkafka/packaging/rpm/tests/README.md +8 -0
  214. package/deps/librdkafka/packaging/rpm/tests/run-test.sh +42 -0
  215. package/deps/librdkafka/packaging/rpm/tests/test-on-docker.sh +56 -0
  216. package/deps/librdkafka/packaging/rpm/tests/test.c +77 -0
  217. package/deps/librdkafka/packaging/rpm/tests/test.cpp +34 -0
  218. package/deps/librdkafka/packaging/tools/build-configurations-checks.sh +10 -0
  219. package/deps/librdkafka/packaging/tools/build-deb-package.sh +64 -0
  220. package/deps/librdkafka/packaging/tools/build-debian.sh +65 -0
  221. package/deps/librdkafka/packaging/tools/build-manylinux.sh +68 -0
  222. package/deps/librdkafka/packaging/tools/build-release-artifacts.sh +139 -0
  223. package/deps/librdkafka/packaging/tools/distro-build.sh +38 -0
  224. package/deps/librdkafka/packaging/tools/gh-release-checksums.py +39 -0
  225. package/deps/librdkafka/packaging/tools/rdutcoverage.sh +25 -0
  226. package/deps/librdkafka/packaging/tools/requirements.txt +2 -0
  227. package/deps/librdkafka/packaging/tools/style-format.sh +148 -0
  228. package/deps/librdkafka/service.yml +18 -0
  229. package/deps/librdkafka/src/CMakeLists.txt +374 -0
  230. package/deps/librdkafka/src/Makefile +103 -0
  231. package/deps/librdkafka/src/README.lz4.md +30 -0
  232. package/deps/librdkafka/src/cJSON.c +2834 -0
  233. package/deps/librdkafka/src/cJSON.h +398 -0
  234. package/deps/librdkafka/src/crc32c.c +430 -0
  235. package/deps/librdkafka/src/crc32c.h +38 -0
  236. package/deps/librdkafka/src/generate_proto.sh +66 -0
  237. package/deps/librdkafka/src/librdkafka_cgrp_synch.png +0 -0
  238. package/deps/librdkafka/src/lz4.c +2727 -0
  239. package/deps/librdkafka/src/lz4.h +842 -0
  240. package/deps/librdkafka/src/lz4frame.c +2078 -0
  241. package/deps/librdkafka/src/lz4frame.h +692 -0
  242. package/deps/librdkafka/src/lz4frame_static.h +47 -0
  243. package/deps/librdkafka/src/lz4hc.c +1631 -0
  244. package/deps/librdkafka/src/lz4hc.h +413 -0
  245. package/deps/librdkafka/src/nanopb/pb.h +917 -0
  246. package/deps/librdkafka/src/nanopb/pb_common.c +388 -0
  247. package/deps/librdkafka/src/nanopb/pb_common.h +49 -0
  248. package/deps/librdkafka/src/nanopb/pb_decode.c +1727 -0
  249. package/deps/librdkafka/src/nanopb/pb_decode.h +193 -0
  250. package/deps/librdkafka/src/nanopb/pb_encode.c +1000 -0
  251. package/deps/librdkafka/src/nanopb/pb_encode.h +185 -0
  252. package/deps/librdkafka/src/opentelemetry/common.pb.c +32 -0
  253. package/deps/librdkafka/src/opentelemetry/common.pb.h +170 -0
  254. package/deps/librdkafka/src/opentelemetry/metrics.options +2 -0
  255. package/deps/librdkafka/src/opentelemetry/metrics.pb.c +67 -0
  256. package/deps/librdkafka/src/opentelemetry/metrics.pb.h +966 -0
  257. package/deps/librdkafka/src/opentelemetry/resource.pb.c +12 -0
  258. package/deps/librdkafka/src/opentelemetry/resource.pb.h +58 -0
  259. package/deps/librdkafka/src/queue.h +850 -0
  260. package/deps/librdkafka/src/rd.h +441 -0
  261. package/deps/librdkafka/src/rdaddr.c +255 -0
  262. package/deps/librdkafka/src/rdaddr.h +203 -0
  263. package/deps/librdkafka/src/rdatomic.h +226 -0
  264. package/deps/librdkafka/src/rdavg.h +259 -0
  265. package/deps/librdkafka/src/rdavl.c +210 -0
  266. package/deps/librdkafka/src/rdavl.h +250 -0
  267. package/deps/librdkafka/src/rdbase64.c +169 -0
  268. package/deps/librdkafka/src/rdbase64.h +41 -0
  269. package/deps/librdkafka/src/rdbuf.c +1884 -0
  270. package/deps/librdkafka/src/rdbuf.h +375 -0
  271. package/deps/librdkafka/src/rdcrc32.c +114 -0
  272. package/deps/librdkafka/src/rdcrc32.h +170 -0
  273. package/deps/librdkafka/src/rddl.c +179 -0
  274. package/deps/librdkafka/src/rddl.h +43 -0
  275. package/deps/librdkafka/src/rdendian.h +174 -0
  276. package/deps/librdkafka/src/rdfloat.h +67 -0
  277. package/deps/librdkafka/src/rdfnv1a.c +113 -0
  278. package/deps/librdkafka/src/rdfnv1a.h +35 -0
  279. package/deps/librdkafka/src/rdgz.c +120 -0
  280. package/deps/librdkafka/src/rdgz.h +46 -0
  281. package/deps/librdkafka/src/rdhdrhistogram.c +721 -0
  282. package/deps/librdkafka/src/rdhdrhistogram.h +87 -0
  283. package/deps/librdkafka/src/rdhttp.c +512 -0
  284. package/deps/librdkafka/src/rdhttp.h +83 -0
  285. package/deps/librdkafka/src/rdinterval.h +177 -0
  286. package/deps/librdkafka/src/rdkafka.c +5351 -0
  287. package/deps/librdkafka/src/rdkafka.h +10603 -0
  288. package/deps/librdkafka/src/rdkafka_admin.c +9417 -0
  289. package/deps/librdkafka/src/rdkafka_admin.h +619 -0
  290. package/deps/librdkafka/src/rdkafka_assignment.c +1010 -0
  291. package/deps/librdkafka/src/rdkafka_assignment.h +73 -0
  292. package/deps/librdkafka/src/rdkafka_assignor.c +1786 -0
  293. package/deps/librdkafka/src/rdkafka_assignor.h +402 -0
  294. package/deps/librdkafka/src/rdkafka_aux.c +409 -0
  295. package/deps/librdkafka/src/rdkafka_aux.h +174 -0
  296. package/deps/librdkafka/src/rdkafka_background.c +221 -0
  297. package/deps/librdkafka/src/rdkafka_broker.c +6186 -0
  298. package/deps/librdkafka/src/rdkafka_broker.h +686 -0
  299. package/deps/librdkafka/src/rdkafka_buf.c +540 -0
  300. package/deps/librdkafka/src/rdkafka_buf.h +1524 -0
  301. package/deps/librdkafka/src/rdkafka_cert.c +552 -0
  302. package/deps/librdkafka/src/rdkafka_cert.h +61 -0
  303. package/deps/librdkafka/src/rdkafka_cgrp.c +7262 -0
  304. package/deps/librdkafka/src/rdkafka_cgrp.h +443 -0
  305. package/deps/librdkafka/src/rdkafka_conf.c +4456 -0
  306. package/deps/librdkafka/src/rdkafka_conf.h +668 -0
  307. package/deps/librdkafka/src/rdkafka_confval.h +97 -0
  308. package/deps/librdkafka/src/rdkafka_coord.c +623 -0
  309. package/deps/librdkafka/src/rdkafka_coord.h +132 -0
  310. package/deps/librdkafka/src/rdkafka_error.c +228 -0
  311. package/deps/librdkafka/src/rdkafka_error.h +80 -0
  312. package/deps/librdkafka/src/rdkafka_event.c +502 -0
  313. package/deps/librdkafka/src/rdkafka_event.h +126 -0
  314. package/deps/librdkafka/src/rdkafka_feature.c +461 -0
  315. package/deps/librdkafka/src/rdkafka_feature.h +102 -0
  316. package/deps/librdkafka/src/rdkafka_fetcher.c +1402 -0
  317. package/deps/librdkafka/src/rdkafka_fetcher.h +44 -0
  318. package/deps/librdkafka/src/rdkafka_header.c +220 -0
  319. package/deps/librdkafka/src/rdkafka_header.h +76 -0
  320. package/deps/librdkafka/src/rdkafka_idempotence.c +807 -0
  321. package/deps/librdkafka/src/rdkafka_idempotence.h +144 -0
  322. package/deps/librdkafka/src/rdkafka_int.h +1222 -0
  323. package/deps/librdkafka/src/rdkafka_interceptor.c +819 -0
  324. package/deps/librdkafka/src/rdkafka_interceptor.h +104 -0
  325. package/deps/librdkafka/src/rdkafka_lz4.c +450 -0
  326. package/deps/librdkafka/src/rdkafka_lz4.h +49 -0
  327. package/deps/librdkafka/src/rdkafka_metadata.c +2124 -0
  328. package/deps/librdkafka/src/rdkafka_metadata.h +341 -0
  329. package/deps/librdkafka/src/rdkafka_metadata_cache.c +977 -0
  330. package/deps/librdkafka/src/rdkafka_mock.c +2885 -0
  331. package/deps/librdkafka/src/rdkafka_mock.h +491 -0
  332. package/deps/librdkafka/src/rdkafka_mock_cgrp.c +710 -0
  333. package/deps/librdkafka/src/rdkafka_mock_handlers.c +2817 -0
  334. package/deps/librdkafka/src/rdkafka_mock_int.h +591 -0
  335. package/deps/librdkafka/src/rdkafka_msg.c +2573 -0
  336. package/deps/librdkafka/src/rdkafka_msg.h +614 -0
  337. package/deps/librdkafka/src/rdkafka_msgbatch.h +62 -0
  338. package/deps/librdkafka/src/rdkafka_msgset.h +98 -0
  339. package/deps/librdkafka/src/rdkafka_msgset_reader.c +1806 -0
  340. package/deps/librdkafka/src/rdkafka_msgset_writer.c +1470 -0
  341. package/deps/librdkafka/src/rdkafka_offset.c +1537 -0
  342. package/deps/librdkafka/src/rdkafka_offset.h +150 -0
  343. package/deps/librdkafka/src/rdkafka_op.c +997 -0
  344. package/deps/librdkafka/src/rdkafka_op.h +834 -0
  345. package/deps/librdkafka/src/rdkafka_partition.c +4801 -0
  346. package/deps/librdkafka/src/rdkafka_partition.h +1173 -0
  347. package/deps/librdkafka/src/rdkafka_pattern.c +228 -0
  348. package/deps/librdkafka/src/rdkafka_pattern.h +70 -0
  349. package/deps/librdkafka/src/rdkafka_plugin.c +213 -0
  350. package/deps/librdkafka/src/rdkafka_plugin.h +41 -0
  351. package/deps/librdkafka/src/rdkafka_proto.h +733 -0
  352. package/deps/librdkafka/src/rdkafka_protocol.h +127 -0
  353. package/deps/librdkafka/src/rdkafka_queue.c +1153 -0
  354. package/deps/librdkafka/src/rdkafka_queue.h +1201 -0
  355. package/deps/librdkafka/src/rdkafka_range_assignor.c +1748 -0
  356. package/deps/librdkafka/src/rdkafka_request.c +6817 -0
  357. package/deps/librdkafka/src/rdkafka_request.h +709 -0
  358. package/deps/librdkafka/src/rdkafka_roundrobin_assignor.c +123 -0
  359. package/deps/librdkafka/src/rdkafka_sasl.c +528 -0
  360. package/deps/librdkafka/src/rdkafka_sasl.h +63 -0
  361. package/deps/librdkafka/src/rdkafka_sasl_cyrus.c +722 -0
  362. package/deps/librdkafka/src/rdkafka_sasl_int.h +89 -0
  363. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.c +1829 -0
  364. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.h +52 -0
  365. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.c +589 -0
  366. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.h +37 -0
  367. package/deps/librdkafka/src/rdkafka_sasl_plain.c +142 -0
  368. package/deps/librdkafka/src/rdkafka_sasl_scram.c +857 -0
  369. package/deps/librdkafka/src/rdkafka_sasl_win32.c +550 -0
  370. package/deps/librdkafka/src/rdkafka_ssl.c +1904 -0
  371. package/deps/librdkafka/src/rdkafka_ssl.h +64 -0
  372. package/deps/librdkafka/src/rdkafka_sticky_assignor.c +4781 -0
  373. package/deps/librdkafka/src/rdkafka_subscription.c +278 -0
  374. package/deps/librdkafka/src/rdkafka_telemetry.c +703 -0
  375. package/deps/librdkafka/src/rdkafka_telemetry.h +52 -0
  376. package/deps/librdkafka/src/rdkafka_telemetry_decode.c +1053 -0
  377. package/deps/librdkafka/src/rdkafka_telemetry_decode.h +59 -0
  378. package/deps/librdkafka/src/rdkafka_telemetry_encode.c +993 -0
  379. package/deps/librdkafka/src/rdkafka_telemetry_encode.h +301 -0
  380. package/deps/librdkafka/src/rdkafka_timer.c +402 -0
  381. package/deps/librdkafka/src/rdkafka_timer.h +117 -0
  382. package/deps/librdkafka/src/rdkafka_topic.c +2078 -0
  383. package/deps/librdkafka/src/rdkafka_topic.h +328 -0
  384. package/deps/librdkafka/src/rdkafka_transport.c +1297 -0
  385. package/deps/librdkafka/src/rdkafka_transport.h +94 -0
  386. package/deps/librdkafka/src/rdkafka_transport_int.h +100 -0
  387. package/deps/librdkafka/src/rdkafka_txnmgr.c +3251 -0
  388. package/deps/librdkafka/src/rdkafka_txnmgr.h +171 -0
  389. package/deps/librdkafka/src/rdkafka_zstd.c +226 -0
  390. package/deps/librdkafka/src/rdkafka_zstd.h +57 -0
  391. package/deps/librdkafka/src/rdlist.c +576 -0
  392. package/deps/librdkafka/src/rdlist.h +434 -0
  393. package/deps/librdkafka/src/rdlog.c +89 -0
  394. package/deps/librdkafka/src/rdlog.h +41 -0
  395. package/deps/librdkafka/src/rdmap.c +503 -0
  396. package/deps/librdkafka/src/rdmap.h +492 -0
  397. package/deps/librdkafka/src/rdmurmur2.c +167 -0
  398. package/deps/librdkafka/src/rdmurmur2.h +35 -0
  399. package/deps/librdkafka/src/rdports.c +61 -0
  400. package/deps/librdkafka/src/rdports.h +38 -0
  401. package/deps/librdkafka/src/rdposix.h +250 -0
  402. package/deps/librdkafka/src/rdrand.c +70 -0
  403. package/deps/librdkafka/src/rdrand.h +43 -0
  404. package/deps/librdkafka/src/rdregex.c +156 -0
  405. package/deps/librdkafka/src/rdregex.h +43 -0
  406. package/deps/librdkafka/src/rdsignal.h +57 -0
  407. package/deps/librdkafka/src/rdstring.c +645 -0
  408. package/deps/librdkafka/src/rdstring.h +98 -0
  409. package/deps/librdkafka/src/rdsysqueue.h +404 -0
  410. package/deps/librdkafka/src/rdtime.h +325 -0
  411. package/deps/librdkafka/src/rdtypes.h +86 -0
  412. package/deps/librdkafka/src/rdunittest.c +532 -0
  413. package/deps/librdkafka/src/rdunittest.h +230 -0
  414. package/deps/librdkafka/src/rdvarint.c +134 -0
  415. package/deps/librdkafka/src/rdvarint.h +165 -0
  416. package/deps/librdkafka/src/rdwin32.h +382 -0
  417. package/deps/librdkafka/src/rdxxhash.c +1030 -0
  418. package/deps/librdkafka/src/rdxxhash.h +328 -0
  419. package/deps/librdkafka/src/regexp.c +1347 -0
  420. package/deps/librdkafka/src/regexp.h +41 -0
  421. package/deps/librdkafka/src/snappy.c +1866 -0
  422. package/deps/librdkafka/src/snappy.h +62 -0
  423. package/deps/librdkafka/src/snappy_compat.h +138 -0
  424. package/deps/librdkafka/src/statistics_schema.json +444 -0
  425. package/deps/librdkafka/src/tinycthread.c +932 -0
  426. package/deps/librdkafka/src/tinycthread.h +503 -0
  427. package/deps/librdkafka/src/tinycthread_extra.c +175 -0
  428. package/deps/librdkafka/src/tinycthread_extra.h +208 -0
  429. package/deps/librdkafka/src/win32_config.h +58 -0
  430. package/deps/librdkafka/src-cpp/CMakeLists.txt +90 -0
  431. package/deps/librdkafka/src-cpp/ConfImpl.cpp +84 -0
  432. package/deps/librdkafka/src-cpp/ConsumerImpl.cpp +244 -0
  433. package/deps/librdkafka/src-cpp/HandleImpl.cpp +436 -0
  434. package/deps/librdkafka/src-cpp/HeadersImpl.cpp +48 -0
  435. package/deps/librdkafka/src-cpp/KafkaConsumerImpl.cpp +296 -0
  436. package/deps/librdkafka/src-cpp/Makefile +55 -0
  437. package/deps/librdkafka/src-cpp/MessageImpl.cpp +38 -0
  438. package/deps/librdkafka/src-cpp/MetadataImpl.cpp +170 -0
  439. package/deps/librdkafka/src-cpp/ProducerImpl.cpp +197 -0
  440. package/deps/librdkafka/src-cpp/QueueImpl.cpp +70 -0
  441. package/deps/librdkafka/src-cpp/README.md +16 -0
  442. package/deps/librdkafka/src-cpp/RdKafka.cpp +59 -0
  443. package/deps/librdkafka/src-cpp/TopicImpl.cpp +124 -0
  444. package/deps/librdkafka/src-cpp/TopicPartitionImpl.cpp +57 -0
  445. package/deps/librdkafka/src-cpp/rdkafkacpp.h +3771 -0
  446. package/deps/librdkafka/src-cpp/rdkafkacpp_int.h +1641 -0
  447. package/deps/librdkafka/tests/0000-unittests.c +72 -0
  448. package/deps/librdkafka/tests/0001-multiobj.c +98 -0
  449. package/deps/librdkafka/tests/0002-unkpart.c +244 -0
  450. package/deps/librdkafka/tests/0003-msgmaxsize.c +173 -0
  451. package/deps/librdkafka/tests/0004-conf.c +867 -0
  452. package/deps/librdkafka/tests/0005-order.c +133 -0
  453. package/deps/librdkafka/tests/0006-symbols.c +163 -0
  454. package/deps/librdkafka/tests/0007-autotopic.c +136 -0
  455. package/deps/librdkafka/tests/0008-reqacks.c +179 -0
  456. package/deps/librdkafka/tests/0009-mock_cluster.c +96 -0
  457. package/deps/librdkafka/tests/0011-produce_batch.c +752 -0
  458. package/deps/librdkafka/tests/0012-produce_consume.c +537 -0
  459. package/deps/librdkafka/tests/0013-null-msgs.c +473 -0
  460. package/deps/librdkafka/tests/0014-reconsume-191.c +512 -0
  461. package/deps/librdkafka/tests/0015-offset_seeks.c +172 -0
  462. package/deps/librdkafka/tests/0016-client_swname.c +166 -0
  463. package/deps/librdkafka/tests/0017-compression.c +142 -0
  464. package/deps/librdkafka/tests/0018-cgrp_term.c +333 -0
  465. package/deps/librdkafka/tests/0019-list_groups.c +289 -0
  466. package/deps/librdkafka/tests/0020-destroy_hang.c +162 -0
  467. package/deps/librdkafka/tests/0021-rkt_destroy.c +71 -0
  468. package/deps/librdkafka/tests/0022-consume_batch.c +276 -0
  469. package/deps/librdkafka/tests/0025-timers.c +147 -0
  470. package/deps/librdkafka/tests/0026-consume_pause.c +549 -0
  471. package/deps/librdkafka/tests/0028-long_topicnames.c +79 -0
  472. package/deps/librdkafka/tests/0029-assign_offset.c +204 -0
  473. package/deps/librdkafka/tests/0030-offset_commit.c +589 -0
  474. package/deps/librdkafka/tests/0031-get_offsets.c +235 -0
  475. package/deps/librdkafka/tests/0033-regex_subscribe.c +520 -0
  476. package/deps/librdkafka/tests/0034-offset_reset.c +377 -0
  477. package/deps/librdkafka/tests/0035-api_version.c +73 -0
  478. package/deps/librdkafka/tests/0036-partial_fetch.c +86 -0
  479. package/deps/librdkafka/tests/0037-destroy_hang_local.c +85 -0
  480. package/deps/librdkafka/tests/0038-performance.c +120 -0
  481. package/deps/librdkafka/tests/0039-event.c +284 -0
  482. package/deps/librdkafka/tests/0040-io_event.c +251 -0
  483. package/deps/librdkafka/tests/0041-fetch_max_bytes.c +96 -0
  484. package/deps/librdkafka/tests/0042-many_topics.c +252 -0
  485. package/deps/librdkafka/tests/0043-no_connection.c +77 -0
  486. package/deps/librdkafka/tests/0044-partition_cnt.c +93 -0
  487. package/deps/librdkafka/tests/0045-subscribe_update.c +746 -0
  488. package/deps/librdkafka/tests/0046-rkt_cache.c +65 -0
  489. package/deps/librdkafka/tests/0047-partial_buf_tmout.c +97 -0
  490. package/deps/librdkafka/tests/0048-partitioner.c +283 -0
  491. package/deps/librdkafka/tests/0049-consume_conn_close.c +162 -0
  492. package/deps/librdkafka/tests/0050-subscribe_adds.c +144 -0
  493. package/deps/librdkafka/tests/0051-assign_adds.c +125 -0
  494. package/deps/librdkafka/tests/0052-msg_timestamps.c +220 -0
  495. package/deps/librdkafka/tests/0053-stats_cb.cpp +535 -0
  496. package/deps/librdkafka/tests/0054-offset_time.cpp +236 -0
  497. package/deps/librdkafka/tests/0055-producer_latency.c +366 -0
  498. package/deps/librdkafka/tests/0056-balanced_group_mt.c +311 -0
  499. package/deps/librdkafka/tests/0057-invalid_topic.cpp +112 -0
  500. package/deps/librdkafka/tests/0058-log.cpp +123 -0
  501. package/deps/librdkafka/tests/0059-bsearch.cpp +237 -0
  502. package/deps/librdkafka/tests/0060-op_prio.cpp +163 -0
  503. package/deps/librdkafka/tests/0061-consumer_lag.cpp +275 -0
  504. package/deps/librdkafka/tests/0062-stats_event.c +126 -0
  505. package/deps/librdkafka/tests/0063-clusterid.cpp +180 -0
  506. package/deps/librdkafka/tests/0064-interceptors.c +481 -0
  507. package/deps/librdkafka/tests/0065-yield.cpp +140 -0
  508. package/deps/librdkafka/tests/0066-plugins.cpp +129 -0
  509. package/deps/librdkafka/tests/0067-empty_topic.cpp +148 -0
  510. package/deps/librdkafka/tests/0068-produce_timeout.c +138 -0
  511. package/deps/librdkafka/tests/0069-consumer_add_parts.c +123 -0
  512. package/deps/librdkafka/tests/0070-null_empty.cpp +197 -0
  513. package/deps/librdkafka/tests/0072-headers_ut.c +448 -0
  514. package/deps/librdkafka/tests/0073-headers.c +381 -0
  515. package/deps/librdkafka/tests/0074-producev.c +87 -0
  516. package/deps/librdkafka/tests/0075-retry.c +253 -0
  517. package/deps/librdkafka/tests/0076-produce_retry.c +450 -0
  518. package/deps/librdkafka/tests/0077-compaction.c +357 -0
  519. package/deps/librdkafka/tests/0078-c_from_cpp.cpp +96 -0
  520. package/deps/librdkafka/tests/0079-fork.c +93 -0
  521. package/deps/librdkafka/tests/0080-admin_ut.c +3065 -0
  522. package/deps/librdkafka/tests/0081-admin.c +5333 -0
  523. package/deps/librdkafka/tests/0082-fetch_max_bytes.cpp +133 -0
  524. package/deps/librdkafka/tests/0083-cb_event.c +228 -0
  525. package/deps/librdkafka/tests/0084-destroy_flags.c +212 -0
  526. package/deps/librdkafka/tests/0085-headers.cpp +388 -0
  527. package/deps/librdkafka/tests/0086-purge.c +335 -0
  528. package/deps/librdkafka/tests/0088-produce_metadata_timeout.c +162 -0
  529. package/deps/librdkafka/tests/0089-max_poll_interval.c +506 -0
  530. package/deps/librdkafka/tests/0090-idempotence.c +172 -0
  531. package/deps/librdkafka/tests/0091-max_poll_interval_timeout.c +297 -0
  532. package/deps/librdkafka/tests/0092-mixed_msgver.c +97 -0
  533. package/deps/librdkafka/tests/0093-holb.c +197 -0
  534. package/deps/librdkafka/tests/0094-idempotence_msg_timeout.c +230 -0
  535. package/deps/librdkafka/tests/0095-all_brokers_down.cpp +122 -0
  536. package/deps/librdkafka/tests/0097-ssl_verify.cpp +466 -0
  537. package/deps/librdkafka/tests/0098-consumer-txn.cpp +1218 -0
  538. package/deps/librdkafka/tests/0099-commit_metadata.c +194 -0
  539. package/deps/librdkafka/tests/0100-thread_interceptors.cpp +195 -0
  540. package/deps/librdkafka/tests/0101-fetch-from-follower.cpp +446 -0
  541. package/deps/librdkafka/tests/0102-static_group_rebalance.c +535 -0
  542. package/deps/librdkafka/tests/0103-transactions.c +1383 -0
  543. package/deps/librdkafka/tests/0104-fetch_from_follower_mock.c +624 -0
  544. package/deps/librdkafka/tests/0105-transactions_mock.c +3923 -0
  545. package/deps/librdkafka/tests/0106-cgrp_sess_timeout.c +297 -0
  546. package/deps/librdkafka/tests/0107-topic_recreate.c +259 -0
  547. package/deps/librdkafka/tests/0109-auto_create_topics.cpp +218 -0
  548. package/deps/librdkafka/tests/0110-batch_size.cpp +183 -0
  549. package/deps/librdkafka/tests/0111-delay_create_topics.cpp +127 -0
  550. package/deps/librdkafka/tests/0112-assign_unknown_part.c +98 -0
  551. package/deps/librdkafka/tests/0113-cooperative_rebalance.cpp +3329 -0
  552. package/deps/librdkafka/tests/0114-sticky_partitioning.cpp +176 -0
  553. package/deps/librdkafka/tests/0115-producer_auth.cpp +179 -0
  554. package/deps/librdkafka/tests/0116-kafkaconsumer_close.cpp +214 -0
  555. package/deps/librdkafka/tests/0117-mock_errors.c +321 -0
  556. package/deps/librdkafka/tests/0118-commit_rebalance.c +121 -0
  557. package/deps/librdkafka/tests/0119-consumer_auth.cpp +148 -0
  558. package/deps/librdkafka/tests/0120-asymmetric_subscription.c +180 -0
  559. package/deps/librdkafka/tests/0121-clusterid.c +115 -0
  560. package/deps/librdkafka/tests/0122-buffer_cleaning_after_rebalance.c +227 -0
  561. package/deps/librdkafka/tests/0123-connections_max_idle.c +98 -0
  562. package/deps/librdkafka/tests/0124-openssl_invalid_engine.c +69 -0
  563. package/deps/librdkafka/tests/0125-immediate_flush.c +144 -0
  564. package/deps/librdkafka/tests/0126-oauthbearer_oidc.c +213 -0
  565. package/deps/librdkafka/tests/0127-fetch_queue_backoff.cpp +165 -0
  566. package/deps/librdkafka/tests/0128-sasl_callback_queue.cpp +125 -0
  567. package/deps/librdkafka/tests/0129-fetch_aborted_msgs.c +78 -0
  568. package/deps/librdkafka/tests/0130-store_offsets.c +178 -0
  569. package/deps/librdkafka/tests/0131-connect_timeout.c +81 -0
  570. package/deps/librdkafka/tests/0132-strategy_ordering.c +171 -0
  571. package/deps/librdkafka/tests/0133-ssl_keys.c +128 -0
  572. package/deps/librdkafka/tests/0134-ssl_provider.c +92 -0
  573. package/deps/librdkafka/tests/0135-sasl_credentials.cpp +143 -0
  574. package/deps/librdkafka/tests/0136-resolve_cb.c +181 -0
  575. package/deps/librdkafka/tests/0137-barrier_batch_consume.c +609 -0
  576. package/deps/librdkafka/tests/0138-admin_mock.c +281 -0
  577. package/deps/librdkafka/tests/0139-offset_validation_mock.c +442 -0
  578. package/deps/librdkafka/tests/0140-commit_metadata.cpp +108 -0
  579. package/deps/librdkafka/tests/0142-reauthentication.c +495 -0
  580. package/deps/librdkafka/tests/0143-exponential_backoff_mock.c +553 -0
  581. package/deps/librdkafka/tests/0144-idempotence_mock.c +373 -0
  582. package/deps/librdkafka/tests/0145-pause_resume_mock.c +119 -0
  583. package/deps/librdkafka/tests/0146-metadata_mock.c +444 -0
  584. package/deps/librdkafka/tests/0150-telemetry_mock.c +648 -0
  585. package/deps/librdkafka/tests/1000-unktopic.c +164 -0
  586. package/deps/librdkafka/tests/8000-idle.cpp +60 -0
  587. package/deps/librdkafka/tests/8001-fetch_from_follower_mock_manual.c +113 -0
  588. package/deps/librdkafka/tests/CMakeLists.txt +164 -0
  589. package/deps/librdkafka/tests/LibrdkafkaTestApp.py +266 -0
  590. package/deps/librdkafka/tests/Makefile +182 -0
  591. package/deps/librdkafka/tests/README.md +509 -0
  592. package/deps/librdkafka/tests/autotest.sh +33 -0
  593. package/deps/librdkafka/tests/backtrace.gdb +30 -0
  594. package/deps/librdkafka/tests/broker_version_tests.py +315 -0
  595. package/deps/librdkafka/tests/buildbox.sh +17 -0
  596. package/deps/librdkafka/tests/cleanup-checker-tests.sh +20 -0
  597. package/deps/librdkafka/tests/cluster_testing.py +191 -0
  598. package/deps/librdkafka/tests/delete-test-topics.sh +56 -0
  599. package/deps/librdkafka/tests/fixtures/ssl/Makefile +8 -0
  600. package/deps/librdkafka/tests/fixtures/ssl/README.md +13 -0
  601. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.p12 +0 -0
  602. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.pem +109 -0
  603. package/deps/librdkafka/tests/fixtures/ssl/client2.key +34 -0
  604. package/deps/librdkafka/tests/fixtures/ssl/create_keys.sh +93 -0
  605. package/deps/librdkafka/tests/fuzzers/Makefile +12 -0
  606. package/deps/librdkafka/tests/fuzzers/README.md +31 -0
  607. package/deps/librdkafka/tests/fuzzers/fuzz_regex.c +74 -0
  608. package/deps/librdkafka/tests/fuzzers/helpers.h +90 -0
  609. package/deps/librdkafka/tests/gen-ssl-certs.sh +165 -0
  610. package/deps/librdkafka/tests/interactive_broker_version.py +170 -0
  611. package/deps/librdkafka/tests/interceptor_test/CMakeLists.txt +16 -0
  612. package/deps/librdkafka/tests/interceptor_test/Makefile +22 -0
  613. package/deps/librdkafka/tests/interceptor_test/interceptor_test.c +314 -0
  614. package/deps/librdkafka/tests/interceptor_test/interceptor_test.h +54 -0
  615. package/deps/librdkafka/tests/java/IncrementalRebalanceCli.java +97 -0
  616. package/deps/librdkafka/tests/java/Makefile +12 -0
  617. package/deps/librdkafka/tests/java/Murmur2Cli.java +46 -0
  618. package/deps/librdkafka/tests/java/README.md +14 -0
  619. package/deps/librdkafka/tests/java/TransactionProducerCli.java +162 -0
  620. package/deps/librdkafka/tests/java/run-class.sh +11 -0
  621. package/deps/librdkafka/tests/librdkafka.suppressions +483 -0
  622. package/deps/librdkafka/tests/lz4_manual_test.sh +59 -0
  623. package/deps/librdkafka/tests/multi-broker-version-test.sh +50 -0
  624. package/deps/librdkafka/tests/parse-refcnt.sh +43 -0
  625. package/deps/librdkafka/tests/performance_plot.py +115 -0
  626. package/deps/librdkafka/tests/plugin_test/Makefile +19 -0
  627. package/deps/librdkafka/tests/plugin_test/plugin_test.c +58 -0
  628. package/deps/librdkafka/tests/requirements.txt +2 -0
  629. package/deps/librdkafka/tests/run-consumer-tests.sh +16 -0
  630. package/deps/librdkafka/tests/run-producer-tests.sh +16 -0
  631. package/deps/librdkafka/tests/run-test.sh +140 -0
  632. package/deps/librdkafka/tests/rusage.c +249 -0
  633. package/deps/librdkafka/tests/sasl_test.py +289 -0
  634. package/deps/librdkafka/tests/scenarios/README.md +6 -0
  635. package/deps/librdkafka/tests/scenarios/ak23.json +6 -0
  636. package/deps/librdkafka/tests/scenarios/default.json +5 -0
  637. package/deps/librdkafka/tests/scenarios/noautocreate.json +5 -0
  638. package/deps/librdkafka/tests/sockem.c +801 -0
  639. package/deps/librdkafka/tests/sockem.h +85 -0
  640. package/deps/librdkafka/tests/sockem_ctrl.c +145 -0
  641. package/deps/librdkafka/tests/sockem_ctrl.h +61 -0
  642. package/deps/librdkafka/tests/test.c +7318 -0
  643. package/deps/librdkafka/tests/test.conf.example +27 -0
  644. package/deps/librdkafka/tests/test.h +979 -0
  645. package/deps/librdkafka/tests/testcpp.cpp +126 -0
  646. package/deps/librdkafka/tests/testcpp.h +360 -0
  647. package/deps/librdkafka/tests/testshared.h +402 -0
  648. package/deps/librdkafka/tests/tools/README.md +4 -0
  649. package/deps/librdkafka/tests/tools/stats/README.md +21 -0
  650. package/deps/librdkafka/tests/tools/stats/filter.jq +42 -0
  651. package/deps/librdkafka/tests/tools/stats/graph.py +150 -0
  652. package/deps/librdkafka/tests/tools/stats/requirements.txt +3 -0
  653. package/deps/librdkafka/tests/tools/stats/to_csv.py +124 -0
  654. package/deps/librdkafka/tests/until-fail.sh +87 -0
  655. package/deps/librdkafka/tests/xxxx-assign_partition.c +122 -0
  656. package/deps/librdkafka/tests/xxxx-metadata.cpp +159 -0
  657. package/deps/librdkafka/vcpkg.json +23 -0
  658. package/deps/librdkafka/win32/README.md +5 -0
  659. package/deps/librdkafka/win32/build-package.bat +3 -0
  660. package/deps/librdkafka/win32/build.bat +19 -0
  661. package/deps/librdkafka/win32/common.vcxproj +84 -0
  662. package/deps/librdkafka/win32/install-openssl.ps1 +33 -0
  663. package/deps/librdkafka/win32/interceptor_test/interceptor_test.vcxproj +87 -0
  664. package/deps/librdkafka/win32/librdkafka.autopkg.template +54 -0
  665. package/deps/librdkafka/win32/librdkafka.master.testing.targets +13 -0
  666. package/deps/librdkafka/win32/librdkafka.sln +226 -0
  667. package/deps/librdkafka/win32/librdkafka.vcxproj +276 -0
  668. package/deps/librdkafka/win32/librdkafkacpp/librdkafkacpp.vcxproj +104 -0
  669. package/deps/librdkafka/win32/msbuild.ps1 +15 -0
  670. package/deps/librdkafka/win32/openssl_engine_example/openssl_engine_example.vcxproj +132 -0
  671. package/deps/librdkafka/win32/package-zip.ps1 +46 -0
  672. package/deps/librdkafka/win32/packages/repositories.config +4 -0
  673. package/deps/librdkafka/win32/push-package.bat +4 -0
  674. package/deps/librdkafka/win32/rdkafka_complex_consumer_example_cpp/rdkafka_complex_consumer_example_cpp.vcxproj +67 -0
  675. package/deps/librdkafka/win32/rdkafka_example/rdkafka_example.vcxproj +97 -0
  676. package/deps/librdkafka/win32/rdkafka_performance/rdkafka_performance.vcxproj +97 -0
  677. package/deps/librdkafka/win32/setup-msys2.ps1 +31 -0
  678. package/deps/librdkafka/win32/setup-vcpkg.ps1 +12 -0
  679. package/deps/librdkafka/win32/tests/test.conf.example +25 -0
  680. package/deps/librdkafka/win32/tests/tests.vcxproj +247 -0
  681. package/deps/librdkafka/win32/win_ssl_cert_store/win_ssl_cert_store.vcxproj +132 -0
  682. package/deps/librdkafka/win32/wingetopt.c +564 -0
  683. package/deps/librdkafka/win32/wingetopt.h +100 -0
  684. package/deps/librdkafka/win32/wintime.h +33 -0
  685. package/deps/librdkafka.gyp +62 -0
  686. package/deps/windows-install.py +73 -0
  687. package/docker-compose.yml +23 -0
  688. package/e2e/admin.spec.js +187 -0
  689. package/e2e/both.spec.js +726 -0
  690. package/e2e/consumer.spec.js +386 -0
  691. package/e2e/groups.spec.js +132 -0
  692. package/e2e/listener.js +51 -0
  693. package/e2e/producer-transaction.spec.js +333 -0
  694. package/e2e/producer.spec.js +283 -0
  695. package/errors.d.ts +347 -0
  696. package/examples/consumer-flow.md +76 -0
  697. package/examples/consumer.md +45 -0
  698. package/examples/docker-alpine.md +30 -0
  699. package/examples/high-level-producer.md +32 -0
  700. package/examples/metadata.md +27 -0
  701. package/examples/oauthbearer-default-flow.md +80 -0
  702. package/examples/producer-cluster.md +103 -0
  703. package/examples/producer.md +73 -0
  704. package/index.d.ts +357 -0
  705. package/lib/admin.js +233 -0
  706. package/lib/client.js +578 -0
  707. package/lib/error.js +472 -0
  708. package/lib/index.js +34 -0
  709. package/lib/kafka-consumer-stream.js +397 -0
  710. package/lib/kafka-consumer.js +698 -0
  711. package/lib/producer/high-level-producer.js +323 -0
  712. package/lib/producer-stream.js +307 -0
  713. package/lib/producer.js +375 -0
  714. package/lib/tools/ref-counter.js +52 -0
  715. package/lib/topic-partition.js +88 -0
  716. package/lib/topic.js +42 -0
  717. package/lib/util.js +29 -0
  718. package/librdkafka.js +12 -0
  719. package/make_docs.sh +59 -0
  720. package/package.json +53 -0
  721. package/renovate.json +30 -0
  722. package/run_docker.sh +42 -0
  723. package/src/admin.cc +624 -0
  724. package/src/admin.h +78 -0
  725. package/src/binding.cc +73 -0
  726. package/src/binding.h +25 -0
  727. package/src/callbacks.cc +614 -0
  728. package/src/callbacks.h +265 -0
  729. package/src/common.cc +582 -0
  730. package/src/common.h +134 -0
  731. package/src/config.cc +167 -0
  732. package/src/config.h +45 -0
  733. package/src/connection.cc +482 -0
  734. package/src/connection.h +108 -0
  735. package/src/errors.cc +96 -0
  736. package/src/errors.h +53 -0
  737. package/src/kafka-consumer.cc +1457 -0
  738. package/src/kafka-consumer.h +136 -0
  739. package/src/per-isolate-data.cc +57 -0
  740. package/src/per-isolate-data.h +39 -0
  741. package/src/producer.cc +873 -0
  742. package/src/producer.h +125 -0
  743. package/src/topic.cc +180 -0
  744. package/src/topic.h +56 -0
  745. package/src/workers.cc +1245 -0
  746. package/src/workers.h +511 -0
  747. package/test/binding.spec.js +66 -0
  748. package/test/consumer.spec.js +91 -0
  749. package/test/error.spec.js +8 -0
  750. package/test/index.spec.js +8 -0
  751. package/test/kafka-consumer-stream.spec.js +298 -0
  752. package/test/kafka-consumer-worker.js +51 -0
  753. package/test/kafka-consumer.spec.js +86 -0
  754. package/test/mocha.opts +1 -0
  755. package/test/mock.js +55 -0
  756. package/test/producer/high-level-producer.spec.js +496 -0
  757. package/test/producer-stream.spec.js +723 -0
  758. package/test/producer-worker.js +53 -0
  759. package/test/producer.spec.js +120 -0
  760. package/test/tools/ref-counter.spec.js +53 -0
  761. package/test/topic-partition.spec.js +104 -0
  762. package/test/util.spec.js +46 -0
  763. package/util/configure.js +30 -0
  764. package/util/get-env.js +6 -0
  765. package/util/test-compile.js +11 -0
  766. package/util/test-producer-delivery.js +100 -0
  767. package/win_install.ps1 +2 -0
@@ -0,0 +1,977 @@
1
+ /*
2
+ * librdkafka - Apache Kafka C library
3
+ *
4
+ * Copyright (c) 2012-2022, Magnus Edenhill
5
+ * 2023, Confluent Inc.
6
+ * All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions are met:
10
+ *
11
+ * 1. Redistributions of source code must retain the above copyright notice,
12
+ * this list of conditions and the following disclaimer.
13
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
14
+ * this list of conditions and the following disclaimer in the documentation
15
+ * and/or other materials provided with the distribution.
16
+ *
17
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
+ * POSSIBILITY OF SUCH DAMAGE.
28
+ */
29
+
30
+
31
+ #include "rd.h"
32
+ #include "rdkafka_int.h"
33
+ #include "rdkafka_topic.h"
34
+ #include "rdkafka_broker.h"
35
+ #include "rdkafka_request.h"
36
+ #include "rdkafka_metadata.h"
37
+
38
+ #include <string.h>
39
+ /**
40
+ * @{
41
+ *
42
+ * @brief Metadata cache
43
+ *
44
+ * The metadata cache consists of cached topic metadata as
45
+ * retrieved from the cluster using MetadataRequest.
46
+ *
47
+ * The topic cache entries are made up \c struct rd_kafka_metadata_cache_entry
48
+ * each containing the topic name, a copy of the topic's metadata
49
+ * and a cache expiry time.
50
+ *
51
+ * On update any previous entry for the topic are removed and replaced
52
+ * with a new entry.
53
+ *
54
+ * The cache is also populated when the topic metadata is being requested
55
+ * for specific topics, this will not interfere with existing cache entries
56
+ * for topics, but for any topics not currently in the cache a new
57
+ * entry will be added with a flag (RD_KAFKA_METADATA_CACHE_VALID(rkmce))
58
+ * indicating that the entry is waiting to be populated by the MetadataResponse.
59
+ * Two special error codes are used for this purpose:
60
+ * RD_KAFKA_RESP_ERR__NOENT - to indicate that a topic needs to be queried,
61
+ * RD_KAFKA_RESP_ERR__WAIT_CACHE - to indicate that a topic is being queried
62
+ * and there is no need to re-query it prior
63
+ * to the current query finishing.
64
+ *
65
+ * The cache is locked in its entirety with rd_kafka_wr/rdlock() by the caller
66
+ * and the returned cache entry must only be accessed during the duration
67
+ * of the lock.
68
+ *
69
+ */
70
+
71
+
72
+
73
+ /**
74
+ * @brief Remove and free cache entry.
75
+ *
76
+ * @remark The expiry timer is not updated, for simplicity.
77
+ * @locks rd_kafka_wrlock()
78
+ */
79
+ static RD_INLINE void
80
+ rd_kafka_metadata_cache_delete(rd_kafka_t *rk,
81
+ struct rd_kafka_metadata_cache_entry *rkmce,
82
+ int unlink_avl) {
83
+ if (unlink_avl) {
84
+ RD_AVL_REMOVE_ELM(&rk->rk_metadata_cache.rkmc_avl, rkmce);
85
+ if (!RD_KAFKA_UUID_IS_ZERO(
86
+ rkmce->rkmce_metadata_internal_topic.topic_id)) {
87
+ RD_AVL_REMOVE_ELM(&rk->rk_metadata_cache.rkmc_avl_by_id,
88
+ rkmce);
89
+ }
90
+ }
91
+ TAILQ_REMOVE(&rk->rk_metadata_cache.rkmc_expiry, rkmce, rkmce_link);
92
+ rd_kafka_assert(NULL, rk->rk_metadata_cache.rkmc_cnt > 0);
93
+ rk->rk_metadata_cache.rkmc_cnt--;
94
+
95
+ rd_free(rkmce);
96
+ }
97
+
98
+ /**
99
+ * @brief Delete cache entry by topic name
100
+ * @locks rd_kafka_wrlock()
101
+ * @returns 1 if entry was found and removed, else 0.
102
+ */
103
+ int rd_kafka_metadata_cache_delete_by_name(rd_kafka_t *rk, const char *topic) {
104
+ struct rd_kafka_metadata_cache_entry *rkmce;
105
+
106
+ rkmce = rd_kafka_metadata_cache_find(rk, topic, 1);
107
+ if (rkmce)
108
+ rd_kafka_metadata_cache_delete(rk, rkmce, 1);
109
+ return rkmce ? 1 : 0;
110
+ }
111
+
112
+ /**
113
+ * @brief Delete cache entry by topic id
114
+ * @locks rd_kafka_wrlock()
115
+ * @returns 1 if entry was found and removed, else 0.
116
+ */
117
+ int rd_kafka_metadata_cache_delete_by_topic_id(rd_kafka_t *rk,
118
+ const rd_kafka_Uuid_t topic_id) {
119
+ struct rd_kafka_metadata_cache_entry *rkmce;
120
+
121
+ rkmce = rd_kafka_metadata_cache_find_by_id(rk, topic_id, 1);
122
+ if (rkmce)
123
+ rd_kafka_metadata_cache_delete(rk, rkmce, 1);
124
+ return rkmce ? 1 : 0;
125
+ }
126
+
127
+ static int rd_kafka_metadata_cache_evict(rd_kafka_t *rk);
128
+
129
+ /**
130
+ * @brief Cache eviction timer callback.
131
+ * @locality rdkafka main thread
132
+ * @locks NOT rd_kafka_*lock()
133
+ */
134
+ static void rd_kafka_metadata_cache_evict_tmr_cb(rd_kafka_timers_t *rkts,
135
+ void *arg) {
136
+ rd_kafka_t *rk = arg;
137
+
138
+ rd_kafka_wrlock(rk);
139
+ rd_kafka_metadata_cache_evict(rk);
140
+ rd_kafka_wrunlock(rk);
141
+ }
142
+
143
+
144
+ /**
145
+ * @brief Evict timed out entries from cache and rearm timer for
146
+ * next expiry.
147
+ *
148
+ * @returns the number of entries evicted.
149
+ *
150
+ * @locks_required rd_kafka_wrlock()
151
+ */
152
+ static int rd_kafka_metadata_cache_evict(rd_kafka_t *rk) {
153
+ int cnt = 0;
154
+ rd_ts_t now = rd_clock();
155
+ struct rd_kafka_metadata_cache_entry *rkmce;
156
+
157
+ while ((rkmce = TAILQ_FIRST(&rk->rk_metadata_cache.rkmc_expiry)) &&
158
+ rkmce->rkmce_ts_expires <= now) {
159
+ rd_kafka_metadata_cache_delete(rk, rkmce, 1);
160
+ cnt++;
161
+ }
162
+
163
+ if (rkmce)
164
+ rd_kafka_timer_start(&rk->rk_timers,
165
+ &rk->rk_metadata_cache.rkmc_expiry_tmr,
166
+ rkmce->rkmce_ts_expires - now,
167
+ rd_kafka_metadata_cache_evict_tmr_cb, rk);
168
+ else
169
+ rd_kafka_timer_stop(&rk->rk_timers,
170
+ &rk->rk_metadata_cache.rkmc_expiry_tmr, 1);
171
+
172
+ rd_kafka_dbg(rk, METADATA, "METADATA",
173
+ "Expired %d entries from metadata cache "
174
+ "(%d entries remain)",
175
+ cnt, rk->rk_metadata_cache.rkmc_cnt);
176
+
177
+ if (cnt)
178
+ rd_kafka_metadata_cache_propagate_changes(rk);
179
+
180
+ return cnt;
181
+ }
182
+
183
+
184
+ /**
185
+ * @brief Remove all cache hints,.
186
+ * This is done when the Metadata response has been parsed and
187
+ * replaced hints with existing topic information, thus this will
188
+ * only remove unmatched topics from the cache.
189
+ *
190
+ * @returns the number of purged hints
191
+ *
192
+ * @locks_required rd_kafka_wrlock()
193
+ */
194
+ int rd_kafka_metadata_cache_purge_all_hints(rd_kafka_t *rk) {
195
+ int cnt = 0;
196
+ struct rd_kafka_metadata_cache_entry *rkmce, *tmp;
197
+
198
+ TAILQ_FOREACH_SAFE(rkmce, &rk->rk_metadata_cache.rkmc_expiry,
199
+ rkmce_link, tmp) {
200
+ if (!RD_KAFKA_METADATA_CACHE_VALID(rkmce)) {
201
+ rd_kafka_metadata_cache_delete(rk, rkmce, 1);
202
+ cnt++;
203
+ }
204
+ }
205
+
206
+ return cnt;
207
+ }
208
+
209
+
210
+ /**
211
+ * @brief Find cache entry by topic name
212
+ *
213
+ * @param valid: entry must be valid (not hint)
214
+ *
215
+ * @locks rd_kafka_*lock()
216
+ */
217
+ struct rd_kafka_metadata_cache_entry *
218
+ rd_kafka_metadata_cache_find(rd_kafka_t *rk, const char *topic, int valid) {
219
+ struct rd_kafka_metadata_cache_entry skel, *rkmce;
220
+ skel.rkmce_mtopic.topic = (char *)topic;
221
+ rkmce = RD_AVL_FIND(&rk->rk_metadata_cache.rkmc_avl, &skel);
222
+ if (rkmce && (!valid || RD_KAFKA_METADATA_CACHE_VALID(rkmce)))
223
+ return rkmce;
224
+ return NULL;
225
+ }
226
+
227
+ /**
228
+ * @brief Find cache entry by topic id
229
+ *
230
+ * @param valid: entry must be valid (not hint)
231
+ *
232
+ * @locks rd_kafka_*lock()
233
+ */
234
+ struct rd_kafka_metadata_cache_entry *
235
+ rd_kafka_metadata_cache_find_by_id(rd_kafka_t *rk,
236
+ const rd_kafka_Uuid_t topic_id,
237
+ int valid) {
238
+ struct rd_kafka_metadata_cache_entry skel, *rkmce;
239
+ skel.rkmce_metadata_internal_topic.topic_id = topic_id;
240
+ rkmce = RD_AVL_FIND(&rk->rk_metadata_cache.rkmc_avl_by_id, &skel);
241
+ if (rkmce && (!valid || RD_KAFKA_METADATA_CACHE_VALID(rkmce)))
242
+ return rkmce;
243
+ return NULL;
244
+ }
245
+
246
+
247
+ /**
248
+ * @brief Partition (id) comparator
249
+ */
250
+ int rd_kafka_metadata_partition_id_cmp(const void *_a, const void *_b) {
251
+ const rd_kafka_metadata_partition_t *a = _a, *b = _b;
252
+ return RD_CMP(a->id, b->id);
253
+ }
254
+
255
+
256
+ /**
257
+ * @brief Add (and replace) cache entry for topic.
258
+ *
259
+ * This makes a copy of \p topic
260
+ *
261
+ * @locks_required rd_kafka_wrlock()
262
+ */
263
+ static struct rd_kafka_metadata_cache_entry *rd_kafka_metadata_cache_insert(
264
+ rd_kafka_t *rk,
265
+ const rd_kafka_metadata_topic_t *mtopic,
266
+ const rd_kafka_metadata_topic_internal_t *metadata_internal_topic,
267
+ rd_ts_t now,
268
+ rd_ts_t ts_expires,
269
+ rd_bool_t include_racks,
270
+ rd_kafka_metadata_broker_internal_t *brokers_internal,
271
+ size_t broker_cnt) {
272
+ struct rd_kafka_metadata_cache_entry *rkmce, *old, *old_by_id = NULL;
273
+ rd_tmpabuf_t tbuf;
274
+ int i;
275
+
276
+ /* Metadata is stored in one contigious buffer where structs and
277
+ * and pointed-to fields are layed out in a memory aligned fashion.
278
+ * rd_tmpabuf_t provides the infrastructure to do this.
279
+ * Because of this we copy all the structs verbatim but
280
+ * any pointer fields needs to be copied explicitly to update
281
+ * the pointer address.
282
+ * See also rd_kafka_metadata_cache_delete which frees this. */
283
+ rd_tmpabuf_new(&tbuf, 0, rd_true /*assert on fail*/);
284
+
285
+ rd_tmpabuf_add_alloc(&tbuf, sizeof(*rkmce));
286
+ rd_tmpabuf_add_alloc(&tbuf, strlen(mtopic->topic) + 1);
287
+ rd_tmpabuf_add_alloc(&tbuf, mtopic->partition_cnt *
288
+ sizeof(*mtopic->partitions));
289
+ rd_tmpabuf_add_alloc(&tbuf,
290
+ mtopic->partition_cnt *
291
+ sizeof(*metadata_internal_topic->partitions));
292
+
293
+ for (i = 0; include_racks && i < mtopic->partition_cnt; i++) {
294
+ size_t j;
295
+ rd_tmpabuf_add_alloc(
296
+ &tbuf, metadata_internal_topic->partitions[i].racks_cnt *
297
+ sizeof(char *));
298
+ for (j = 0;
299
+ j < metadata_internal_topic->partitions[i].racks_cnt;
300
+ j++) {
301
+ rd_tmpabuf_add_alloc(
302
+ &tbuf, strlen(metadata_internal_topic->partitions[i]
303
+ .racks[j]) +
304
+ 1);
305
+ }
306
+ }
307
+
308
+ rd_tmpabuf_finalize(&tbuf);
309
+
310
+ rkmce = rd_tmpabuf_alloc(&tbuf, sizeof(*rkmce));
311
+
312
+ rkmce->rkmce_mtopic = *mtopic;
313
+
314
+ rkmce->rkmce_metadata_internal_topic = *metadata_internal_topic;
315
+
316
+ /* Copy topic name and update pointer */
317
+ rkmce->rkmce_mtopic.topic = rd_tmpabuf_write_str(&tbuf, mtopic->topic);
318
+
319
+ /* Copy partition array and update pointer */
320
+ rkmce->rkmce_mtopic.partitions = rd_tmpabuf_write(
321
+ &tbuf, mtopic->partitions,
322
+ mtopic->partition_cnt * sizeof(*mtopic->partitions));
323
+
324
+ /* Copy partition array (internal) and update pointer */
325
+ rkmce->rkmce_metadata_internal_topic.partitions =
326
+ rd_tmpabuf_write(&tbuf, metadata_internal_topic->partitions,
327
+ mtopic->partition_cnt *
328
+ sizeof(*metadata_internal_topic->partitions));
329
+
330
+
331
+ /* Sort partitions for future bsearch() lookups. */
332
+ qsort(rkmce->rkmce_mtopic.partitions, rkmce->rkmce_mtopic.partition_cnt,
333
+ sizeof(*rkmce->rkmce_mtopic.partitions),
334
+ rd_kafka_metadata_partition_id_cmp);
335
+
336
+ /* partitions (internal) are already sorted. */
337
+
338
+ if (include_racks) {
339
+ for (i = 0; i < rkmce->rkmce_mtopic.partition_cnt; i++) {
340
+ size_t j;
341
+ rd_kafka_metadata_partition_t *mdp =
342
+ &rkmce->rkmce_mtopic.partitions[i];
343
+ rd_kafka_metadata_partition_internal_t *mdpi =
344
+ &rkmce->rkmce_metadata_internal_topic.partitions[i];
345
+ rd_kafka_metadata_partition_internal_t *mdpi_orig =
346
+ &metadata_internal_topic->partitions[i];
347
+
348
+ if (mdp->replica_cnt == 0 || mdpi->racks_cnt == 0)
349
+ continue;
350
+
351
+ mdpi->racks = rd_tmpabuf_alloc(
352
+ &tbuf, sizeof(char *) * mdpi->racks_cnt);
353
+ for (j = 0; j < mdpi_orig->racks_cnt; j++)
354
+ mdpi->racks[j] = rd_tmpabuf_write_str(
355
+ &tbuf, mdpi_orig->racks[j]);
356
+ }
357
+ }
358
+
359
+ /* Clear uncached fields. */
360
+ for (i = 0; i < mtopic->partition_cnt; i++) {
361
+ rkmce->rkmce_mtopic.partitions[i].replicas = NULL;
362
+ rkmce->rkmce_mtopic.partitions[i].replica_cnt = 0;
363
+ rkmce->rkmce_mtopic.partitions[i].isrs = NULL;
364
+ rkmce->rkmce_mtopic.partitions[i].isr_cnt = 0;
365
+ }
366
+ TAILQ_INSERT_TAIL(&rk->rk_metadata_cache.rkmc_expiry, rkmce,
367
+ rkmce_link);
368
+ rk->rk_metadata_cache.rkmc_cnt++;
369
+ rkmce->rkmce_ts_expires = ts_expires;
370
+ rkmce->rkmce_ts_insert = now;
371
+
372
+ /* Insert (and replace existing) entry. */
373
+ old = RD_AVL_INSERT(&rk->rk_metadata_cache.rkmc_avl, rkmce,
374
+ rkmce_avlnode);
375
+ /* Insert (and replace existing) entry into the AVL tree sorted
376
+ * by topic id. */
377
+ if (!RD_KAFKA_UUID_IS_ZERO(
378
+ rkmce->rkmce_metadata_internal_topic.topic_id)) {
379
+ /* If topic id isn't zero insert cache entry into this tree */
380
+ old_by_id = RD_AVL_INSERT(&rk->rk_metadata_cache.rkmc_avl_by_id,
381
+ rkmce, rkmce_avlnode_by_id);
382
+ } else if (old && !RD_KAFKA_UUID_IS_ZERO(
383
+ old->rkmce_metadata_internal_topic.topic_id)) {
384
+ /* If it had a topic id, remove it from the tree */
385
+ RD_AVL_REMOVE_ELM(&rk->rk_metadata_cache.rkmc_avl_by_id, old);
386
+ }
387
+ if (old) {
388
+ /* Delete and free old cache entry */
389
+ rd_kafka_metadata_cache_delete(rk, old, 0);
390
+ }
391
+ if (old_by_id && old_by_id != old) {
392
+ /* If there was a different cache entry in this tree,
393
+ * remove and free it. */
394
+ RD_AVL_REMOVE_ELM(&rk->rk_metadata_cache.rkmc_avl, old_by_id);
395
+ rd_kafka_metadata_cache_delete(rk, old_by_id, 0);
396
+ }
397
+
398
+ /* Explicitly not freeing the tmpabuf since rkmce points to its
399
+ * memory. */
400
+ return rkmce;
401
+ }
402
+
403
+
404
+ /**
405
+ * @brief Purge the metadata cache
406
+ *
407
+ * @locks_required rd_kafka_wrlock()
408
+ */
409
+ void rd_kafka_metadata_cache_purge(rd_kafka_t *rk, rd_bool_t purge_observers) {
410
+ struct rd_kafka_metadata_cache_entry *rkmce;
411
+ int was_empty = TAILQ_EMPTY(&rk->rk_metadata_cache.rkmc_expiry);
412
+
413
+ while ((rkmce = TAILQ_FIRST(&rk->rk_metadata_cache.rkmc_expiry)))
414
+ rd_kafka_metadata_cache_delete(rk, rkmce, 1);
415
+
416
+ rd_kafka_timer_stop(&rk->rk_timers,
417
+ &rk->rk_metadata_cache.rkmc_expiry_tmr, 1);
418
+
419
+ if (!was_empty)
420
+ rd_kafka_metadata_cache_propagate_changes(rk);
421
+
422
+ if (purge_observers)
423
+ rd_list_clear(&rk->rk_metadata_cache.rkmc_observers);
424
+ }
425
+
426
+
427
+ /**
428
+ * @brief Start or update the cache expiry timer.
429
+ * Typically done after a series of cache_topic_update()
430
+ *
431
+ * @locks rd_kafka_wrlock()
432
+ */
433
+ void rd_kafka_metadata_cache_expiry_start(rd_kafka_t *rk) {
434
+ struct rd_kafka_metadata_cache_entry *rkmce;
435
+
436
+ if ((rkmce = TAILQ_FIRST(&rk->rk_metadata_cache.rkmc_expiry)))
437
+ rd_kafka_timer_start(&rk->rk_timers,
438
+ &rk->rk_metadata_cache.rkmc_expiry_tmr,
439
+ rkmce->rkmce_ts_expires - rd_clock(),
440
+ rd_kafka_metadata_cache_evict_tmr_cb, rk);
441
+ }
442
+
443
+ /**
444
+ * @brief Update the metadata cache for a single topic
445
+ * with the provided metadata.
446
+ *
447
+ * If the topic has a temporary error the existing entry is removed
448
+ * and no new entry is added, which avoids the topic to be
449
+ * suppressed in upcoming metadata requests because being in the cache.
450
+ * In other words: we want to re-query errored topics.
451
+ * If the broker reports ERR_UNKNOWN_TOPIC_OR_PART we add a negative cache
452
+ * entry with an low expiry time, this is so that client code (cgrp) knows
453
+ * the topic has been queried but did not exist, otherwise it would wait
454
+ * forever for the unknown topic to surface.
455
+ *
456
+ * For permanent errors (authorization failures), we keep
457
+ * the entry cached for metadata.max.age.ms.
458
+ *
459
+ * @param only_existing Update only existing metadata cache entries,
460
+ * either valid or hinted.
461
+ *
462
+ * @return 1 on metadata change, 0 when no change was applied
463
+ *
464
+ * @remark The cache expiry timer will not be updated/started,
465
+ * call rd_kafka_metadata_cache_expiry_start() instead.
466
+ *
467
+ * @locks rd_kafka_wrlock()
468
+ */
469
+ int rd_kafka_metadata_cache_topic_update(
470
+ rd_kafka_t *rk,
471
+ const rd_kafka_metadata_topic_t *mdt,
472
+ const rd_kafka_metadata_topic_internal_t *mdit,
473
+ rd_bool_t propagate,
474
+ rd_bool_t include_racks,
475
+ rd_kafka_metadata_broker_internal_t *brokers,
476
+ size_t broker_cnt,
477
+ rd_bool_t only_existing) {
478
+ struct rd_kafka_metadata_cache_entry *rkmce = NULL;
479
+ rd_ts_t now = rd_clock();
480
+ rd_ts_t ts_expires = now + (rk->rk_conf.metadata_max_age_ms * 1000);
481
+ int changed = 1;
482
+ if (only_existing) {
483
+ if (likely(mdt->topic != NULL)) {
484
+ rkmce = rd_kafka_metadata_cache_find(rk, mdt->topic, 0);
485
+ } else {
486
+ rkmce = rd_kafka_metadata_cache_find_by_id(
487
+ rk, mdit->topic_id, 1);
488
+ }
489
+ if (!rkmce)
490
+ return 0;
491
+ }
492
+
493
+ if (likely(mdt->topic != NULL)) {
494
+ /* Cache unknown topics for a short while (100ms) to allow the
495
+ * cgrp logic to find negative cache hits. */
496
+ if (mdt->err == RD_KAFKA_RESP_ERR_UNKNOWN_TOPIC_OR_PART)
497
+ ts_expires = RD_MIN(ts_expires, now + (100 * 1000));
498
+
499
+ if (!mdt->err ||
500
+ mdt->err == RD_KAFKA_RESP_ERR_TOPIC_AUTHORIZATION_FAILED ||
501
+ mdt->err == RD_KAFKA_RESP_ERR_UNKNOWN_TOPIC_OR_PART)
502
+ rd_kafka_metadata_cache_insert(
503
+ rk, mdt, mdit, now, ts_expires, include_racks,
504
+ brokers, broker_cnt);
505
+ else
506
+ changed = rd_kafka_metadata_cache_delete_by_name(
507
+ rk, mdt->topic);
508
+ } else {
509
+ /* Cache entry found but no topic name:
510
+ * delete it. */
511
+ changed = rd_kafka_metadata_cache_delete_by_topic_id(
512
+ rk, mdit->topic_id);
513
+ }
514
+
515
+ if (changed && propagate)
516
+ rd_kafka_metadata_cache_propagate_changes(rk);
517
+
518
+ return changed;
519
+ }
520
+
521
+
522
+ /**
523
+ * @brief Remove cache hints for topics in \p topics
524
+ * This is done when the Metadata response has been parsed and
525
+ * replaced hints with existing topic information, thus this will
526
+ * only remove unmatched topics from the cache.
527
+ *
528
+ * @locks rd_kafka_wrlock()
529
+ */
530
+ void rd_kafka_metadata_cache_purge_hints(rd_kafka_t *rk,
531
+ const rd_list_t *topics) {
532
+ const char *topic;
533
+ int i;
534
+ int cnt = 0;
535
+
536
+ RD_LIST_FOREACH(topic, topics, i) {
537
+ struct rd_kafka_metadata_cache_entry *rkmce;
538
+
539
+ if (!(rkmce =
540
+ rd_kafka_metadata_cache_find(rk, topic, 0 /*any*/)) ||
541
+ RD_KAFKA_METADATA_CACHE_VALID(rkmce))
542
+ continue;
543
+
544
+ rd_kafka_metadata_cache_delete(rk, rkmce, 1 /*unlink avl*/);
545
+ cnt++;
546
+ }
547
+
548
+ if (cnt > 0) {
549
+ rd_kafka_dbg(rk, METADATA, "METADATA",
550
+ "Purged %d/%d cached topic hint(s)", cnt,
551
+ rd_list_cnt(topics));
552
+ rd_kafka_metadata_cache_propagate_changes(rk);
553
+ }
554
+ }
555
+
556
+ /**
557
+ * @brief Remove cache hints for topic ids in \p topic_ids
558
+ * This is done when the Metadata response has been parsed and
559
+ * replaced hints with existing topic information, thus this will
560
+ * only remove unmatched topics from the cache.
561
+ *
562
+ * @locks rd_kafka_wrlock()
563
+ */
564
+ void rd_kafka_metadata_cache_purge_hints_by_id(rd_kafka_t *rk,
565
+ const rd_list_t *topic_ids) {
566
+ const rd_kafka_Uuid_t *topic_id;
567
+ int i;
568
+ int cnt = 0;
569
+
570
+ RD_LIST_FOREACH(topic_id, topic_ids, i) {
571
+ struct rd_kafka_metadata_cache_entry *rkmce;
572
+
573
+ if (!(rkmce = rd_kafka_metadata_cache_find_by_id(rk, *topic_id,
574
+ 0 /*any*/)) ||
575
+ RD_KAFKA_METADATA_CACHE_VALID(rkmce))
576
+ continue;
577
+
578
+ rd_kafka_metadata_cache_delete(rk, rkmce, 1 /*unlink avl*/);
579
+ cnt++;
580
+ }
581
+
582
+ if (cnt > 0) {
583
+ rd_kafka_dbg(rk, METADATA, "METADATA",
584
+ "Purged %d/%d cached topic hint(s)", cnt,
585
+ rd_list_cnt(topic_ids));
586
+ rd_kafka_metadata_cache_propagate_changes(rk);
587
+ }
588
+ }
589
+
590
+
591
+ /**
592
+ * @brief Inserts a non-valid entry for topics in \p topics indicating
593
+ * that a MetadataRequest is in progress.
594
+ * This avoids sending multiple MetadataRequests for the same topics
595
+ * if there are already outstanding requests, see
596
+ * \c rd_kafka_metadata_refresh_topics().
597
+ *
598
+ * @remark These non-valid cache entries' expire time is set to the
599
+ * MetadataRequest timeout.
600
+ *
601
+ * @param dst rd_list_t(char *topicname): if not NULL: populated with
602
+ * topics that were added as hints to cache, e.q., topics to query.
603
+ * @param dst rd_list_t(char *topicname)
604
+ * @param err is the error to set on hint cache entries,
605
+ * typically ERR__WAIT_CACHE.
606
+ * @param replace replace existing valid entries
607
+ *
608
+ * @returns the number of topic hints inserted.
609
+ *
610
+ * @locks_required rd_kafka_wrlock()
611
+ */
612
+ int rd_kafka_metadata_cache_hint(rd_kafka_t *rk,
613
+ const rd_list_t *topics,
614
+ rd_list_t *dst,
615
+ rd_kafka_resp_err_t err,
616
+ rd_bool_t replace) {
617
+ const char *topic;
618
+ rd_ts_t now = rd_clock();
619
+ rd_ts_t ts_expires = now + (rk->rk_conf.socket_timeout_ms * 1000);
620
+ int i;
621
+ int cnt = 0;
622
+
623
+ RD_LIST_FOREACH(topic, topics, i) {
624
+ rd_kafka_metadata_topic_t mtopic = {.topic = (char *)topic,
625
+ .err = err};
626
+ rd_kafka_metadata_topic_internal_t metadata_internal_topic =
627
+ RD_ZERO_INIT;
628
+ /*const*/ struct rd_kafka_metadata_cache_entry *rkmce;
629
+
630
+ /* !replace: Dont overwrite valid entries */
631
+ if (!replace && (rkmce = rd_kafka_metadata_cache_find(
632
+ rk, topic, 0 /*any*/))) {
633
+ if (RD_KAFKA_METADATA_CACHE_VALID(rkmce) ||
634
+ (dst && rkmce->rkmce_mtopic.err !=
635
+ RD_KAFKA_RESP_ERR__NOENT))
636
+ continue;
637
+ rkmce->rkmce_mtopic.err = err;
638
+ /* FALLTHRU */
639
+ }
640
+
641
+ rd_kafka_metadata_cache_insert(rk, &mtopic,
642
+ &metadata_internal_topic, now,
643
+ ts_expires, rd_false, NULL, 0);
644
+ cnt++;
645
+
646
+ if (dst)
647
+ rd_list_add(dst, rd_strdup(topic));
648
+ }
649
+
650
+ if (cnt > 0)
651
+ rd_kafka_dbg(rk, METADATA, "METADATA",
652
+ "Hinted cache of %d/%d topic(s) being queried",
653
+ cnt, rd_list_cnt(topics));
654
+
655
+ return cnt;
656
+ }
657
+
658
+
659
+ /**
660
+ * @brief Same as rd_kafka_metadata_cache_hint() but takes
661
+ * a topic+partition list as input instead.
662
+ *
663
+ * @locks_acquired rd_kafka_wrlock()
664
+ */
665
+ int rd_kafka_metadata_cache_hint_rktparlist(
666
+ rd_kafka_t *rk,
667
+ const rd_kafka_topic_partition_list_t *rktparlist,
668
+ rd_list_t *dst,
669
+ int replace) {
670
+ rd_list_t topics;
671
+ int r;
672
+
673
+ rd_list_init(&topics, rktparlist->cnt, rd_free);
674
+ rd_kafka_topic_partition_list_get_topic_names(rktparlist, &topics,
675
+ 0 /*dont include regex*/);
676
+ rd_kafka_wrlock(rk);
677
+ r = rd_kafka_metadata_cache_hint(
678
+ rk, &topics, dst, RD_KAFKA_RESP_ERR__WAIT_CACHE, replace);
679
+ rd_kafka_wrunlock(rk);
680
+
681
+ rd_list_destroy(&topics);
682
+ return r;
683
+ }
684
+
685
+
686
+ /**
687
+ * @brief Cache entry comparator (on topic name)
688
+ */
689
+ static int rd_kafka_metadata_cache_entry_cmp(const void *_a, const void *_b) {
690
+ const struct rd_kafka_metadata_cache_entry *a = _a, *b = _b;
691
+ return strcmp(a->rkmce_mtopic.topic, b->rkmce_mtopic.topic);
692
+ }
693
+
694
+ /**
695
+ * @brief Cache entry comparator (on topic id)
696
+ */
697
+ static int rd_kafka_metadata_cache_entry_by_id_cmp(const void *_a,
698
+ const void *_b) {
699
+ const struct rd_kafka_metadata_cache_entry *a = _a, *b = _b;
700
+ return rd_kafka_Uuid_cmp(a->rkmce_metadata_internal_topic.topic_id,
701
+ b->rkmce_metadata_internal_topic.topic_id);
702
+ }
703
+
704
+
705
+ /**
706
+ * @brief Initialize the metadata cache
707
+ *
708
+ * @locks rd_kafka_wrlock()
709
+ */
710
+ void rd_kafka_metadata_cache_init(rd_kafka_t *rk) {
711
+ rd_avl_init(&rk->rk_metadata_cache.rkmc_avl,
712
+ rd_kafka_metadata_cache_entry_cmp, 0);
713
+ rd_avl_init(&rk->rk_metadata_cache.rkmc_avl_by_id,
714
+ rd_kafka_metadata_cache_entry_by_id_cmp, 0);
715
+ TAILQ_INIT(&rk->rk_metadata_cache.rkmc_expiry);
716
+ mtx_init(&rk->rk_metadata_cache.rkmc_full_lock, mtx_plain);
717
+ mtx_init(&rk->rk_metadata_cache.rkmc_cnd_lock, mtx_plain);
718
+ cnd_init(&rk->rk_metadata_cache.rkmc_cnd);
719
+ rd_list_init(&rk->rk_metadata_cache.rkmc_observers, 8,
720
+ rd_kafka_enq_once_trigger_destroy);
721
+ }
722
+
723
+ /**
724
+ * @brief Purge and destroy metadata cache.
725
+ *
726
+ * @locks_required rd_kafka_wrlock()
727
+ */
728
+ void rd_kafka_metadata_cache_destroy(rd_kafka_t *rk) {
729
+ rd_list_destroy(&rk->rk_metadata_cache.rkmc_observers);
730
+ rd_kafka_timer_stop(&rk->rk_timers,
731
+ &rk->rk_metadata_cache.rkmc_query_tmr, 1 /*lock*/);
732
+ rd_kafka_metadata_cache_purge(rk, rd_true /*observers too*/);
733
+ mtx_destroy(&rk->rk_metadata_cache.rkmc_full_lock);
734
+ mtx_destroy(&rk->rk_metadata_cache.rkmc_cnd_lock);
735
+ cnd_destroy(&rk->rk_metadata_cache.rkmc_cnd);
736
+ rd_avl_destroy(&rk->rk_metadata_cache.rkmc_avl);
737
+ rd_avl_destroy(&rk->rk_metadata_cache.rkmc_avl_by_id);
738
+ }
739
+
740
+
741
+
742
+ /**
743
+ * @brief Add eonce to list of async cache observers.
744
+ *
745
+ * @locks_required rd_kafka_wrlock()
746
+ */
747
+ void rd_kafka_metadata_cache_wait_state_change_async(
748
+ rd_kafka_t *rk,
749
+ rd_kafka_enq_once_t *eonce) {
750
+ rd_kafka_enq_once_add_source(eonce, "wait metadata cache change");
751
+ rd_list_add(&rk->rk_metadata_cache.rkmc_observers, eonce);
752
+ }
753
+
754
+
755
+ /**
756
+ * @brief Wait for cache update, or timeout.
757
+ *
758
+ * @returns 1 on cache update or 0 on timeout.
759
+ * @locks none
760
+ * @locality any
761
+ */
762
+ int rd_kafka_metadata_cache_wait_change(rd_kafka_t *rk, int timeout_ms) {
763
+ int r;
764
+ #if ENABLE_DEVEL
765
+ rd_ts_t ts_start = rd_clock();
766
+ #endif
767
+ mtx_lock(&rk->rk_metadata_cache.rkmc_cnd_lock);
768
+ r = cnd_timedwait_ms(&rk->rk_metadata_cache.rkmc_cnd,
769
+ &rk->rk_metadata_cache.rkmc_cnd_lock, timeout_ms);
770
+ mtx_unlock(&rk->rk_metadata_cache.rkmc_cnd_lock);
771
+
772
+ #if ENABLE_DEVEL
773
+ rd_kafka_dbg(rk, METADATA, "CACHEWAIT", "%s wait took %dms: %s",
774
+ __FUNCTION__, (int)((rd_clock() - ts_start) / 1000),
775
+ r == thrd_success ? "succeeded" : "timed out");
776
+ #endif
777
+ return r == thrd_success;
778
+ }
779
+
780
+
781
+ /**
782
+ * @brief eonce trigger callback for rd_list_apply() call in
783
+ * rd_kafka_metadata_cache_propagate_changes()
784
+ */
785
+ static int
786
+ rd_kafka_metadata_cache_propagate_changes_trigger_eonce(void *elem,
787
+ void *opaque) {
788
+ rd_kafka_enq_once_t *eonce = elem;
789
+ rd_kafka_enq_once_trigger(eonce, RD_KAFKA_RESP_ERR_NO_ERROR,
790
+ "wait metadata cache change");
791
+ return 0; /* remove eonce from list */
792
+ }
793
+
794
+
795
+ /**
796
+ * @brief Propagate that the cache changed (but not what changed) to
797
+ * any cnd listeners and eonce observers.
798
+ * @locks_required rd_kafka_wrlock(rk)
799
+ * @locks_acquired rkmc_cnd_lock
800
+ * @locality any
801
+ */
802
+ void rd_kafka_metadata_cache_propagate_changes(rd_kafka_t *rk) {
803
+ mtx_lock(&rk->rk_metadata_cache.rkmc_cnd_lock);
804
+ cnd_broadcast(&rk->rk_metadata_cache.rkmc_cnd);
805
+ mtx_unlock(&rk->rk_metadata_cache.rkmc_cnd_lock);
806
+
807
+ /* Trigger observers */
808
+ rd_list_apply(&rk->rk_metadata_cache.rkmc_observers,
809
+ rd_kafka_metadata_cache_propagate_changes_trigger_eonce,
810
+ NULL);
811
+ }
812
+
813
+ /**
814
+ * @returns the shared metadata for a topic, or NULL if not found in
815
+ * cache.
816
+ *
817
+ * @locks rd_kafka_*lock()
818
+ */
819
+ const rd_kafka_metadata_topic_t *
820
+ rd_kafka_metadata_cache_topic_get(rd_kafka_t *rk,
821
+ const char *topic,
822
+ int valid) {
823
+ struct rd_kafka_metadata_cache_entry *rkmce;
824
+
825
+ if (!(rkmce = rd_kafka_metadata_cache_find(rk, topic, valid)))
826
+ return NULL;
827
+
828
+ return &rkmce->rkmce_mtopic;
829
+ }
830
+
831
+
832
+
833
+ /**
834
+ * @brief Looks up the shared metadata for a partition along with its topic.
835
+ *
836
+ * Cache entries with errors (such as auth errors) will not be returned unless
837
+ * \p valid is set to false.
838
+ *
839
+ * @param mtopicp: pointer to topic metadata
840
+ * @param mpartp: pointer to partition metadata
841
+ * @param valid: only return valid entries (no hints)
842
+ *
843
+ * @returns -1 if topic was not found in cache, 0 if topic was found
844
+ * but not the partition, 1 if both topic and partition was found.
845
+ *
846
+ * @locks rd_kafka_*lock()
847
+ */
848
+ int rd_kafka_metadata_cache_topic_partition_get(
849
+ rd_kafka_t *rk,
850
+ const rd_kafka_metadata_topic_t **mtopicp,
851
+ const rd_kafka_metadata_partition_t **mpartp,
852
+ const char *topic,
853
+ int32_t partition,
854
+ int valid) {
855
+
856
+ const rd_kafka_metadata_topic_t *mtopic;
857
+ const rd_kafka_metadata_partition_t *mpart;
858
+ rd_kafka_metadata_partition_t skel = {.id = partition};
859
+
860
+ *mtopicp = NULL;
861
+ *mpartp = NULL;
862
+
863
+ if (!(mtopic = rd_kafka_metadata_cache_topic_get(rk, topic, valid)))
864
+ return -1;
865
+
866
+ *mtopicp = mtopic;
867
+
868
+ if (mtopic->err)
869
+ return -1;
870
+
871
+ /* Partitions array may be sparse so use bsearch lookup. */
872
+ mpart = bsearch(&skel, mtopic->partitions, mtopic->partition_cnt,
873
+ sizeof(*mtopic->partitions),
874
+ rd_kafka_metadata_partition_id_cmp);
875
+
876
+ if (!mpart)
877
+ return 0;
878
+
879
+ *mpartp = mpart;
880
+
881
+ return 1;
882
+ }
883
+
884
+
885
+ /**
886
+ * @returns the number of topics in \p topics that are in the cache.
887
+ *
888
+ * @param topics rd_list(const char *): topic names
889
+ * @param metadata_agep: age of oldest entry will be returned.
890
+ *
891
+ * @locks rd_kafka_*lock()
892
+ */
893
+ int rd_kafka_metadata_cache_topics_count_exists(rd_kafka_t *rk,
894
+ const rd_list_t *topics,
895
+ int *metadata_agep) {
896
+ const char *topic;
897
+ int i;
898
+ int cnt = 0;
899
+ int max_age = -1;
900
+
901
+ RD_LIST_FOREACH(topic, topics, i) {
902
+ const struct rd_kafka_metadata_cache_entry *rkmce;
903
+ int age;
904
+
905
+ if (!(rkmce = rd_kafka_metadata_cache_find(rk, topic,
906
+ 1 /*valid only*/)))
907
+ continue;
908
+
909
+ age = (int)((rd_clock() - rkmce->rkmce_ts_insert) / 1000);
910
+ if (age > max_age)
911
+ max_age = age;
912
+ cnt++;
913
+ }
914
+
915
+ *metadata_agep = max_age;
916
+
917
+ return cnt;
918
+ }
919
+
920
+
921
+ /**
922
+ * @brief Add all topics in the metadata cache to \p topics, avoid duplicates.
923
+ *
924
+ * Element type is (char *topic_name).
925
+ *
926
+ * @returns the number of elements added to \p topics
927
+ *
928
+ * @locks_required rd_kafka_*lock()
929
+ */
930
+ int rd_kafka_metadata_cache_topics_to_list(rd_kafka_t *rk, rd_list_t *topics) {
931
+ const struct rd_kafka_metadata_cache_entry *rkmce;
932
+ int precnt = rd_list_cnt(topics);
933
+
934
+ TAILQ_FOREACH(rkmce, &rk->rk_metadata_cache.rkmc_expiry, rkmce_link) {
935
+ /* Ignore topics that have up to date metadata info */
936
+ if (RD_KAFKA_METADATA_CACHE_VALID(rkmce))
937
+ continue;
938
+
939
+ if (rd_list_find(topics, rkmce->rkmce_mtopic.topic,
940
+ rd_list_cmp_str))
941
+ continue;
942
+
943
+ rd_list_add(topics, rd_strdup(rkmce->rkmce_mtopic.topic));
944
+ }
945
+
946
+ return rd_list_cnt(topics) - precnt;
947
+ }
948
+
949
+
950
+ /**
951
+ * @brief Dump cache to \p fp
952
+ *
953
+ * @locks rd_kafka_*lock()
954
+ */
955
+ void rd_kafka_metadata_cache_dump(FILE *fp, rd_kafka_t *rk) {
956
+ const struct rd_kafka_metadata_cache *rkmc = &rk->rk_metadata_cache;
957
+ const struct rd_kafka_metadata_cache_entry *rkmce;
958
+ rd_ts_t now = rd_clock();
959
+
960
+ fprintf(fp, "Metadata cache with %d entries:\n", rkmc->rkmc_cnt);
961
+ TAILQ_FOREACH(rkmce, &rkmc->rkmc_expiry, rkmce_link) {
962
+ fprintf(fp,
963
+ " %s (inserted %dms ago, expires in %dms, "
964
+ "%d partition(s), %s)%s%s\n",
965
+ rkmce->rkmce_mtopic.topic,
966
+ (int)((now - rkmce->rkmce_ts_insert) / 1000),
967
+ (int)((rkmce->rkmce_ts_expires - now) / 1000),
968
+ rkmce->rkmce_mtopic.partition_cnt,
969
+ RD_KAFKA_METADATA_CACHE_VALID(rkmce) ? "valid" : "hint",
970
+ rkmce->rkmce_mtopic.err ? " error: " : "",
971
+ rkmce->rkmce_mtopic.err
972
+ ? rd_kafka_err2str(rkmce->rkmce_mtopic.err)
973
+ : "");
974
+ }
975
+ }
976
+
977
+ /**@}*/