@point3/node-rdkafka 3.6.0-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 (707) hide show
  1. package/LICENSE.txt +20 -0
  2. package/README.md +636 -0
  3. package/binding.gyp +154 -0
  4. package/deps/librdkafka/.clang-format +136 -0
  5. package/deps/librdkafka/.clang-format-cpp +103 -0
  6. package/deps/librdkafka/.dir-locals.el +10 -0
  7. package/deps/librdkafka/.formatignore +33 -0
  8. package/deps/librdkafka/.gdbmacros +19 -0
  9. package/deps/librdkafka/.github/CODEOWNERS +1 -0
  10. package/deps/librdkafka/.github/ISSUE_TEMPLATE +34 -0
  11. package/deps/librdkafka/.semaphore/run-all-tests.yml +77 -0
  12. package/deps/librdkafka/.semaphore/semaphore-integration.yml +250 -0
  13. package/deps/librdkafka/.semaphore/semaphore.yml +378 -0
  14. package/deps/librdkafka/.semaphore/verify-linux-packages.yml +41 -0
  15. package/deps/librdkafka/CHANGELOG.md +2208 -0
  16. package/deps/librdkafka/CMakeLists.txt +291 -0
  17. package/deps/librdkafka/CODE_OF_CONDUCT.md +46 -0
  18. package/deps/librdkafka/CONFIGURATION.md +209 -0
  19. package/deps/librdkafka/CONTRIBUTING.md +431 -0
  20. package/deps/librdkafka/Doxyfile +2375 -0
  21. package/deps/librdkafka/INTRODUCTION.md +2481 -0
  22. package/deps/librdkafka/LICENSE +26 -0
  23. package/deps/librdkafka/LICENSE.cjson +22 -0
  24. package/deps/librdkafka/LICENSE.crc32c +28 -0
  25. package/deps/librdkafka/LICENSE.fnv1a +18 -0
  26. package/deps/librdkafka/LICENSE.hdrhistogram +27 -0
  27. package/deps/librdkafka/LICENSE.lz4 +26 -0
  28. package/deps/librdkafka/LICENSE.murmur2 +25 -0
  29. package/deps/librdkafka/LICENSE.nanopb +22 -0
  30. package/deps/librdkafka/LICENSE.opentelemetry +203 -0
  31. package/deps/librdkafka/LICENSE.pycrc +23 -0
  32. package/deps/librdkafka/LICENSE.queue +31 -0
  33. package/deps/librdkafka/LICENSE.regexp +5 -0
  34. package/deps/librdkafka/LICENSE.snappy +36 -0
  35. package/deps/librdkafka/LICENSE.tinycthread +26 -0
  36. package/deps/librdkafka/LICENSE.wingetopt +49 -0
  37. package/deps/librdkafka/LICENSES.txt +625 -0
  38. package/deps/librdkafka/Makefile +125 -0
  39. package/deps/librdkafka/README.md +199 -0
  40. package/deps/librdkafka/README.win32 +26 -0
  41. package/deps/librdkafka/STATISTICS.md +624 -0
  42. package/deps/librdkafka/configure +214 -0
  43. package/deps/librdkafka/configure.self +331 -0
  44. package/deps/librdkafka/debian/changelog +111 -0
  45. package/deps/librdkafka/debian/compat +1 -0
  46. package/deps/librdkafka/debian/control +71 -0
  47. package/deps/librdkafka/debian/copyright +99 -0
  48. package/deps/librdkafka/debian/gbp.conf +9 -0
  49. package/deps/librdkafka/debian/librdkafka++1.install +1 -0
  50. package/deps/librdkafka/debian/librdkafka-dev.examples +2 -0
  51. package/deps/librdkafka/debian/librdkafka-dev.install +9 -0
  52. package/deps/librdkafka/debian/librdkafka1.docs +5 -0
  53. package/deps/librdkafka/debian/librdkafka1.install +1 -0
  54. package/deps/librdkafka/debian/librdkafka1.symbols +135 -0
  55. package/deps/librdkafka/debian/rules +19 -0
  56. package/deps/librdkafka/debian/source/format +1 -0
  57. package/deps/librdkafka/debian/watch +2 -0
  58. package/deps/librdkafka/dev-conf.sh +123 -0
  59. package/deps/librdkafka/examples/CMakeLists.txt +79 -0
  60. package/deps/librdkafka/examples/Makefile +167 -0
  61. package/deps/librdkafka/examples/README.md +42 -0
  62. package/deps/librdkafka/examples/alter_consumer_group_offsets.c +338 -0
  63. package/deps/librdkafka/examples/consumer.c +271 -0
  64. package/deps/librdkafka/examples/delete_records.c +233 -0
  65. package/deps/librdkafka/examples/describe_cluster.c +322 -0
  66. package/deps/librdkafka/examples/describe_consumer_groups.c +455 -0
  67. package/deps/librdkafka/examples/describe_topics.c +427 -0
  68. package/deps/librdkafka/examples/elect_leaders.c +317 -0
  69. package/deps/librdkafka/examples/globals.json +11 -0
  70. package/deps/librdkafka/examples/idempotent_producer.c +344 -0
  71. package/deps/librdkafka/examples/incremental_alter_configs.c +347 -0
  72. package/deps/librdkafka/examples/kafkatest_verifiable_client.cpp +945 -0
  73. package/deps/librdkafka/examples/list_consumer_group_offsets.c +359 -0
  74. package/deps/librdkafka/examples/list_consumer_groups.c +365 -0
  75. package/deps/librdkafka/examples/list_offsets.c +327 -0
  76. package/deps/librdkafka/examples/misc.c +287 -0
  77. package/deps/librdkafka/examples/openssl_engine_example.cpp +248 -0
  78. package/deps/librdkafka/examples/producer.c +251 -0
  79. package/deps/librdkafka/examples/producer.cpp +228 -0
  80. package/deps/librdkafka/examples/rdkafka_complex_consumer_example.c +617 -0
  81. package/deps/librdkafka/examples/rdkafka_complex_consumer_example.cpp +467 -0
  82. package/deps/librdkafka/examples/rdkafka_consume_batch.cpp +264 -0
  83. package/deps/librdkafka/examples/rdkafka_example.c +853 -0
  84. package/deps/librdkafka/examples/rdkafka_example.cpp +679 -0
  85. package/deps/librdkafka/examples/rdkafka_performance.c +1781 -0
  86. package/deps/librdkafka/examples/transactions-older-broker.c +668 -0
  87. package/deps/librdkafka/examples/transactions.c +665 -0
  88. package/deps/librdkafka/examples/user_scram.c +491 -0
  89. package/deps/librdkafka/examples/win_ssl_cert_store.cpp +396 -0
  90. package/deps/librdkafka/lds-gen.py +73 -0
  91. package/deps/librdkafka/mainpage.doxy +40 -0
  92. package/deps/librdkafka/mklove/Makefile.base +329 -0
  93. package/deps/librdkafka/mklove/modules/configure.atomics +144 -0
  94. package/deps/librdkafka/mklove/modules/configure.base +2484 -0
  95. package/deps/librdkafka/mklove/modules/configure.builtin +70 -0
  96. package/deps/librdkafka/mklove/modules/configure.cc +186 -0
  97. package/deps/librdkafka/mklove/modules/configure.cxx +8 -0
  98. package/deps/librdkafka/mklove/modules/configure.fileversion +65 -0
  99. package/deps/librdkafka/mklove/modules/configure.gitversion +29 -0
  100. package/deps/librdkafka/mklove/modules/configure.good_cflags +18 -0
  101. package/deps/librdkafka/mklove/modules/configure.host +132 -0
  102. package/deps/librdkafka/mklove/modules/configure.lib +49 -0
  103. package/deps/librdkafka/mklove/modules/configure.libcurl +99 -0
  104. package/deps/librdkafka/mklove/modules/configure.libsasl2 +36 -0
  105. package/deps/librdkafka/mklove/modules/configure.libssl +147 -0
  106. package/deps/librdkafka/mklove/modules/configure.libzstd +58 -0
  107. package/deps/librdkafka/mklove/modules/configure.parseversion +95 -0
  108. package/deps/librdkafka/mklove/modules/configure.pic +16 -0
  109. package/deps/librdkafka/mklove/modules/configure.socket +20 -0
  110. package/deps/librdkafka/mklove/modules/configure.zlib +61 -0
  111. package/deps/librdkafka/mklove/modules/patches/README.md +8 -0
  112. package/deps/librdkafka/mklove/modules/patches/libcurl.0000-no-runtime-linking-check.patch +11 -0
  113. package/deps/librdkafka/mklove/modules/patches/libssl.0000-osx-rand-include-fix-OpenSSL-PR16409.patch +56 -0
  114. package/deps/librdkafka/packaging/RELEASE.md +319 -0
  115. package/deps/librdkafka/packaging/alpine/build-alpine.sh +38 -0
  116. package/deps/librdkafka/packaging/archlinux/PKGBUILD +30 -0
  117. package/deps/librdkafka/packaging/cmake/Config.cmake.in +37 -0
  118. package/deps/librdkafka/packaging/cmake/Modules/FindLZ4.cmake +38 -0
  119. package/deps/librdkafka/packaging/cmake/Modules/FindZSTD.cmake +27 -0
  120. package/deps/librdkafka/packaging/cmake/Modules/LICENSE.FindZstd +178 -0
  121. package/deps/librdkafka/packaging/cmake/README.md +38 -0
  122. package/deps/librdkafka/packaging/cmake/config.h.in +52 -0
  123. package/deps/librdkafka/packaging/cmake/parseversion.cmake +60 -0
  124. package/deps/librdkafka/packaging/cmake/rdkafka.pc.in +12 -0
  125. package/deps/librdkafka/packaging/cmake/try_compile/atomic_32_test.c +8 -0
  126. package/deps/librdkafka/packaging/cmake/try_compile/atomic_64_test.c +8 -0
  127. package/deps/librdkafka/packaging/cmake/try_compile/c11threads_test.c +14 -0
  128. package/deps/librdkafka/packaging/cmake/try_compile/crc32c_hw_test.c +27 -0
  129. package/deps/librdkafka/packaging/cmake/try_compile/dlopen_test.c +11 -0
  130. package/deps/librdkafka/packaging/cmake/try_compile/libsasl2_test.c +7 -0
  131. package/deps/librdkafka/packaging/cmake/try_compile/pthread_setname_darwin_test.c +6 -0
  132. package/deps/librdkafka/packaging/cmake/try_compile/pthread_setname_freebsd_test.c +7 -0
  133. package/deps/librdkafka/packaging/cmake/try_compile/pthread_setname_gnu_test.c +5 -0
  134. package/deps/librdkafka/packaging/cmake/try_compile/rand_r_test.c +7 -0
  135. package/deps/librdkafka/packaging/cmake/try_compile/rdkafka_setup.cmake +122 -0
  136. package/deps/librdkafka/packaging/cmake/try_compile/regex_test.c +10 -0
  137. package/deps/librdkafka/packaging/cmake/try_compile/strndup_test.c +5 -0
  138. package/deps/librdkafka/packaging/cmake/try_compile/sync_32_test.c +8 -0
  139. package/deps/librdkafka/packaging/cmake/try_compile/sync_64_test.c +8 -0
  140. package/deps/librdkafka/packaging/cp/README.md +16 -0
  141. package/deps/librdkafka/packaging/cp/check_features.c +72 -0
  142. package/deps/librdkafka/packaging/cp/verify-deb.sh +33 -0
  143. package/deps/librdkafka/packaging/cp/verify-packages.sh +69 -0
  144. package/deps/librdkafka/packaging/cp/verify-rpm.sh +32 -0
  145. package/deps/librdkafka/packaging/debian/changelog +66 -0
  146. package/deps/librdkafka/packaging/debian/compat +1 -0
  147. package/deps/librdkafka/packaging/debian/control +49 -0
  148. package/deps/librdkafka/packaging/debian/copyright +84 -0
  149. package/deps/librdkafka/packaging/debian/docs +5 -0
  150. package/deps/librdkafka/packaging/debian/gbp.conf +9 -0
  151. package/deps/librdkafka/packaging/debian/librdkafka-dev.dirs +2 -0
  152. package/deps/librdkafka/packaging/debian/librdkafka-dev.examples +2 -0
  153. package/deps/librdkafka/packaging/debian/librdkafka-dev.install +6 -0
  154. package/deps/librdkafka/packaging/debian/librdkafka-dev.substvars +1 -0
  155. package/deps/librdkafka/packaging/debian/librdkafka.dsc +16 -0
  156. package/deps/librdkafka/packaging/debian/librdkafka1-dbg.substvars +1 -0
  157. package/deps/librdkafka/packaging/debian/librdkafka1.dirs +1 -0
  158. package/deps/librdkafka/packaging/debian/librdkafka1.install +2 -0
  159. package/deps/librdkafka/packaging/debian/librdkafka1.postinst.debhelper +5 -0
  160. package/deps/librdkafka/packaging/debian/librdkafka1.postrm.debhelper +5 -0
  161. package/deps/librdkafka/packaging/debian/librdkafka1.symbols +64 -0
  162. package/deps/librdkafka/packaging/debian/rules +19 -0
  163. package/deps/librdkafka/packaging/debian/source/format +1 -0
  164. package/deps/librdkafka/packaging/debian/watch +2 -0
  165. package/deps/librdkafka/packaging/get_version.py +21 -0
  166. package/deps/librdkafka/packaging/homebrew/README.md +15 -0
  167. package/deps/librdkafka/packaging/homebrew/brew-update-pr.sh +31 -0
  168. package/deps/librdkafka/packaging/mingw-w64/configure-build-msys2-mingw-static.sh +52 -0
  169. package/deps/librdkafka/packaging/mingw-w64/configure-build-msys2-mingw.sh +21 -0
  170. package/deps/librdkafka/packaging/mingw-w64/export-variables.sh +13 -0
  171. package/deps/librdkafka/packaging/mingw-w64/run-tests.sh +6 -0
  172. package/deps/librdkafka/packaging/mingw-w64/semaphoreci-build.sh +38 -0
  173. package/deps/librdkafka/packaging/nuget/README.md +84 -0
  174. package/deps/librdkafka/packaging/nuget/artifact.py +177 -0
  175. package/deps/librdkafka/packaging/nuget/cleanup-s3.py +143 -0
  176. package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-win32__bldtype-Release/msvcr120.zip +0 -0
  177. package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-win32__bldtype-Release/msvcr140.zip +0 -0
  178. package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-x64__bldtype-Release/msvcr120.zip +0 -0
  179. package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-x64__bldtype-Release/msvcr140.zip +0 -0
  180. package/deps/librdkafka/packaging/nuget/nuget.sh +21 -0
  181. package/deps/librdkafka/packaging/nuget/nugetpackage.py +278 -0
  182. package/deps/librdkafka/packaging/nuget/packaging.py +448 -0
  183. package/deps/librdkafka/packaging/nuget/push-to-nuget.sh +21 -0
  184. package/deps/librdkafka/packaging/nuget/release.py +167 -0
  185. package/deps/librdkafka/packaging/nuget/requirements.txt +3 -0
  186. package/deps/librdkafka/packaging/nuget/staticpackage.py +178 -0
  187. package/deps/librdkafka/packaging/nuget/templates/librdkafka.redist.nuspec +21 -0
  188. package/deps/librdkafka/packaging/nuget/templates/librdkafka.redist.props +18 -0
  189. package/deps/librdkafka/packaging/nuget/templates/librdkafka.redist.targets +19 -0
  190. package/deps/librdkafka/packaging/nuget/zfile/__init__.py +0 -0
  191. package/deps/librdkafka/packaging/nuget/zfile/zfile.py +98 -0
  192. package/deps/librdkafka/packaging/rpm/Makefile +92 -0
  193. package/deps/librdkafka/packaging/rpm/README.md +23 -0
  194. package/deps/librdkafka/packaging/rpm/el7-x86_64.cfg +40 -0
  195. package/deps/librdkafka/packaging/rpm/librdkafka.spec +118 -0
  196. package/deps/librdkafka/packaging/rpm/mock-on-docker.sh +96 -0
  197. package/deps/librdkafka/packaging/rpm/tests/Makefile +25 -0
  198. package/deps/librdkafka/packaging/rpm/tests/README.md +8 -0
  199. package/deps/librdkafka/packaging/rpm/tests/run-test.sh +42 -0
  200. package/deps/librdkafka/packaging/rpm/tests/test-on-docker.sh +56 -0
  201. package/deps/librdkafka/packaging/rpm/tests/test.c +77 -0
  202. package/deps/librdkafka/packaging/rpm/tests/test.cpp +34 -0
  203. package/deps/librdkafka/packaging/tools/Dockerfile +31 -0
  204. package/deps/librdkafka/packaging/tools/build-configurations-checks.sh +12 -0
  205. package/deps/librdkafka/packaging/tools/build-deb-package.sh +64 -0
  206. package/deps/librdkafka/packaging/tools/build-debian.sh +65 -0
  207. package/deps/librdkafka/packaging/tools/build-manylinux.sh +68 -0
  208. package/deps/librdkafka/packaging/tools/build-release-artifacts.sh +139 -0
  209. package/deps/librdkafka/packaging/tools/distro-build.sh +38 -0
  210. package/deps/librdkafka/packaging/tools/gh-release-checksums.py +39 -0
  211. package/deps/librdkafka/packaging/tools/rdutcoverage.sh +25 -0
  212. package/deps/librdkafka/packaging/tools/requirements.txt +2 -0
  213. package/deps/librdkafka/packaging/tools/run-in-docker.sh +28 -0
  214. package/deps/librdkafka/packaging/tools/run-integration-tests.sh +31 -0
  215. package/deps/librdkafka/packaging/tools/run-style-check.sh +4 -0
  216. package/deps/librdkafka/packaging/tools/style-format.sh +149 -0
  217. package/deps/librdkafka/packaging/tools/update_rpcs_max_versions.py +100 -0
  218. package/deps/librdkafka/service.yml +172 -0
  219. package/deps/librdkafka/src/CMakeLists.txt +374 -0
  220. package/deps/librdkafka/src/Makefile +103 -0
  221. package/deps/librdkafka/src/README.lz4.md +30 -0
  222. package/deps/librdkafka/src/cJSON.c +2834 -0
  223. package/deps/librdkafka/src/cJSON.h +398 -0
  224. package/deps/librdkafka/src/crc32c.c +430 -0
  225. package/deps/librdkafka/src/crc32c.h +38 -0
  226. package/deps/librdkafka/src/generate_proto.sh +66 -0
  227. package/deps/librdkafka/src/librdkafka_cgrp_synch.png +0 -0
  228. package/deps/librdkafka/src/lz4.c +2727 -0
  229. package/deps/librdkafka/src/lz4.h +842 -0
  230. package/deps/librdkafka/src/lz4frame.c +2078 -0
  231. package/deps/librdkafka/src/lz4frame.h +692 -0
  232. package/deps/librdkafka/src/lz4frame_static.h +47 -0
  233. package/deps/librdkafka/src/lz4hc.c +1631 -0
  234. package/deps/librdkafka/src/lz4hc.h +413 -0
  235. package/deps/librdkafka/src/nanopb/pb.h +917 -0
  236. package/deps/librdkafka/src/nanopb/pb_common.c +388 -0
  237. package/deps/librdkafka/src/nanopb/pb_common.h +49 -0
  238. package/deps/librdkafka/src/nanopb/pb_decode.c +1727 -0
  239. package/deps/librdkafka/src/nanopb/pb_decode.h +193 -0
  240. package/deps/librdkafka/src/nanopb/pb_encode.c +1000 -0
  241. package/deps/librdkafka/src/nanopb/pb_encode.h +185 -0
  242. package/deps/librdkafka/src/opentelemetry/common.pb.c +32 -0
  243. package/deps/librdkafka/src/opentelemetry/common.pb.h +170 -0
  244. package/deps/librdkafka/src/opentelemetry/metrics.options +2 -0
  245. package/deps/librdkafka/src/opentelemetry/metrics.pb.c +67 -0
  246. package/deps/librdkafka/src/opentelemetry/metrics.pb.h +966 -0
  247. package/deps/librdkafka/src/opentelemetry/resource.pb.c +12 -0
  248. package/deps/librdkafka/src/opentelemetry/resource.pb.h +58 -0
  249. package/deps/librdkafka/src/queue.h +850 -0
  250. package/deps/librdkafka/src/rd.h +584 -0
  251. package/deps/librdkafka/src/rdaddr.c +255 -0
  252. package/deps/librdkafka/src/rdaddr.h +202 -0
  253. package/deps/librdkafka/src/rdatomic.h +230 -0
  254. package/deps/librdkafka/src/rdavg.h +260 -0
  255. package/deps/librdkafka/src/rdavl.c +210 -0
  256. package/deps/librdkafka/src/rdavl.h +250 -0
  257. package/deps/librdkafka/src/rdbase64.c +200 -0
  258. package/deps/librdkafka/src/rdbase64.h +43 -0
  259. package/deps/librdkafka/src/rdbuf.c +1884 -0
  260. package/deps/librdkafka/src/rdbuf.h +375 -0
  261. package/deps/librdkafka/src/rdcrc32.c +114 -0
  262. package/deps/librdkafka/src/rdcrc32.h +170 -0
  263. package/deps/librdkafka/src/rddl.c +179 -0
  264. package/deps/librdkafka/src/rddl.h +43 -0
  265. package/deps/librdkafka/src/rdendian.h +175 -0
  266. package/deps/librdkafka/src/rdfloat.h +67 -0
  267. package/deps/librdkafka/src/rdfnv1a.c +113 -0
  268. package/deps/librdkafka/src/rdfnv1a.h +35 -0
  269. package/deps/librdkafka/src/rdgz.c +120 -0
  270. package/deps/librdkafka/src/rdgz.h +46 -0
  271. package/deps/librdkafka/src/rdhdrhistogram.c +721 -0
  272. package/deps/librdkafka/src/rdhdrhistogram.h +87 -0
  273. package/deps/librdkafka/src/rdhttp.c +830 -0
  274. package/deps/librdkafka/src/rdhttp.h +101 -0
  275. package/deps/librdkafka/src/rdinterval.h +177 -0
  276. package/deps/librdkafka/src/rdkafka.c +5505 -0
  277. package/deps/librdkafka/src/rdkafka.h +10686 -0
  278. package/deps/librdkafka/src/rdkafka_admin.c +9794 -0
  279. package/deps/librdkafka/src/rdkafka_admin.h +661 -0
  280. package/deps/librdkafka/src/rdkafka_assignment.c +1010 -0
  281. package/deps/librdkafka/src/rdkafka_assignment.h +73 -0
  282. package/deps/librdkafka/src/rdkafka_assignor.c +1786 -0
  283. package/deps/librdkafka/src/rdkafka_assignor.h +402 -0
  284. package/deps/librdkafka/src/rdkafka_aux.c +409 -0
  285. package/deps/librdkafka/src/rdkafka_aux.h +174 -0
  286. package/deps/librdkafka/src/rdkafka_background.c +221 -0
  287. package/deps/librdkafka/src/rdkafka_broker.c +6337 -0
  288. package/deps/librdkafka/src/rdkafka_broker.h +744 -0
  289. package/deps/librdkafka/src/rdkafka_buf.c +543 -0
  290. package/deps/librdkafka/src/rdkafka_buf.h +1525 -0
  291. package/deps/librdkafka/src/rdkafka_cert.c +576 -0
  292. package/deps/librdkafka/src/rdkafka_cert.h +62 -0
  293. package/deps/librdkafka/src/rdkafka_cgrp.c +7587 -0
  294. package/deps/librdkafka/src/rdkafka_cgrp.h +477 -0
  295. package/deps/librdkafka/src/rdkafka_conf.c +4880 -0
  296. package/deps/librdkafka/src/rdkafka_conf.h +732 -0
  297. package/deps/librdkafka/src/rdkafka_confval.h +97 -0
  298. package/deps/librdkafka/src/rdkafka_coord.c +623 -0
  299. package/deps/librdkafka/src/rdkafka_coord.h +132 -0
  300. package/deps/librdkafka/src/rdkafka_error.c +228 -0
  301. package/deps/librdkafka/src/rdkafka_error.h +80 -0
  302. package/deps/librdkafka/src/rdkafka_event.c +502 -0
  303. package/deps/librdkafka/src/rdkafka_event.h +126 -0
  304. package/deps/librdkafka/src/rdkafka_feature.c +898 -0
  305. package/deps/librdkafka/src/rdkafka_feature.h +104 -0
  306. package/deps/librdkafka/src/rdkafka_fetcher.c +1422 -0
  307. package/deps/librdkafka/src/rdkafka_fetcher.h +44 -0
  308. package/deps/librdkafka/src/rdkafka_header.c +220 -0
  309. package/deps/librdkafka/src/rdkafka_header.h +76 -0
  310. package/deps/librdkafka/src/rdkafka_idempotence.c +807 -0
  311. package/deps/librdkafka/src/rdkafka_idempotence.h +144 -0
  312. package/deps/librdkafka/src/rdkafka_int.h +1260 -0
  313. package/deps/librdkafka/src/rdkafka_interceptor.c +819 -0
  314. package/deps/librdkafka/src/rdkafka_interceptor.h +104 -0
  315. package/deps/librdkafka/src/rdkafka_lz4.c +450 -0
  316. package/deps/librdkafka/src/rdkafka_lz4.h +49 -0
  317. package/deps/librdkafka/src/rdkafka_metadata.c +2209 -0
  318. package/deps/librdkafka/src/rdkafka_metadata.h +345 -0
  319. package/deps/librdkafka/src/rdkafka_metadata_cache.c +1183 -0
  320. package/deps/librdkafka/src/rdkafka_mock.c +3661 -0
  321. package/deps/librdkafka/src/rdkafka_mock.h +610 -0
  322. package/deps/librdkafka/src/rdkafka_mock_cgrp.c +1876 -0
  323. package/deps/librdkafka/src/rdkafka_mock_handlers.c +3113 -0
  324. package/deps/librdkafka/src/rdkafka_mock_int.h +710 -0
  325. package/deps/librdkafka/src/rdkafka_msg.c +2589 -0
  326. package/deps/librdkafka/src/rdkafka_msg.h +614 -0
  327. package/deps/librdkafka/src/rdkafka_msgbatch.h +62 -0
  328. package/deps/librdkafka/src/rdkafka_msgset.h +98 -0
  329. package/deps/librdkafka/src/rdkafka_msgset_reader.c +1806 -0
  330. package/deps/librdkafka/src/rdkafka_msgset_writer.c +1474 -0
  331. package/deps/librdkafka/src/rdkafka_offset.c +1565 -0
  332. package/deps/librdkafka/src/rdkafka_offset.h +150 -0
  333. package/deps/librdkafka/src/rdkafka_op.c +997 -0
  334. package/deps/librdkafka/src/rdkafka_op.h +858 -0
  335. package/deps/librdkafka/src/rdkafka_partition.c +4896 -0
  336. package/deps/librdkafka/src/rdkafka_partition.h +1182 -0
  337. package/deps/librdkafka/src/rdkafka_pattern.c +228 -0
  338. package/deps/librdkafka/src/rdkafka_pattern.h +70 -0
  339. package/deps/librdkafka/src/rdkafka_plugin.c +213 -0
  340. package/deps/librdkafka/src/rdkafka_plugin.h +41 -0
  341. package/deps/librdkafka/src/rdkafka_proto.h +736 -0
  342. package/deps/librdkafka/src/rdkafka_protocol.h +128 -0
  343. package/deps/librdkafka/src/rdkafka_queue.c +1230 -0
  344. package/deps/librdkafka/src/rdkafka_queue.h +1220 -0
  345. package/deps/librdkafka/src/rdkafka_range_assignor.c +1748 -0
  346. package/deps/librdkafka/src/rdkafka_request.c +7089 -0
  347. package/deps/librdkafka/src/rdkafka_request.h +732 -0
  348. package/deps/librdkafka/src/rdkafka_roundrobin_assignor.c +123 -0
  349. package/deps/librdkafka/src/rdkafka_sasl.c +530 -0
  350. package/deps/librdkafka/src/rdkafka_sasl.h +63 -0
  351. package/deps/librdkafka/src/rdkafka_sasl_cyrus.c +722 -0
  352. package/deps/librdkafka/src/rdkafka_sasl_int.h +89 -0
  353. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.c +1833 -0
  354. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.h +52 -0
  355. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.c +1666 -0
  356. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.h +47 -0
  357. package/deps/librdkafka/src/rdkafka_sasl_plain.c +142 -0
  358. package/deps/librdkafka/src/rdkafka_sasl_scram.c +858 -0
  359. package/deps/librdkafka/src/rdkafka_sasl_win32.c +550 -0
  360. package/deps/librdkafka/src/rdkafka_ssl.c +2129 -0
  361. package/deps/librdkafka/src/rdkafka_ssl.h +86 -0
  362. package/deps/librdkafka/src/rdkafka_sticky_assignor.c +4785 -0
  363. package/deps/librdkafka/src/rdkafka_subscription.c +278 -0
  364. package/deps/librdkafka/src/rdkafka_telemetry.c +760 -0
  365. package/deps/librdkafka/src/rdkafka_telemetry.h +52 -0
  366. package/deps/librdkafka/src/rdkafka_telemetry_decode.c +1053 -0
  367. package/deps/librdkafka/src/rdkafka_telemetry_decode.h +59 -0
  368. package/deps/librdkafka/src/rdkafka_telemetry_encode.c +997 -0
  369. package/deps/librdkafka/src/rdkafka_telemetry_encode.h +301 -0
  370. package/deps/librdkafka/src/rdkafka_timer.c +402 -0
  371. package/deps/librdkafka/src/rdkafka_timer.h +117 -0
  372. package/deps/librdkafka/src/rdkafka_topic.c +2161 -0
  373. package/deps/librdkafka/src/rdkafka_topic.h +334 -0
  374. package/deps/librdkafka/src/rdkafka_transport.c +1309 -0
  375. package/deps/librdkafka/src/rdkafka_transport.h +99 -0
  376. package/deps/librdkafka/src/rdkafka_transport_int.h +100 -0
  377. package/deps/librdkafka/src/rdkafka_txnmgr.c +3256 -0
  378. package/deps/librdkafka/src/rdkafka_txnmgr.h +171 -0
  379. package/deps/librdkafka/src/rdkafka_zstd.c +226 -0
  380. package/deps/librdkafka/src/rdkafka_zstd.h +57 -0
  381. package/deps/librdkafka/src/rdlist.c +576 -0
  382. package/deps/librdkafka/src/rdlist.h +434 -0
  383. package/deps/librdkafka/src/rdlog.c +89 -0
  384. package/deps/librdkafka/src/rdlog.h +41 -0
  385. package/deps/librdkafka/src/rdmap.c +508 -0
  386. package/deps/librdkafka/src/rdmap.h +492 -0
  387. package/deps/librdkafka/src/rdmurmur2.c +167 -0
  388. package/deps/librdkafka/src/rdmurmur2.h +35 -0
  389. package/deps/librdkafka/src/rdports.c +61 -0
  390. package/deps/librdkafka/src/rdports.h +38 -0
  391. package/deps/librdkafka/src/rdposix.h +250 -0
  392. package/deps/librdkafka/src/rdrand.c +80 -0
  393. package/deps/librdkafka/src/rdrand.h +43 -0
  394. package/deps/librdkafka/src/rdregex.c +156 -0
  395. package/deps/librdkafka/src/rdregex.h +43 -0
  396. package/deps/librdkafka/src/rdsignal.h +57 -0
  397. package/deps/librdkafka/src/rdstring.c +645 -0
  398. package/deps/librdkafka/src/rdstring.h +98 -0
  399. package/deps/librdkafka/src/rdsysqueue.h +404 -0
  400. package/deps/librdkafka/src/rdtime.h +356 -0
  401. package/deps/librdkafka/src/rdtypes.h +86 -0
  402. package/deps/librdkafka/src/rdunittest.c +549 -0
  403. package/deps/librdkafka/src/rdunittest.h +232 -0
  404. package/deps/librdkafka/src/rdvarint.c +134 -0
  405. package/deps/librdkafka/src/rdvarint.h +165 -0
  406. package/deps/librdkafka/src/rdwin32.h +382 -0
  407. package/deps/librdkafka/src/rdxxhash.c +1030 -0
  408. package/deps/librdkafka/src/rdxxhash.h +328 -0
  409. package/deps/librdkafka/src/regexp.c +1352 -0
  410. package/deps/librdkafka/src/regexp.h +41 -0
  411. package/deps/librdkafka/src/snappy.c +1866 -0
  412. package/deps/librdkafka/src/snappy.h +62 -0
  413. package/deps/librdkafka/src/snappy_compat.h +138 -0
  414. package/deps/librdkafka/src/statistics_schema.json +444 -0
  415. package/deps/librdkafka/src/tinycthread.c +932 -0
  416. package/deps/librdkafka/src/tinycthread.h +503 -0
  417. package/deps/librdkafka/src/tinycthread_extra.c +199 -0
  418. package/deps/librdkafka/src/tinycthread_extra.h +212 -0
  419. package/deps/librdkafka/src/win32_config.h +58 -0
  420. package/deps/librdkafka/src-cpp/CMakeLists.txt +90 -0
  421. package/deps/librdkafka/src-cpp/ConfImpl.cpp +84 -0
  422. package/deps/librdkafka/src-cpp/ConsumerImpl.cpp +244 -0
  423. package/deps/librdkafka/src-cpp/HandleImpl.cpp +436 -0
  424. package/deps/librdkafka/src-cpp/HeadersImpl.cpp +48 -0
  425. package/deps/librdkafka/src-cpp/KafkaConsumerImpl.cpp +296 -0
  426. package/deps/librdkafka/src-cpp/Makefile +55 -0
  427. package/deps/librdkafka/src-cpp/MessageImpl.cpp +38 -0
  428. package/deps/librdkafka/src-cpp/MetadataImpl.cpp +170 -0
  429. package/deps/librdkafka/src-cpp/ProducerImpl.cpp +197 -0
  430. package/deps/librdkafka/src-cpp/QueueImpl.cpp +70 -0
  431. package/deps/librdkafka/src-cpp/README.md +16 -0
  432. package/deps/librdkafka/src-cpp/RdKafka.cpp +59 -0
  433. package/deps/librdkafka/src-cpp/TopicImpl.cpp +124 -0
  434. package/deps/librdkafka/src-cpp/TopicPartitionImpl.cpp +57 -0
  435. package/deps/librdkafka/src-cpp/rdkafkacpp.h +3797 -0
  436. package/deps/librdkafka/src-cpp/rdkafkacpp_int.h +1641 -0
  437. package/deps/librdkafka/tests/0000-unittests.c +72 -0
  438. package/deps/librdkafka/tests/0001-multiobj.c +102 -0
  439. package/deps/librdkafka/tests/0002-unkpart.c +244 -0
  440. package/deps/librdkafka/tests/0003-msgmaxsize.c +173 -0
  441. package/deps/librdkafka/tests/0004-conf.c +934 -0
  442. package/deps/librdkafka/tests/0005-order.c +133 -0
  443. package/deps/librdkafka/tests/0006-symbols.c +163 -0
  444. package/deps/librdkafka/tests/0007-autotopic.c +136 -0
  445. package/deps/librdkafka/tests/0008-reqacks.c +179 -0
  446. package/deps/librdkafka/tests/0009-mock_cluster.c +97 -0
  447. package/deps/librdkafka/tests/0011-produce_batch.c +753 -0
  448. package/deps/librdkafka/tests/0012-produce_consume.c +537 -0
  449. package/deps/librdkafka/tests/0013-null-msgs.c +473 -0
  450. package/deps/librdkafka/tests/0014-reconsume-191.c +512 -0
  451. package/deps/librdkafka/tests/0015-offset_seeks.c +172 -0
  452. package/deps/librdkafka/tests/0016-client_swname.c +181 -0
  453. package/deps/librdkafka/tests/0017-compression.c +140 -0
  454. package/deps/librdkafka/tests/0018-cgrp_term.c +338 -0
  455. package/deps/librdkafka/tests/0019-list_groups.c +289 -0
  456. package/deps/librdkafka/tests/0020-destroy_hang.c +162 -0
  457. package/deps/librdkafka/tests/0021-rkt_destroy.c +72 -0
  458. package/deps/librdkafka/tests/0022-consume_batch.c +279 -0
  459. package/deps/librdkafka/tests/0025-timers.c +147 -0
  460. package/deps/librdkafka/tests/0026-consume_pause.c +547 -0
  461. package/deps/librdkafka/tests/0028-long_topicnames.c +79 -0
  462. package/deps/librdkafka/tests/0029-assign_offset.c +202 -0
  463. package/deps/librdkafka/tests/0030-offset_commit.c +589 -0
  464. package/deps/librdkafka/tests/0031-get_offsets.c +235 -0
  465. package/deps/librdkafka/tests/0033-regex_subscribe.c +536 -0
  466. package/deps/librdkafka/tests/0034-offset_reset.c +398 -0
  467. package/deps/librdkafka/tests/0035-api_version.c +73 -0
  468. package/deps/librdkafka/tests/0036-partial_fetch.c +87 -0
  469. package/deps/librdkafka/tests/0037-destroy_hang_local.c +85 -0
  470. package/deps/librdkafka/tests/0038-performance.c +121 -0
  471. package/deps/librdkafka/tests/0039-event.c +284 -0
  472. package/deps/librdkafka/tests/0040-io_event.c +257 -0
  473. package/deps/librdkafka/tests/0041-fetch_max_bytes.c +97 -0
  474. package/deps/librdkafka/tests/0042-many_topics.c +252 -0
  475. package/deps/librdkafka/tests/0043-no_connection.c +77 -0
  476. package/deps/librdkafka/tests/0044-partition_cnt.c +94 -0
  477. package/deps/librdkafka/tests/0045-subscribe_update.c +1010 -0
  478. package/deps/librdkafka/tests/0046-rkt_cache.c +65 -0
  479. package/deps/librdkafka/tests/0047-partial_buf_tmout.c +98 -0
  480. package/deps/librdkafka/tests/0048-partitioner.c +283 -0
  481. package/deps/librdkafka/tests/0049-consume_conn_close.c +162 -0
  482. package/deps/librdkafka/tests/0050-subscribe_adds.c +145 -0
  483. package/deps/librdkafka/tests/0051-assign_adds.c +126 -0
  484. package/deps/librdkafka/tests/0052-msg_timestamps.c +238 -0
  485. package/deps/librdkafka/tests/0053-stats_cb.cpp +527 -0
  486. package/deps/librdkafka/tests/0054-offset_time.cpp +236 -0
  487. package/deps/librdkafka/tests/0055-producer_latency.c +539 -0
  488. package/deps/librdkafka/tests/0056-balanced_group_mt.c +315 -0
  489. package/deps/librdkafka/tests/0057-invalid_topic.cpp +112 -0
  490. package/deps/librdkafka/tests/0058-log.cpp +123 -0
  491. package/deps/librdkafka/tests/0059-bsearch.cpp +241 -0
  492. package/deps/librdkafka/tests/0060-op_prio.cpp +163 -0
  493. package/deps/librdkafka/tests/0061-consumer_lag.cpp +295 -0
  494. package/deps/librdkafka/tests/0062-stats_event.c +126 -0
  495. package/deps/librdkafka/tests/0063-clusterid.cpp +180 -0
  496. package/deps/librdkafka/tests/0064-interceptors.c +481 -0
  497. package/deps/librdkafka/tests/0065-yield.cpp +140 -0
  498. package/deps/librdkafka/tests/0066-plugins.cpp +129 -0
  499. package/deps/librdkafka/tests/0067-empty_topic.cpp +151 -0
  500. package/deps/librdkafka/tests/0068-produce_timeout.c +136 -0
  501. package/deps/librdkafka/tests/0069-consumer_add_parts.c +119 -0
  502. package/deps/librdkafka/tests/0070-null_empty.cpp +197 -0
  503. package/deps/librdkafka/tests/0072-headers_ut.c +448 -0
  504. package/deps/librdkafka/tests/0073-headers.c +381 -0
  505. package/deps/librdkafka/tests/0074-producev.c +87 -0
  506. package/deps/librdkafka/tests/0075-retry.c +290 -0
  507. package/deps/librdkafka/tests/0076-produce_retry.c +452 -0
  508. package/deps/librdkafka/tests/0077-compaction.c +363 -0
  509. package/deps/librdkafka/tests/0078-c_from_cpp.cpp +96 -0
  510. package/deps/librdkafka/tests/0079-fork.c +93 -0
  511. package/deps/librdkafka/tests/0080-admin_ut.c +3095 -0
  512. package/deps/librdkafka/tests/0081-admin.c +5633 -0
  513. package/deps/librdkafka/tests/0082-fetch_max_bytes.cpp +137 -0
  514. package/deps/librdkafka/tests/0083-cb_event.c +233 -0
  515. package/deps/librdkafka/tests/0084-destroy_flags.c +208 -0
  516. package/deps/librdkafka/tests/0085-headers.cpp +392 -0
  517. package/deps/librdkafka/tests/0086-purge.c +368 -0
  518. package/deps/librdkafka/tests/0088-produce_metadata_timeout.c +162 -0
  519. package/deps/librdkafka/tests/0089-max_poll_interval.c +511 -0
  520. package/deps/librdkafka/tests/0090-idempotence.c +171 -0
  521. package/deps/librdkafka/tests/0091-max_poll_interval_timeout.c +295 -0
  522. package/deps/librdkafka/tests/0092-mixed_msgver.c +103 -0
  523. package/deps/librdkafka/tests/0093-holb.c +200 -0
  524. package/deps/librdkafka/tests/0094-idempotence_msg_timeout.c +231 -0
  525. package/deps/librdkafka/tests/0095-all_brokers_down.cpp +122 -0
  526. package/deps/librdkafka/tests/0097-ssl_verify.cpp +658 -0
  527. package/deps/librdkafka/tests/0098-consumer-txn.cpp +1218 -0
  528. package/deps/librdkafka/tests/0099-commit_metadata.c +194 -0
  529. package/deps/librdkafka/tests/0100-thread_interceptors.cpp +195 -0
  530. package/deps/librdkafka/tests/0101-fetch-from-follower.cpp +446 -0
  531. package/deps/librdkafka/tests/0102-static_group_rebalance.c +836 -0
  532. package/deps/librdkafka/tests/0103-transactions.c +1383 -0
  533. package/deps/librdkafka/tests/0104-fetch_from_follower_mock.c +625 -0
  534. package/deps/librdkafka/tests/0105-transactions_mock.c +3930 -0
  535. package/deps/librdkafka/tests/0106-cgrp_sess_timeout.c +318 -0
  536. package/deps/librdkafka/tests/0107-topic_recreate.c +259 -0
  537. package/deps/librdkafka/tests/0109-auto_create_topics.cpp +278 -0
  538. package/deps/librdkafka/tests/0110-batch_size.cpp +182 -0
  539. package/deps/librdkafka/tests/0111-delay_create_topics.cpp +127 -0
  540. package/deps/librdkafka/tests/0112-assign_unknown_part.c +87 -0
  541. package/deps/librdkafka/tests/0113-cooperative_rebalance.cpp +3473 -0
  542. package/deps/librdkafka/tests/0114-sticky_partitioning.cpp +176 -0
  543. package/deps/librdkafka/tests/0115-producer_auth.cpp +182 -0
  544. package/deps/librdkafka/tests/0116-kafkaconsumer_close.cpp +216 -0
  545. package/deps/librdkafka/tests/0117-mock_errors.c +331 -0
  546. package/deps/librdkafka/tests/0118-commit_rebalance.c +154 -0
  547. package/deps/librdkafka/tests/0119-consumer_auth.cpp +167 -0
  548. package/deps/librdkafka/tests/0120-asymmetric_subscription.c +185 -0
  549. package/deps/librdkafka/tests/0121-clusterid.c +115 -0
  550. package/deps/librdkafka/tests/0122-buffer_cleaning_after_rebalance.c +227 -0
  551. package/deps/librdkafka/tests/0123-connections_max_idle.c +98 -0
  552. package/deps/librdkafka/tests/0124-openssl_invalid_engine.c +69 -0
  553. package/deps/librdkafka/tests/0125-immediate_flush.c +144 -0
  554. package/deps/librdkafka/tests/0126-oauthbearer_oidc.c +528 -0
  555. package/deps/librdkafka/tests/0127-fetch_queue_backoff.cpp +165 -0
  556. package/deps/librdkafka/tests/0128-sasl_callback_queue.cpp +125 -0
  557. package/deps/librdkafka/tests/0129-fetch_aborted_msgs.c +79 -0
  558. package/deps/librdkafka/tests/0130-store_offsets.c +178 -0
  559. package/deps/librdkafka/tests/0131-connect_timeout.c +81 -0
  560. package/deps/librdkafka/tests/0132-strategy_ordering.c +179 -0
  561. package/deps/librdkafka/tests/0133-ssl_keys.c +150 -0
  562. package/deps/librdkafka/tests/0134-ssl_provider.c +92 -0
  563. package/deps/librdkafka/tests/0135-sasl_credentials.cpp +143 -0
  564. package/deps/librdkafka/tests/0136-resolve_cb.c +181 -0
  565. package/deps/librdkafka/tests/0137-barrier_batch_consume.c +619 -0
  566. package/deps/librdkafka/tests/0138-admin_mock.c +281 -0
  567. package/deps/librdkafka/tests/0139-offset_validation_mock.c +950 -0
  568. package/deps/librdkafka/tests/0140-commit_metadata.cpp +108 -0
  569. package/deps/librdkafka/tests/0142-reauthentication.c +515 -0
  570. package/deps/librdkafka/tests/0143-exponential_backoff_mock.c +552 -0
  571. package/deps/librdkafka/tests/0144-idempotence_mock.c +373 -0
  572. package/deps/librdkafka/tests/0145-pause_resume_mock.c +119 -0
  573. package/deps/librdkafka/tests/0146-metadata_mock.c +505 -0
  574. package/deps/librdkafka/tests/0147-consumer_group_consumer_mock.c +952 -0
  575. package/deps/librdkafka/tests/0148-offset_fetch_commit_error_mock.c +563 -0
  576. package/deps/librdkafka/tests/0149-broker-same-host-port.c +140 -0
  577. package/deps/librdkafka/tests/0150-telemetry_mock.c +651 -0
  578. package/deps/librdkafka/tests/0151-purge-brokers.c +566 -0
  579. package/deps/librdkafka/tests/0152-rebootstrap.c +59 -0
  580. package/deps/librdkafka/tests/0153-memberid.c +128 -0
  581. package/deps/librdkafka/tests/1000-unktopic.c +164 -0
  582. package/deps/librdkafka/tests/8000-idle.cpp +60 -0
  583. package/deps/librdkafka/tests/8001-fetch_from_follower_mock_manual.c +113 -0
  584. package/deps/librdkafka/tests/CMakeLists.txt +170 -0
  585. package/deps/librdkafka/tests/LibrdkafkaTestApp.py +291 -0
  586. package/deps/librdkafka/tests/Makefile +182 -0
  587. package/deps/librdkafka/tests/README.md +509 -0
  588. package/deps/librdkafka/tests/autotest.sh +33 -0
  589. package/deps/librdkafka/tests/backtrace.gdb +30 -0
  590. package/deps/librdkafka/tests/broker_version_tests.py +315 -0
  591. package/deps/librdkafka/tests/buildbox.sh +17 -0
  592. package/deps/librdkafka/tests/cleanup-checker-tests.sh +20 -0
  593. package/deps/librdkafka/tests/cluster_testing.py +191 -0
  594. package/deps/librdkafka/tests/delete-test-topics.sh +56 -0
  595. package/deps/librdkafka/tests/fixtures/oauthbearer/jwt_assertion_template.json +10 -0
  596. package/deps/librdkafka/tests/fixtures/ssl/Makefile +8 -0
  597. package/deps/librdkafka/tests/fixtures/ssl/README.md +13 -0
  598. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.intermediate.p12 +0 -0
  599. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.p12 +0 -0
  600. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.intermediate.pem +72 -0
  601. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.pem +50 -0
  602. package/deps/librdkafka/tests/fixtures/ssl/client2.intermediate.key +46 -0
  603. package/deps/librdkafka/tests/fixtures/ssl/client2.key +46 -0
  604. package/deps/librdkafka/tests/fixtures/ssl/create_keys.sh +168 -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 +13 -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-all-tests.sh +79 -0
  630. package/deps/librdkafka/tests/run-consumer-tests.sh +16 -0
  631. package/deps/librdkafka/tests/run-producer-tests.sh +16 -0
  632. package/deps/librdkafka/tests/run-test-batches.py +157 -0
  633. package/deps/librdkafka/tests/run-test.sh +140 -0
  634. package/deps/librdkafka/tests/rusage.c +249 -0
  635. package/deps/librdkafka/tests/sasl_test.py +289 -0
  636. package/deps/librdkafka/tests/scenarios/README.md +6 -0
  637. package/deps/librdkafka/tests/scenarios/ak23.json +6 -0
  638. package/deps/librdkafka/tests/scenarios/default.json +5 -0
  639. package/deps/librdkafka/tests/scenarios/noautocreate.json +5 -0
  640. package/deps/librdkafka/tests/sockem.c +801 -0
  641. package/deps/librdkafka/tests/sockem.h +85 -0
  642. package/deps/librdkafka/tests/sockem_ctrl.c +145 -0
  643. package/deps/librdkafka/tests/sockem_ctrl.h +61 -0
  644. package/deps/librdkafka/tests/test.c +7778 -0
  645. package/deps/librdkafka/tests/test.conf.example +27 -0
  646. package/deps/librdkafka/tests/test.h +1028 -0
  647. package/deps/librdkafka/tests/testcpp.cpp +131 -0
  648. package/deps/librdkafka/tests/testcpp.h +388 -0
  649. package/deps/librdkafka/tests/testshared.h +416 -0
  650. package/deps/librdkafka/tests/tools/README.md +4 -0
  651. package/deps/librdkafka/tests/tools/stats/README.md +21 -0
  652. package/deps/librdkafka/tests/tools/stats/filter.jq +42 -0
  653. package/deps/librdkafka/tests/tools/stats/graph.py +150 -0
  654. package/deps/librdkafka/tests/tools/stats/requirements.txt +3 -0
  655. package/deps/librdkafka/tests/tools/stats/to_csv.py +124 -0
  656. package/deps/librdkafka/tests/trivup/trivup-0.14.0.tar.gz +0 -0
  657. package/deps/librdkafka/tests/until-fail.sh +87 -0
  658. package/deps/librdkafka/tests/xxxx-assign_partition.c +122 -0
  659. package/deps/librdkafka/tests/xxxx-metadata.cpp +159 -0
  660. package/deps/librdkafka/vcpkg.json +23 -0
  661. package/deps/librdkafka/win32/README.md +5 -0
  662. package/deps/librdkafka/win32/build-package.bat +3 -0
  663. package/deps/librdkafka/win32/build.bat +19 -0
  664. package/deps/librdkafka/win32/common.vcxproj +84 -0
  665. package/deps/librdkafka/win32/interceptor_test/interceptor_test.vcxproj +87 -0
  666. package/deps/librdkafka/win32/librdkafka.autopkg.template +54 -0
  667. package/deps/librdkafka/win32/librdkafka.master.testing.targets +13 -0
  668. package/deps/librdkafka/win32/librdkafka.sln +226 -0
  669. package/deps/librdkafka/win32/librdkafka.vcxproj +276 -0
  670. package/deps/librdkafka/win32/librdkafkacpp/librdkafkacpp.vcxproj +104 -0
  671. package/deps/librdkafka/win32/msbuild.ps1 +15 -0
  672. package/deps/librdkafka/win32/openssl_engine_example/openssl_engine_example.vcxproj +132 -0
  673. package/deps/librdkafka/win32/package-zip.ps1 +46 -0
  674. package/deps/librdkafka/win32/packages/repositories.config +4 -0
  675. package/deps/librdkafka/win32/push-package.bat +4 -0
  676. package/deps/librdkafka/win32/rdkafka_complex_consumer_example_cpp/rdkafka_complex_consumer_example_cpp.vcxproj +67 -0
  677. package/deps/librdkafka/win32/rdkafka_example/rdkafka_example.vcxproj +97 -0
  678. package/deps/librdkafka/win32/rdkafka_performance/rdkafka_performance.vcxproj +97 -0
  679. package/deps/librdkafka/win32/setup-msys2.ps1 +47 -0
  680. package/deps/librdkafka/win32/setup-vcpkg.ps1 +34 -0
  681. package/deps/librdkafka/win32/tests/test.conf.example +25 -0
  682. package/deps/librdkafka/win32/tests/tests.vcxproj +253 -0
  683. package/deps/librdkafka/win32/win_ssl_cert_store/win_ssl_cert_store.vcxproj +132 -0
  684. package/deps/librdkafka/win32/wingetopt.c +564 -0
  685. package/deps/librdkafka/win32/wingetopt.h +101 -0
  686. package/deps/librdkafka/win32/wintime.h +33 -0
  687. package/deps/librdkafka.gyp +62 -0
  688. package/lib/admin.js +233 -0
  689. package/lib/client.js +573 -0
  690. package/lib/error.js +500 -0
  691. package/lib/index.js +34 -0
  692. package/lib/kafka-consumer-stream.js +397 -0
  693. package/lib/kafka-consumer.js +698 -0
  694. package/lib/producer/high-level-producer.js +323 -0
  695. package/lib/producer-stream.js +307 -0
  696. package/lib/producer.js +375 -0
  697. package/lib/tools/ref-counter.js +52 -0
  698. package/lib/topic-partition.js +88 -0
  699. package/lib/topic.js +42 -0
  700. package/lib/util.js +29 -0
  701. package/package.json +61 -0
  702. package/prebuilds/darwin-arm64/@point3+node-rdkafka.node +0 -0
  703. package/prebuilds/linux-x64/@point3+node-rdkafka.node +0 -0
  704. package/util/configure.js +30 -0
  705. package/util/get-env.js +6 -0
  706. package/util/test-compile.js +11 -0
  707. package/util/test-producer-delivery.js +100 -0
@@ -0,0 +1,1183 @@
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
+ * @brief Creates a new metadata cache entry.
257
+ *
258
+ * @param mdt Topic to insert in the cache entry.
259
+ * @param mdti Topic to insert in the cache entry (internal structure).
260
+ * @param include_racks Include partition racks.
261
+ *
262
+ * @return The new metadata cache entry, to free with `rd_free`.
263
+ */
264
+ static struct rd_kafka_metadata_cache_entry *rd_kafka_metadata_cache_entry_new(
265
+ const rd_kafka_metadata_topic_t *mtopic,
266
+ const rd_kafka_metadata_topic_internal_t *metadata_internal_topic,
267
+ rd_bool_t include_racks) {
268
+ struct rd_kafka_metadata_cache_entry *rkmce;
269
+ rd_tmpabuf_t tbuf;
270
+ int i;
271
+
272
+ /* Metadata is stored in one contigious buffer where structs and
273
+ * and pointed-to fields are layed out in a memory aligned fashion.
274
+ * rd_tmpabuf_t provides the infrastructure to do this.
275
+ * Because of this we copy all the structs verbatim but
276
+ * any pointer fields needs to be copied explicitly to update
277
+ * the pointer address.
278
+ * See also rd_kafka_metadata_cache_delete which frees this. */
279
+ rd_tmpabuf_new(&tbuf, 0, rd_true /*assert on fail*/);
280
+
281
+ rd_tmpabuf_add_alloc(&tbuf, sizeof(*rkmce));
282
+ rd_tmpabuf_add_alloc(&tbuf, strlen(mtopic->topic) + 1);
283
+ rd_tmpabuf_add_alloc(&tbuf, mtopic->partition_cnt *
284
+ sizeof(*mtopic->partitions));
285
+ rd_tmpabuf_add_alloc(&tbuf,
286
+ mtopic->partition_cnt *
287
+ sizeof(*metadata_internal_topic->partitions));
288
+
289
+ for (i = 0; include_racks && i < mtopic->partition_cnt; i++) {
290
+ size_t j;
291
+ rd_tmpabuf_add_alloc(
292
+ &tbuf, metadata_internal_topic->partitions[i].racks_cnt *
293
+ sizeof(char *));
294
+ for (j = 0;
295
+ j < metadata_internal_topic->partitions[i].racks_cnt;
296
+ j++) {
297
+ rd_tmpabuf_add_alloc(
298
+ &tbuf, strlen(metadata_internal_topic->partitions[i]
299
+ .racks[j]) +
300
+ 1);
301
+ }
302
+ }
303
+
304
+ rd_tmpabuf_finalize(&tbuf);
305
+
306
+ rkmce = rd_tmpabuf_alloc(&tbuf, sizeof(*rkmce));
307
+
308
+ rkmce->rkmce_mtopic = *mtopic;
309
+
310
+ rkmce->rkmce_metadata_internal_topic = *metadata_internal_topic;
311
+
312
+ /* Copy topic name and update pointer */
313
+ rkmce->rkmce_mtopic.topic = rd_tmpabuf_write_str(&tbuf, mtopic->topic);
314
+
315
+ /* Copy partition array and update pointer */
316
+ rkmce->rkmce_mtopic.partitions = rd_tmpabuf_write(
317
+ &tbuf, mtopic->partitions,
318
+ mtopic->partition_cnt * sizeof(*mtopic->partitions));
319
+
320
+ /* Copy partition array (internal) and update pointer */
321
+ rkmce->rkmce_metadata_internal_topic.partitions =
322
+ rd_tmpabuf_write(&tbuf, metadata_internal_topic->partitions,
323
+ mtopic->partition_cnt *
324
+ sizeof(*metadata_internal_topic->partitions));
325
+
326
+
327
+ /* Sort partitions for future bsearch() lookups. */
328
+ qsort(rkmce->rkmce_mtopic.partitions, rkmce->rkmce_mtopic.partition_cnt,
329
+ sizeof(*rkmce->rkmce_mtopic.partitions),
330
+ rd_kafka_metadata_partition_id_cmp);
331
+
332
+ /* partitions (internal) are already sorted. */
333
+
334
+ if (include_racks) {
335
+ for (i = 0; i < rkmce->rkmce_mtopic.partition_cnt; i++) {
336
+ size_t j;
337
+ rd_kafka_metadata_partition_t *mdp =
338
+ &rkmce->rkmce_mtopic.partitions[i];
339
+ rd_kafka_metadata_partition_internal_t *mdpi =
340
+ &rkmce->rkmce_metadata_internal_topic.partitions[i];
341
+ rd_kafka_metadata_partition_internal_t *mdpi_orig =
342
+ &metadata_internal_topic->partitions[i];
343
+
344
+ if (mdp->replica_cnt == 0 || mdpi->racks_cnt == 0)
345
+ continue;
346
+
347
+ mdpi->racks = rd_tmpabuf_alloc(
348
+ &tbuf, sizeof(char *) * mdpi->racks_cnt);
349
+ for (j = 0; j < mdpi_orig->racks_cnt; j++)
350
+ mdpi->racks[j] = rd_tmpabuf_write_str(
351
+ &tbuf, mdpi_orig->racks[j]);
352
+ }
353
+ }
354
+
355
+ /* Clear uncached fields. */
356
+ for (i = 0; i < mtopic->partition_cnt; i++) {
357
+ rkmce->rkmce_mtopic.partitions[i].replicas = NULL;
358
+ rkmce->rkmce_mtopic.partitions[i].replica_cnt = 0;
359
+ rkmce->rkmce_mtopic.partitions[i].isrs = NULL;
360
+ rkmce->rkmce_mtopic.partitions[i].isr_cnt = 0;
361
+ }
362
+
363
+ return rkmce;
364
+ }
365
+
366
+ /**
367
+ * @brief Add (and replace) cache entry for topic.
368
+ *
369
+ * @locks_required rd_kafka_wrlock()
370
+ */
371
+ static struct rd_kafka_metadata_cache_entry *
372
+ rd_kafka_metadata_cache_insert(rd_kafka_t *rk,
373
+ struct rd_kafka_metadata_cache_entry *rkmce,
374
+ rd_ts_t now,
375
+ rd_ts_t ts_expires) {
376
+ struct rd_kafka_metadata_cache_entry *old, *old_by_id = NULL;
377
+ TAILQ_INSERT_TAIL(&rk->rk_metadata_cache.rkmc_expiry, rkmce,
378
+ rkmce_link);
379
+ rk->rk_metadata_cache.rkmc_cnt++;
380
+ rkmce->rkmce_ts_expires = ts_expires;
381
+ rkmce->rkmce_ts_insert = now;
382
+
383
+ /* Insert (and replace existing) entry. */
384
+ old = RD_AVL_INSERT(&rk->rk_metadata_cache.rkmc_avl, rkmce,
385
+ rkmce_avlnode);
386
+ /* Insert (and replace existing) entry into the AVL tree sorted
387
+ * by topic id. */
388
+ if (!RD_KAFKA_UUID_IS_ZERO(
389
+ rkmce->rkmce_metadata_internal_topic.topic_id)) {
390
+ /* If topic id isn't zero insert cache entry into this tree */
391
+ old_by_id = RD_AVL_INSERT(&rk->rk_metadata_cache.rkmc_avl_by_id,
392
+ rkmce, rkmce_avlnode_by_id);
393
+ }
394
+ if (old &&
395
+ !RD_KAFKA_UUID_IS_ZERO(
396
+ old->rkmce_metadata_internal_topic.topic_id) &&
397
+ rd_kafka_Uuid_cmp(rkmce->rkmce_metadata_internal_topic.topic_id,
398
+ old->rkmce_metadata_internal_topic.topic_id) !=
399
+ 0) {
400
+ /* If it had a different topic id, remove it from the tree */
401
+ RD_AVL_REMOVE_ELM(&rk->rk_metadata_cache.rkmc_avl_by_id, old);
402
+ }
403
+ if (old) {
404
+ /* Delete and free old cache entry */
405
+ rd_kafka_metadata_cache_delete(rk, old, 0);
406
+ }
407
+ if (old_by_id && old_by_id != old) {
408
+ rd_dassert(
409
+ !*"Different cache entries for topic name and topic id");
410
+ }
411
+
412
+ /* Explicitly not freeing the tmpabuf since rkmce points to its
413
+ * memory. */
414
+ return rkmce;
415
+ }
416
+
417
+ /**
418
+ * @brief Add (and replace) cache entry for topic.
419
+ *
420
+ * This makes a copy of \p mtopic and \p metadata_internal_topic ,
421
+ *
422
+ * @locks_required rd_kafka_wrlock()
423
+ */
424
+ static struct rd_kafka_metadata_cache_entry *rd_kafka_metadata_cache_insert_new(
425
+ rd_kafka_t *rk,
426
+ const rd_kafka_metadata_topic_t *mtopic,
427
+ const rd_kafka_metadata_topic_internal_t *metadata_internal_topic,
428
+ rd_ts_t now,
429
+ rd_ts_t ts_expires,
430
+ rd_bool_t include_racks) {
431
+ /* Create entry */
432
+ struct rd_kafka_metadata_cache_entry *rkmce =
433
+ rd_kafka_metadata_cache_entry_new(mtopic, metadata_internal_topic,
434
+ include_racks);
435
+ /* Insert/replace entry */
436
+ return rd_kafka_metadata_cache_insert(rk, rkmce, now, ts_expires);
437
+ }
438
+
439
+ /**
440
+ * @brief Purge the metadata cache
441
+ *
442
+ * @locks_required rd_kafka_wrlock()
443
+ */
444
+ void rd_kafka_metadata_cache_purge(rd_kafka_t *rk, rd_bool_t purge_observers) {
445
+ struct rd_kafka_metadata_cache_entry *rkmce;
446
+ int was_empty = TAILQ_EMPTY(&rk->rk_metadata_cache.rkmc_expiry);
447
+
448
+ while ((rkmce = TAILQ_FIRST(&rk->rk_metadata_cache.rkmc_expiry)))
449
+ rd_kafka_metadata_cache_delete(rk, rkmce, 1);
450
+
451
+ rd_kafka_timer_stop(&rk->rk_timers,
452
+ &rk->rk_metadata_cache.rkmc_expiry_tmr, 1);
453
+
454
+ if (!was_empty)
455
+ rd_kafka_metadata_cache_propagate_changes(rk);
456
+
457
+ if (purge_observers)
458
+ rd_list_clear(&rk->rk_metadata_cache.rkmc_observers);
459
+ }
460
+
461
+
462
+ /**
463
+ * @brief Start or update the cache expiry timer.
464
+ * Typically done after a series of cache_topic_update()
465
+ *
466
+ * @locks rd_kafka_wrlock()
467
+ */
468
+ void rd_kafka_metadata_cache_expiry_start(rd_kafka_t *rk) {
469
+ struct rd_kafka_metadata_cache_entry *rkmce;
470
+
471
+ if ((rkmce = TAILQ_FIRST(&rk->rk_metadata_cache.rkmc_expiry)))
472
+ rd_kafka_timer_start(&rk->rk_timers,
473
+ &rk->rk_metadata_cache.rkmc_expiry_tmr,
474
+ rkmce->rkmce_ts_expires - rd_clock(),
475
+ rd_kafka_metadata_cache_evict_tmr_cb, rk);
476
+ }
477
+
478
+ #define rd_kafka_metadata_cache_topic_update_replace_partition( \
479
+ current_partition, new_partition, current_partition_cnt, \
480
+ new_partition_cnt, partition) \
481
+ ((partition) < (current_partition_cnt) && \
482
+ (partition) >= (new_partition_cnt) \
483
+ ? rd_false \
484
+ : (partition) < (new_partition_cnt) && \
485
+ (partition) >= (current_partition_cnt) \
486
+ ? rd_true \
487
+ : (new_partition).leader_epoch == -1 || \
488
+ (new_partition).leader_epoch >= \
489
+ (current_partition.leader_epoch));
490
+
491
+
492
+ static struct rd_kafka_metadata_cache_entry *
493
+ rd_kafka_metadata_cache_topic_update_merge_partitions(
494
+ rd_kafka_t *rk,
495
+ struct rd_kafka_metadata_cache_entry *rkmce_current,
496
+ const rd_kafka_metadata_topic_t *mdt,
497
+ const rd_kafka_metadata_topic_internal_t *mdti,
498
+ rd_bool_t include_racks,
499
+ rd_bool_t has_reliable_epochs) {
500
+ rd_tmpabuf_t tbuf;
501
+ struct rd_kafka_metadata_cache_entry *rkmce;
502
+ size_t i, current_partition_cnt, new_partition_cnt, partition_cnt;
503
+
504
+ if (!has_reliable_epochs || !rkmce_current ||
505
+ /* Different topic ids */
506
+ rd_kafka_Uuid_cmp(
507
+ mdti->topic_id,
508
+ rkmce_current->rkmce_metadata_internal_topic.topic_id) != 0) {
509
+ return rd_kafka_metadata_cache_entry_new(mdt, mdti,
510
+ include_racks);
511
+ }
512
+
513
+ current_partition_cnt = rkmce_current->rkmce_mtopic.partition_cnt;
514
+ new_partition_cnt = mdt->partition_cnt;
515
+ partition_cnt = RD_MAX(current_partition_cnt, new_partition_cnt);
516
+
517
+ rd_tmpabuf_new(&tbuf, sizeof(*rkmce), rd_true /*assert on fail*/);
518
+ rd_tmpabuf_add_alloc(&tbuf, sizeof(*rkmce));
519
+ rd_tmpabuf_add_alloc(&tbuf, strlen(mdt->topic) + 1);
520
+ rd_tmpabuf_add_alloc(&tbuf, partition_cnt * sizeof(*mdt->partitions));
521
+ rd_tmpabuf_add_alloc(&tbuf, partition_cnt * sizeof(*mdti->partitions));
522
+
523
+ for (i = 0; include_racks && i < partition_cnt; i++) {
524
+ size_t j;
525
+ rd_kafka_metadata_partition_internal_t *partition_internal;
526
+ rd_bool_t replace_partition =
527
+ rd_kafka_metadata_cache_topic_update_replace_partition(
528
+ rkmce_current->rkmce_metadata_internal_topic
529
+ .partitions[i],
530
+ mdti->partitions[i], current_partition_cnt,
531
+ new_partition_cnt, i);
532
+
533
+ partition_internal =
534
+ replace_partition
535
+ ? &mdti->partitions[i]
536
+ : &rkmce_current->rkmce_metadata_internal_topic
537
+ .partitions[i];
538
+ rd_tmpabuf_add_alloc(&tbuf, partition_internal->racks_cnt *
539
+ sizeof(char *));
540
+ for (j = 0; j < partition_internal->racks_cnt; j++) {
541
+ rd_tmpabuf_add_alloc(
542
+ &tbuf, strlen(partition_internal->racks[j]) + 1);
543
+ }
544
+ }
545
+
546
+ rd_tmpabuf_finalize(&tbuf);
547
+
548
+ rkmce = rd_tmpabuf_alloc(&tbuf, sizeof(*rkmce));
549
+
550
+ rkmce->rkmce_mtopic = *mdt;
551
+
552
+ rkmce->rkmce_metadata_internal_topic = *mdti;
553
+
554
+ /* Copy topic name */
555
+ rkmce->rkmce_mtopic.topic = rd_tmpabuf_write_str(&tbuf, mdt->topic);
556
+
557
+ /* Allocate partition array */
558
+ rkmce->rkmce_mtopic.partitions =
559
+ rd_tmpabuf_alloc(&tbuf, partition_cnt * sizeof(*mdt->partitions));
560
+
561
+ /* Allocate partition array (internal) */
562
+ rkmce->rkmce_metadata_internal_topic.partitions =
563
+ rd_tmpabuf_alloc(&tbuf, partition_cnt * sizeof(*mdti->partitions));
564
+
565
+ for (i = 0; i < partition_cnt; i++) {
566
+ struct rd_kafka_metadata_partition *partition;
567
+ rd_kafka_metadata_partition_internal_t *partition_internal;
568
+
569
+ rd_bool_t replace_partition =
570
+ rd_kafka_metadata_cache_topic_update_replace_partition(
571
+ rkmce_current->rkmce_metadata_internal_topic
572
+ .partitions[i],
573
+ mdti->partitions[i], current_partition_cnt,
574
+ new_partition_cnt, i);
575
+
576
+ if (replace_partition) {
577
+ partition = &mdt->partitions[i];
578
+ partition_internal = &mdti->partitions[i];
579
+ } else {
580
+ partition = &rkmce_current->rkmce_mtopic.partitions[i];
581
+ partition_internal =
582
+ &rkmce_current->rkmce_metadata_internal_topic
583
+ .partitions[i];
584
+ }
585
+
586
+ rkmce->rkmce_mtopic.partitions[i] = *partition;
587
+ rkmce->rkmce_metadata_internal_topic.partitions[i] =
588
+ *partition_internal;
589
+
590
+ if (include_racks) {
591
+ size_t j;
592
+ rkmce->rkmce_metadata_internal_topic.partitions[i]
593
+ .racks = rd_tmpabuf_alloc(
594
+ &tbuf,
595
+ partition_internal->racks_cnt * sizeof(char *));
596
+ rkmce->rkmce_metadata_internal_topic.partitions[i]
597
+ .racks_cnt = partition_internal->racks_cnt;
598
+ for (j = 0; j < partition_internal->racks_cnt; j++) {
599
+ rkmce->rkmce_metadata_internal_topic
600
+ .partitions[i]
601
+ .racks[j] = rd_tmpabuf_write_str(
602
+ &tbuf, partition_internal->racks[j]);
603
+ }
604
+ } else {
605
+ rkmce->rkmce_metadata_internal_topic.partitions[i]
606
+ .racks = NULL;
607
+ rkmce->rkmce_metadata_internal_topic.partitions[i]
608
+ .racks_cnt = 0;
609
+ }
610
+ }
611
+ return rkmce;
612
+ }
613
+
614
+ /**
615
+ * @brief Update the metadata cache for a single topic
616
+ * with the provided metadata.
617
+ *
618
+ * If the topic has a temporary error the existing entry is removed
619
+ * and no new entry is added, which avoids the topic to be
620
+ * suppressed in upcoming metadata requests because being in the cache.
621
+ * In other words: we want to re-query errored topics.
622
+ * If the broker reports ERR_UNKNOWN_TOPIC_OR_PART we add a negative cache
623
+ * entry with an low expiry time, this is so that client code (cgrp) knows
624
+ * the topic has been queried but did not exist, otherwise it would wait
625
+ * forever for the unknown topic to surface.
626
+ *
627
+ * For permanent errors (authorization failures), we keep
628
+ * the entry cached for metadata.max.age.ms.
629
+ *
630
+ * @param mdt Topic to insert in the cache entry.
631
+ * @param mdti Topic to insert in the cache entry (internal structure).
632
+ * @param propagate Propagate metadata cache changes now.
633
+ * @param include_racks Include partition racks.
634
+ * @param has_reliable_leader_epochs Comes from a broker with reliable leader
635
+ * epochs.
636
+ *
637
+ * @return 1 on metadata change, 0 when no change was applied
638
+ *
639
+ * @remark The cache expiry timer will not be updated/started,
640
+ * call rd_kafka_metadata_cache_expiry_start() instead.
641
+ *
642
+ * @locks rd_kafka_wrlock()
643
+ */
644
+ int rd_kafka_metadata_cache_topic_update(
645
+ rd_kafka_t *rk,
646
+ const rd_kafka_metadata_topic_t *mdt,
647
+ const rd_kafka_metadata_topic_internal_t *mdti,
648
+ rd_bool_t propagate,
649
+ rd_bool_t include_racks,
650
+ rd_bool_t has_reliable_leader_epochs) {
651
+ rd_ts_t now = rd_clock();
652
+ rd_ts_t ts_expires = now + (rk->rk_conf.metadata_max_age_ms * 1000);
653
+ int changed = 0;
654
+
655
+ if (likely(mdt->topic != NULL)) {
656
+ struct rd_kafka_metadata_cache_entry *rkmce,
657
+ *rkmce_current = NULL;
658
+ rd_kafka_metadata_topic_internal_t mdti_copy = *mdti;
659
+ switch (mdt->err) {
660
+ case RD_KAFKA_RESP_ERR_UNKNOWN_TOPIC_OR_PART:
661
+ /* Cache unknown topics for metadata.propagation.max.ms
662
+ * to allow the cgrp logic to find negative cache hits.
663
+ * and to avoid false reappearances of the topic
664
+ * after deletion. */
665
+ ts_expires = RD_MIN(ts_expires, now + (100 * 1000));
666
+
667
+ /* Continue */
668
+ case RD_KAFKA_RESP_ERR_NO_ERROR:
669
+ rkmce_current =
670
+ rd_kafka_metadata_cache_find(rk, mdt->topic, 1);
671
+ if (mdt->err ==
672
+ RD_KAFKA_RESP_ERR_UNKNOWN_TOPIC_OR_PART &&
673
+ rkmce_current &&
674
+ RD_KAFKA_UUID_IS_ZERO(mdti->topic_id) &&
675
+ !RD_KAFKA_UUID_IS_ZERO(
676
+ rkmce_current->rkmce_metadata_internal_topic
677
+ .topic_id)) {
678
+ /* Keep the existing topic id to detect
679
+ * if the same id is received again
680
+ * as existing */
681
+ mdti_copy.topic_id =
682
+ rkmce_current->rkmce_metadata_internal_topic
683
+ .topic_id;
684
+ }
685
+
686
+ /* Continue */
687
+ case RD_KAFKA_RESP_ERR_TOPIC_AUTHORIZATION_FAILED:
688
+ rkmce =
689
+ rd_kafka_metadata_cache_topic_update_merge_partitions(
690
+ rk, rkmce_current, mdt, &mdti_copy,
691
+ include_racks, has_reliable_leader_epochs);
692
+ /* Insert/replace entry */
693
+ rd_kafka_metadata_cache_insert(rk, rkmce, now,
694
+ ts_expires);
695
+ changed = 1;
696
+ break;
697
+ default:
698
+ break;
699
+ }
700
+ } else {
701
+ /* Cache entry found but no topic name:
702
+ * delete it. */
703
+ changed = rd_kafka_metadata_cache_delete_by_topic_id(
704
+ rk, mdti->topic_id);
705
+ }
706
+
707
+ if (changed && propagate)
708
+ rd_kafka_metadata_cache_propagate_changes(rk);
709
+
710
+ return changed;
711
+ }
712
+
713
+
714
+ /**
715
+ * @brief Remove cache hints for topics in \p topics
716
+ * This is done when the Metadata response has been parsed and
717
+ * replaced hints with existing topic information, thus this will
718
+ * only remove unmatched topics from the cache.
719
+ *
720
+ * @locks rd_kafka_wrlock()
721
+ */
722
+ void rd_kafka_metadata_cache_purge_hints(rd_kafka_t *rk,
723
+ const rd_list_t *topics) {
724
+ const char *topic;
725
+ int i;
726
+ int cnt = 0;
727
+
728
+ RD_LIST_FOREACH(topic, topics, i) {
729
+ struct rd_kafka_metadata_cache_entry *rkmce;
730
+
731
+ if (!(rkmce =
732
+ rd_kafka_metadata_cache_find(rk, topic, 0 /*any*/)) ||
733
+ RD_KAFKA_METADATA_CACHE_VALID(rkmce))
734
+ continue;
735
+
736
+ rd_kafka_metadata_cache_delete(rk, rkmce, 1 /*unlink avl*/);
737
+ cnt++;
738
+ }
739
+
740
+ if (cnt > 0) {
741
+ rd_kafka_dbg(rk, METADATA, "METADATA",
742
+ "Purged %d/%d cached topic hint(s)", cnt,
743
+ rd_list_cnt(topics));
744
+ rd_kafka_metadata_cache_propagate_changes(rk);
745
+ }
746
+ }
747
+
748
+ /**
749
+ * @brief Remove cache hints for topic ids in \p topic_ids
750
+ * This is done when the Metadata response has been parsed and
751
+ * replaced hints with existing topic information, thus this will
752
+ * only remove unmatched topics from the cache.
753
+ *
754
+ * @locks rd_kafka_wrlock()
755
+ */
756
+ void rd_kafka_metadata_cache_purge_hints_by_id(rd_kafka_t *rk,
757
+ const rd_list_t *topic_ids) {
758
+ const rd_kafka_Uuid_t *topic_id;
759
+ int i;
760
+ int cnt = 0;
761
+
762
+ RD_LIST_FOREACH(topic_id, topic_ids, i) {
763
+ struct rd_kafka_metadata_cache_entry *rkmce;
764
+
765
+ if (!(rkmce = rd_kafka_metadata_cache_find_by_id(rk, *topic_id,
766
+ 0 /*any*/)) ||
767
+ RD_KAFKA_METADATA_CACHE_VALID(rkmce))
768
+ continue;
769
+
770
+ rd_kafka_metadata_cache_delete(rk, rkmce, 1 /*unlink avl*/);
771
+ cnt++;
772
+ }
773
+
774
+ if (cnt > 0) {
775
+ rd_kafka_dbg(rk, METADATA, "METADATA",
776
+ "Purged %d/%d cached topic hint(s)", cnt,
777
+ rd_list_cnt(topic_ids));
778
+ rd_kafka_metadata_cache_propagate_changes(rk);
779
+ }
780
+ }
781
+
782
+
783
+ /**
784
+ * @brief Inserts a non-valid entry for topics in \p topics indicating
785
+ * that a MetadataRequest is in progress.
786
+ * This avoids sending multiple MetadataRequests for the same topics
787
+ * if there are already outstanding requests, see
788
+ * \c rd_kafka_metadata_refresh_topics().
789
+ *
790
+ * @remark These non-valid cache entries' expire time is set to the
791
+ * MetadataRequest timeout.
792
+ *
793
+ * @param dst rd_list_t(char *topicname): if not NULL: populated with
794
+ * topics that were added as hints to cache, e.q., topics to query.
795
+ * @param dst rd_list_t(char *topicname)
796
+ * @param err is the error to set on hint cache entries,
797
+ * typically ERR__WAIT_CACHE.
798
+ *
799
+ * @returns the number of topic hints inserted.
800
+ *
801
+ * @locks_required rd_kafka_wrlock()
802
+ */
803
+ int rd_kafka_metadata_cache_hint(rd_kafka_t *rk,
804
+ const rd_list_t *topics,
805
+ rd_list_t *dst,
806
+ rd_kafka_resp_err_t err) {
807
+ const char *topic;
808
+ rd_ts_t now = rd_clock();
809
+ rd_ts_t ts_expires = now + (rk->rk_conf.socket_timeout_ms * 1000);
810
+ int i;
811
+ int cnt = 0;
812
+
813
+ RD_LIST_FOREACH(topic, topics, i) {
814
+ rd_kafka_metadata_topic_t mtopic = {.topic = (char *)topic,
815
+ .err = err};
816
+ rd_kafka_metadata_topic_internal_t metadata_internal_topic =
817
+ RD_ZERO_INIT;
818
+ /*const*/ struct rd_kafka_metadata_cache_entry *rkmce;
819
+
820
+ if ((rkmce =
821
+ rd_kafka_metadata_cache_find(rk, topic, 0 /*any*/))) {
822
+ if (RD_KAFKA_METADATA_CACHE_VALID(rkmce) ||
823
+ (dst && rkmce->rkmce_mtopic.err !=
824
+ RD_KAFKA_RESP_ERR__NOENT))
825
+ continue;
826
+ rkmce->rkmce_mtopic.err = err;
827
+ /* FALLTHRU */
828
+ }
829
+
830
+ rd_kafka_metadata_cache_insert_new(rk, &mtopic,
831
+ &metadata_internal_topic,
832
+ now, ts_expires, rd_false);
833
+ cnt++;
834
+
835
+ if (dst)
836
+ rd_list_add(dst, rd_strdup(topic));
837
+ }
838
+
839
+ if (cnt > 0)
840
+ rd_kafka_dbg(rk, METADATA, "METADATA",
841
+ "Hinted cache of %d/%d topic(s) being queried",
842
+ cnt, rd_list_cnt(topics));
843
+
844
+ return cnt;
845
+ }
846
+
847
+
848
+ /**
849
+ * @brief Same as rd_kafka_metadata_cache_hint() but takes
850
+ * a topic+partition list as input instead.
851
+ *
852
+ * @locks_acquired rd_kafka_wrlock()
853
+ */
854
+ int rd_kafka_metadata_cache_hint_rktparlist(
855
+ rd_kafka_t *rk,
856
+ const rd_kafka_topic_partition_list_t *rktparlist,
857
+ rd_list_t *dst) {
858
+ rd_list_t topics;
859
+ int r;
860
+
861
+ rd_list_init(&topics, rktparlist->cnt, rd_free);
862
+ rd_kafka_topic_partition_list_get_topic_names(rktparlist, &topics,
863
+ 0 /*dont include regex*/);
864
+ rd_kafka_wrlock(rk);
865
+ r = rd_kafka_metadata_cache_hint(rk, &topics, dst,
866
+ RD_KAFKA_RESP_ERR__WAIT_CACHE);
867
+ rd_kafka_wrunlock(rk);
868
+
869
+ rd_list_destroy(&topics);
870
+ return r;
871
+ }
872
+
873
+
874
+ /**
875
+ * @brief Cache entry comparator (on topic name)
876
+ */
877
+ static int rd_kafka_metadata_cache_entry_cmp(const void *_a, const void *_b) {
878
+ const struct rd_kafka_metadata_cache_entry *a = _a, *b = _b;
879
+ return strcmp(a->rkmce_mtopic.topic, b->rkmce_mtopic.topic);
880
+ }
881
+
882
+ /**
883
+ * @brief Cache entry comparator (on topic id)
884
+ */
885
+ static int rd_kafka_metadata_cache_entry_by_id_cmp(const void *_a,
886
+ const void *_b) {
887
+ const struct rd_kafka_metadata_cache_entry *a = _a, *b = _b;
888
+ return rd_kafka_Uuid_cmp(a->rkmce_metadata_internal_topic.topic_id,
889
+ b->rkmce_metadata_internal_topic.topic_id);
890
+ }
891
+
892
+
893
+ /**
894
+ * @brief Initialize the metadata cache
895
+ *
896
+ * @locks rd_kafka_wrlock()
897
+ */
898
+ void rd_kafka_metadata_cache_init(rd_kafka_t *rk) {
899
+ rd_avl_init(&rk->rk_metadata_cache.rkmc_avl,
900
+ rd_kafka_metadata_cache_entry_cmp, 0);
901
+ rd_avl_init(&rk->rk_metadata_cache.rkmc_avl_by_id,
902
+ rd_kafka_metadata_cache_entry_by_id_cmp, 0);
903
+ TAILQ_INIT(&rk->rk_metadata_cache.rkmc_expiry);
904
+ mtx_init(&rk->rk_metadata_cache.rkmc_full_lock, mtx_plain);
905
+ mtx_init(&rk->rk_metadata_cache.rkmc_cnd_lock, mtx_plain);
906
+ cnd_init(&rk->rk_metadata_cache.rkmc_cnd);
907
+ rd_list_init(&rk->rk_metadata_cache.rkmc_observers, 8,
908
+ rd_kafka_enq_once_trigger_destroy);
909
+ }
910
+
911
+ /**
912
+ * @brief Purge and destroy metadata cache.
913
+ *
914
+ * @locks_required rd_kafka_wrlock()
915
+ */
916
+ void rd_kafka_metadata_cache_destroy(rd_kafka_t *rk) {
917
+ rd_list_destroy(&rk->rk_metadata_cache.rkmc_observers);
918
+ rd_kafka_timer_stop(&rk->rk_timers,
919
+ &rk->rk_metadata_cache.rkmc_query_tmr, 1 /*lock*/);
920
+ rd_kafka_metadata_cache_purge(rk, rd_true /*observers too*/);
921
+ mtx_destroy(&rk->rk_metadata_cache.rkmc_full_lock);
922
+ mtx_destroy(&rk->rk_metadata_cache.rkmc_cnd_lock);
923
+ cnd_destroy(&rk->rk_metadata_cache.rkmc_cnd);
924
+ rd_avl_destroy(&rk->rk_metadata_cache.rkmc_avl);
925
+ rd_avl_destroy(&rk->rk_metadata_cache.rkmc_avl_by_id);
926
+ }
927
+
928
+
929
+
930
+ /**
931
+ * @brief Add eonce to list of async cache observers.
932
+ *
933
+ * @locks_required rd_kafka_wrlock()
934
+ */
935
+ void rd_kafka_metadata_cache_wait_state_change_async(
936
+ rd_kafka_t *rk,
937
+ rd_kafka_enq_once_t *eonce) {
938
+ rd_kafka_enq_once_add_source(eonce, "wait metadata cache change");
939
+ rd_list_add(&rk->rk_metadata_cache.rkmc_observers, eonce);
940
+ }
941
+
942
+
943
+ /**
944
+ * @brief Wait for cache update, or timeout.
945
+ *
946
+ * @returns 1 on cache update or 0 on timeout.
947
+ * @locks none
948
+ * @locality any
949
+ */
950
+ int rd_kafka_metadata_cache_wait_change(rd_kafka_t *rk, int timeout_ms) {
951
+ int r;
952
+ #if ENABLE_DEVEL
953
+ rd_ts_t ts_start = rd_clock();
954
+ #endif
955
+ mtx_lock(&rk->rk_metadata_cache.rkmc_cnd_lock);
956
+ r = cnd_timedwait_ms(&rk->rk_metadata_cache.rkmc_cnd,
957
+ &rk->rk_metadata_cache.rkmc_cnd_lock, timeout_ms);
958
+ mtx_unlock(&rk->rk_metadata_cache.rkmc_cnd_lock);
959
+
960
+ #if ENABLE_DEVEL
961
+ rd_kafka_dbg(rk, METADATA, "CACHEWAIT", "%s wait took %dms: %s",
962
+ __FUNCTION__, (int)((rd_clock() - ts_start) / 1000),
963
+ r == thrd_success ? "succeeded" : "timed out");
964
+ #endif
965
+ return r == thrd_success;
966
+ }
967
+
968
+
969
+ /**
970
+ * @brief eonce trigger callback for rd_list_apply() call in
971
+ * rd_kafka_metadata_cache_propagate_changes()
972
+ */
973
+ static int
974
+ rd_kafka_metadata_cache_propagate_changes_trigger_eonce(void *elem,
975
+ void *opaque) {
976
+ rd_kafka_enq_once_t *eonce = elem;
977
+ rd_kafka_enq_once_trigger(eonce, RD_KAFKA_RESP_ERR_NO_ERROR,
978
+ "wait metadata cache change");
979
+ return 0; /* remove eonce from list */
980
+ }
981
+
982
+
983
+ /**
984
+ * @brief Propagate that the cache changed (but not what changed) to
985
+ * any cnd listeners and eonce observers.
986
+ * @locks_required rd_kafka_wrlock(rk)
987
+ * @locks_acquired rkmc_cnd_lock
988
+ * @locality any
989
+ */
990
+ void rd_kafka_metadata_cache_propagate_changes(rd_kafka_t *rk) {
991
+ mtx_lock(&rk->rk_metadata_cache.rkmc_cnd_lock);
992
+ cnd_broadcast(&rk->rk_metadata_cache.rkmc_cnd);
993
+ mtx_unlock(&rk->rk_metadata_cache.rkmc_cnd_lock);
994
+
995
+ /* Trigger observers */
996
+ rd_list_apply(&rk->rk_metadata_cache.rkmc_observers,
997
+ rd_kafka_metadata_cache_propagate_changes_trigger_eonce,
998
+ NULL);
999
+ }
1000
+
1001
+ /**
1002
+ * @param mdtip If non NULL, it's set to a pointer to internal topic metadata,
1003
+ * or to NULL if not found in cache.
1004
+ * @returns the shared metadata for a topic, or NULL if not found in
1005
+ * cache.
1006
+ *
1007
+ * @locks rd_kafka_*lock()
1008
+ */
1009
+ const rd_kafka_metadata_topic_t *rd_kafka_metadata_cache_topic_get(
1010
+ rd_kafka_t *rk,
1011
+ const char *topic,
1012
+ const rd_kafka_metadata_topic_internal_t **mdtip,
1013
+ int valid) {
1014
+ struct rd_kafka_metadata_cache_entry *rkmce;
1015
+
1016
+ if (!(rkmce = rd_kafka_metadata_cache_find(rk, topic, valid))) {
1017
+ if (mdtip)
1018
+ *mdtip = NULL;
1019
+ return NULL;
1020
+ }
1021
+ if (mdtip)
1022
+ *mdtip = &rkmce->rkmce_metadata_internal_topic;
1023
+ return &rkmce->rkmce_mtopic;
1024
+ }
1025
+
1026
+
1027
+
1028
+ /**
1029
+ * @brief Looks up the shared metadata for a partition along with its topic.
1030
+ *
1031
+ * Cache entries with errors (such as auth errors) will not be returned unless
1032
+ * \p valid is set to false.
1033
+ *
1034
+ * @param mtopicp: pointer to topic metadata
1035
+ * @param mpartp: pointer to partition metadata
1036
+ * @param mdpip: pointer to internal partition metadata
1037
+ * @param valid: only return valid entries (no hints)
1038
+ *
1039
+ * @returns -1 if topic was not found in cache, 0 if topic was found
1040
+ * but not the partition, 1 if both topic and partition was found.
1041
+ *
1042
+ * @locks rd_kafka_*lock()
1043
+ */
1044
+ int rd_kafka_metadata_cache_topic_partition_get(
1045
+ rd_kafka_t *rk,
1046
+ const rd_kafka_metadata_topic_t **mtopicp,
1047
+ const rd_kafka_metadata_partition_t **mpartp,
1048
+ const rd_kafka_metadata_partition_internal_t **mdpip,
1049
+ const char *topic,
1050
+ int32_t partition,
1051
+ int valid) {
1052
+
1053
+ const rd_kafka_metadata_topic_t *mtopic;
1054
+ const rd_kafka_metadata_topic_internal_t *mdti;
1055
+ const rd_kafka_metadata_partition_t *mpart;
1056
+ rd_kafka_metadata_partition_t skel = {.id = partition};
1057
+
1058
+ *mtopicp = NULL;
1059
+ *mpartp = NULL;
1060
+ *mdpip = NULL;
1061
+
1062
+ if (!(mtopic =
1063
+ rd_kafka_metadata_cache_topic_get(rk, topic, &mdti, valid)))
1064
+ return -1;
1065
+
1066
+ *mtopicp = mtopic;
1067
+
1068
+ if (mtopic->err)
1069
+ return -1;
1070
+
1071
+ /* Partitions array may be sparse so use bsearch lookup. */
1072
+ mpart = bsearch(&skel, mtopic->partitions, mtopic->partition_cnt,
1073
+ sizeof(*mtopic->partitions),
1074
+ rd_kafka_metadata_partition_id_cmp);
1075
+
1076
+ if (!mpart)
1077
+ return 0;
1078
+
1079
+ *mpartp = mpart;
1080
+ if (mdpip)
1081
+ *mdpip = &mdti->partitions[mpart->id];
1082
+
1083
+ return 1;
1084
+ }
1085
+
1086
+
1087
+ /**
1088
+ * @returns the number of topics in \p topics that are in the cache.
1089
+ *
1090
+ * @param topics rd_list(const char *): topic names
1091
+ * @param metadata_agep: age of oldest entry will be returned.
1092
+ *
1093
+ * @locks rd_kafka_*lock()
1094
+ */
1095
+ int rd_kafka_metadata_cache_topics_count_exists(rd_kafka_t *rk,
1096
+ const rd_list_t *topics,
1097
+ int *metadata_agep) {
1098
+ const char *topic;
1099
+ int i;
1100
+ int cnt = 0;
1101
+ int max_age = -1;
1102
+
1103
+ RD_LIST_FOREACH(topic, topics, i) {
1104
+ const struct rd_kafka_metadata_cache_entry *rkmce;
1105
+ int age;
1106
+
1107
+ if (!(rkmce = rd_kafka_metadata_cache_find(rk, topic,
1108
+ 1 /*valid only*/)))
1109
+ continue;
1110
+
1111
+ age = (int)((rd_clock() - rkmce->rkmce_ts_insert) / 1000);
1112
+ if (age > max_age)
1113
+ max_age = age;
1114
+ cnt++;
1115
+ }
1116
+
1117
+ *metadata_agep = max_age;
1118
+
1119
+ return cnt;
1120
+ }
1121
+
1122
+
1123
+ /**
1124
+ * @brief Add all topics in the metadata cache to \p topics, avoid duplicates.
1125
+ *
1126
+ * Element type is (char *topic_name).
1127
+ *
1128
+ * @param exclude_valid Exclude topics that have up to date metadata info.
1129
+ *
1130
+ * @returns the number of elements added to \p topics
1131
+ *
1132
+ * @locks_required rd_kafka_*lock()
1133
+ */
1134
+ int rd_kafka_metadata_cache_topics_to_list(rd_kafka_t *rk,
1135
+ rd_list_t *topics,
1136
+ rd_bool_t exclude_valid) {
1137
+ const struct rd_kafka_metadata_cache_entry *rkmce;
1138
+ int precnt = rd_list_cnt(topics);
1139
+
1140
+ TAILQ_FOREACH(rkmce, &rk->rk_metadata_cache.rkmc_expiry, rkmce_link) {
1141
+ /* Ignore topics that have up to date metadata info */
1142
+ if (exclude_valid && RD_KAFKA_METADATA_CACHE_VALID(rkmce))
1143
+ continue;
1144
+
1145
+ if (rd_list_find(topics, rkmce->rkmce_mtopic.topic,
1146
+ rd_list_cmp_str))
1147
+ continue;
1148
+
1149
+ rd_list_add(topics, rd_strdup(rkmce->rkmce_mtopic.topic));
1150
+ }
1151
+
1152
+ return rd_list_cnt(topics) - precnt;
1153
+ }
1154
+
1155
+
1156
+ /**
1157
+ * @brief Dump cache to \p fp
1158
+ *
1159
+ * @locks rd_kafka_*lock()
1160
+ */
1161
+ void rd_kafka_metadata_cache_dump(FILE *fp, rd_kafka_t *rk) {
1162
+ const struct rd_kafka_metadata_cache *rkmc = &rk->rk_metadata_cache;
1163
+ const struct rd_kafka_metadata_cache_entry *rkmce;
1164
+ rd_ts_t now = rd_clock();
1165
+
1166
+ fprintf(fp, "Metadata cache with %d entries:\n", rkmc->rkmc_cnt);
1167
+ TAILQ_FOREACH(rkmce, &rkmc->rkmc_expiry, rkmce_link) {
1168
+ fprintf(fp,
1169
+ " %s (inserted %dms ago, expires in %dms, "
1170
+ "%d partition(s), %s)%s%s\n",
1171
+ rkmce->rkmce_mtopic.topic,
1172
+ (int)((now - rkmce->rkmce_ts_insert) / 1000),
1173
+ (int)((rkmce->rkmce_ts_expires - now) / 1000),
1174
+ rkmce->rkmce_mtopic.partition_cnt,
1175
+ RD_KAFKA_METADATA_CACHE_VALID(rkmce) ? "valid" : "hint",
1176
+ rkmce->rkmce_mtopic.err ? " error: " : "",
1177
+ rkmce->rkmce_mtopic.err
1178
+ ? rd_kafka_err2str(rkmce->rkmce_mtopic.err)
1179
+ : "");
1180
+ }
1181
+ }
1182
+
1183
+ /**@}*/