@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,1230 @@
1
+ /*
2
+ * librdkafka - The Apache Kafka C/C++ library
3
+ *
4
+ * Copyright (c) 2016-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
+ #include "rdkafka_int.h"
31
+ #include "rdkafka_offset.h"
32
+ #include "rdkafka_topic.h"
33
+ #include "rdkafka_interceptor.h"
34
+
35
+ int RD_TLS rd_kafka_yield_thread = 0;
36
+
37
+ void rd_kafka_yield(rd_kafka_t *rk) {
38
+ rd_kafka_yield_thread = 1;
39
+ }
40
+
41
+
42
+ /**
43
+ * @brief Check and reset yield flag.
44
+ * @returns rd_true if caller should yield, otherwise rd_false.
45
+ * @remarks rkq_lock MUST be held
46
+ */
47
+ static RD_INLINE rd_bool_t rd_kafka_q_check_yield(rd_kafka_q_t *rkq) {
48
+ if (!(rkq->rkq_flags & RD_KAFKA_Q_F_YIELD))
49
+ return rd_false;
50
+
51
+ rkq->rkq_flags &= ~RD_KAFKA_Q_F_YIELD;
52
+ return rd_true;
53
+ }
54
+ /**
55
+ * Destroy a queue. refcnt must be at zero.
56
+ */
57
+ void rd_kafka_q_destroy_final(rd_kafka_q_t *rkq) {
58
+
59
+ mtx_lock(&rkq->rkq_lock);
60
+ if (unlikely(rkq->rkq_qio != NULL)) {
61
+ rd_free(rkq->rkq_qio);
62
+ rkq->rkq_qio = NULL;
63
+ }
64
+ /* Queue must have been disabled prior to final destruction,
65
+ * this is to catch the case where the queue owner/poll does not
66
+ * use rd_kafka_q_destroy_owner(). */
67
+ rd_dassert(!(rkq->rkq_flags & RD_KAFKA_Q_F_READY));
68
+ rd_kafka_q_disable0(rkq, 0 /*no-lock*/); /* for the non-devel case */
69
+ rd_kafka_q_fwd_set0(rkq, NULL, 0 /*no-lock*/, 0 /*no-fwd-app*/);
70
+ rd_kafka_q_purge0(rkq, 0 /*no-lock*/);
71
+ assert(!rkq->rkq_fwdq);
72
+ mtx_unlock(&rkq->rkq_lock);
73
+ mtx_destroy(&rkq->rkq_lock);
74
+ cnd_destroy(&rkq->rkq_cond);
75
+
76
+ if (rkq->rkq_flags & RD_KAFKA_Q_F_ALLOCATED)
77
+ rd_free(rkq);
78
+ }
79
+
80
+
81
+
82
+ /**
83
+ * Initialize a queue.
84
+ */
85
+ void rd_kafka_q_init0(rd_kafka_q_t *rkq,
86
+ rd_kafka_t *rk,
87
+ rd_bool_t for_consume,
88
+ const char *func,
89
+ int line) {
90
+ rd_kafka_q_reset(rkq);
91
+ rkq->rkq_fwdq = NULL;
92
+ rkq->rkq_refcnt = 1;
93
+ rkq->rkq_flags = RD_KAFKA_Q_F_READY;
94
+ if (for_consume)
95
+ rkq->rkq_flags |= RD_KAFKA_Q_F_CONSUMER;
96
+ rkq->rkq_rk = rk;
97
+ rkq->rkq_qio = NULL;
98
+ rkq->rkq_serve = NULL;
99
+ rkq->rkq_opaque = NULL;
100
+ rkq->rkq_ts_last_poll_start = 0;
101
+ rkq->rkq_ts_last_poll_end = 0;
102
+ mtx_init(&rkq->rkq_lock, mtx_plain);
103
+ cnd_init(&rkq->rkq_cond);
104
+ #if ENABLE_DEVEL
105
+ rd_snprintf(rkq->rkq_name, sizeof(rkq->rkq_name), "%s:%d", func, line);
106
+ #else
107
+ rkq->rkq_name = func;
108
+ #endif
109
+ }
110
+
111
+
112
+ /**
113
+ * Allocate a new queue and initialize it.
114
+ */
115
+ rd_kafka_q_t *rd_kafka_q_new0(rd_kafka_t *rk,
116
+ rd_bool_t for_consume,
117
+ const char *func,
118
+ int line) {
119
+ rd_kafka_q_t *rkq = rd_malloc(sizeof(*rkq));
120
+ if (!for_consume)
121
+ rd_kafka_q_init(rkq, rk);
122
+ else
123
+ rd_kafka_consume_q_init(rkq, rk);
124
+ rkq->rkq_flags |= RD_KAFKA_Q_F_ALLOCATED;
125
+ #if ENABLE_DEVEL
126
+ rd_snprintf(rkq->rkq_name, sizeof(rkq->rkq_name), "%s:%d", func, line);
127
+ #else
128
+ rkq->rkq_name = func;
129
+ #endif
130
+ return rkq;
131
+ }
132
+
133
+ /*
134
+ * Sets the flag RD_KAFKA_Q_F_CONSUMER for rkq, any queues it's being forwarded
135
+ * to, recursively.
136
+ * Setting this flag indicates that polling this queue is equivalent to calling
137
+ * consumer poll, and will reset the max.poll.interval.ms timer. Only used
138
+ * internally when forwarding queues.
139
+ * @locks rd_kafka_q_lock(rkq)
140
+ */
141
+ static void rd_kafka_q_consumer_propagate(rd_kafka_q_t *rkq) {
142
+ mtx_lock(&rkq->rkq_lock);
143
+ rkq->rkq_flags |= RD_KAFKA_Q_F_CONSUMER;
144
+
145
+ if (!rkq->rkq_fwdq) {
146
+ mtx_unlock(&rkq->rkq_lock);
147
+ return;
148
+ }
149
+
150
+ /* Recursively propagate the flag to any queues rkq is already
151
+ * forwarding to. There will be a deadlock here if the queues are being
152
+ * forwarded circularly, but that is a user error. We can't resolve this
153
+ * deadlock by unlocking before the recursive call, because that leads
154
+ * to incorrectness if the rkq_fwdq is forwarded elsewhere and the old
155
+ * one destroyed between recursive calls. */
156
+ rd_kafka_q_consumer_propagate(rkq->rkq_fwdq);
157
+ mtx_unlock(&rkq->rkq_lock);
158
+ }
159
+
160
+ /**
161
+ * Set/clear forward queue.
162
+ * Queue forwarding enables message routing inside rdkafka.
163
+ * Typical use is to re-route all fetched messages for all partitions
164
+ * to one single queue.
165
+ *
166
+ * All access to rkq_fwdq are protected by rkq_lock.
167
+ */
168
+ void rd_kafka_q_fwd_set0(rd_kafka_q_t *srcq,
169
+ rd_kafka_q_t *destq,
170
+ int do_lock,
171
+ int fwd_app) {
172
+ if (unlikely(srcq == destq))
173
+ return;
174
+
175
+ if (do_lock)
176
+ mtx_lock(&srcq->rkq_lock);
177
+ if (fwd_app)
178
+ srcq->rkq_flags |= RD_KAFKA_Q_F_FWD_APP;
179
+ if (srcq->rkq_fwdq) {
180
+ rd_kafka_q_destroy(srcq->rkq_fwdq);
181
+ srcq->rkq_fwdq = NULL;
182
+ }
183
+ if (destq) {
184
+ rd_kafka_q_keep(destq);
185
+
186
+ /* If rkq has ops in queue, append them to fwdq's queue.
187
+ * This is an irreversible operation. */
188
+ if (srcq->rkq_qlen > 0) {
189
+ rd_dassert(destq->rkq_flags & RD_KAFKA_Q_F_READY);
190
+ rd_kafka_q_concat(destq, srcq);
191
+ }
192
+
193
+ srcq->rkq_fwdq = destq;
194
+
195
+ if (srcq->rkq_flags & RD_KAFKA_Q_F_CONSUMER)
196
+ rd_kafka_q_consumer_propagate(destq);
197
+ }
198
+ if (do_lock)
199
+ mtx_unlock(&srcq->rkq_lock);
200
+ }
201
+
202
+ /**
203
+ * Purge all entries from a queue.
204
+ */
205
+ int rd_kafka_q_purge0(rd_kafka_q_t *rkq, int do_lock) {
206
+ rd_kafka_op_t *rko, *next;
207
+ TAILQ_HEAD(, rd_kafka_op_s) tmpq = TAILQ_HEAD_INITIALIZER(tmpq);
208
+ rd_kafka_q_t *fwdq;
209
+ int cnt = 0;
210
+
211
+ if (do_lock)
212
+ mtx_lock(&rkq->rkq_lock);
213
+
214
+ if ((fwdq = rd_kafka_q_fwd_get(rkq, 0))) {
215
+ if (do_lock)
216
+ mtx_unlock(&rkq->rkq_lock);
217
+ cnt = rd_kafka_q_purge(fwdq);
218
+ rd_kafka_q_destroy(fwdq);
219
+ return cnt;
220
+ }
221
+
222
+ /* Move ops queue to tmpq to avoid lock-order issue
223
+ * by locks taken from rd_kafka_op_destroy(). */
224
+ TAILQ_MOVE(&tmpq, &rkq->rkq_q, rko_link);
225
+
226
+ rd_kafka_q_mark_served(rkq);
227
+
228
+ /* Zero out queue */
229
+ rd_kafka_q_reset(rkq);
230
+
231
+ if (do_lock)
232
+ mtx_unlock(&rkq->rkq_lock);
233
+
234
+ /* Destroy the ops */
235
+ next = TAILQ_FIRST(&tmpq);
236
+ while ((rko = next)) {
237
+ next = TAILQ_NEXT(next, rko_link);
238
+ rd_kafka_op_destroy(rko);
239
+ cnt++;
240
+ }
241
+
242
+ return cnt;
243
+ }
244
+
245
+
246
+ /**
247
+ * Purge all entries from a queue with a rktp version smaller than `version`
248
+ * This shaves off the head of the queue, up until the first rko with
249
+ * a non-matching rktp or version.
250
+ */
251
+ void rd_kafka_q_purge_toppar_version(rd_kafka_q_t *rkq,
252
+ rd_kafka_toppar_t *rktp,
253
+ int version) {
254
+ rd_kafka_op_t *rko, *next;
255
+ TAILQ_HEAD(, rd_kafka_op_s) tmpq = TAILQ_HEAD_INITIALIZER(tmpq);
256
+ int32_t cnt = 0;
257
+ int64_t size = 0;
258
+ rd_kafka_q_t *fwdq;
259
+
260
+ mtx_lock(&rkq->rkq_lock);
261
+
262
+ if ((fwdq = rd_kafka_q_fwd_get(rkq, 0))) {
263
+ mtx_unlock(&rkq->rkq_lock);
264
+ rd_kafka_q_purge_toppar_version(fwdq, rktp, version);
265
+ rd_kafka_q_destroy(fwdq);
266
+ return;
267
+ }
268
+
269
+ /* Move ops to temporary queue and then destroy them from there
270
+ * without locks to avoid lock-ordering problems in op_destroy() */
271
+ while ((rko = TAILQ_FIRST(&rkq->rkq_q)) && rko->rko_rktp &&
272
+ rko->rko_rktp == rktp && rko->rko_version < version) {
273
+ TAILQ_REMOVE(&rkq->rkq_q, rko, rko_link);
274
+ TAILQ_INSERT_TAIL(&tmpq, rko, rko_link);
275
+ cnt++;
276
+ size += rko->rko_len;
277
+ }
278
+
279
+ rd_kafka_q_mark_served(rkq);
280
+
281
+ rkq->rkq_qlen -= cnt;
282
+ rkq->rkq_qsize -= size;
283
+ mtx_unlock(&rkq->rkq_lock);
284
+
285
+ next = TAILQ_FIRST(&tmpq);
286
+ while ((rko = next)) {
287
+ next = TAILQ_NEXT(next, rko_link);
288
+ rd_kafka_op_destroy(rko);
289
+ }
290
+ }
291
+
292
+
293
+ /**
294
+ * Move 'cnt' entries from 'srcq' to 'dstq'.
295
+ * If 'cnt' == -1 all entries will be moved.
296
+ * Returns the number of entries moved.
297
+ */
298
+ int rd_kafka_q_move_cnt(rd_kafka_q_t *dstq,
299
+ rd_kafka_q_t *srcq,
300
+ int cnt,
301
+ int do_locks) {
302
+ rd_kafka_op_t *rko;
303
+ int mcnt = 0;
304
+
305
+ if (do_locks) {
306
+ mtx_lock(&srcq->rkq_lock);
307
+ mtx_lock(&dstq->rkq_lock);
308
+ }
309
+
310
+ if (!dstq->rkq_fwdq && !srcq->rkq_fwdq) {
311
+ if (cnt > 0 && dstq->rkq_qlen == 0)
312
+ rd_kafka_q_io_event(dstq);
313
+
314
+ /* Optimization, if 'cnt' is equal/larger than all
315
+ * items of 'srcq' we can move the entire queue. */
316
+ if (cnt == -1 || cnt >= (int)srcq->rkq_qlen) {
317
+ mcnt = srcq->rkq_qlen;
318
+ rd_kafka_q_concat0(dstq, srcq, 0 /*no-lock*/);
319
+ } else {
320
+ while (mcnt < cnt &&
321
+ (rko = TAILQ_FIRST(&srcq->rkq_q))) {
322
+ TAILQ_REMOVE(&srcq->rkq_q, rko, rko_link);
323
+ if (likely(!rko->rko_prio))
324
+ TAILQ_INSERT_TAIL(&dstq->rkq_q, rko,
325
+ rko_link);
326
+ else
327
+ TAILQ_INSERT_SORTED(
328
+ &dstq->rkq_q, rko, rd_kafka_op_t *,
329
+ rko_link, rd_kafka_op_cmp_prio);
330
+
331
+ srcq->rkq_qlen--;
332
+ dstq->rkq_qlen++;
333
+ srcq->rkq_qsize -= rko->rko_len;
334
+ dstq->rkq_qsize += rko->rko_len;
335
+ mcnt++;
336
+ }
337
+ }
338
+
339
+ rd_kafka_q_mark_served(srcq);
340
+
341
+ } else
342
+ mcnt = rd_kafka_q_move_cnt(
343
+ dstq->rkq_fwdq ? dstq->rkq_fwdq : dstq,
344
+ srcq->rkq_fwdq ? srcq->rkq_fwdq : srcq, cnt, do_locks);
345
+
346
+ if (do_locks) {
347
+ mtx_unlock(&dstq->rkq_lock);
348
+ mtx_unlock(&srcq->rkq_lock);
349
+ }
350
+
351
+ return mcnt;
352
+ }
353
+
354
+
355
+ /**
356
+ * Filters out outdated ops.
357
+ */
358
+ static RD_INLINE rd_kafka_op_t *
359
+ rd_kafka_op_filter(rd_kafka_q_t *rkq, rd_kafka_op_t *rko, int version) {
360
+ if (unlikely(!rko))
361
+ return NULL;
362
+
363
+ if (unlikely(rd_kafka_op_version_outdated(rko, version))) {
364
+ rd_kafka_q_deq0(rkq, rko);
365
+ rd_kafka_op_destroy(rko);
366
+ return NULL;
367
+ }
368
+
369
+ return rko;
370
+ }
371
+
372
+
373
+
374
+ /**
375
+ * Pop an op from a queue.
376
+ *
377
+ * Locality: any thread.
378
+ */
379
+
380
+
381
+ /**
382
+ * Serve q like rd_kafka_q_serve() until an op is found that can be returned
383
+ * as an event to the application.
384
+ *
385
+ * @param rkq Queue to pop from.
386
+ * @param timeout_us Maximum time to wait for an op, in microseconds.
387
+ * @param version Fetch version to filter out outdated ops.
388
+ * @param cb_type Callback type to use for the op.
389
+ * @param callback Callback to use for the op, if any.
390
+ * @param opaque Opaque pointer to pass to the callback.
391
+ * @param is_consume_call If `rd_true` and it could be a consumer call it
392
+ * checks if this queue can contain fetched messages.
393
+ *
394
+ * @returns the first event:able op, or NULL on timeout.
395
+ *
396
+ * @locality any thread
397
+ */
398
+ static rd_kafka_op_t *rd_kafka_q_pop_serve0(rd_kafka_q_t *rkq,
399
+ rd_ts_t timeout_us,
400
+ int32_t version,
401
+ rd_kafka_q_cb_type_t cb_type,
402
+ rd_kafka_q_serve_cb_t *callback,
403
+ void *opaque,
404
+ rd_bool_t is_consume_call) {
405
+ rd_kafka_op_t *rko;
406
+ rd_kafka_q_t *fwdq;
407
+
408
+ rd_dassert(cb_type);
409
+
410
+ mtx_lock(&rkq->rkq_lock);
411
+
412
+ rd_kafka_yield_thread = 0;
413
+ if (!(fwdq = rd_kafka_q_fwd_get(rkq, 0))) {
414
+ const rd_bool_t can_q_contain_fetched_msgs =
415
+ is_consume_call &&
416
+ rd_kafka_q_can_contain_fetched_msgs(rkq, RD_DONT_LOCK);
417
+
418
+ rd_ts_t abs_timeout = rd_timeout_init_us(timeout_us);
419
+
420
+ if (can_q_contain_fetched_msgs)
421
+ rd_kafka_app_poll_start(rkq->rkq_rk, rkq, 0,
422
+ timeout_us);
423
+
424
+ while (1) {
425
+ rd_kafka_op_res_t res;
426
+ /* Keep track of current lock status to avoid
427
+ * unnecessary lock flapping in all the cases below. */
428
+ rd_bool_t is_locked = rd_true;
429
+
430
+ /* Filter out outdated ops */
431
+ retry:
432
+ while ((rko = TAILQ_FIRST(&rkq->rkq_q)) &&
433
+ !(rko = rd_kafka_op_filter(rkq, rko, version)))
434
+ ;
435
+
436
+ rd_kafka_q_mark_served(rkq);
437
+
438
+ if (rko) {
439
+ /* Proper versioned op */
440
+ rd_kafka_q_deq0(rkq, rko);
441
+
442
+ /* Let op_handle() operate without lock
443
+ * held to allow re-enqueuing, etc. */
444
+ mtx_unlock(&rkq->rkq_lock);
445
+ is_locked = rd_false;
446
+
447
+ /* Ops with callbacks are considered handled
448
+ * and we move on to the next op, if any.
449
+ * Ops w/o callbacks are returned immediately */
450
+ res = rd_kafka_op_handle(rkq->rkq_rk, rkq, rko,
451
+ cb_type, opaque,
452
+ callback);
453
+
454
+ if (res == RD_KAFKA_OP_RES_HANDLED ||
455
+ res == RD_KAFKA_OP_RES_KEEP) {
456
+ mtx_lock(&rkq->rkq_lock);
457
+ is_locked = rd_true;
458
+ goto retry; /* Next op */
459
+ } else if (unlikely(res ==
460
+ RD_KAFKA_OP_RES_YIELD)) {
461
+ if (can_q_contain_fetched_msgs)
462
+ rd_kafka_app_polled(rkq->rkq_rk,
463
+ rkq);
464
+ /* Callback yielded, unroll */
465
+ return NULL;
466
+ } else {
467
+ if (can_q_contain_fetched_msgs)
468
+ rd_kafka_app_polled(rkq->rkq_rk,
469
+ rkq);
470
+ break; /* Proper op, handle below. */
471
+ }
472
+ }
473
+
474
+ if (unlikely(rd_kafka_q_check_yield(rkq))) {
475
+ if (is_locked)
476
+ mtx_unlock(&rkq->rkq_lock);
477
+ if (can_q_contain_fetched_msgs)
478
+ rd_kafka_app_polled(rkq->rkq_rk, rkq);
479
+ return NULL;
480
+ }
481
+
482
+ if (!is_locked)
483
+ mtx_lock(&rkq->rkq_lock);
484
+
485
+ if (cnd_timedwait_abs(&rkq->rkq_cond, &rkq->rkq_lock,
486
+ abs_timeout) != thrd_success) {
487
+ mtx_unlock(&rkq->rkq_lock);
488
+ if (can_q_contain_fetched_msgs)
489
+ rd_kafka_app_polled(rkq->rkq_rk, rkq);
490
+ return NULL;
491
+ }
492
+ }
493
+
494
+ } else {
495
+ /* Since the q_pop may block we need to release the parent
496
+ * queue's lock. */
497
+ mtx_unlock(&rkq->rkq_lock);
498
+ rko = rd_kafka_q_pop_serve0(fwdq, timeout_us, version, cb_type,
499
+ callback, opaque, is_consume_call);
500
+ rd_kafka_q_destroy(fwdq);
501
+ }
502
+
503
+
504
+ return rko;
505
+ }
506
+
507
+ rd_kafka_op_t *rd_kafka_q_pop_serve(rd_kafka_q_t *rkq,
508
+ rd_ts_t timeout_us,
509
+ int32_t version,
510
+ rd_kafka_q_cb_type_t cb_type,
511
+ rd_kafka_q_serve_cb_t *callback,
512
+ void *opaque) {
513
+ return rd_kafka_q_pop_serve0(rkq, timeout_us, version, cb_type,
514
+ callback, opaque, rd_false);
515
+ }
516
+
517
+ /**
518
+ * @brief Same as `rd_kafka_q_pop_serve`, use this call when the queue
519
+ * could be a fetch queue, use the other one when it
520
+ * can never be.
521
+ */
522
+ rd_kafka_op_t *
523
+ rd_kafka_q_pop_serve_maybe_consume(rd_kafka_q_t *rkq,
524
+ rd_ts_t timeout_us,
525
+ int32_t version,
526
+ rd_kafka_q_cb_type_t cb_type,
527
+ rd_kafka_q_serve_cb_t *callback,
528
+ void *opaque) {
529
+ return rd_kafka_q_pop_serve0(rkq, timeout_us, version, cb_type,
530
+ callback, opaque,
531
+ /* Only check if to call app_polled when
532
+ * this is a consumer. */
533
+ rkq->rkq_rk->rk_type == RD_KAFKA_CONSUMER);
534
+ }
535
+
536
+ rd_kafka_op_t *
537
+ rd_kafka_q_pop(rd_kafka_q_t *rkq, rd_ts_t timeout_us, int32_t version) {
538
+ return rd_kafka_q_pop_serve(rkq, timeout_us, version,
539
+ RD_KAFKA_Q_CB_RETURN, NULL, NULL);
540
+ }
541
+
542
+ /**
543
+ * Pop all available ops from a queue and call the provided
544
+ * callback for each op.
545
+ *
546
+ * @param rkq Queue to serve.
547
+ * @param max_cnt Limits the number of ops served, 0 = no limit.
548
+ * @param cb_type Callback type to use.
549
+ * @param callback Callback to call for each op.
550
+ * @param opaque Opaque pointer to pass to the callback.
551
+ * @param is_consume_call If `rd_true` and it could be a consumer call it
552
+ * checks if this queue can contain fetched messages.
553
+ *
554
+ * @return The number of ops served.
555
+ *
556
+ * @locality any thread.
557
+ */
558
+ int rd_kafka_q_serve0(rd_kafka_q_t *rkq,
559
+ int timeout_ms,
560
+ int max_cnt,
561
+ rd_kafka_q_cb_type_t cb_type,
562
+ rd_kafka_q_serve_cb_t *callback,
563
+ void *opaque,
564
+ rd_bool_t is_consume_call) {
565
+ rd_kafka_t *rk = rkq->rkq_rk;
566
+ rd_kafka_op_t *rko;
567
+ rd_kafka_q_t localq;
568
+ rd_kafka_q_t *fwdq;
569
+ int cnt = 0;
570
+ rd_ts_t abs_timeout;
571
+ const rd_bool_t can_q_contain_fetched_msgs =
572
+ is_consume_call &&
573
+ rd_kafka_q_can_contain_fetched_msgs(rkq, RD_DONT_LOCK);
574
+
575
+ rd_dassert(cb_type);
576
+
577
+ mtx_lock(&rkq->rkq_lock);
578
+
579
+ rd_dassert(TAILQ_EMPTY(&rkq->rkq_q) || rkq->rkq_qlen > 0);
580
+ if ((fwdq = rd_kafka_q_fwd_get(rkq, 0))) {
581
+ int ret;
582
+ /* Since the q_pop may block we need to release the parent
583
+ * queue's lock. */
584
+ mtx_unlock(&rkq->rkq_lock);
585
+ ret = rd_kafka_q_serve0(fwdq, timeout_ms, max_cnt, cb_type,
586
+ callback, opaque, is_consume_call);
587
+ rd_kafka_q_destroy(fwdq);
588
+ return ret;
589
+ }
590
+
591
+
592
+ abs_timeout = rd_timeout_init(timeout_ms);
593
+
594
+ if (can_q_contain_fetched_msgs)
595
+ rd_kafka_app_poll_start(rk, rkq, 0, timeout_ms);
596
+
597
+ /* Wait for op */
598
+ while (!(rko = TAILQ_FIRST(&rkq->rkq_q)) &&
599
+ !rd_kafka_q_check_yield(rkq) &&
600
+ cnd_timedwait_abs(&rkq->rkq_cond, &rkq->rkq_lock, abs_timeout) ==
601
+ thrd_success)
602
+ ;
603
+
604
+ rd_kafka_q_mark_served(rkq);
605
+
606
+ if (!rko) {
607
+ mtx_unlock(&rkq->rkq_lock);
608
+ if (can_q_contain_fetched_msgs)
609
+ rd_kafka_app_polled(rk, rkq);
610
+ return 0;
611
+ }
612
+
613
+ /* Move the first `max_cnt` ops. */
614
+ rd_kafka_q_init(&localq, rkq->rkq_rk);
615
+ rd_kafka_q_move_cnt(&localq, rkq, max_cnt == 0 ? -1 /*all*/ : max_cnt,
616
+ 0 /*no-locks*/);
617
+
618
+ mtx_unlock(&rkq->rkq_lock);
619
+
620
+ rd_kafka_yield_thread = 0;
621
+
622
+ /* Call callback for each op */
623
+ while ((rko = TAILQ_FIRST(&localq.rkq_q))) {
624
+ rd_kafka_op_res_t res;
625
+
626
+ rd_kafka_q_deq0(&localq, rko);
627
+ res = rd_kafka_op_handle(rk, &localq, rko, cb_type, opaque,
628
+ callback);
629
+ /* op must have been handled */
630
+ rd_kafka_assert(NULL, res != RD_KAFKA_OP_RES_PASS);
631
+ cnt++;
632
+
633
+ if (unlikely(res == RD_KAFKA_OP_RES_YIELD ||
634
+ rd_kafka_yield_thread)) {
635
+ /* Callback called rd_kafka_yield(), we must
636
+ * stop our callback dispatching and put the
637
+ * ops in localq back on the original queue head. */
638
+ if (!TAILQ_EMPTY(&localq.rkq_q))
639
+ rd_kafka_q_prepend(rkq, &localq);
640
+ break;
641
+ }
642
+ }
643
+
644
+ if (can_q_contain_fetched_msgs)
645
+ rd_kafka_app_polled(rk, rkq);
646
+
647
+ rd_kafka_q_destroy_owner(&localq);
648
+
649
+ return cnt;
650
+ }
651
+
652
+ int rd_kafka_q_serve(rd_kafka_q_t *rkq,
653
+ int timeout_ms,
654
+ int max_cnt,
655
+ rd_kafka_q_cb_type_t cb_type,
656
+ rd_kafka_q_serve_cb_t *callback,
657
+ void *opaque) {
658
+ return rd_kafka_q_serve0(rkq, timeout_ms, max_cnt, cb_type, callback,
659
+ opaque, rd_false);
660
+ }
661
+
662
+ /**
663
+ * @brief Same as `rd_kafka_q_serve`, use this call when the queue
664
+ * could be a fetch queue, use the other one when it
665
+ * can never be.
666
+ */
667
+ int rd_kafka_q_serve_maybe_consume(rd_kafka_q_t *rkq,
668
+ int timeout_ms,
669
+ int max_cnt,
670
+ rd_kafka_q_cb_type_t cb_type,
671
+ rd_kafka_q_serve_cb_t *callback,
672
+ void *opaque) {
673
+ return rd_kafka_q_serve0(rkq, timeout_ms, max_cnt, cb_type, callback,
674
+ opaque,
675
+ /* Only check if to call app_polled when
676
+ * this is a consumer. */
677
+ rkq->rkq_rk->rk_type == RD_KAFKA_CONSUMER);
678
+ }
679
+
680
+ /**
681
+ * @brief Filter out and destroy outdated messages.
682
+ *
683
+ * @returns Returns the number of valid messages.
684
+ *
685
+ * @locality Any thread.
686
+ */
687
+ static size_t
688
+ rd_kafka_purge_outdated_messages(rd_kafka_toppar_t *rktp,
689
+ int32_t version,
690
+ rd_kafka_message_t **rkmessages,
691
+ size_t cnt,
692
+ struct rd_kafka_op_tailq *ctrl_msg_q) {
693
+ size_t valid_count = 0;
694
+ size_t i;
695
+ rd_kafka_op_t *rko, *next;
696
+
697
+ for (i = 0; i < cnt; i++) {
698
+ rko = rkmessages[i]->_private;
699
+ if (rko->rko_rktp == rktp &&
700
+ rd_kafka_op_version_outdated(rko, version)) {
701
+ /* This also destroys the corresponding rkmessage. */
702
+ rd_kafka_op_destroy(rko);
703
+ } else if (i > valid_count) {
704
+ rkmessages[valid_count++] = rkmessages[i];
705
+ } else {
706
+ valid_count++;
707
+ }
708
+ }
709
+
710
+ /* Discard outdated control msgs ops */
711
+ next = TAILQ_FIRST(ctrl_msg_q);
712
+ while (next) {
713
+ rko = next;
714
+ next = TAILQ_NEXT(rko, rko_link);
715
+ if (rko->rko_rktp == rktp &&
716
+ rd_kafka_op_version_outdated(rko, version)) {
717
+ TAILQ_REMOVE(ctrl_msg_q, rko, rko_link);
718
+ rd_kafka_op_destroy(rko);
719
+ }
720
+ }
721
+
722
+ return valid_count;
723
+ }
724
+
725
+
726
+ /**
727
+ * Populate 'rkmessages' array with messages from 'rkq'.
728
+ * If 'auto_commit' is set, each message's offset will be committed
729
+ * to the offset store for that toppar.
730
+ *
731
+ * Returns the number of messages added.
732
+ */
733
+
734
+ int rd_kafka_q_serve_rkmessages(rd_kafka_q_t *rkq,
735
+ int timeout_ms,
736
+ rd_kafka_message_t **rkmessages,
737
+ size_t rkmessages_size) {
738
+ unsigned int cnt = 0;
739
+ TAILQ_HEAD(, rd_kafka_op_s) tmpq = TAILQ_HEAD_INITIALIZER(tmpq);
740
+ struct rd_kafka_op_tailq ctrl_msg_q =
741
+ TAILQ_HEAD_INITIALIZER(ctrl_msg_q);
742
+ rd_kafka_op_t *rko, *next;
743
+ rd_kafka_t *rk = rkq->rkq_rk;
744
+ rd_kafka_q_t *fwdq;
745
+ rd_ts_t abs_timeout;
746
+ int i;
747
+
748
+ mtx_lock(&rkq->rkq_lock);
749
+ if ((fwdq = rd_kafka_q_fwd_get(rkq, 0))) {
750
+ /* Since the q_pop may block we need to release the parent
751
+ * queue's lock. */
752
+ mtx_unlock(&rkq->rkq_lock);
753
+ cnt = rd_kafka_q_serve_rkmessages(fwdq, timeout_ms, rkmessages,
754
+ rkmessages_size);
755
+ rd_kafka_q_destroy(fwdq);
756
+ return cnt;
757
+ }
758
+
759
+ mtx_unlock(&rkq->rkq_lock);
760
+
761
+ abs_timeout = rd_timeout_init(timeout_ms);
762
+
763
+ rd_kafka_app_poll_start(rk, rkq, 0, timeout_ms);
764
+
765
+ rd_kafka_yield_thread = 0;
766
+ while (cnt < rkmessages_size) {
767
+ rd_kafka_op_res_t res;
768
+
769
+ mtx_lock(&rkq->rkq_lock);
770
+
771
+ while (!(rko = TAILQ_FIRST(&rkq->rkq_q)) &&
772
+ !rd_kafka_q_check_yield(rkq) &&
773
+ cnd_timedwait_abs(&rkq->rkq_cond, &rkq->rkq_lock,
774
+ abs_timeout) == thrd_success)
775
+ ;
776
+
777
+ rd_kafka_q_mark_served(rkq);
778
+
779
+ if (!rko) {
780
+ mtx_unlock(&rkq->rkq_lock);
781
+ break; /* Timed out */
782
+ }
783
+
784
+ rd_kafka_q_deq0(rkq, rko);
785
+
786
+ mtx_unlock(&rkq->rkq_lock);
787
+
788
+ if (unlikely(rko->rko_type == RD_KAFKA_OP_BARRIER)) {
789
+ cnt = (unsigned int)rd_kafka_purge_outdated_messages(
790
+ rko->rko_rktp, rko->rko_version, rkmessages, cnt,
791
+ &ctrl_msg_q);
792
+ rd_kafka_op_destroy(rko);
793
+ continue;
794
+ }
795
+
796
+ if (rd_kafka_op_version_outdated(rko, 0)) {
797
+ /* Outdated op, put on discard queue */
798
+ TAILQ_INSERT_TAIL(&tmpq, rko, rko_link);
799
+ continue;
800
+ }
801
+
802
+ /* Serve non-FETCH callbacks */
803
+ res =
804
+ rd_kafka_poll_cb(rk, rkq, rko, RD_KAFKA_Q_CB_RETURN, NULL);
805
+ if (res == RD_KAFKA_OP_RES_KEEP ||
806
+ res == RD_KAFKA_OP_RES_HANDLED) {
807
+ /* Callback served, rko is destroyed (if HANDLED). */
808
+ continue;
809
+ } else if (unlikely(res == RD_KAFKA_OP_RES_YIELD ||
810
+ rd_kafka_yield_thread)) {
811
+ /* Yield. */
812
+ break;
813
+ }
814
+ rd_dassert(res == RD_KAFKA_OP_RES_PASS);
815
+
816
+ /* If this is a control messages, don't return message to
817
+ * application. Add it to a tmp queue from where we can store
818
+ * the offset and destroy the op */
819
+ if (unlikely(rd_kafka_op_is_ctrl_msg(rko))) {
820
+ TAILQ_INSERT_TAIL(&ctrl_msg_q, rko, rko_link);
821
+ continue;
822
+ }
823
+
824
+ /* Get rkmessage from rko and append to array. */
825
+ rkmessages[cnt++] = rd_kafka_message_get(rko);
826
+ }
827
+
828
+ for (i = cnt - 1; i >= 0; i--) {
829
+ rko = (rd_kafka_op_t *)rkmessages[i]->_private;
830
+ rd_kafka_toppar_t *rktp = rko->rko_rktp;
831
+ int64_t offset = rkmessages[i]->offset + 1;
832
+ if (unlikely(rktp && (rktp->rktp_app_pos.offset < offset)))
833
+ rd_kafka_update_app_pos(
834
+ rk, rktp,
835
+ RD_KAFKA_FETCH_POS(
836
+ offset,
837
+ rd_kafka_message_leader_epoch(rkmessages[i])),
838
+ RD_DO_LOCK);
839
+ }
840
+
841
+ /* Discard non-desired and already handled ops */
842
+ next = TAILQ_FIRST(&tmpq);
843
+ while (next) {
844
+ rko = next;
845
+ next = TAILQ_NEXT(next, rko_link);
846
+ rd_kafka_op_destroy(rko);
847
+ }
848
+
849
+ /* Discard ctrl msgs */
850
+ next = TAILQ_FIRST(&ctrl_msg_q);
851
+ while (next) {
852
+ rko = next;
853
+ next = TAILQ_NEXT(next, rko_link);
854
+ rd_kafka_toppar_t *rktp = rko->rko_rktp;
855
+ int64_t offset = rko->rko_u.fetch.rkm.rkm_rkmessage.offset + 1;
856
+ if (rktp && (rktp->rktp_app_pos.offset < offset))
857
+ rd_kafka_update_app_pos(
858
+ rk, rktp,
859
+ RD_KAFKA_FETCH_POS(
860
+ offset,
861
+ rd_kafka_message_leader_epoch(
862
+ &rko->rko_u.fetch.rkm.rkm_rkmessage)),
863
+ RD_DO_LOCK);
864
+ rd_kafka_op_destroy(rko);
865
+ }
866
+
867
+ rd_kafka_app_polled(rk, rkq);
868
+
869
+ return cnt;
870
+ }
871
+
872
+
873
+
874
+ void rd_kafka_queue_destroy(rd_kafka_queue_t *rkqu) {
875
+ if (rkqu->rkqu_is_owner)
876
+ rd_kafka_q_destroy_owner(rkqu->rkqu_q);
877
+ else
878
+ rd_kafka_q_destroy(rkqu->rkqu_q);
879
+ rd_free(rkqu);
880
+ }
881
+
882
+ rd_kafka_queue_t *rd_kafka_queue_new0(rd_kafka_t *rk, rd_kafka_q_t *rkq) {
883
+ rd_kafka_queue_t *rkqu;
884
+
885
+ rkqu = rd_calloc(1, sizeof(*rkqu));
886
+
887
+ rkqu->rkqu_q = rkq;
888
+ rd_kafka_q_keep(rkq);
889
+
890
+ rkqu->rkqu_rk = rk;
891
+
892
+ return rkqu;
893
+ }
894
+
895
+
896
+ rd_kafka_queue_t *rd_kafka_queue_new(rd_kafka_t *rk) {
897
+ rd_kafka_q_t *rkq;
898
+ rd_kafka_queue_t *rkqu;
899
+
900
+ rkq = rd_kafka_q_new(rk);
901
+ rkqu = rd_kafka_queue_new0(rk, rkq);
902
+ rd_kafka_q_destroy(rkq); /* Loose refcount from q_new, one is held
903
+ * by queue_new0 */
904
+ rkqu->rkqu_is_owner = 1;
905
+ return rkqu;
906
+ }
907
+
908
+
909
+ rd_kafka_queue_t *rd_kafka_queue_get_main(rd_kafka_t *rk) {
910
+ return rd_kafka_queue_new0(rk, rk->rk_rep);
911
+ }
912
+
913
+
914
+ rd_kafka_queue_t *rd_kafka_queue_get_consumer(rd_kafka_t *rk) {
915
+ if (!rk->rk_cgrp)
916
+ return NULL;
917
+ return rd_kafka_queue_new0(rk, rk->rk_cgrp->rkcg_q);
918
+ }
919
+
920
+ rd_kafka_queue_t *rd_kafka_queue_get_partition(rd_kafka_t *rk,
921
+ const char *topic,
922
+ int32_t partition) {
923
+ rd_kafka_toppar_t *rktp;
924
+ rd_kafka_queue_t *result;
925
+
926
+ if (rk->rk_type == RD_KAFKA_PRODUCER)
927
+ return NULL;
928
+
929
+ rktp = rd_kafka_toppar_get2(rk, topic, partition, 0, /* no ua_on_miss */
930
+ 1 /* create_on_miss */);
931
+
932
+ if (!rktp)
933
+ return NULL;
934
+
935
+ result = rd_kafka_queue_new0(rk, rktp->rktp_fetchq);
936
+ rd_kafka_toppar_destroy(rktp);
937
+
938
+ return result;
939
+ }
940
+
941
+ rd_kafka_queue_t *rd_kafka_queue_get_background(rd_kafka_t *rk) {
942
+ rd_kafka_queue_t *rkqu;
943
+
944
+ rd_kafka_wrlock(rk);
945
+ if (!rk->rk_background.q) {
946
+ char errstr[256];
947
+
948
+ if (rd_kafka_background_thread_create(rk, errstr,
949
+ sizeof(errstr))) {
950
+ rd_kafka_log(rk, LOG_ERR, "BACKGROUND",
951
+ "Failed to create background thread: %s",
952
+ errstr);
953
+ rd_kafka_wrunlock(rk);
954
+ return NULL;
955
+ }
956
+ }
957
+
958
+ rkqu = rd_kafka_queue_new0(rk, rk->rk_background.q);
959
+ rd_kafka_wrunlock(rk);
960
+ return rkqu;
961
+ }
962
+
963
+
964
+ rd_kafka_resp_err_t rd_kafka_set_log_queue(rd_kafka_t *rk,
965
+ rd_kafka_queue_t *rkqu) {
966
+ rd_kafka_q_t *rkq;
967
+
968
+ if (!rk->rk_logq)
969
+ return RD_KAFKA_RESP_ERR__NOT_CONFIGURED;
970
+
971
+ if (!rkqu)
972
+ rkq = rk->rk_rep;
973
+ else
974
+ rkq = rkqu->rkqu_q;
975
+ rd_kafka_q_fwd_set(rk->rk_logq, rkq);
976
+ return RD_KAFKA_RESP_ERR_NO_ERROR;
977
+ }
978
+
979
+ void rd_kafka_queue_forward(rd_kafka_queue_t *src, rd_kafka_queue_t *dst) {
980
+ rd_kafka_q_fwd_set0(src->rkqu_q, dst ? dst->rkqu_q : NULL,
981
+ 1, /* do_lock */
982
+ 1 /* fwd_app */);
983
+ }
984
+
985
+
986
+ size_t rd_kafka_queue_length(rd_kafka_queue_t *rkqu) {
987
+ return (size_t)rd_kafka_q_len(rkqu->rkqu_q);
988
+ }
989
+
990
+ /**
991
+ * @brief Enable or disable(fd==-1) fd-based wake-ups for queue
992
+ */
993
+ void rd_kafka_q_io_event_enable(rd_kafka_q_t *rkq,
994
+ rd_socket_t fd,
995
+ const void *payload,
996
+ size_t size) {
997
+ struct rd_kafka_q_io *qio = NULL;
998
+
999
+ if (fd != -1) {
1000
+ qio = rd_malloc(sizeof(*qio) + size);
1001
+ qio->fd = fd;
1002
+ qio->size = size;
1003
+ qio->payload = (void *)(qio + 1);
1004
+ qio->sent = rd_false;
1005
+ qio->event_cb = NULL;
1006
+ qio->event_cb_opaque = NULL;
1007
+ memcpy(qio->payload, payload, size);
1008
+ }
1009
+
1010
+ mtx_lock(&rkq->rkq_lock);
1011
+ if (rkq->rkq_qio) {
1012
+ rd_free(rkq->rkq_qio);
1013
+ rkq->rkq_qio = NULL;
1014
+ }
1015
+
1016
+ if (fd != -1) {
1017
+ rkq->rkq_qio = qio;
1018
+ }
1019
+
1020
+ mtx_unlock(&rkq->rkq_lock);
1021
+ }
1022
+
1023
+ void rd_kafka_queue_io_event_enable(rd_kafka_queue_t *rkqu,
1024
+ int fd,
1025
+ const void *payload,
1026
+ size_t size) {
1027
+ rd_kafka_q_io_event_enable(rkqu->rkqu_q, fd, payload, size);
1028
+ }
1029
+
1030
+
1031
+ void rd_kafka_queue_yield(rd_kafka_queue_t *rkqu) {
1032
+ rd_kafka_q_yield(rkqu->rkqu_q);
1033
+ }
1034
+
1035
+
1036
+ /**
1037
+ * @brief Enable or disable(event_cb==NULL) callback-based wake-ups for queue
1038
+ */
1039
+ void rd_kafka_q_cb_event_enable(rd_kafka_q_t *rkq,
1040
+ void (*event_cb)(rd_kafka_t *rk, void *opaque),
1041
+ void *opaque) {
1042
+ struct rd_kafka_q_io *qio = NULL;
1043
+
1044
+ if (event_cb) {
1045
+ qio = rd_malloc(sizeof(*qio));
1046
+ qio->fd = -1;
1047
+ qio->size = 0;
1048
+ qio->payload = NULL;
1049
+ qio->event_cb = event_cb;
1050
+ qio->event_cb_opaque = opaque;
1051
+ }
1052
+
1053
+ mtx_lock(&rkq->rkq_lock);
1054
+ if (rkq->rkq_qio) {
1055
+ rd_free(rkq->rkq_qio);
1056
+ rkq->rkq_qio = NULL;
1057
+ }
1058
+
1059
+ if (event_cb) {
1060
+ rkq->rkq_qio = qio;
1061
+ }
1062
+
1063
+ mtx_unlock(&rkq->rkq_lock);
1064
+ }
1065
+
1066
+ void rd_kafka_queue_cb_event_enable(rd_kafka_queue_t *rkqu,
1067
+ void (*event_cb)(rd_kafka_t *rk,
1068
+ void *opaque),
1069
+ void *opaque) {
1070
+ rd_kafka_q_cb_event_enable(rkqu->rkqu_q, event_cb, opaque);
1071
+ }
1072
+
1073
+
1074
+ /**
1075
+ * Helper: wait for single op on 'rkq', and return its error,
1076
+ * or .._TIMED_OUT on timeout.
1077
+ */
1078
+ rd_kafka_resp_err_t rd_kafka_q_wait_result(rd_kafka_q_t *rkq, int timeout_ms) {
1079
+ rd_kafka_op_t *rko;
1080
+ rd_kafka_resp_err_t err;
1081
+
1082
+ rko = rd_kafka_q_pop(rkq, rd_timeout_us(timeout_ms), 0);
1083
+ if (!rko)
1084
+ err = RD_KAFKA_RESP_ERR__TIMED_OUT;
1085
+ else {
1086
+ err = rko->rko_err;
1087
+ rd_kafka_op_destroy(rko);
1088
+ }
1089
+
1090
+ return err;
1091
+ }
1092
+
1093
+
1094
+ /**
1095
+ * Apply \p callback on each op in queue.
1096
+ * If the callback wishes to remove the rko it must do so using
1097
+ * using rd_kafka_op_deq0().
1098
+ *
1099
+ * @returns the sum of \p callback() return values.
1100
+ * @remark rkq will be locked, callers should take care not to
1101
+ * interact with \p rkq through other means from the callback to avoid
1102
+ * deadlocks.
1103
+ */
1104
+ int rd_kafka_q_apply(rd_kafka_q_t *rkq,
1105
+ int (*callback)(rd_kafka_q_t *rkq,
1106
+ rd_kafka_op_t *rko,
1107
+ void *opaque),
1108
+ void *opaque) {
1109
+ rd_kafka_op_t *rko, *next;
1110
+ rd_kafka_q_t *fwdq;
1111
+ int cnt = 0;
1112
+
1113
+ mtx_lock(&rkq->rkq_lock);
1114
+ if ((fwdq = rd_kafka_q_fwd_get(rkq, 0))) {
1115
+ mtx_unlock(&rkq->rkq_lock);
1116
+ cnt = rd_kafka_q_apply(fwdq, callback, opaque);
1117
+ rd_kafka_q_destroy(fwdq);
1118
+ return cnt;
1119
+ }
1120
+
1121
+ next = TAILQ_FIRST(&rkq->rkq_q);
1122
+ while ((rko = next)) {
1123
+ next = TAILQ_NEXT(next, rko_link);
1124
+ cnt += callback(rkq, rko, opaque);
1125
+ }
1126
+
1127
+ rd_kafka_q_mark_served(rkq);
1128
+
1129
+ mtx_unlock(&rkq->rkq_lock);
1130
+
1131
+ return cnt;
1132
+ }
1133
+
1134
+ /**
1135
+ * @brief Convert relative to absolute offsets and also purge any messages
1136
+ * that are older than \p min_offset.
1137
+ * @remark Error ops with ERR__NOT_IMPLEMENTED will not be purged since
1138
+ * they are used to indicate unknnown compression codecs and compressed
1139
+ * messagesets may have a starting offset lower than what we requested.
1140
+ * @remark \p rkq locking is not performed (caller's responsibility)
1141
+ * @remark Must NOT be used on fwdq.
1142
+ */
1143
+ void rd_kafka_q_fix_offsets(rd_kafka_q_t *rkq,
1144
+ int64_t min_offset,
1145
+ int64_t base_offset) {
1146
+ rd_kafka_op_t *rko, *next;
1147
+ int adj_len = 0;
1148
+ int64_t adj_size = 0;
1149
+
1150
+ rd_kafka_assert(NULL, !rkq->rkq_fwdq);
1151
+
1152
+ next = TAILQ_FIRST(&rkq->rkq_q);
1153
+ while ((rko = next)) {
1154
+ next = TAILQ_NEXT(next, rko_link);
1155
+
1156
+ if (unlikely(rko->rko_type != RD_KAFKA_OP_FETCH))
1157
+ continue;
1158
+
1159
+ rko->rko_u.fetch.rkm.rkm_offset += base_offset;
1160
+
1161
+ if (rko->rko_u.fetch.rkm.rkm_offset < min_offset &&
1162
+ rko->rko_err != RD_KAFKA_RESP_ERR__NOT_IMPLEMENTED) {
1163
+ adj_len++;
1164
+ adj_size += rko->rko_len;
1165
+ TAILQ_REMOVE(&rkq->rkq_q, rko, rko_link);
1166
+ rd_kafka_op_destroy(rko);
1167
+ continue;
1168
+ }
1169
+ }
1170
+
1171
+
1172
+ rkq->rkq_qlen -= adj_len;
1173
+ rkq->rkq_qsize -= adj_size;
1174
+ }
1175
+
1176
+
1177
+ /**
1178
+ * @brief Print information and contents of queue
1179
+ */
1180
+ void rd_kafka_q_dump(FILE *fp, rd_kafka_q_t *rkq) {
1181
+ mtx_lock(&rkq->rkq_lock);
1182
+ fprintf(fp,
1183
+ "Queue %p \"%s\" (refcnt %d, flags 0x%x, %d ops, "
1184
+ "%" PRId64 " bytes)\n",
1185
+ rkq, rkq->rkq_name, rkq->rkq_refcnt, rkq->rkq_flags,
1186
+ rkq->rkq_qlen, rkq->rkq_qsize);
1187
+
1188
+ if (rkq->rkq_qio)
1189
+ fprintf(fp, " QIO fd %d\n", (int)rkq->rkq_qio->fd);
1190
+ if (rkq->rkq_serve)
1191
+ fprintf(fp, " Serve callback %p, opaque %p\n", rkq->rkq_serve,
1192
+ rkq->rkq_opaque);
1193
+
1194
+ if (rkq->rkq_fwdq) {
1195
+ fprintf(fp, " Forwarded ->\n");
1196
+ rd_kafka_q_dump(fp, rkq->rkq_fwdq);
1197
+ } else {
1198
+ rd_kafka_op_t *rko;
1199
+
1200
+ if (!TAILQ_EMPTY(&rkq->rkq_q))
1201
+ fprintf(fp, " Queued ops:\n");
1202
+ TAILQ_FOREACH(rko, &rkq->rkq_q, rko_link) {
1203
+ fprintf(fp,
1204
+ " %p %s (v%" PRId32
1205
+ ", flags 0x%x, "
1206
+ "prio %d, len %" PRId32
1207
+ ", source %s, "
1208
+ "replyq %p)\n",
1209
+ rko, rd_kafka_op2str(rko->rko_type),
1210
+ rko->rko_version, rko->rko_flags, rko->rko_prio,
1211
+ rko->rko_len,
1212
+ #if ENABLE_DEVEL
1213
+ rko->rko_source
1214
+ #else
1215
+ "-"
1216
+ #endif
1217
+ ,
1218
+ rko->rko_replyq.q);
1219
+ }
1220
+ }
1221
+
1222
+ mtx_unlock(&rkq->rkq_lock);
1223
+ }
1224
+
1225
+
1226
+ void rd_kafka_enq_once_trigger_destroy(void *ptr) {
1227
+ rd_kafka_enq_once_t *eonce = ptr;
1228
+
1229
+ rd_kafka_enq_once_trigger(eonce, RD_KAFKA_RESP_ERR__DESTROY, "destroy");
1230
+ }