@platformatic/rdkafka 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (767) hide show
  1. package/.editorconfig +5 -0
  2. package/.jshintignore +1 -0
  3. package/.jshintrc +23 -0
  4. package/CONTRIBUTING.md +237 -0
  5. package/LICENSE.txt +21 -0
  6. package/Makefile +94 -0
  7. package/README.md +630 -0
  8. package/bench/consumer-raw-rdkafka.js +76 -0
  9. package/bench/consumer-subscribe.js +77 -0
  10. package/bench/kafka-consumer-stream.js +100 -0
  11. package/bench/producer-raw-rdkafka.js +125 -0
  12. package/bench/producer-rdkafka.js +117 -0
  13. package/bench/seed.sh +38 -0
  14. package/binding.gyp +155 -0
  15. package/ci/checks/librdkafka-correct-version.js +67 -0
  16. package/ci/checks/librdkafka-exists.js +13 -0
  17. package/ci/librdkafka-defs-generator.js +193 -0
  18. package/ci/prepublish.js +3 -0
  19. package/config.d.ts +1132 -0
  20. package/configure +15 -0
  21. package/cpplint.py +6325 -0
  22. package/deploy.enc +0 -0
  23. package/deps/librdkafka/.clang-format +136 -0
  24. package/deps/librdkafka/.clang-format-cpp +103 -0
  25. package/deps/librdkafka/.dir-locals.el +10 -0
  26. package/deps/librdkafka/.formatignore +33 -0
  27. package/deps/librdkafka/.gdbmacros +19 -0
  28. package/deps/librdkafka/.semaphore/project.yml +43 -0
  29. package/deps/librdkafka/.semaphore/project_public.yml +20 -0
  30. package/deps/librdkafka/.semaphore/semaphore.yml +355 -0
  31. package/deps/librdkafka/CHANGELOG.md +1738 -0
  32. package/deps/librdkafka/CMakeLists.txt +291 -0
  33. package/deps/librdkafka/CODE_OF_CONDUCT.md +46 -0
  34. package/deps/librdkafka/CONFIGURATION.md +189 -0
  35. package/deps/librdkafka/CONTRIBUTING.md +431 -0
  36. package/deps/librdkafka/Doxyfile +2375 -0
  37. package/deps/librdkafka/INTRODUCTION.md +2173 -0
  38. package/deps/librdkafka/LICENSE +26 -0
  39. package/deps/librdkafka/LICENSE.cjson +22 -0
  40. package/deps/librdkafka/LICENSE.crc32c +28 -0
  41. package/deps/librdkafka/LICENSE.fnv1a +18 -0
  42. package/deps/librdkafka/LICENSE.hdrhistogram +27 -0
  43. package/deps/librdkafka/LICENSE.lz4 +26 -0
  44. package/deps/librdkafka/LICENSE.murmur2 +25 -0
  45. package/deps/librdkafka/LICENSE.nanopb +22 -0
  46. package/deps/librdkafka/LICENSE.opentelemetry +203 -0
  47. package/deps/librdkafka/LICENSE.pycrc +23 -0
  48. package/deps/librdkafka/LICENSE.queue +31 -0
  49. package/deps/librdkafka/LICENSE.regexp +5 -0
  50. package/deps/librdkafka/LICENSE.snappy +36 -0
  51. package/deps/librdkafka/LICENSE.tinycthread +26 -0
  52. package/deps/librdkafka/LICENSE.wingetopt +49 -0
  53. package/deps/librdkafka/LICENSES.txt +625 -0
  54. package/deps/librdkafka/Makefile +124 -0
  55. package/deps/librdkafka/README.md +199 -0
  56. package/deps/librdkafka/README.win32 +26 -0
  57. package/deps/librdkafka/STATISTICS.md +624 -0
  58. package/deps/librdkafka/configure +214 -0
  59. package/deps/librdkafka/configure.self +331 -0
  60. package/deps/librdkafka/debian/changelog +111 -0
  61. package/deps/librdkafka/debian/compat +1 -0
  62. package/deps/librdkafka/debian/control +71 -0
  63. package/deps/librdkafka/debian/copyright +99 -0
  64. package/deps/librdkafka/debian/gbp.conf +9 -0
  65. package/deps/librdkafka/debian/librdkafka++1.install +1 -0
  66. package/deps/librdkafka/debian/librdkafka-dev.examples +2 -0
  67. package/deps/librdkafka/debian/librdkafka-dev.install +9 -0
  68. package/deps/librdkafka/debian/librdkafka1.docs +5 -0
  69. package/deps/librdkafka/debian/librdkafka1.install +1 -0
  70. package/deps/librdkafka/debian/librdkafka1.symbols +135 -0
  71. package/deps/librdkafka/debian/rules +19 -0
  72. package/deps/librdkafka/debian/source/format +1 -0
  73. package/deps/librdkafka/debian/watch +2 -0
  74. package/deps/librdkafka/dev-conf.sh +123 -0
  75. package/deps/librdkafka/examples/CMakeLists.txt +79 -0
  76. package/deps/librdkafka/examples/Makefile +167 -0
  77. package/deps/librdkafka/examples/README.md +42 -0
  78. package/deps/librdkafka/examples/alter_consumer_group_offsets.c +338 -0
  79. package/deps/librdkafka/examples/consumer.c +261 -0
  80. package/deps/librdkafka/examples/delete_records.c +233 -0
  81. package/deps/librdkafka/examples/describe_cluster.c +322 -0
  82. package/deps/librdkafka/examples/describe_consumer_groups.c +436 -0
  83. package/deps/librdkafka/examples/describe_topics.c +427 -0
  84. package/deps/librdkafka/examples/elect_leaders.c +317 -0
  85. package/deps/librdkafka/examples/globals.json +11 -0
  86. package/deps/librdkafka/examples/idempotent_producer.c +344 -0
  87. package/deps/librdkafka/examples/incremental_alter_configs.c +348 -0
  88. package/deps/librdkafka/examples/kafkatest_verifiable_client.cpp +961 -0
  89. package/deps/librdkafka/examples/list_consumer_group_offsets.c +359 -0
  90. package/deps/librdkafka/examples/list_consumer_groups.c +365 -0
  91. package/deps/librdkafka/examples/list_offsets.c +327 -0
  92. package/deps/librdkafka/examples/misc.c +287 -0
  93. package/deps/librdkafka/examples/openssl_engine_example.cpp +249 -0
  94. package/deps/librdkafka/examples/producer.c +251 -0
  95. package/deps/librdkafka/examples/producer.cpp +228 -0
  96. package/deps/librdkafka/examples/rdkafka_complex_consumer_example.c +617 -0
  97. package/deps/librdkafka/examples/rdkafka_complex_consumer_example.cpp +467 -0
  98. package/deps/librdkafka/examples/rdkafka_consume_batch.cpp +264 -0
  99. package/deps/librdkafka/examples/rdkafka_example.c +853 -0
  100. package/deps/librdkafka/examples/rdkafka_example.cpp +679 -0
  101. package/deps/librdkafka/examples/rdkafka_performance.c +1781 -0
  102. package/deps/librdkafka/examples/transactions-older-broker.c +668 -0
  103. package/deps/librdkafka/examples/transactions.c +665 -0
  104. package/deps/librdkafka/examples/user_scram.c +492 -0
  105. package/deps/librdkafka/examples/win_ssl_cert_store.cpp +395 -0
  106. package/deps/librdkafka/lds-gen.py +73 -0
  107. package/deps/librdkafka/mainpage.doxy +40 -0
  108. package/deps/librdkafka/mklove/Makefile.base +329 -0
  109. package/deps/librdkafka/mklove/modules/configure.atomics +144 -0
  110. package/deps/librdkafka/mklove/modules/configure.base +2484 -0
  111. package/deps/librdkafka/mklove/modules/configure.builtin +70 -0
  112. package/deps/librdkafka/mklove/modules/configure.cc +186 -0
  113. package/deps/librdkafka/mklove/modules/configure.cxx +8 -0
  114. package/deps/librdkafka/mklove/modules/configure.fileversion +65 -0
  115. package/deps/librdkafka/mklove/modules/configure.gitversion +29 -0
  116. package/deps/librdkafka/mklove/modules/configure.good_cflags +18 -0
  117. package/deps/librdkafka/mklove/modules/configure.host +132 -0
  118. package/deps/librdkafka/mklove/modules/configure.lib +49 -0
  119. package/deps/librdkafka/mklove/modules/configure.libcurl +99 -0
  120. package/deps/librdkafka/mklove/modules/configure.libsasl2 +36 -0
  121. package/deps/librdkafka/mklove/modules/configure.libssl +147 -0
  122. package/deps/librdkafka/mklove/modules/configure.libzstd +58 -0
  123. package/deps/librdkafka/mklove/modules/configure.parseversion +95 -0
  124. package/deps/librdkafka/mklove/modules/configure.pic +16 -0
  125. package/deps/librdkafka/mklove/modules/configure.socket +20 -0
  126. package/deps/librdkafka/mklove/modules/configure.zlib +61 -0
  127. package/deps/librdkafka/mklove/modules/patches/README.md +8 -0
  128. package/deps/librdkafka/mklove/modules/patches/libcurl.0000-no-runtime-linking-check.patch +11 -0
  129. package/deps/librdkafka/mklove/modules/patches/libssl.0000-osx-rand-include-fix-OpenSSL-PR16409.patch +56 -0
  130. package/deps/librdkafka/packaging/RELEASE.md +311 -0
  131. package/deps/librdkafka/packaging/alpine/build-alpine.sh +38 -0
  132. package/deps/librdkafka/packaging/archlinux/PKGBUILD +30 -0
  133. package/deps/librdkafka/packaging/cmake/Config.cmake.in +37 -0
  134. package/deps/librdkafka/packaging/cmake/Modules/FindLZ4.cmake +38 -0
  135. package/deps/librdkafka/packaging/cmake/Modules/FindZSTD.cmake +27 -0
  136. package/deps/librdkafka/packaging/cmake/Modules/LICENSE.FindZstd +178 -0
  137. package/deps/librdkafka/packaging/cmake/README.md +38 -0
  138. package/deps/librdkafka/packaging/cmake/config.h.in +52 -0
  139. package/deps/librdkafka/packaging/cmake/parseversion.cmake +60 -0
  140. package/deps/librdkafka/packaging/cmake/rdkafka.pc.in +12 -0
  141. package/deps/librdkafka/packaging/cmake/try_compile/atomic_32_test.c +8 -0
  142. package/deps/librdkafka/packaging/cmake/try_compile/atomic_64_test.c +8 -0
  143. package/deps/librdkafka/packaging/cmake/try_compile/c11threads_test.c +14 -0
  144. package/deps/librdkafka/packaging/cmake/try_compile/crc32c_hw_test.c +27 -0
  145. package/deps/librdkafka/packaging/cmake/try_compile/dlopen_test.c +11 -0
  146. package/deps/librdkafka/packaging/cmake/try_compile/libsasl2_test.c +7 -0
  147. package/deps/librdkafka/packaging/cmake/try_compile/pthread_setname_darwin_test.c +6 -0
  148. package/deps/librdkafka/packaging/cmake/try_compile/pthread_setname_freebsd_test.c +7 -0
  149. package/deps/librdkafka/packaging/cmake/try_compile/pthread_setname_gnu_test.c +5 -0
  150. package/deps/librdkafka/packaging/cmake/try_compile/rand_r_test.c +7 -0
  151. package/deps/librdkafka/packaging/cmake/try_compile/rdkafka_setup.cmake +122 -0
  152. package/deps/librdkafka/packaging/cmake/try_compile/regex_test.c +10 -0
  153. package/deps/librdkafka/packaging/cmake/try_compile/strndup_test.c +5 -0
  154. package/deps/librdkafka/packaging/cmake/try_compile/sync_32_test.c +8 -0
  155. package/deps/librdkafka/packaging/cmake/try_compile/sync_64_test.c +8 -0
  156. package/deps/librdkafka/packaging/cp/README.md +13 -0
  157. package/deps/librdkafka/packaging/cp/check_features.c +64 -0
  158. package/deps/librdkafka/packaging/cp/verify-deb.sh +33 -0
  159. package/deps/librdkafka/packaging/cp/verify-packages.sh +48 -0
  160. package/deps/librdkafka/packaging/cp/verify-rpm.sh +39 -0
  161. package/deps/librdkafka/packaging/debian/changelog +66 -0
  162. package/deps/librdkafka/packaging/debian/compat +1 -0
  163. package/deps/librdkafka/packaging/debian/control +49 -0
  164. package/deps/librdkafka/packaging/debian/copyright +84 -0
  165. package/deps/librdkafka/packaging/debian/gbp.conf +9 -0
  166. package/deps/librdkafka/packaging/debian/librdkafka-dev.dirs +2 -0
  167. package/deps/librdkafka/packaging/debian/librdkafka-dev.examples +2 -0
  168. package/deps/librdkafka/packaging/debian/librdkafka-dev.install +6 -0
  169. package/deps/librdkafka/packaging/debian/librdkafka-dev.substvars +1 -0
  170. package/deps/librdkafka/packaging/debian/librdkafka.dsc +16 -0
  171. package/deps/librdkafka/packaging/debian/librdkafka1-dbg.substvars +1 -0
  172. package/deps/librdkafka/packaging/debian/librdkafka1.dirs +1 -0
  173. package/deps/librdkafka/packaging/debian/librdkafka1.install +2 -0
  174. package/deps/librdkafka/packaging/debian/librdkafka1.postinst.debhelper +5 -0
  175. package/deps/librdkafka/packaging/debian/librdkafka1.postrm.debhelper +5 -0
  176. package/deps/librdkafka/packaging/debian/librdkafka1.symbols +64 -0
  177. package/deps/librdkafka/packaging/debian/rules +19 -0
  178. package/deps/librdkafka/packaging/debian/source/format +1 -0
  179. package/deps/librdkafka/packaging/debian/watch +2 -0
  180. package/deps/librdkafka/packaging/get_version.py +21 -0
  181. package/deps/librdkafka/packaging/homebrew/README.md +15 -0
  182. package/deps/librdkafka/packaging/homebrew/brew-update-pr.sh +31 -0
  183. package/deps/librdkafka/packaging/mingw-w64/configure-build-msys2-mingw-static.sh +52 -0
  184. package/deps/librdkafka/packaging/mingw-w64/configure-build-msys2-mingw.sh +21 -0
  185. package/deps/librdkafka/packaging/mingw-w64/run-tests.sh +6 -0
  186. package/deps/librdkafka/packaging/mingw-w64/semaphoreci-build.sh +38 -0
  187. package/deps/librdkafka/packaging/mingw-w64/travis-before-install.sh +20 -0
  188. package/deps/librdkafka/packaging/nuget/README.md +84 -0
  189. package/deps/librdkafka/packaging/nuget/artifact.py +177 -0
  190. package/deps/librdkafka/packaging/nuget/cleanup-s3.py +143 -0
  191. package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-win32__bldtype-Release/msvcr120.zip +0 -0
  192. package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-win32__bldtype-Release/msvcr140.zip +0 -0
  193. package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-x64__bldtype-Release/msvcr120.zip +0 -0
  194. package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-x64__bldtype-Release/msvcr140.zip +0 -0
  195. package/deps/librdkafka/packaging/nuget/nuget.sh +21 -0
  196. package/deps/librdkafka/packaging/nuget/nugetpackage.py +278 -0
  197. package/deps/librdkafka/packaging/nuget/packaging.py +448 -0
  198. package/deps/librdkafka/packaging/nuget/push-to-nuget.sh +21 -0
  199. package/deps/librdkafka/packaging/nuget/release.py +167 -0
  200. package/deps/librdkafka/packaging/nuget/requirements.txt +3 -0
  201. package/deps/librdkafka/packaging/nuget/staticpackage.py +178 -0
  202. package/deps/librdkafka/packaging/nuget/templates/librdkafka.redist.nuspec +21 -0
  203. package/deps/librdkafka/packaging/nuget/templates/librdkafka.redist.props +18 -0
  204. package/deps/librdkafka/packaging/nuget/templates/librdkafka.redist.targets +19 -0
  205. package/deps/librdkafka/packaging/nuget/zfile/__init__.py +0 -0
  206. package/deps/librdkafka/packaging/nuget/zfile/zfile.py +98 -0
  207. package/deps/librdkafka/packaging/rpm/Makefile +92 -0
  208. package/deps/librdkafka/packaging/rpm/README.md +23 -0
  209. package/deps/librdkafka/packaging/rpm/el7-x86_64.cfg +40 -0
  210. package/deps/librdkafka/packaging/rpm/librdkafka.spec +118 -0
  211. package/deps/librdkafka/packaging/rpm/mock-on-docker.sh +96 -0
  212. package/deps/librdkafka/packaging/rpm/tests/Makefile +25 -0
  213. package/deps/librdkafka/packaging/rpm/tests/README.md +8 -0
  214. package/deps/librdkafka/packaging/rpm/tests/run-test.sh +42 -0
  215. package/deps/librdkafka/packaging/rpm/tests/test-on-docker.sh +56 -0
  216. package/deps/librdkafka/packaging/rpm/tests/test.c +77 -0
  217. package/deps/librdkafka/packaging/rpm/tests/test.cpp +34 -0
  218. package/deps/librdkafka/packaging/tools/build-configurations-checks.sh +10 -0
  219. package/deps/librdkafka/packaging/tools/build-deb-package.sh +64 -0
  220. package/deps/librdkafka/packaging/tools/build-debian.sh +65 -0
  221. package/deps/librdkafka/packaging/tools/build-manylinux.sh +68 -0
  222. package/deps/librdkafka/packaging/tools/build-release-artifacts.sh +139 -0
  223. package/deps/librdkafka/packaging/tools/distro-build.sh +38 -0
  224. package/deps/librdkafka/packaging/tools/gh-release-checksums.py +39 -0
  225. package/deps/librdkafka/packaging/tools/rdutcoverage.sh +25 -0
  226. package/deps/librdkafka/packaging/tools/requirements.txt +2 -0
  227. package/deps/librdkafka/packaging/tools/style-format.sh +148 -0
  228. package/deps/librdkafka/service.yml +18 -0
  229. package/deps/librdkafka/src/CMakeLists.txt +374 -0
  230. package/deps/librdkafka/src/Makefile +103 -0
  231. package/deps/librdkafka/src/README.lz4.md +30 -0
  232. package/deps/librdkafka/src/cJSON.c +2834 -0
  233. package/deps/librdkafka/src/cJSON.h +398 -0
  234. package/deps/librdkafka/src/crc32c.c +430 -0
  235. package/deps/librdkafka/src/crc32c.h +38 -0
  236. package/deps/librdkafka/src/generate_proto.sh +66 -0
  237. package/deps/librdkafka/src/librdkafka_cgrp_synch.png +0 -0
  238. package/deps/librdkafka/src/lz4.c +2727 -0
  239. package/deps/librdkafka/src/lz4.h +842 -0
  240. package/deps/librdkafka/src/lz4frame.c +2078 -0
  241. package/deps/librdkafka/src/lz4frame.h +692 -0
  242. package/deps/librdkafka/src/lz4frame_static.h +47 -0
  243. package/deps/librdkafka/src/lz4hc.c +1631 -0
  244. package/deps/librdkafka/src/lz4hc.h +413 -0
  245. package/deps/librdkafka/src/nanopb/pb.h +917 -0
  246. package/deps/librdkafka/src/nanopb/pb_common.c +388 -0
  247. package/deps/librdkafka/src/nanopb/pb_common.h +49 -0
  248. package/deps/librdkafka/src/nanopb/pb_decode.c +1727 -0
  249. package/deps/librdkafka/src/nanopb/pb_decode.h +193 -0
  250. package/deps/librdkafka/src/nanopb/pb_encode.c +1000 -0
  251. package/deps/librdkafka/src/nanopb/pb_encode.h +185 -0
  252. package/deps/librdkafka/src/opentelemetry/common.pb.c +32 -0
  253. package/deps/librdkafka/src/opentelemetry/common.pb.h +170 -0
  254. package/deps/librdkafka/src/opentelemetry/metrics.options +2 -0
  255. package/deps/librdkafka/src/opentelemetry/metrics.pb.c +67 -0
  256. package/deps/librdkafka/src/opentelemetry/metrics.pb.h +966 -0
  257. package/deps/librdkafka/src/opentelemetry/resource.pb.c +12 -0
  258. package/deps/librdkafka/src/opentelemetry/resource.pb.h +58 -0
  259. package/deps/librdkafka/src/queue.h +850 -0
  260. package/deps/librdkafka/src/rd.h +441 -0
  261. package/deps/librdkafka/src/rdaddr.c +255 -0
  262. package/deps/librdkafka/src/rdaddr.h +203 -0
  263. package/deps/librdkafka/src/rdatomic.h +226 -0
  264. package/deps/librdkafka/src/rdavg.h +259 -0
  265. package/deps/librdkafka/src/rdavl.c +210 -0
  266. package/deps/librdkafka/src/rdavl.h +250 -0
  267. package/deps/librdkafka/src/rdbase64.c +169 -0
  268. package/deps/librdkafka/src/rdbase64.h +41 -0
  269. package/deps/librdkafka/src/rdbuf.c +1884 -0
  270. package/deps/librdkafka/src/rdbuf.h +375 -0
  271. package/deps/librdkafka/src/rdcrc32.c +114 -0
  272. package/deps/librdkafka/src/rdcrc32.h +170 -0
  273. package/deps/librdkafka/src/rddl.c +179 -0
  274. package/deps/librdkafka/src/rddl.h +43 -0
  275. package/deps/librdkafka/src/rdendian.h +174 -0
  276. package/deps/librdkafka/src/rdfloat.h +67 -0
  277. package/deps/librdkafka/src/rdfnv1a.c +113 -0
  278. package/deps/librdkafka/src/rdfnv1a.h +35 -0
  279. package/deps/librdkafka/src/rdgz.c +120 -0
  280. package/deps/librdkafka/src/rdgz.h +46 -0
  281. package/deps/librdkafka/src/rdhdrhistogram.c +721 -0
  282. package/deps/librdkafka/src/rdhdrhistogram.h +87 -0
  283. package/deps/librdkafka/src/rdhttp.c +512 -0
  284. package/deps/librdkafka/src/rdhttp.h +83 -0
  285. package/deps/librdkafka/src/rdinterval.h +177 -0
  286. package/deps/librdkafka/src/rdkafka.c +5351 -0
  287. package/deps/librdkafka/src/rdkafka.h +10603 -0
  288. package/deps/librdkafka/src/rdkafka_admin.c +9417 -0
  289. package/deps/librdkafka/src/rdkafka_admin.h +619 -0
  290. package/deps/librdkafka/src/rdkafka_assignment.c +1010 -0
  291. package/deps/librdkafka/src/rdkafka_assignment.h +73 -0
  292. package/deps/librdkafka/src/rdkafka_assignor.c +1786 -0
  293. package/deps/librdkafka/src/rdkafka_assignor.h +402 -0
  294. package/deps/librdkafka/src/rdkafka_aux.c +409 -0
  295. package/deps/librdkafka/src/rdkafka_aux.h +174 -0
  296. package/deps/librdkafka/src/rdkafka_background.c +221 -0
  297. package/deps/librdkafka/src/rdkafka_broker.c +6186 -0
  298. package/deps/librdkafka/src/rdkafka_broker.h +686 -0
  299. package/deps/librdkafka/src/rdkafka_buf.c +540 -0
  300. package/deps/librdkafka/src/rdkafka_buf.h +1524 -0
  301. package/deps/librdkafka/src/rdkafka_cert.c +552 -0
  302. package/deps/librdkafka/src/rdkafka_cert.h +61 -0
  303. package/deps/librdkafka/src/rdkafka_cgrp.c +7262 -0
  304. package/deps/librdkafka/src/rdkafka_cgrp.h +443 -0
  305. package/deps/librdkafka/src/rdkafka_conf.c +4456 -0
  306. package/deps/librdkafka/src/rdkafka_conf.h +668 -0
  307. package/deps/librdkafka/src/rdkafka_confval.h +97 -0
  308. package/deps/librdkafka/src/rdkafka_coord.c +623 -0
  309. package/deps/librdkafka/src/rdkafka_coord.h +132 -0
  310. package/deps/librdkafka/src/rdkafka_error.c +228 -0
  311. package/deps/librdkafka/src/rdkafka_error.h +80 -0
  312. package/deps/librdkafka/src/rdkafka_event.c +502 -0
  313. package/deps/librdkafka/src/rdkafka_event.h +126 -0
  314. package/deps/librdkafka/src/rdkafka_feature.c +461 -0
  315. package/deps/librdkafka/src/rdkafka_feature.h +102 -0
  316. package/deps/librdkafka/src/rdkafka_fetcher.c +1402 -0
  317. package/deps/librdkafka/src/rdkafka_fetcher.h +44 -0
  318. package/deps/librdkafka/src/rdkafka_header.c +220 -0
  319. package/deps/librdkafka/src/rdkafka_header.h +76 -0
  320. package/deps/librdkafka/src/rdkafka_idempotence.c +807 -0
  321. package/deps/librdkafka/src/rdkafka_idempotence.h +144 -0
  322. package/deps/librdkafka/src/rdkafka_int.h +1222 -0
  323. package/deps/librdkafka/src/rdkafka_interceptor.c +819 -0
  324. package/deps/librdkafka/src/rdkafka_interceptor.h +104 -0
  325. package/deps/librdkafka/src/rdkafka_lz4.c +450 -0
  326. package/deps/librdkafka/src/rdkafka_lz4.h +49 -0
  327. package/deps/librdkafka/src/rdkafka_metadata.c +2124 -0
  328. package/deps/librdkafka/src/rdkafka_metadata.h +341 -0
  329. package/deps/librdkafka/src/rdkafka_metadata_cache.c +977 -0
  330. package/deps/librdkafka/src/rdkafka_mock.c +2885 -0
  331. package/deps/librdkafka/src/rdkafka_mock.h +491 -0
  332. package/deps/librdkafka/src/rdkafka_mock_cgrp.c +710 -0
  333. package/deps/librdkafka/src/rdkafka_mock_handlers.c +2817 -0
  334. package/deps/librdkafka/src/rdkafka_mock_int.h +591 -0
  335. package/deps/librdkafka/src/rdkafka_msg.c +2573 -0
  336. package/deps/librdkafka/src/rdkafka_msg.h +614 -0
  337. package/deps/librdkafka/src/rdkafka_msgbatch.h +62 -0
  338. package/deps/librdkafka/src/rdkafka_msgset.h +98 -0
  339. package/deps/librdkafka/src/rdkafka_msgset_reader.c +1806 -0
  340. package/deps/librdkafka/src/rdkafka_msgset_writer.c +1470 -0
  341. package/deps/librdkafka/src/rdkafka_offset.c +1537 -0
  342. package/deps/librdkafka/src/rdkafka_offset.h +150 -0
  343. package/deps/librdkafka/src/rdkafka_op.c +997 -0
  344. package/deps/librdkafka/src/rdkafka_op.h +834 -0
  345. package/deps/librdkafka/src/rdkafka_partition.c +4801 -0
  346. package/deps/librdkafka/src/rdkafka_partition.h +1173 -0
  347. package/deps/librdkafka/src/rdkafka_pattern.c +228 -0
  348. package/deps/librdkafka/src/rdkafka_pattern.h +70 -0
  349. package/deps/librdkafka/src/rdkafka_plugin.c +213 -0
  350. package/deps/librdkafka/src/rdkafka_plugin.h +41 -0
  351. package/deps/librdkafka/src/rdkafka_proto.h +733 -0
  352. package/deps/librdkafka/src/rdkafka_protocol.h +127 -0
  353. package/deps/librdkafka/src/rdkafka_queue.c +1153 -0
  354. package/deps/librdkafka/src/rdkafka_queue.h +1201 -0
  355. package/deps/librdkafka/src/rdkafka_range_assignor.c +1748 -0
  356. package/deps/librdkafka/src/rdkafka_request.c +6817 -0
  357. package/deps/librdkafka/src/rdkafka_request.h +709 -0
  358. package/deps/librdkafka/src/rdkafka_roundrobin_assignor.c +123 -0
  359. package/deps/librdkafka/src/rdkafka_sasl.c +528 -0
  360. package/deps/librdkafka/src/rdkafka_sasl.h +63 -0
  361. package/deps/librdkafka/src/rdkafka_sasl_cyrus.c +722 -0
  362. package/deps/librdkafka/src/rdkafka_sasl_int.h +89 -0
  363. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.c +1829 -0
  364. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.h +52 -0
  365. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.c +589 -0
  366. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.h +37 -0
  367. package/deps/librdkafka/src/rdkafka_sasl_plain.c +142 -0
  368. package/deps/librdkafka/src/rdkafka_sasl_scram.c +857 -0
  369. package/deps/librdkafka/src/rdkafka_sasl_win32.c +550 -0
  370. package/deps/librdkafka/src/rdkafka_ssl.c +1904 -0
  371. package/deps/librdkafka/src/rdkafka_ssl.h +64 -0
  372. package/deps/librdkafka/src/rdkafka_sticky_assignor.c +4781 -0
  373. package/deps/librdkafka/src/rdkafka_subscription.c +278 -0
  374. package/deps/librdkafka/src/rdkafka_telemetry.c +703 -0
  375. package/deps/librdkafka/src/rdkafka_telemetry.h +52 -0
  376. package/deps/librdkafka/src/rdkafka_telemetry_decode.c +1053 -0
  377. package/deps/librdkafka/src/rdkafka_telemetry_decode.h +59 -0
  378. package/deps/librdkafka/src/rdkafka_telemetry_encode.c +993 -0
  379. package/deps/librdkafka/src/rdkafka_telemetry_encode.h +301 -0
  380. package/deps/librdkafka/src/rdkafka_timer.c +402 -0
  381. package/deps/librdkafka/src/rdkafka_timer.h +117 -0
  382. package/deps/librdkafka/src/rdkafka_topic.c +2078 -0
  383. package/deps/librdkafka/src/rdkafka_topic.h +328 -0
  384. package/deps/librdkafka/src/rdkafka_transport.c +1297 -0
  385. package/deps/librdkafka/src/rdkafka_transport.h +94 -0
  386. package/deps/librdkafka/src/rdkafka_transport_int.h +100 -0
  387. package/deps/librdkafka/src/rdkafka_txnmgr.c +3251 -0
  388. package/deps/librdkafka/src/rdkafka_txnmgr.h +171 -0
  389. package/deps/librdkafka/src/rdkafka_zstd.c +226 -0
  390. package/deps/librdkafka/src/rdkafka_zstd.h +57 -0
  391. package/deps/librdkafka/src/rdlist.c +576 -0
  392. package/deps/librdkafka/src/rdlist.h +434 -0
  393. package/deps/librdkafka/src/rdlog.c +89 -0
  394. package/deps/librdkafka/src/rdlog.h +41 -0
  395. package/deps/librdkafka/src/rdmap.c +503 -0
  396. package/deps/librdkafka/src/rdmap.h +492 -0
  397. package/deps/librdkafka/src/rdmurmur2.c +167 -0
  398. package/deps/librdkafka/src/rdmurmur2.h +35 -0
  399. package/deps/librdkafka/src/rdports.c +61 -0
  400. package/deps/librdkafka/src/rdports.h +38 -0
  401. package/deps/librdkafka/src/rdposix.h +250 -0
  402. package/deps/librdkafka/src/rdrand.c +70 -0
  403. package/deps/librdkafka/src/rdrand.h +43 -0
  404. package/deps/librdkafka/src/rdregex.c +156 -0
  405. package/deps/librdkafka/src/rdregex.h +43 -0
  406. package/deps/librdkafka/src/rdsignal.h +57 -0
  407. package/deps/librdkafka/src/rdstring.c +645 -0
  408. package/deps/librdkafka/src/rdstring.h +98 -0
  409. package/deps/librdkafka/src/rdsysqueue.h +404 -0
  410. package/deps/librdkafka/src/rdtime.h +325 -0
  411. package/deps/librdkafka/src/rdtypes.h +86 -0
  412. package/deps/librdkafka/src/rdunittest.c +532 -0
  413. package/deps/librdkafka/src/rdunittest.h +230 -0
  414. package/deps/librdkafka/src/rdvarint.c +134 -0
  415. package/deps/librdkafka/src/rdvarint.h +165 -0
  416. package/deps/librdkafka/src/rdwin32.h +382 -0
  417. package/deps/librdkafka/src/rdxxhash.c +1030 -0
  418. package/deps/librdkafka/src/rdxxhash.h +328 -0
  419. package/deps/librdkafka/src/regexp.c +1347 -0
  420. package/deps/librdkafka/src/regexp.h +41 -0
  421. package/deps/librdkafka/src/snappy.c +1866 -0
  422. package/deps/librdkafka/src/snappy.h +62 -0
  423. package/deps/librdkafka/src/snappy_compat.h +138 -0
  424. package/deps/librdkafka/src/statistics_schema.json +444 -0
  425. package/deps/librdkafka/src/tinycthread.c +932 -0
  426. package/deps/librdkafka/src/tinycthread.h +503 -0
  427. package/deps/librdkafka/src/tinycthread_extra.c +175 -0
  428. package/deps/librdkafka/src/tinycthread_extra.h +208 -0
  429. package/deps/librdkafka/src/win32_config.h +58 -0
  430. package/deps/librdkafka/src-cpp/CMakeLists.txt +90 -0
  431. package/deps/librdkafka/src-cpp/ConfImpl.cpp +84 -0
  432. package/deps/librdkafka/src-cpp/ConsumerImpl.cpp +244 -0
  433. package/deps/librdkafka/src-cpp/HandleImpl.cpp +436 -0
  434. package/deps/librdkafka/src-cpp/HeadersImpl.cpp +48 -0
  435. package/deps/librdkafka/src-cpp/KafkaConsumerImpl.cpp +296 -0
  436. package/deps/librdkafka/src-cpp/Makefile +55 -0
  437. package/deps/librdkafka/src-cpp/MessageImpl.cpp +38 -0
  438. package/deps/librdkafka/src-cpp/MetadataImpl.cpp +170 -0
  439. package/deps/librdkafka/src-cpp/ProducerImpl.cpp +197 -0
  440. package/deps/librdkafka/src-cpp/QueueImpl.cpp +70 -0
  441. package/deps/librdkafka/src-cpp/README.md +16 -0
  442. package/deps/librdkafka/src-cpp/RdKafka.cpp +59 -0
  443. package/deps/librdkafka/src-cpp/TopicImpl.cpp +124 -0
  444. package/deps/librdkafka/src-cpp/TopicPartitionImpl.cpp +57 -0
  445. package/deps/librdkafka/src-cpp/rdkafkacpp.h +3771 -0
  446. package/deps/librdkafka/src-cpp/rdkafkacpp_int.h +1641 -0
  447. package/deps/librdkafka/tests/0000-unittests.c +72 -0
  448. package/deps/librdkafka/tests/0001-multiobj.c +98 -0
  449. package/deps/librdkafka/tests/0002-unkpart.c +244 -0
  450. package/deps/librdkafka/tests/0003-msgmaxsize.c +173 -0
  451. package/deps/librdkafka/tests/0004-conf.c +867 -0
  452. package/deps/librdkafka/tests/0005-order.c +133 -0
  453. package/deps/librdkafka/tests/0006-symbols.c +163 -0
  454. package/deps/librdkafka/tests/0007-autotopic.c +136 -0
  455. package/deps/librdkafka/tests/0008-reqacks.c +179 -0
  456. package/deps/librdkafka/tests/0009-mock_cluster.c +96 -0
  457. package/deps/librdkafka/tests/0011-produce_batch.c +752 -0
  458. package/deps/librdkafka/tests/0012-produce_consume.c +537 -0
  459. package/deps/librdkafka/tests/0013-null-msgs.c +473 -0
  460. package/deps/librdkafka/tests/0014-reconsume-191.c +512 -0
  461. package/deps/librdkafka/tests/0015-offset_seeks.c +172 -0
  462. package/deps/librdkafka/tests/0016-client_swname.c +166 -0
  463. package/deps/librdkafka/tests/0017-compression.c +142 -0
  464. package/deps/librdkafka/tests/0018-cgrp_term.c +333 -0
  465. package/deps/librdkafka/tests/0019-list_groups.c +289 -0
  466. package/deps/librdkafka/tests/0020-destroy_hang.c +162 -0
  467. package/deps/librdkafka/tests/0021-rkt_destroy.c +71 -0
  468. package/deps/librdkafka/tests/0022-consume_batch.c +276 -0
  469. package/deps/librdkafka/tests/0025-timers.c +147 -0
  470. package/deps/librdkafka/tests/0026-consume_pause.c +549 -0
  471. package/deps/librdkafka/tests/0028-long_topicnames.c +79 -0
  472. package/deps/librdkafka/tests/0029-assign_offset.c +204 -0
  473. package/deps/librdkafka/tests/0030-offset_commit.c +589 -0
  474. package/deps/librdkafka/tests/0031-get_offsets.c +235 -0
  475. package/deps/librdkafka/tests/0033-regex_subscribe.c +520 -0
  476. package/deps/librdkafka/tests/0034-offset_reset.c +377 -0
  477. package/deps/librdkafka/tests/0035-api_version.c +73 -0
  478. package/deps/librdkafka/tests/0036-partial_fetch.c +86 -0
  479. package/deps/librdkafka/tests/0037-destroy_hang_local.c +85 -0
  480. package/deps/librdkafka/tests/0038-performance.c +120 -0
  481. package/deps/librdkafka/tests/0039-event.c +284 -0
  482. package/deps/librdkafka/tests/0040-io_event.c +251 -0
  483. package/deps/librdkafka/tests/0041-fetch_max_bytes.c +96 -0
  484. package/deps/librdkafka/tests/0042-many_topics.c +252 -0
  485. package/deps/librdkafka/tests/0043-no_connection.c +77 -0
  486. package/deps/librdkafka/tests/0044-partition_cnt.c +93 -0
  487. package/deps/librdkafka/tests/0045-subscribe_update.c +746 -0
  488. package/deps/librdkafka/tests/0046-rkt_cache.c +65 -0
  489. package/deps/librdkafka/tests/0047-partial_buf_tmout.c +97 -0
  490. package/deps/librdkafka/tests/0048-partitioner.c +283 -0
  491. package/deps/librdkafka/tests/0049-consume_conn_close.c +162 -0
  492. package/deps/librdkafka/tests/0050-subscribe_adds.c +144 -0
  493. package/deps/librdkafka/tests/0051-assign_adds.c +125 -0
  494. package/deps/librdkafka/tests/0052-msg_timestamps.c +220 -0
  495. package/deps/librdkafka/tests/0053-stats_cb.cpp +535 -0
  496. package/deps/librdkafka/tests/0054-offset_time.cpp +236 -0
  497. package/deps/librdkafka/tests/0055-producer_latency.c +366 -0
  498. package/deps/librdkafka/tests/0056-balanced_group_mt.c +311 -0
  499. package/deps/librdkafka/tests/0057-invalid_topic.cpp +112 -0
  500. package/deps/librdkafka/tests/0058-log.cpp +123 -0
  501. package/deps/librdkafka/tests/0059-bsearch.cpp +237 -0
  502. package/deps/librdkafka/tests/0060-op_prio.cpp +163 -0
  503. package/deps/librdkafka/tests/0061-consumer_lag.cpp +275 -0
  504. package/deps/librdkafka/tests/0062-stats_event.c +126 -0
  505. package/deps/librdkafka/tests/0063-clusterid.cpp +180 -0
  506. package/deps/librdkafka/tests/0064-interceptors.c +481 -0
  507. package/deps/librdkafka/tests/0065-yield.cpp +140 -0
  508. package/deps/librdkafka/tests/0066-plugins.cpp +129 -0
  509. package/deps/librdkafka/tests/0067-empty_topic.cpp +148 -0
  510. package/deps/librdkafka/tests/0068-produce_timeout.c +138 -0
  511. package/deps/librdkafka/tests/0069-consumer_add_parts.c +123 -0
  512. package/deps/librdkafka/tests/0070-null_empty.cpp +197 -0
  513. package/deps/librdkafka/tests/0072-headers_ut.c +448 -0
  514. package/deps/librdkafka/tests/0073-headers.c +381 -0
  515. package/deps/librdkafka/tests/0074-producev.c +87 -0
  516. package/deps/librdkafka/tests/0075-retry.c +253 -0
  517. package/deps/librdkafka/tests/0076-produce_retry.c +450 -0
  518. package/deps/librdkafka/tests/0077-compaction.c +357 -0
  519. package/deps/librdkafka/tests/0078-c_from_cpp.cpp +96 -0
  520. package/deps/librdkafka/tests/0079-fork.c +93 -0
  521. package/deps/librdkafka/tests/0080-admin_ut.c +3065 -0
  522. package/deps/librdkafka/tests/0081-admin.c +5333 -0
  523. package/deps/librdkafka/tests/0082-fetch_max_bytes.cpp +133 -0
  524. package/deps/librdkafka/tests/0083-cb_event.c +228 -0
  525. package/deps/librdkafka/tests/0084-destroy_flags.c +212 -0
  526. package/deps/librdkafka/tests/0085-headers.cpp +388 -0
  527. package/deps/librdkafka/tests/0086-purge.c +335 -0
  528. package/deps/librdkafka/tests/0088-produce_metadata_timeout.c +162 -0
  529. package/deps/librdkafka/tests/0089-max_poll_interval.c +506 -0
  530. package/deps/librdkafka/tests/0090-idempotence.c +172 -0
  531. package/deps/librdkafka/tests/0091-max_poll_interval_timeout.c +297 -0
  532. package/deps/librdkafka/tests/0092-mixed_msgver.c +97 -0
  533. package/deps/librdkafka/tests/0093-holb.c +197 -0
  534. package/deps/librdkafka/tests/0094-idempotence_msg_timeout.c +230 -0
  535. package/deps/librdkafka/tests/0095-all_brokers_down.cpp +122 -0
  536. package/deps/librdkafka/tests/0097-ssl_verify.cpp +466 -0
  537. package/deps/librdkafka/tests/0098-consumer-txn.cpp +1218 -0
  538. package/deps/librdkafka/tests/0099-commit_metadata.c +194 -0
  539. package/deps/librdkafka/tests/0100-thread_interceptors.cpp +195 -0
  540. package/deps/librdkafka/tests/0101-fetch-from-follower.cpp +446 -0
  541. package/deps/librdkafka/tests/0102-static_group_rebalance.c +535 -0
  542. package/deps/librdkafka/tests/0103-transactions.c +1383 -0
  543. package/deps/librdkafka/tests/0104-fetch_from_follower_mock.c +624 -0
  544. package/deps/librdkafka/tests/0105-transactions_mock.c +3923 -0
  545. package/deps/librdkafka/tests/0106-cgrp_sess_timeout.c +297 -0
  546. package/deps/librdkafka/tests/0107-topic_recreate.c +259 -0
  547. package/deps/librdkafka/tests/0109-auto_create_topics.cpp +218 -0
  548. package/deps/librdkafka/tests/0110-batch_size.cpp +183 -0
  549. package/deps/librdkafka/tests/0111-delay_create_topics.cpp +127 -0
  550. package/deps/librdkafka/tests/0112-assign_unknown_part.c +98 -0
  551. package/deps/librdkafka/tests/0113-cooperative_rebalance.cpp +3329 -0
  552. package/deps/librdkafka/tests/0114-sticky_partitioning.cpp +176 -0
  553. package/deps/librdkafka/tests/0115-producer_auth.cpp +179 -0
  554. package/deps/librdkafka/tests/0116-kafkaconsumer_close.cpp +214 -0
  555. package/deps/librdkafka/tests/0117-mock_errors.c +321 -0
  556. package/deps/librdkafka/tests/0118-commit_rebalance.c +121 -0
  557. package/deps/librdkafka/tests/0119-consumer_auth.cpp +148 -0
  558. package/deps/librdkafka/tests/0120-asymmetric_subscription.c +180 -0
  559. package/deps/librdkafka/tests/0121-clusterid.c +115 -0
  560. package/deps/librdkafka/tests/0122-buffer_cleaning_after_rebalance.c +227 -0
  561. package/deps/librdkafka/tests/0123-connections_max_idle.c +98 -0
  562. package/deps/librdkafka/tests/0124-openssl_invalid_engine.c +69 -0
  563. package/deps/librdkafka/tests/0125-immediate_flush.c +144 -0
  564. package/deps/librdkafka/tests/0126-oauthbearer_oidc.c +213 -0
  565. package/deps/librdkafka/tests/0127-fetch_queue_backoff.cpp +165 -0
  566. package/deps/librdkafka/tests/0128-sasl_callback_queue.cpp +125 -0
  567. package/deps/librdkafka/tests/0129-fetch_aborted_msgs.c +78 -0
  568. package/deps/librdkafka/tests/0130-store_offsets.c +178 -0
  569. package/deps/librdkafka/tests/0131-connect_timeout.c +81 -0
  570. package/deps/librdkafka/tests/0132-strategy_ordering.c +171 -0
  571. package/deps/librdkafka/tests/0133-ssl_keys.c +128 -0
  572. package/deps/librdkafka/tests/0134-ssl_provider.c +92 -0
  573. package/deps/librdkafka/tests/0135-sasl_credentials.cpp +143 -0
  574. package/deps/librdkafka/tests/0136-resolve_cb.c +181 -0
  575. package/deps/librdkafka/tests/0137-barrier_batch_consume.c +609 -0
  576. package/deps/librdkafka/tests/0138-admin_mock.c +281 -0
  577. package/deps/librdkafka/tests/0139-offset_validation_mock.c +442 -0
  578. package/deps/librdkafka/tests/0140-commit_metadata.cpp +108 -0
  579. package/deps/librdkafka/tests/0142-reauthentication.c +495 -0
  580. package/deps/librdkafka/tests/0143-exponential_backoff_mock.c +553 -0
  581. package/deps/librdkafka/tests/0144-idempotence_mock.c +373 -0
  582. package/deps/librdkafka/tests/0145-pause_resume_mock.c +119 -0
  583. package/deps/librdkafka/tests/0146-metadata_mock.c +444 -0
  584. package/deps/librdkafka/tests/0150-telemetry_mock.c +648 -0
  585. package/deps/librdkafka/tests/1000-unktopic.c +164 -0
  586. package/deps/librdkafka/tests/8000-idle.cpp +60 -0
  587. package/deps/librdkafka/tests/8001-fetch_from_follower_mock_manual.c +113 -0
  588. package/deps/librdkafka/tests/CMakeLists.txt +164 -0
  589. package/deps/librdkafka/tests/LibrdkafkaTestApp.py +266 -0
  590. package/deps/librdkafka/tests/Makefile +182 -0
  591. package/deps/librdkafka/tests/README.md +509 -0
  592. package/deps/librdkafka/tests/autotest.sh +33 -0
  593. package/deps/librdkafka/tests/backtrace.gdb +30 -0
  594. package/deps/librdkafka/tests/broker_version_tests.py +315 -0
  595. package/deps/librdkafka/tests/buildbox.sh +17 -0
  596. package/deps/librdkafka/tests/cleanup-checker-tests.sh +20 -0
  597. package/deps/librdkafka/tests/cluster_testing.py +191 -0
  598. package/deps/librdkafka/tests/delete-test-topics.sh +56 -0
  599. package/deps/librdkafka/tests/fixtures/ssl/Makefile +8 -0
  600. package/deps/librdkafka/tests/fixtures/ssl/README.md +13 -0
  601. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.p12 +0 -0
  602. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.pem +109 -0
  603. package/deps/librdkafka/tests/fixtures/ssl/client2.key +34 -0
  604. package/deps/librdkafka/tests/fixtures/ssl/create_keys.sh +93 -0
  605. package/deps/librdkafka/tests/fuzzers/Makefile +12 -0
  606. package/deps/librdkafka/tests/fuzzers/README.md +31 -0
  607. package/deps/librdkafka/tests/fuzzers/fuzz_regex.c +74 -0
  608. package/deps/librdkafka/tests/fuzzers/helpers.h +90 -0
  609. package/deps/librdkafka/tests/gen-ssl-certs.sh +165 -0
  610. package/deps/librdkafka/tests/interactive_broker_version.py +170 -0
  611. package/deps/librdkafka/tests/interceptor_test/CMakeLists.txt +16 -0
  612. package/deps/librdkafka/tests/interceptor_test/Makefile +22 -0
  613. package/deps/librdkafka/tests/interceptor_test/interceptor_test.c +314 -0
  614. package/deps/librdkafka/tests/interceptor_test/interceptor_test.h +54 -0
  615. package/deps/librdkafka/tests/java/IncrementalRebalanceCli.java +97 -0
  616. package/deps/librdkafka/tests/java/Makefile +12 -0
  617. package/deps/librdkafka/tests/java/Murmur2Cli.java +46 -0
  618. package/deps/librdkafka/tests/java/README.md +14 -0
  619. package/deps/librdkafka/tests/java/TransactionProducerCli.java +162 -0
  620. package/deps/librdkafka/tests/java/run-class.sh +11 -0
  621. package/deps/librdkafka/tests/librdkafka.suppressions +483 -0
  622. package/deps/librdkafka/tests/lz4_manual_test.sh +59 -0
  623. package/deps/librdkafka/tests/multi-broker-version-test.sh +50 -0
  624. package/deps/librdkafka/tests/parse-refcnt.sh +43 -0
  625. package/deps/librdkafka/tests/performance_plot.py +115 -0
  626. package/deps/librdkafka/tests/plugin_test/Makefile +19 -0
  627. package/deps/librdkafka/tests/plugin_test/plugin_test.c +58 -0
  628. package/deps/librdkafka/tests/requirements.txt +2 -0
  629. package/deps/librdkafka/tests/run-consumer-tests.sh +16 -0
  630. package/deps/librdkafka/tests/run-producer-tests.sh +16 -0
  631. package/deps/librdkafka/tests/run-test.sh +140 -0
  632. package/deps/librdkafka/tests/rusage.c +249 -0
  633. package/deps/librdkafka/tests/sasl_test.py +289 -0
  634. package/deps/librdkafka/tests/scenarios/README.md +6 -0
  635. package/deps/librdkafka/tests/scenarios/ak23.json +6 -0
  636. package/deps/librdkafka/tests/scenarios/default.json +5 -0
  637. package/deps/librdkafka/tests/scenarios/noautocreate.json +5 -0
  638. package/deps/librdkafka/tests/sockem.c +801 -0
  639. package/deps/librdkafka/tests/sockem.h +85 -0
  640. package/deps/librdkafka/tests/sockem_ctrl.c +145 -0
  641. package/deps/librdkafka/tests/sockem_ctrl.h +61 -0
  642. package/deps/librdkafka/tests/test.c +7318 -0
  643. package/deps/librdkafka/tests/test.conf.example +27 -0
  644. package/deps/librdkafka/tests/test.h +979 -0
  645. package/deps/librdkafka/tests/testcpp.cpp +126 -0
  646. package/deps/librdkafka/tests/testcpp.h +360 -0
  647. package/deps/librdkafka/tests/testshared.h +402 -0
  648. package/deps/librdkafka/tests/tools/README.md +4 -0
  649. package/deps/librdkafka/tests/tools/stats/README.md +21 -0
  650. package/deps/librdkafka/tests/tools/stats/filter.jq +42 -0
  651. package/deps/librdkafka/tests/tools/stats/graph.py +150 -0
  652. package/deps/librdkafka/tests/tools/stats/requirements.txt +3 -0
  653. package/deps/librdkafka/tests/tools/stats/to_csv.py +124 -0
  654. package/deps/librdkafka/tests/until-fail.sh +87 -0
  655. package/deps/librdkafka/tests/xxxx-assign_partition.c +122 -0
  656. package/deps/librdkafka/tests/xxxx-metadata.cpp +159 -0
  657. package/deps/librdkafka/vcpkg.json +23 -0
  658. package/deps/librdkafka/win32/README.md +5 -0
  659. package/deps/librdkafka/win32/build-package.bat +3 -0
  660. package/deps/librdkafka/win32/build.bat +19 -0
  661. package/deps/librdkafka/win32/common.vcxproj +84 -0
  662. package/deps/librdkafka/win32/install-openssl.ps1 +33 -0
  663. package/deps/librdkafka/win32/interceptor_test/interceptor_test.vcxproj +87 -0
  664. package/deps/librdkafka/win32/librdkafka.autopkg.template +54 -0
  665. package/deps/librdkafka/win32/librdkafka.master.testing.targets +13 -0
  666. package/deps/librdkafka/win32/librdkafka.sln +226 -0
  667. package/deps/librdkafka/win32/librdkafka.vcxproj +276 -0
  668. package/deps/librdkafka/win32/librdkafkacpp/librdkafkacpp.vcxproj +104 -0
  669. package/deps/librdkafka/win32/msbuild.ps1 +15 -0
  670. package/deps/librdkafka/win32/openssl_engine_example/openssl_engine_example.vcxproj +132 -0
  671. package/deps/librdkafka/win32/package-zip.ps1 +46 -0
  672. package/deps/librdkafka/win32/packages/repositories.config +4 -0
  673. package/deps/librdkafka/win32/push-package.bat +4 -0
  674. package/deps/librdkafka/win32/rdkafka_complex_consumer_example_cpp/rdkafka_complex_consumer_example_cpp.vcxproj +67 -0
  675. package/deps/librdkafka/win32/rdkafka_example/rdkafka_example.vcxproj +97 -0
  676. package/deps/librdkafka/win32/rdkafka_performance/rdkafka_performance.vcxproj +97 -0
  677. package/deps/librdkafka/win32/setup-msys2.ps1 +31 -0
  678. package/deps/librdkafka/win32/setup-vcpkg.ps1 +12 -0
  679. package/deps/librdkafka/win32/tests/test.conf.example +25 -0
  680. package/deps/librdkafka/win32/tests/tests.vcxproj +247 -0
  681. package/deps/librdkafka/win32/win_ssl_cert_store/win_ssl_cert_store.vcxproj +132 -0
  682. package/deps/librdkafka/win32/wingetopt.c +564 -0
  683. package/deps/librdkafka/win32/wingetopt.h +100 -0
  684. package/deps/librdkafka/win32/wintime.h +33 -0
  685. package/deps/librdkafka.gyp +62 -0
  686. package/deps/windows-install.py +73 -0
  687. package/docker-compose.yml +23 -0
  688. package/e2e/admin.spec.js +187 -0
  689. package/e2e/both.spec.js +726 -0
  690. package/e2e/consumer.spec.js +386 -0
  691. package/e2e/groups.spec.js +132 -0
  692. package/e2e/listener.js +51 -0
  693. package/e2e/producer-transaction.spec.js +333 -0
  694. package/e2e/producer.spec.js +283 -0
  695. package/errors.d.ts +347 -0
  696. package/examples/consumer-flow.md +76 -0
  697. package/examples/consumer.md +45 -0
  698. package/examples/docker-alpine.md +30 -0
  699. package/examples/high-level-producer.md +32 -0
  700. package/examples/metadata.md +27 -0
  701. package/examples/oauthbearer-default-flow.md +80 -0
  702. package/examples/producer-cluster.md +103 -0
  703. package/examples/producer.md +73 -0
  704. package/index.d.ts +357 -0
  705. package/lib/admin.js +233 -0
  706. package/lib/client.js +578 -0
  707. package/lib/error.js +472 -0
  708. package/lib/index.js +34 -0
  709. package/lib/kafka-consumer-stream.js +397 -0
  710. package/lib/kafka-consumer.js +698 -0
  711. package/lib/producer/high-level-producer.js +323 -0
  712. package/lib/producer-stream.js +307 -0
  713. package/lib/producer.js +375 -0
  714. package/lib/tools/ref-counter.js +52 -0
  715. package/lib/topic-partition.js +88 -0
  716. package/lib/topic.js +42 -0
  717. package/lib/util.js +29 -0
  718. package/librdkafka.js +12 -0
  719. package/make_docs.sh +59 -0
  720. package/package.json +53 -0
  721. package/renovate.json +30 -0
  722. package/run_docker.sh +42 -0
  723. package/src/admin.cc +624 -0
  724. package/src/admin.h +78 -0
  725. package/src/binding.cc +73 -0
  726. package/src/binding.h +25 -0
  727. package/src/callbacks.cc +614 -0
  728. package/src/callbacks.h +265 -0
  729. package/src/common.cc +582 -0
  730. package/src/common.h +134 -0
  731. package/src/config.cc +167 -0
  732. package/src/config.h +45 -0
  733. package/src/connection.cc +482 -0
  734. package/src/connection.h +108 -0
  735. package/src/errors.cc +96 -0
  736. package/src/errors.h +53 -0
  737. package/src/kafka-consumer.cc +1457 -0
  738. package/src/kafka-consumer.h +136 -0
  739. package/src/per-isolate-data.cc +57 -0
  740. package/src/per-isolate-data.h +39 -0
  741. package/src/producer.cc +873 -0
  742. package/src/producer.h +125 -0
  743. package/src/topic.cc +180 -0
  744. package/src/topic.h +56 -0
  745. package/src/workers.cc +1245 -0
  746. package/src/workers.h +511 -0
  747. package/test/binding.spec.js +66 -0
  748. package/test/consumer.spec.js +91 -0
  749. package/test/error.spec.js +8 -0
  750. package/test/index.spec.js +8 -0
  751. package/test/kafka-consumer-stream.spec.js +298 -0
  752. package/test/kafka-consumer-worker.js +51 -0
  753. package/test/kafka-consumer.spec.js +86 -0
  754. package/test/mocha.opts +1 -0
  755. package/test/mock.js +55 -0
  756. package/test/producer/high-level-producer.spec.js +496 -0
  757. package/test/producer-stream.spec.js +723 -0
  758. package/test/producer-worker.js +53 -0
  759. package/test/producer.spec.js +120 -0
  760. package/test/tools/ref-counter.spec.js +53 -0
  761. package/test/topic-partition.spec.js +104 -0
  762. package/test/util.spec.js +46 -0
  763. package/util/configure.js +30 -0
  764. package/util/get-env.js +6 -0
  765. package/util/test-compile.js +11 -0
  766. package/util/test-producer-delivery.js +100 -0
  767. package/win_install.ps1 +2 -0
@@ -0,0 +1,1153 @@
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
+ mtx_init(&rkq->rkq_lock, mtx_plain);
101
+ cnd_init(&rkq->rkq_cond);
102
+ #if ENABLE_DEVEL
103
+ rd_snprintf(rkq->rkq_name, sizeof(rkq->rkq_name), "%s:%d", func, line);
104
+ #else
105
+ rkq->rkq_name = func;
106
+ #endif
107
+ }
108
+
109
+
110
+ /**
111
+ * Allocate a new queue and initialize it.
112
+ */
113
+ rd_kafka_q_t *rd_kafka_q_new0(rd_kafka_t *rk,
114
+ rd_bool_t for_consume,
115
+ const char *func,
116
+ int line) {
117
+ rd_kafka_q_t *rkq = rd_malloc(sizeof(*rkq));
118
+ if (!for_consume)
119
+ rd_kafka_q_init(rkq, rk);
120
+ else
121
+ rd_kafka_consume_q_init(rkq, rk);
122
+ rkq->rkq_flags |= RD_KAFKA_Q_F_ALLOCATED;
123
+ #if ENABLE_DEVEL
124
+ rd_snprintf(rkq->rkq_name, sizeof(rkq->rkq_name), "%s:%d", func, line);
125
+ #else
126
+ rkq->rkq_name = func;
127
+ #endif
128
+ return rkq;
129
+ }
130
+
131
+ /*
132
+ * Sets the flag RD_KAFKA_Q_F_CONSUMER for rkq, any queues it's being forwarded
133
+ * to, recursively.
134
+ * Setting this flag indicates that polling this queue is equivalent to calling
135
+ * consumer poll, and will reset the max.poll.interval.ms timer. Only used
136
+ * internally when forwarding queues.
137
+ * @locks rd_kafka_q_lock(rkq)
138
+ */
139
+ static void rd_kafka_q_consumer_propagate(rd_kafka_q_t *rkq) {
140
+ mtx_lock(&rkq->rkq_lock);
141
+ rkq->rkq_flags |= RD_KAFKA_Q_F_CONSUMER;
142
+
143
+ if (!rkq->rkq_fwdq) {
144
+ mtx_unlock(&rkq->rkq_lock);
145
+ return;
146
+ }
147
+
148
+ /* Recursively propagate the flag to any queues rkq is already
149
+ * forwarding to. There will be a deadlock here if the queues are being
150
+ * forwarded circularly, but that is a user error. We can't resolve this
151
+ * deadlock by unlocking before the recursive call, because that leads
152
+ * to incorrectness if the rkq_fwdq is forwarded elsewhere and the old
153
+ * one destroyed between recursive calls. */
154
+ rd_kafka_q_consumer_propagate(rkq->rkq_fwdq);
155
+ mtx_unlock(&rkq->rkq_lock);
156
+ }
157
+
158
+ /**
159
+ * Set/clear forward queue.
160
+ * Queue forwarding enables message routing inside rdkafka.
161
+ * Typical use is to re-route all fetched messages for all partitions
162
+ * to one single queue.
163
+ *
164
+ * All access to rkq_fwdq are protected by rkq_lock.
165
+ */
166
+ void rd_kafka_q_fwd_set0(rd_kafka_q_t *srcq,
167
+ rd_kafka_q_t *destq,
168
+ int do_lock,
169
+ int fwd_app) {
170
+ if (unlikely(srcq == destq))
171
+ return;
172
+
173
+ if (do_lock)
174
+ mtx_lock(&srcq->rkq_lock);
175
+ if (fwd_app)
176
+ srcq->rkq_flags |= RD_KAFKA_Q_F_FWD_APP;
177
+ if (srcq->rkq_fwdq) {
178
+ rd_kafka_q_destroy(srcq->rkq_fwdq);
179
+ srcq->rkq_fwdq = NULL;
180
+ }
181
+ if (destq) {
182
+ rd_kafka_q_keep(destq);
183
+
184
+ /* If rkq has ops in queue, append them to fwdq's queue.
185
+ * This is an irreversible operation. */
186
+ if (srcq->rkq_qlen > 0) {
187
+ rd_dassert(destq->rkq_flags & RD_KAFKA_Q_F_READY);
188
+ rd_kafka_q_concat(destq, srcq);
189
+ }
190
+
191
+ srcq->rkq_fwdq = destq;
192
+
193
+ if (srcq->rkq_flags & RD_KAFKA_Q_F_CONSUMER)
194
+ rd_kafka_q_consumer_propagate(destq);
195
+ }
196
+ if (do_lock)
197
+ mtx_unlock(&srcq->rkq_lock);
198
+ }
199
+
200
+ /**
201
+ * Purge all entries from a queue.
202
+ */
203
+ int rd_kafka_q_purge0(rd_kafka_q_t *rkq, int do_lock) {
204
+ rd_kafka_op_t *rko, *next;
205
+ TAILQ_HEAD(, rd_kafka_op_s) tmpq = TAILQ_HEAD_INITIALIZER(tmpq);
206
+ rd_kafka_q_t *fwdq;
207
+ int cnt = 0;
208
+
209
+ if (do_lock)
210
+ mtx_lock(&rkq->rkq_lock);
211
+
212
+ if ((fwdq = rd_kafka_q_fwd_get(rkq, 0))) {
213
+ if (do_lock)
214
+ mtx_unlock(&rkq->rkq_lock);
215
+ cnt = rd_kafka_q_purge(fwdq);
216
+ rd_kafka_q_destroy(fwdq);
217
+ return cnt;
218
+ }
219
+
220
+ /* Move ops queue to tmpq to avoid lock-order issue
221
+ * by locks taken from rd_kafka_op_destroy(). */
222
+ TAILQ_MOVE(&tmpq, &rkq->rkq_q, rko_link);
223
+
224
+ rd_kafka_q_mark_served(rkq);
225
+
226
+ /* Zero out queue */
227
+ rd_kafka_q_reset(rkq);
228
+
229
+ if (do_lock)
230
+ mtx_unlock(&rkq->rkq_lock);
231
+
232
+ /* Destroy the ops */
233
+ next = TAILQ_FIRST(&tmpq);
234
+ while ((rko = next)) {
235
+ next = TAILQ_NEXT(next, rko_link);
236
+ rd_kafka_op_destroy(rko);
237
+ cnt++;
238
+ }
239
+
240
+ return cnt;
241
+ }
242
+
243
+
244
+ /**
245
+ * Purge all entries from a queue with a rktp version smaller than `version`
246
+ * This shaves off the head of the queue, up until the first rko with
247
+ * a non-matching rktp or version.
248
+ */
249
+ void rd_kafka_q_purge_toppar_version(rd_kafka_q_t *rkq,
250
+ rd_kafka_toppar_t *rktp,
251
+ int version) {
252
+ rd_kafka_op_t *rko, *next;
253
+ TAILQ_HEAD(, rd_kafka_op_s) tmpq = TAILQ_HEAD_INITIALIZER(tmpq);
254
+ int32_t cnt = 0;
255
+ int64_t size = 0;
256
+ rd_kafka_q_t *fwdq;
257
+
258
+ mtx_lock(&rkq->rkq_lock);
259
+
260
+ if ((fwdq = rd_kafka_q_fwd_get(rkq, 0))) {
261
+ mtx_unlock(&rkq->rkq_lock);
262
+ rd_kafka_q_purge_toppar_version(fwdq, rktp, version);
263
+ rd_kafka_q_destroy(fwdq);
264
+ return;
265
+ }
266
+
267
+ /* Move ops to temporary queue and then destroy them from there
268
+ * without locks to avoid lock-ordering problems in op_destroy() */
269
+ while ((rko = TAILQ_FIRST(&rkq->rkq_q)) && rko->rko_rktp &&
270
+ rko->rko_rktp == rktp && rko->rko_version < version) {
271
+ TAILQ_REMOVE(&rkq->rkq_q, rko, rko_link);
272
+ TAILQ_INSERT_TAIL(&tmpq, rko, rko_link);
273
+ cnt++;
274
+ size += rko->rko_len;
275
+ }
276
+
277
+ rd_kafka_q_mark_served(rkq);
278
+
279
+ rkq->rkq_qlen -= cnt;
280
+ rkq->rkq_qsize -= size;
281
+ mtx_unlock(&rkq->rkq_lock);
282
+
283
+ next = TAILQ_FIRST(&tmpq);
284
+ while ((rko = next)) {
285
+ next = TAILQ_NEXT(next, rko_link);
286
+ rd_kafka_op_destroy(rko);
287
+ }
288
+ }
289
+
290
+
291
+ /**
292
+ * Move 'cnt' entries from 'srcq' to 'dstq'.
293
+ * If 'cnt' == -1 all entries will be moved.
294
+ * Returns the number of entries moved.
295
+ */
296
+ int rd_kafka_q_move_cnt(rd_kafka_q_t *dstq,
297
+ rd_kafka_q_t *srcq,
298
+ int cnt,
299
+ int do_locks) {
300
+ rd_kafka_op_t *rko;
301
+ int mcnt = 0;
302
+
303
+ if (do_locks) {
304
+ mtx_lock(&srcq->rkq_lock);
305
+ mtx_lock(&dstq->rkq_lock);
306
+ }
307
+
308
+ if (!dstq->rkq_fwdq && !srcq->rkq_fwdq) {
309
+ if (cnt > 0 && dstq->rkq_qlen == 0)
310
+ rd_kafka_q_io_event(dstq);
311
+
312
+ /* Optimization, if 'cnt' is equal/larger than all
313
+ * items of 'srcq' we can move the entire queue. */
314
+ if (cnt == -1 || cnt >= (int)srcq->rkq_qlen) {
315
+ mcnt = srcq->rkq_qlen;
316
+ rd_kafka_q_concat0(dstq, srcq, 0 /*no-lock*/);
317
+ } else {
318
+ while (mcnt < cnt &&
319
+ (rko = TAILQ_FIRST(&srcq->rkq_q))) {
320
+ TAILQ_REMOVE(&srcq->rkq_q, rko, rko_link);
321
+ if (likely(!rko->rko_prio))
322
+ TAILQ_INSERT_TAIL(&dstq->rkq_q, rko,
323
+ rko_link);
324
+ else
325
+ TAILQ_INSERT_SORTED(
326
+ &dstq->rkq_q, rko, rd_kafka_op_t *,
327
+ rko_link, rd_kafka_op_cmp_prio);
328
+
329
+ srcq->rkq_qlen--;
330
+ dstq->rkq_qlen++;
331
+ srcq->rkq_qsize -= rko->rko_len;
332
+ dstq->rkq_qsize += rko->rko_len;
333
+ mcnt++;
334
+ }
335
+ }
336
+
337
+ rd_kafka_q_mark_served(srcq);
338
+
339
+ } else
340
+ mcnt = rd_kafka_q_move_cnt(
341
+ dstq->rkq_fwdq ? dstq->rkq_fwdq : dstq,
342
+ srcq->rkq_fwdq ? srcq->rkq_fwdq : srcq, cnt, do_locks);
343
+
344
+ if (do_locks) {
345
+ mtx_unlock(&dstq->rkq_lock);
346
+ mtx_unlock(&srcq->rkq_lock);
347
+ }
348
+
349
+ return mcnt;
350
+ }
351
+
352
+
353
+ /**
354
+ * Filters out outdated ops.
355
+ */
356
+ static RD_INLINE rd_kafka_op_t *
357
+ rd_kafka_op_filter(rd_kafka_q_t *rkq, rd_kafka_op_t *rko, int version) {
358
+ if (unlikely(!rko))
359
+ return NULL;
360
+
361
+ if (unlikely(rd_kafka_op_version_outdated(rko, version))) {
362
+ rd_kafka_q_deq0(rkq, rko);
363
+ rd_kafka_op_destroy(rko);
364
+ return NULL;
365
+ }
366
+
367
+ return rko;
368
+ }
369
+
370
+
371
+
372
+ /**
373
+ * Pop an op from a queue.
374
+ *
375
+ * Locality: any thread.
376
+ */
377
+
378
+
379
+ /**
380
+ * Serve q like rd_kafka_q_serve() until an op is found that can be returned
381
+ * as an event to the application.
382
+ *
383
+ * @returns the first event:able op, or NULL on timeout.
384
+ *
385
+ * Locality: any thread
386
+ */
387
+ rd_kafka_op_t *rd_kafka_q_pop_serve(rd_kafka_q_t *rkq,
388
+ rd_ts_t timeout_us,
389
+ int32_t version,
390
+ rd_kafka_q_cb_type_t cb_type,
391
+ rd_kafka_q_serve_cb_t *callback,
392
+ void *opaque) {
393
+ rd_kafka_op_t *rko;
394
+ rd_kafka_q_t *fwdq;
395
+
396
+ rd_dassert(cb_type);
397
+
398
+ mtx_lock(&rkq->rkq_lock);
399
+
400
+ rd_kafka_yield_thread = 0;
401
+ if (!(fwdq = rd_kafka_q_fwd_get(rkq, 0))) {
402
+ const rd_bool_t can_q_contain_fetched_msgs =
403
+ rd_kafka_q_can_contain_fetched_msgs(rkq, RD_DONT_LOCK);
404
+
405
+ struct timespec timeout_tspec;
406
+
407
+ rd_timeout_init_timespec_us(&timeout_tspec, timeout_us);
408
+
409
+ if (can_q_contain_fetched_msgs)
410
+ rd_kafka_app_poll_start(rkq->rkq_rk, 0, timeout_us);
411
+
412
+ while (1) {
413
+ rd_kafka_op_res_t res;
414
+ /* Keep track of current lock status to avoid
415
+ * unnecessary lock flapping in all the cases below. */
416
+ rd_bool_t is_locked = rd_true;
417
+
418
+ /* Filter out outdated ops */
419
+ retry:
420
+ while ((rko = TAILQ_FIRST(&rkq->rkq_q)) &&
421
+ !(rko = rd_kafka_op_filter(rkq, rko, version)))
422
+ ;
423
+
424
+ rd_kafka_q_mark_served(rkq);
425
+
426
+ if (rko) {
427
+ /* Proper versioned op */
428
+ rd_kafka_q_deq0(rkq, rko);
429
+
430
+ /* Let op_handle() operate without lock
431
+ * held to allow re-enqueuing, etc. */
432
+ mtx_unlock(&rkq->rkq_lock);
433
+ is_locked = rd_false;
434
+
435
+ /* Ops with callbacks are considered handled
436
+ * and we move on to the next op, if any.
437
+ * Ops w/o callbacks are returned immediately */
438
+ res = rd_kafka_op_handle(rkq->rkq_rk, rkq, rko,
439
+ cb_type, opaque,
440
+ callback);
441
+
442
+ if (res == RD_KAFKA_OP_RES_HANDLED ||
443
+ res == RD_KAFKA_OP_RES_KEEP) {
444
+ mtx_lock(&rkq->rkq_lock);
445
+ is_locked = rd_true;
446
+ goto retry; /* Next op */
447
+ } else if (unlikely(res ==
448
+ RD_KAFKA_OP_RES_YIELD)) {
449
+ if (can_q_contain_fetched_msgs)
450
+ rd_kafka_app_polled(
451
+ rkq->rkq_rk);
452
+ /* Callback yielded, unroll */
453
+ return NULL;
454
+ } else {
455
+ if (can_q_contain_fetched_msgs)
456
+ rd_kafka_app_polled(
457
+ rkq->rkq_rk);
458
+ break; /* Proper op, handle below. */
459
+ }
460
+ }
461
+
462
+ if (unlikely(rd_kafka_q_check_yield(rkq))) {
463
+ if (is_locked)
464
+ mtx_unlock(&rkq->rkq_lock);
465
+ if (can_q_contain_fetched_msgs)
466
+ rd_kafka_app_polled(rkq->rkq_rk);
467
+ return NULL;
468
+ }
469
+
470
+ if (!is_locked)
471
+ mtx_lock(&rkq->rkq_lock);
472
+
473
+ if (cnd_timedwait_abs(&rkq->rkq_cond, &rkq->rkq_lock,
474
+ &timeout_tspec) != thrd_success) {
475
+ mtx_unlock(&rkq->rkq_lock);
476
+ if (can_q_contain_fetched_msgs)
477
+ rd_kafka_app_polled(rkq->rkq_rk);
478
+ return NULL;
479
+ }
480
+ }
481
+
482
+ } else {
483
+ /* Since the q_pop may block we need to release the parent
484
+ * queue's lock. */
485
+ mtx_unlock(&rkq->rkq_lock);
486
+ rko = rd_kafka_q_pop_serve(fwdq, timeout_us, version, cb_type,
487
+ callback, opaque);
488
+ rd_kafka_q_destroy(fwdq);
489
+ }
490
+
491
+
492
+ return rko;
493
+ }
494
+
495
+ rd_kafka_op_t *
496
+ rd_kafka_q_pop(rd_kafka_q_t *rkq, rd_ts_t timeout_us, int32_t version) {
497
+ return rd_kafka_q_pop_serve(rkq, timeout_us, version,
498
+ RD_KAFKA_Q_CB_RETURN, NULL, NULL);
499
+ }
500
+
501
+
502
+ /**
503
+ * Pop all available ops from a queue and call the provided
504
+ * callback for each op.
505
+ * `max_cnt` limits the number of ops served, 0 = no limit.
506
+ *
507
+ * Returns the number of ops served.
508
+ *
509
+ * Locality: any thread.
510
+ */
511
+ int rd_kafka_q_serve(rd_kafka_q_t *rkq,
512
+ int timeout_ms,
513
+ int max_cnt,
514
+ rd_kafka_q_cb_type_t cb_type,
515
+ rd_kafka_q_serve_cb_t *callback,
516
+ void *opaque) {
517
+ rd_kafka_t *rk = rkq->rkq_rk;
518
+ rd_kafka_op_t *rko;
519
+ rd_kafka_q_t localq;
520
+ rd_kafka_q_t *fwdq;
521
+ int cnt = 0;
522
+ struct timespec timeout_tspec;
523
+ const rd_bool_t can_q_contain_fetched_msgs =
524
+ rd_kafka_q_can_contain_fetched_msgs(rkq, RD_DONT_LOCK);
525
+
526
+ rd_dassert(cb_type);
527
+
528
+ mtx_lock(&rkq->rkq_lock);
529
+
530
+ rd_dassert(TAILQ_EMPTY(&rkq->rkq_q) || rkq->rkq_qlen > 0);
531
+ if ((fwdq = rd_kafka_q_fwd_get(rkq, 0))) {
532
+ int ret;
533
+ /* Since the q_pop may block we need to release the parent
534
+ * queue's lock. */
535
+ mtx_unlock(&rkq->rkq_lock);
536
+ ret = rd_kafka_q_serve(fwdq, timeout_ms, max_cnt, cb_type,
537
+ callback, opaque);
538
+ rd_kafka_q_destroy(fwdq);
539
+ return ret;
540
+ }
541
+
542
+
543
+ rd_timeout_init_timespec(&timeout_tspec, timeout_ms);
544
+
545
+ if (can_q_contain_fetched_msgs)
546
+ rd_kafka_app_poll_start(rk, 0, timeout_ms);
547
+
548
+ /* Wait for op */
549
+ while (!(rko = TAILQ_FIRST(&rkq->rkq_q)) &&
550
+ !rd_kafka_q_check_yield(rkq) &&
551
+ cnd_timedwait_abs(&rkq->rkq_cond, &rkq->rkq_lock,
552
+ &timeout_tspec) == thrd_success)
553
+ ;
554
+
555
+ rd_kafka_q_mark_served(rkq);
556
+
557
+ if (!rko) {
558
+ mtx_unlock(&rkq->rkq_lock);
559
+ if (can_q_contain_fetched_msgs)
560
+ rd_kafka_app_polled(rk);
561
+ return 0;
562
+ }
563
+
564
+ /* Move the first `max_cnt` ops. */
565
+ rd_kafka_q_init(&localq, rkq->rkq_rk);
566
+ rd_kafka_q_move_cnt(&localq, rkq, max_cnt == 0 ? -1 /*all*/ : max_cnt,
567
+ 0 /*no-locks*/);
568
+
569
+ mtx_unlock(&rkq->rkq_lock);
570
+
571
+ rd_kafka_yield_thread = 0;
572
+
573
+ /* Call callback for each op */
574
+ while ((rko = TAILQ_FIRST(&localq.rkq_q))) {
575
+ rd_kafka_op_res_t res;
576
+
577
+ rd_kafka_q_deq0(&localq, rko);
578
+ res = rd_kafka_op_handle(rk, &localq, rko, cb_type, opaque,
579
+ callback);
580
+ /* op must have been handled */
581
+ rd_kafka_assert(NULL, res != RD_KAFKA_OP_RES_PASS);
582
+ cnt++;
583
+
584
+ if (unlikely(res == RD_KAFKA_OP_RES_YIELD ||
585
+ rd_kafka_yield_thread)) {
586
+ /* Callback called rd_kafka_yield(), we must
587
+ * stop our callback dispatching and put the
588
+ * ops in localq back on the original queue head. */
589
+ if (!TAILQ_EMPTY(&localq.rkq_q))
590
+ rd_kafka_q_prepend(rkq, &localq);
591
+ break;
592
+ }
593
+ }
594
+
595
+ if (can_q_contain_fetched_msgs)
596
+ rd_kafka_app_polled(rk);
597
+
598
+ rd_kafka_q_destroy_owner(&localq);
599
+
600
+ return cnt;
601
+ }
602
+
603
+ /**
604
+ * @brief Filter out and destroy outdated messages.
605
+ *
606
+ * @returns Returns the number of valid messages.
607
+ *
608
+ * @locality Any thread.
609
+ */
610
+ static size_t
611
+ rd_kafka_purge_outdated_messages(rd_kafka_toppar_t *rktp,
612
+ int32_t version,
613
+ rd_kafka_message_t **rkmessages,
614
+ size_t cnt,
615
+ struct rd_kafka_op_tailq *ctrl_msg_q) {
616
+ size_t valid_count = 0;
617
+ size_t i;
618
+ rd_kafka_op_t *rko, *next;
619
+
620
+ for (i = 0; i < cnt; i++) {
621
+ rko = rkmessages[i]->_private;
622
+ if (rko->rko_rktp == rktp &&
623
+ rd_kafka_op_version_outdated(rko, version)) {
624
+ /* This also destroys the corresponding rkmessage. */
625
+ rd_kafka_op_destroy(rko);
626
+ } else if (i > valid_count) {
627
+ rkmessages[valid_count++] = rkmessages[i];
628
+ } else {
629
+ valid_count++;
630
+ }
631
+ }
632
+
633
+ /* Discard outdated control msgs ops */
634
+ next = TAILQ_FIRST(ctrl_msg_q);
635
+ while (next) {
636
+ rko = next;
637
+ next = TAILQ_NEXT(rko, rko_link);
638
+ if (rko->rko_rktp == rktp &&
639
+ rd_kafka_op_version_outdated(rko, version)) {
640
+ TAILQ_REMOVE(ctrl_msg_q, rko, rko_link);
641
+ rd_kafka_op_destroy(rko);
642
+ }
643
+ }
644
+
645
+ return valid_count;
646
+ }
647
+
648
+
649
+ /**
650
+ * Populate 'rkmessages' array with messages from 'rkq'.
651
+ * If 'auto_commit' is set, each message's offset will be committed
652
+ * to the offset store for that toppar.
653
+ *
654
+ * Returns the number of messages added.
655
+ */
656
+
657
+ int rd_kafka_q_serve_rkmessages(rd_kafka_q_t *rkq,
658
+ int timeout_ms,
659
+ rd_kafka_message_t **rkmessages,
660
+ size_t rkmessages_size) {
661
+ unsigned int cnt = 0;
662
+ TAILQ_HEAD(, rd_kafka_op_s) tmpq = TAILQ_HEAD_INITIALIZER(tmpq);
663
+ struct rd_kafka_op_tailq ctrl_msg_q =
664
+ TAILQ_HEAD_INITIALIZER(ctrl_msg_q);
665
+ rd_kafka_op_t *rko, *next;
666
+ rd_kafka_t *rk = rkq->rkq_rk;
667
+ rd_kafka_q_t *fwdq;
668
+ struct timespec timeout_tspec;
669
+ int i;
670
+
671
+ mtx_lock(&rkq->rkq_lock);
672
+ if ((fwdq = rd_kafka_q_fwd_get(rkq, 0))) {
673
+ /* Since the q_pop may block we need to release the parent
674
+ * queue's lock. */
675
+ mtx_unlock(&rkq->rkq_lock);
676
+ cnt = rd_kafka_q_serve_rkmessages(fwdq, timeout_ms, rkmessages,
677
+ rkmessages_size);
678
+ rd_kafka_q_destroy(fwdq);
679
+ return cnt;
680
+ }
681
+
682
+ mtx_unlock(&rkq->rkq_lock);
683
+
684
+ rd_timeout_init_timespec(&timeout_tspec, timeout_ms);
685
+
686
+ rd_kafka_app_poll_start(rk, 0, timeout_ms);
687
+
688
+ rd_kafka_yield_thread = 0;
689
+ while (cnt < rkmessages_size) {
690
+ rd_kafka_op_res_t res;
691
+
692
+ mtx_lock(&rkq->rkq_lock);
693
+
694
+ while (!(rko = TAILQ_FIRST(&rkq->rkq_q)) &&
695
+ !rd_kafka_q_check_yield(rkq) &&
696
+ cnd_timedwait_abs(&rkq->rkq_cond, &rkq->rkq_lock,
697
+ &timeout_tspec) == thrd_success)
698
+ ;
699
+
700
+ rd_kafka_q_mark_served(rkq);
701
+
702
+ if (!rko) {
703
+ mtx_unlock(&rkq->rkq_lock);
704
+ break; /* Timed out */
705
+ }
706
+
707
+ rd_kafka_q_deq0(rkq, rko);
708
+
709
+ mtx_unlock(&rkq->rkq_lock);
710
+
711
+ if (unlikely(rko->rko_type == RD_KAFKA_OP_BARRIER)) {
712
+ cnt = (unsigned int)rd_kafka_purge_outdated_messages(
713
+ rko->rko_rktp, rko->rko_version, rkmessages, cnt,
714
+ &ctrl_msg_q);
715
+ rd_kafka_op_destroy(rko);
716
+ continue;
717
+ }
718
+
719
+ if (rd_kafka_op_version_outdated(rko, 0)) {
720
+ /* Outdated op, put on discard queue */
721
+ TAILQ_INSERT_TAIL(&tmpq, rko, rko_link);
722
+ continue;
723
+ }
724
+
725
+ /* Serve non-FETCH callbacks */
726
+ res =
727
+ rd_kafka_poll_cb(rk, rkq, rko, RD_KAFKA_Q_CB_RETURN, NULL);
728
+ if (res == RD_KAFKA_OP_RES_KEEP ||
729
+ res == RD_KAFKA_OP_RES_HANDLED) {
730
+ /* Callback served, rko is destroyed (if HANDLED). */
731
+ continue;
732
+ } else if (unlikely(res == RD_KAFKA_OP_RES_YIELD ||
733
+ rd_kafka_yield_thread)) {
734
+ /* Yield. */
735
+ break;
736
+ }
737
+ rd_dassert(res == RD_KAFKA_OP_RES_PASS);
738
+
739
+ /* If this is a control messages, don't return message to
740
+ * application. Add it to a tmp queue from where we can store
741
+ * the offset and destroy the op */
742
+ if (unlikely(rd_kafka_op_is_ctrl_msg(rko))) {
743
+ TAILQ_INSERT_TAIL(&ctrl_msg_q, rko, rko_link);
744
+ continue;
745
+ }
746
+
747
+ /* Get rkmessage from rko and append to array. */
748
+ rkmessages[cnt++] = rd_kafka_message_get(rko);
749
+ }
750
+
751
+ for (i = cnt - 1; i >= 0; i--) {
752
+ rko = (rd_kafka_op_t *)rkmessages[i]->_private;
753
+ rd_kafka_toppar_t *rktp = rko->rko_rktp;
754
+ int64_t offset = rkmessages[i]->offset + 1;
755
+ if (unlikely(rktp && (rktp->rktp_app_pos.offset < offset)))
756
+ rd_kafka_update_app_pos(
757
+ rk, rktp,
758
+ RD_KAFKA_FETCH_POS(
759
+ offset,
760
+ rd_kafka_message_leader_epoch(rkmessages[i])),
761
+ RD_DO_LOCK);
762
+ }
763
+
764
+ /* Discard non-desired and already handled ops */
765
+ next = TAILQ_FIRST(&tmpq);
766
+ while (next) {
767
+ rko = next;
768
+ next = TAILQ_NEXT(next, rko_link);
769
+ rd_kafka_op_destroy(rko);
770
+ }
771
+
772
+ /* Discard ctrl msgs */
773
+ next = TAILQ_FIRST(&ctrl_msg_q);
774
+ while (next) {
775
+ rko = next;
776
+ next = TAILQ_NEXT(next, rko_link);
777
+ rd_kafka_toppar_t *rktp = rko->rko_rktp;
778
+ int64_t offset = rko->rko_u.fetch.rkm.rkm_rkmessage.offset + 1;
779
+ if (rktp && (rktp->rktp_app_pos.offset < offset))
780
+ rd_kafka_update_app_pos(
781
+ rk, rktp,
782
+ RD_KAFKA_FETCH_POS(
783
+ offset,
784
+ rd_kafka_message_leader_epoch(
785
+ &rko->rko_u.fetch.rkm.rkm_rkmessage)),
786
+ RD_DO_LOCK);
787
+ rd_kafka_op_destroy(rko);
788
+ }
789
+
790
+ rd_kafka_app_polled(rk);
791
+
792
+ return cnt;
793
+ }
794
+
795
+
796
+
797
+ void rd_kafka_queue_destroy(rd_kafka_queue_t *rkqu) {
798
+ if (rkqu->rkqu_is_owner)
799
+ rd_kafka_q_destroy_owner(rkqu->rkqu_q);
800
+ else
801
+ rd_kafka_q_destroy(rkqu->rkqu_q);
802
+ rd_free(rkqu);
803
+ }
804
+
805
+ rd_kafka_queue_t *rd_kafka_queue_new0(rd_kafka_t *rk, rd_kafka_q_t *rkq) {
806
+ rd_kafka_queue_t *rkqu;
807
+
808
+ rkqu = rd_calloc(1, sizeof(*rkqu));
809
+
810
+ rkqu->rkqu_q = rkq;
811
+ rd_kafka_q_keep(rkq);
812
+
813
+ rkqu->rkqu_rk = rk;
814
+
815
+ return rkqu;
816
+ }
817
+
818
+
819
+ rd_kafka_queue_t *rd_kafka_queue_new(rd_kafka_t *rk) {
820
+ rd_kafka_q_t *rkq;
821
+ rd_kafka_queue_t *rkqu;
822
+
823
+ rkq = rd_kafka_q_new(rk);
824
+ rkqu = rd_kafka_queue_new0(rk, rkq);
825
+ rd_kafka_q_destroy(rkq); /* Loose refcount from q_new, one is held
826
+ * by queue_new0 */
827
+ rkqu->rkqu_is_owner = 1;
828
+ return rkqu;
829
+ }
830
+
831
+
832
+ rd_kafka_queue_t *rd_kafka_queue_get_main(rd_kafka_t *rk) {
833
+ return rd_kafka_queue_new0(rk, rk->rk_rep);
834
+ }
835
+
836
+
837
+ rd_kafka_queue_t *rd_kafka_queue_get_consumer(rd_kafka_t *rk) {
838
+ if (!rk->rk_cgrp)
839
+ return NULL;
840
+ return rd_kafka_queue_new0(rk, rk->rk_cgrp->rkcg_q);
841
+ }
842
+
843
+ rd_kafka_queue_t *rd_kafka_queue_get_partition(rd_kafka_t *rk,
844
+ const char *topic,
845
+ int32_t partition) {
846
+ rd_kafka_toppar_t *rktp;
847
+ rd_kafka_queue_t *result;
848
+
849
+ if (rk->rk_type == RD_KAFKA_PRODUCER)
850
+ return NULL;
851
+
852
+ rktp = rd_kafka_toppar_get2(rk, topic, partition, 0, /* no ua_on_miss */
853
+ 1 /* create_on_miss */);
854
+
855
+ if (!rktp)
856
+ return NULL;
857
+
858
+ result = rd_kafka_queue_new0(rk, rktp->rktp_fetchq);
859
+ rd_kafka_toppar_destroy(rktp);
860
+
861
+ return result;
862
+ }
863
+
864
+ rd_kafka_queue_t *rd_kafka_queue_get_background(rd_kafka_t *rk) {
865
+ rd_kafka_queue_t *rkqu;
866
+
867
+ rd_kafka_wrlock(rk);
868
+ if (!rk->rk_background.q) {
869
+ char errstr[256];
870
+
871
+ if (rd_kafka_background_thread_create(rk, errstr,
872
+ sizeof(errstr))) {
873
+ rd_kafka_log(rk, LOG_ERR, "BACKGROUND",
874
+ "Failed to create background thread: %s",
875
+ errstr);
876
+ rd_kafka_wrunlock(rk);
877
+ return NULL;
878
+ }
879
+ }
880
+
881
+ rkqu = rd_kafka_queue_new0(rk, rk->rk_background.q);
882
+ rd_kafka_wrunlock(rk);
883
+ return rkqu;
884
+ }
885
+
886
+
887
+ rd_kafka_resp_err_t rd_kafka_set_log_queue(rd_kafka_t *rk,
888
+ rd_kafka_queue_t *rkqu) {
889
+ rd_kafka_q_t *rkq;
890
+
891
+ if (!rk->rk_logq)
892
+ return RD_KAFKA_RESP_ERR__NOT_CONFIGURED;
893
+
894
+ if (!rkqu)
895
+ rkq = rk->rk_rep;
896
+ else
897
+ rkq = rkqu->rkqu_q;
898
+ rd_kafka_q_fwd_set(rk->rk_logq, rkq);
899
+ return RD_KAFKA_RESP_ERR_NO_ERROR;
900
+ }
901
+
902
+ void rd_kafka_queue_forward(rd_kafka_queue_t *src, rd_kafka_queue_t *dst) {
903
+ rd_kafka_q_fwd_set0(src->rkqu_q, dst ? dst->rkqu_q : NULL,
904
+ 1, /* do_lock */
905
+ 1 /* fwd_app */);
906
+ }
907
+
908
+
909
+ size_t rd_kafka_queue_length(rd_kafka_queue_t *rkqu) {
910
+ return (size_t)rd_kafka_q_len(rkqu->rkqu_q);
911
+ }
912
+
913
+ /**
914
+ * @brief Enable or disable(fd==-1) fd-based wake-ups for queue
915
+ */
916
+ void rd_kafka_q_io_event_enable(rd_kafka_q_t *rkq,
917
+ rd_socket_t fd,
918
+ const void *payload,
919
+ size_t size) {
920
+ struct rd_kafka_q_io *qio = NULL;
921
+
922
+ if (fd != -1) {
923
+ qio = rd_malloc(sizeof(*qio) + size);
924
+ qio->fd = fd;
925
+ qio->size = size;
926
+ qio->payload = (void *)(qio + 1);
927
+ qio->sent = rd_false;
928
+ qio->event_cb = NULL;
929
+ qio->event_cb_opaque = NULL;
930
+ memcpy(qio->payload, payload, size);
931
+ }
932
+
933
+ mtx_lock(&rkq->rkq_lock);
934
+ if (rkq->rkq_qio) {
935
+ rd_free(rkq->rkq_qio);
936
+ rkq->rkq_qio = NULL;
937
+ }
938
+
939
+ if (fd != -1) {
940
+ rkq->rkq_qio = qio;
941
+ }
942
+
943
+ mtx_unlock(&rkq->rkq_lock);
944
+ }
945
+
946
+ void rd_kafka_queue_io_event_enable(rd_kafka_queue_t *rkqu,
947
+ int fd,
948
+ const void *payload,
949
+ size_t size) {
950
+ rd_kafka_q_io_event_enable(rkqu->rkqu_q, fd, payload, size);
951
+ }
952
+
953
+
954
+ void rd_kafka_queue_yield(rd_kafka_queue_t *rkqu) {
955
+ rd_kafka_q_yield(rkqu->rkqu_q);
956
+ }
957
+
958
+
959
+ /**
960
+ * @brief Enable or disable(event_cb==NULL) callback-based wake-ups for queue
961
+ */
962
+ void rd_kafka_q_cb_event_enable(rd_kafka_q_t *rkq,
963
+ void (*event_cb)(rd_kafka_t *rk, void *opaque),
964
+ void *opaque) {
965
+ struct rd_kafka_q_io *qio = NULL;
966
+
967
+ if (event_cb) {
968
+ qio = rd_malloc(sizeof(*qio));
969
+ qio->fd = -1;
970
+ qio->size = 0;
971
+ qio->payload = NULL;
972
+ qio->event_cb = event_cb;
973
+ qio->event_cb_opaque = opaque;
974
+ }
975
+
976
+ mtx_lock(&rkq->rkq_lock);
977
+ if (rkq->rkq_qio) {
978
+ rd_free(rkq->rkq_qio);
979
+ rkq->rkq_qio = NULL;
980
+ }
981
+
982
+ if (event_cb) {
983
+ rkq->rkq_qio = qio;
984
+ }
985
+
986
+ mtx_unlock(&rkq->rkq_lock);
987
+ }
988
+
989
+ void rd_kafka_queue_cb_event_enable(rd_kafka_queue_t *rkqu,
990
+ void (*event_cb)(rd_kafka_t *rk,
991
+ void *opaque),
992
+ void *opaque) {
993
+ rd_kafka_q_cb_event_enable(rkqu->rkqu_q, event_cb, opaque);
994
+ }
995
+
996
+
997
+ /**
998
+ * Helper: wait for single op on 'rkq', and return its error,
999
+ * or .._TIMED_OUT on timeout.
1000
+ */
1001
+ rd_kafka_resp_err_t rd_kafka_q_wait_result(rd_kafka_q_t *rkq, int timeout_ms) {
1002
+ rd_kafka_op_t *rko;
1003
+ rd_kafka_resp_err_t err;
1004
+
1005
+ rko = rd_kafka_q_pop(rkq, rd_timeout_us(timeout_ms), 0);
1006
+ if (!rko)
1007
+ err = RD_KAFKA_RESP_ERR__TIMED_OUT;
1008
+ else {
1009
+ err = rko->rko_err;
1010
+ rd_kafka_op_destroy(rko);
1011
+ }
1012
+
1013
+ return err;
1014
+ }
1015
+
1016
+
1017
+ /**
1018
+ * Apply \p callback on each op in queue.
1019
+ * If the callback wishes to remove the rko it must do so using
1020
+ * using rd_kafka_op_deq0().
1021
+ *
1022
+ * @returns the sum of \p callback() return values.
1023
+ * @remark rkq will be locked, callers should take care not to
1024
+ * interact with \p rkq through other means from the callback to avoid
1025
+ * deadlocks.
1026
+ */
1027
+ int rd_kafka_q_apply(rd_kafka_q_t *rkq,
1028
+ int (*callback)(rd_kafka_q_t *rkq,
1029
+ rd_kafka_op_t *rko,
1030
+ void *opaque),
1031
+ void *opaque) {
1032
+ rd_kafka_op_t *rko, *next;
1033
+ rd_kafka_q_t *fwdq;
1034
+ int cnt = 0;
1035
+
1036
+ mtx_lock(&rkq->rkq_lock);
1037
+ if ((fwdq = rd_kafka_q_fwd_get(rkq, 0))) {
1038
+ mtx_unlock(&rkq->rkq_lock);
1039
+ cnt = rd_kafka_q_apply(fwdq, callback, opaque);
1040
+ rd_kafka_q_destroy(fwdq);
1041
+ return cnt;
1042
+ }
1043
+
1044
+ next = TAILQ_FIRST(&rkq->rkq_q);
1045
+ while ((rko = next)) {
1046
+ next = TAILQ_NEXT(next, rko_link);
1047
+ cnt += callback(rkq, rko, opaque);
1048
+ }
1049
+
1050
+ rd_kafka_q_mark_served(rkq);
1051
+
1052
+ mtx_unlock(&rkq->rkq_lock);
1053
+
1054
+ return cnt;
1055
+ }
1056
+
1057
+ /**
1058
+ * @brief Convert relative to absolute offsets and also purge any messages
1059
+ * that are older than \p min_offset.
1060
+ * @remark Error ops with ERR__NOT_IMPLEMENTED will not be purged since
1061
+ * they are used to indicate unknnown compression codecs and compressed
1062
+ * messagesets may have a starting offset lower than what we requested.
1063
+ * @remark \p rkq locking is not performed (caller's responsibility)
1064
+ * @remark Must NOT be used on fwdq.
1065
+ */
1066
+ void rd_kafka_q_fix_offsets(rd_kafka_q_t *rkq,
1067
+ int64_t min_offset,
1068
+ int64_t base_offset) {
1069
+ rd_kafka_op_t *rko, *next;
1070
+ int adj_len = 0;
1071
+ int64_t adj_size = 0;
1072
+
1073
+ rd_kafka_assert(NULL, !rkq->rkq_fwdq);
1074
+
1075
+ next = TAILQ_FIRST(&rkq->rkq_q);
1076
+ while ((rko = next)) {
1077
+ next = TAILQ_NEXT(next, rko_link);
1078
+
1079
+ if (unlikely(rko->rko_type != RD_KAFKA_OP_FETCH))
1080
+ continue;
1081
+
1082
+ rko->rko_u.fetch.rkm.rkm_offset += base_offset;
1083
+
1084
+ if (rko->rko_u.fetch.rkm.rkm_offset < min_offset &&
1085
+ rko->rko_err != RD_KAFKA_RESP_ERR__NOT_IMPLEMENTED) {
1086
+ adj_len++;
1087
+ adj_size += rko->rko_len;
1088
+ TAILQ_REMOVE(&rkq->rkq_q, rko, rko_link);
1089
+ rd_kafka_op_destroy(rko);
1090
+ continue;
1091
+ }
1092
+ }
1093
+
1094
+
1095
+ rkq->rkq_qlen -= adj_len;
1096
+ rkq->rkq_qsize -= adj_size;
1097
+ }
1098
+
1099
+
1100
+ /**
1101
+ * @brief Print information and contents of queue
1102
+ */
1103
+ void rd_kafka_q_dump(FILE *fp, rd_kafka_q_t *rkq) {
1104
+ mtx_lock(&rkq->rkq_lock);
1105
+ fprintf(fp,
1106
+ "Queue %p \"%s\" (refcnt %d, flags 0x%x, %d ops, "
1107
+ "%" PRId64 " bytes)\n",
1108
+ rkq, rkq->rkq_name, rkq->rkq_refcnt, rkq->rkq_flags,
1109
+ rkq->rkq_qlen, rkq->rkq_qsize);
1110
+
1111
+ if (rkq->rkq_qio)
1112
+ fprintf(fp, " QIO fd %d\n", (int)rkq->rkq_qio->fd);
1113
+ if (rkq->rkq_serve)
1114
+ fprintf(fp, " Serve callback %p, opaque %p\n", rkq->rkq_serve,
1115
+ rkq->rkq_opaque);
1116
+
1117
+ if (rkq->rkq_fwdq) {
1118
+ fprintf(fp, " Forwarded ->\n");
1119
+ rd_kafka_q_dump(fp, rkq->rkq_fwdq);
1120
+ } else {
1121
+ rd_kafka_op_t *rko;
1122
+
1123
+ if (!TAILQ_EMPTY(&rkq->rkq_q))
1124
+ fprintf(fp, " Queued ops:\n");
1125
+ TAILQ_FOREACH(rko, &rkq->rkq_q, rko_link) {
1126
+ fprintf(fp,
1127
+ " %p %s (v%" PRId32
1128
+ ", flags 0x%x, "
1129
+ "prio %d, len %" PRId32
1130
+ ", source %s, "
1131
+ "replyq %p)\n",
1132
+ rko, rd_kafka_op2str(rko->rko_type),
1133
+ rko->rko_version, rko->rko_flags, rko->rko_prio,
1134
+ rko->rko_len,
1135
+ #if ENABLE_DEVEL
1136
+ rko->rko_source
1137
+ #else
1138
+ "-"
1139
+ #endif
1140
+ ,
1141
+ rko->rko_replyq.q);
1142
+ }
1143
+ }
1144
+
1145
+ mtx_unlock(&rkq->rkq_lock);
1146
+ }
1147
+
1148
+
1149
+ void rd_kafka_enq_once_trigger_destroy(void *ptr) {
1150
+ rd_kafka_enq_once_t *eonce = ptr;
1151
+
1152
+ rd_kafka_enq_once_trigger(eonce, RD_KAFKA_RESP_ERR__DESTROY, "destroy");
1153
+ }