@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,1220 @@
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
+ #ifndef _RDKAFKA_QUEUE_H_
31
+ #define _RDKAFKA_QUEUE_H_
32
+
33
+ #include "rdkafka_op.h"
34
+ #include "rdkafka_int.h"
35
+
36
+ #ifdef _WIN32
37
+ #include <io.h> /* for _write() */
38
+ #endif
39
+
40
+ /** @brief Queueing strategy */
41
+ #define RD_KAFKA_QUEUE_FIFO 0
42
+ #define RD_KAFKA_QUEUE_LIFO 1
43
+
44
+ TAILQ_HEAD(rd_kafka_op_tailq, rd_kafka_op_s);
45
+
46
+ /**
47
+ * @struct Queue for rd_kafka_op_t*.
48
+ *
49
+ * @remark All readers of the queue must call rd_kafka_q_mark_served()
50
+ * after reading the queue (while still holding the queue lock) to
51
+ * clear the wakeup-sent flag.
52
+ */
53
+ struct rd_kafka_q_s {
54
+ mtx_t rkq_lock;
55
+ cnd_t rkq_cond;
56
+ struct rd_kafka_q_s *rkq_fwdq; /* Forwarded/Routed queue.
57
+ * Used in place of this queue
58
+ * for all operations. */
59
+
60
+ struct rd_kafka_op_tailq rkq_q; /* TAILQ_HEAD(, rd_kafka_op_s) */
61
+ int rkq_qlen; /* Number of entries in queue */
62
+ int64_t rkq_qsize; /* Size of all entries in queue */
63
+ int rkq_refcnt;
64
+ int rkq_flags;
65
+ #define RD_KAFKA_Q_F_ALLOCATED 0x1 /* Allocated: rd_free on destroy */
66
+ #define RD_KAFKA_Q_F_READY \
67
+ 0x2 /* Queue is ready to be used. \
68
+ * Flag is cleared on destroy */
69
+ #define RD_KAFKA_Q_F_FWD_APP \
70
+ 0x4 /* Queue is being forwarded by a call \
71
+ * to rd_kafka_queue_forward. */
72
+ #define RD_KAFKA_Q_F_YIELD \
73
+ 0x8 /* Have waiters return even if \
74
+ * no rko was enqueued. \
75
+ * This is used to wake up a waiter \
76
+ * by triggering the cond-var \
77
+ * but without having to enqueue \
78
+ * an op. */
79
+ #define RD_KAFKA_Q_F_CONSUMER \
80
+ 0x10 /* If this flag is set, this queue might contain fetched messages \
81
+ from partitions. Polling this queue will reset the \
82
+ max.poll.interval.ms timer. Once set, this flag is never \
83
+ reset. */
84
+
85
+ rd_kafka_t *rkq_rk;
86
+ struct rd_kafka_q_io *rkq_qio; /* FD-based application signalling */
87
+
88
+ /* Op serve callback (optional).
89
+ * Mainly used for forwarded queues to use the original queue's
90
+ * serve function from the forwarded position.
91
+ * Shall return 1 if op was handled, else 0. */
92
+ rd_kafka_q_serve_cb_t *rkq_serve;
93
+ void *rkq_opaque;
94
+ rd_ts_t rkq_ts_last_poll_start; /**< Timestamp of last queue
95
+ * poll() call start
96
+ * Only relevant for a consumer. */
97
+ rd_ts_t rkq_ts_last_poll_end; /**< Timestamp of last queue
98
+ * poll() call end
99
+ * Only relevant for a consumer. */
100
+
101
+ #if ENABLE_DEVEL
102
+ char rkq_name[64]; /* Debugging: queue name (FUNC:LINE) */
103
+ #else
104
+ const char *rkq_name; /* Debugging: queue name (FUNC) */
105
+ #endif
106
+ };
107
+
108
+
109
+ /* Application signalling state holder. */
110
+ struct rd_kafka_q_io {
111
+ /* For FD-based signalling */
112
+ rd_socket_t fd;
113
+ void *payload;
114
+ size_t size;
115
+ rd_bool_t sent; /**< Wake-up has been sent.
116
+ * This field is reset to false by the queue
117
+ * reader, allowing a new wake-up to be sent by a
118
+ * subsequent writer. */
119
+ /* For callback-based signalling */
120
+ void (*event_cb)(rd_kafka_t *rk, void *opaque);
121
+ void *event_cb_opaque;
122
+ };
123
+
124
+
125
+
126
+ /**
127
+ * @return true if queue is ready/enabled, else false.
128
+ * @remark queue luck must be held by caller (if applicable)
129
+ */
130
+ static RD_INLINE RD_UNUSED int rd_kafka_q_ready(rd_kafka_q_t *rkq) {
131
+ return rkq->rkq_flags & RD_KAFKA_Q_F_READY;
132
+ }
133
+
134
+
135
+
136
+ void rd_kafka_q_init0(rd_kafka_q_t *rkq,
137
+ rd_kafka_t *rk,
138
+ rd_bool_t for_consume,
139
+ const char *func,
140
+ int line);
141
+ #define rd_kafka_q_init(rkq, rk) \
142
+ rd_kafka_q_init0(rkq, rk, rd_false, __FUNCTION__, __LINE__)
143
+ #define rd_kafka_consume_q_init(rkq, rk) \
144
+ rd_kafka_q_init0(rkq, rk, rd_true, __FUNCTION__, __LINE__)
145
+ rd_kafka_q_t *rd_kafka_q_new0(rd_kafka_t *rk,
146
+ rd_bool_t for_consume,
147
+ const char *func,
148
+ int line);
149
+ #define rd_kafka_q_new(rk) rd_kafka_q_new0(rk, rd_false, __FUNCTION__, __LINE__)
150
+ #define rd_kafka_consume_q_new(rk) \
151
+ rd_kafka_q_new0(rk, rd_true, __FUNCTION__, __LINE__)
152
+ void rd_kafka_q_destroy_final(rd_kafka_q_t *rkq);
153
+
154
+ #define rd_kafka_q_lock(rkqu) mtx_lock(&(rkqu)->rkq_lock)
155
+ #define rd_kafka_q_unlock(rkqu) mtx_unlock(&(rkqu)->rkq_lock)
156
+
157
+ static RD_INLINE RD_UNUSED rd_kafka_q_t *rd_kafka_q_keep(rd_kafka_q_t *rkq) {
158
+ mtx_lock(&rkq->rkq_lock);
159
+ rkq->rkq_refcnt++;
160
+ mtx_unlock(&rkq->rkq_lock);
161
+ return rkq;
162
+ }
163
+
164
+ static RD_INLINE RD_UNUSED rd_kafka_q_t *
165
+ rd_kafka_q_keep_nolock(rd_kafka_q_t *rkq) {
166
+ rkq->rkq_refcnt++;
167
+ return rkq;
168
+ }
169
+
170
+
171
+ /**
172
+ * @returns the queue's name (used for debugging)
173
+ */
174
+ static RD_INLINE RD_UNUSED const char *rd_kafka_q_name(rd_kafka_q_t *rkq) {
175
+ return rkq->rkq_name;
176
+ }
177
+
178
+ /**
179
+ * @returns the final destination queue name (after forwarding)
180
+ * @remark rkq MUST NOT be locked
181
+ */
182
+ static RD_INLINE RD_UNUSED const char *rd_kafka_q_dest_name(rd_kafka_q_t *rkq) {
183
+ const char *ret;
184
+ mtx_lock(&rkq->rkq_lock);
185
+ if (rkq->rkq_fwdq)
186
+ ret = rd_kafka_q_dest_name(rkq->rkq_fwdq);
187
+ else
188
+ ret = rd_kafka_q_name(rkq);
189
+ mtx_unlock(&rkq->rkq_lock);
190
+ return ret;
191
+ }
192
+
193
+ /**
194
+ * @brief Disable a queue.
195
+ * Attempting to enqueue ops to the queue will destroy the ops.
196
+ */
197
+ static RD_INLINE RD_UNUSED void rd_kafka_q_disable0(rd_kafka_q_t *rkq,
198
+ int do_lock) {
199
+ if (do_lock)
200
+ mtx_lock(&rkq->rkq_lock);
201
+ rkq->rkq_flags &= ~RD_KAFKA_Q_F_READY;
202
+ if (do_lock)
203
+ mtx_unlock(&rkq->rkq_lock);
204
+ }
205
+ #define rd_kafka_q_disable(rkq) rd_kafka_q_disable0(rkq, 1 /*lock*/)
206
+
207
+ int rd_kafka_q_purge0(rd_kafka_q_t *rkq, int do_lock);
208
+ #define rd_kafka_q_purge(rkq) rd_kafka_q_purge0(rkq, 1 /*lock*/)
209
+ void rd_kafka_q_purge_toppar_version(rd_kafka_q_t *rkq,
210
+ rd_kafka_toppar_t *rktp,
211
+ int version);
212
+
213
+ /**
214
+ * @brief Loose reference to queue, when refcount reaches 0 the queue
215
+ * will be destroyed.
216
+ *
217
+ * @param disable Also disable the queue, to be used by owner of the queue.
218
+ */
219
+ static RD_INLINE RD_UNUSED void rd_kafka_q_destroy0(rd_kafka_q_t *rkq,
220
+ int disable) {
221
+ int do_delete = 0;
222
+
223
+ if (disable) {
224
+ /* To avoid recursive locking (from ops being purged
225
+ * that reference this queue somehow),
226
+ * we disable the queue and purge it with individual
227
+ * locking. */
228
+ rd_kafka_q_disable0(rkq, 1 /*lock*/);
229
+ rd_kafka_q_purge0(rkq, 1 /*lock*/);
230
+ }
231
+
232
+ mtx_lock(&rkq->rkq_lock);
233
+ rd_kafka_assert(NULL, rkq->rkq_refcnt > 0);
234
+ do_delete = !--rkq->rkq_refcnt;
235
+ mtx_unlock(&rkq->rkq_lock);
236
+
237
+ if (unlikely(do_delete))
238
+ rd_kafka_q_destroy_final(rkq);
239
+ }
240
+
241
+ #define rd_kafka_q_destroy(rkq) rd_kafka_q_destroy0(rkq, 0 /*dont-disable*/)
242
+
243
+ /**
244
+ * @brief Queue destroy method to be used by the owner (poller) of
245
+ * the queue. The only difference to q_destroy() is that this
246
+ * method also disables the queue so that any q_enq() operations
247
+ * will fail.
248
+ * Failure to disable a queue on the poller when it destroys its
249
+ * queue reference results in ops being enqueued on the queue
250
+ * but there is noone left to poll it, possibly resulting in a
251
+ * hang on termination due to refcounts held by the op.
252
+ */
253
+ static RD_INLINE RD_UNUSED void rd_kafka_q_destroy_owner(rd_kafka_q_t *rkq) {
254
+ rd_kafka_q_destroy0(rkq, 1 /*disable*/);
255
+ }
256
+
257
+
258
+ /**
259
+ * Reset a queue.
260
+ * WARNING: All messages will be lost and leaked.
261
+ * NOTE: No locking is performed.
262
+ */
263
+ static RD_INLINE RD_UNUSED void rd_kafka_q_reset(rd_kafka_q_t *rkq) {
264
+ TAILQ_INIT(&rkq->rkq_q);
265
+ rd_dassert(TAILQ_EMPTY(&rkq->rkq_q));
266
+ rkq->rkq_qlen = 0;
267
+ rkq->rkq_qsize = 0;
268
+ }
269
+
270
+
271
+
272
+ /**
273
+ * Forward 'srcq' to 'destq'
274
+ */
275
+ void rd_kafka_q_fwd_set0(rd_kafka_q_t *srcq,
276
+ rd_kafka_q_t *destq,
277
+ int do_lock,
278
+ int fwd_app);
279
+ #define rd_kafka_q_fwd_set(S, D) \
280
+ rd_kafka_q_fwd_set0(S, D, 1 /*lock*/, 0 /*no fwd_app*/)
281
+
282
+ /**
283
+ * @returns the forward queue (if any) with its refcount increased.
284
+ * @locks rd_kafka_q_lock(rkq) == !do_lock
285
+ */
286
+ static RD_INLINE RD_UNUSED rd_kafka_q_t *rd_kafka_q_fwd_get(rd_kafka_q_t *rkq,
287
+ int do_lock) {
288
+ rd_kafka_q_t *fwdq;
289
+ if (do_lock)
290
+ mtx_lock(&rkq->rkq_lock);
291
+
292
+ if ((fwdq = rkq->rkq_fwdq))
293
+ rd_kafka_q_keep(fwdq);
294
+
295
+ if (do_lock)
296
+ mtx_unlock(&rkq->rkq_lock);
297
+
298
+ return fwdq;
299
+ }
300
+
301
+
302
+ /**
303
+ * @returns true if queue is forwarded, else false.
304
+ *
305
+ * @remark Thread-safe.
306
+ */
307
+ static RD_INLINE RD_UNUSED int rd_kafka_q_is_fwded(rd_kafka_q_t *rkq) {
308
+ int r;
309
+ mtx_lock(&rkq->rkq_lock);
310
+ r = rkq->rkq_fwdq ? 1 : 0;
311
+ mtx_unlock(&rkq->rkq_lock);
312
+ return r;
313
+ }
314
+
315
+
316
+
317
+ /**
318
+ * @brief Trigger an IO event for this queue.
319
+ *
320
+ * @remark Queue MUST be locked
321
+ */
322
+ static RD_INLINE RD_UNUSED void rd_kafka_q_io_event(rd_kafka_q_t *rkq) {
323
+
324
+ if (likely(!rkq->rkq_qio))
325
+ return;
326
+
327
+ if (rkq->rkq_qio->event_cb) {
328
+ rkq->rkq_qio->event_cb(rkq->rkq_rk,
329
+ rkq->rkq_qio->event_cb_opaque);
330
+ return;
331
+ }
332
+
333
+
334
+ /* Only one wake-up event should be sent per non-polling period.
335
+ * As the queue reader calls poll/reads the channel it calls to
336
+ * rd_kafka_q_mark_served() to reset the wakeup sent flag, allowing
337
+ * further wakeups in the next non-polling period. */
338
+ if (rkq->rkq_qio->sent)
339
+ return; /* Wake-up event already written */
340
+
341
+ rkq->rkq_qio->sent = rd_true;
342
+
343
+ /* Write wake-up event to socket.
344
+ * Ignore errors, not much to do anyway. */
345
+ if (rd_socket_write(rkq->rkq_qio->fd, rkq->rkq_qio->payload,
346
+ (int)rkq->rkq_qio->size) == -1)
347
+ ;
348
+ }
349
+
350
+
351
+ /**
352
+ * @brief rko->rko_prio comparator
353
+ * @remark: descending order: higher priority takes preceedence.
354
+ */
355
+ static RD_INLINE RD_UNUSED int rd_kafka_op_cmp_prio(const void *_a,
356
+ const void *_b) {
357
+ const rd_kafka_op_t *a = _a, *b = _b;
358
+
359
+ return RD_CMP(b->rko_prio, a->rko_prio);
360
+ }
361
+
362
+
363
+ /**
364
+ * @brief Wake up waiters without enqueuing an op.
365
+ */
366
+ static RD_INLINE RD_UNUSED void rd_kafka_q_yield(rd_kafka_q_t *rkq) {
367
+ rd_kafka_q_t *fwdq;
368
+
369
+ mtx_lock(&rkq->rkq_lock);
370
+
371
+ rd_dassert(rkq->rkq_refcnt > 0);
372
+
373
+ if (unlikely(!(rkq->rkq_flags & RD_KAFKA_Q_F_READY))) {
374
+ /* Queue has been disabled */
375
+ mtx_unlock(&rkq->rkq_lock);
376
+ return;
377
+ }
378
+
379
+ if (!(fwdq = rd_kafka_q_fwd_get(rkq, 0))) {
380
+ rkq->rkq_flags |= RD_KAFKA_Q_F_YIELD;
381
+ cnd_broadcast(&rkq->rkq_cond);
382
+ if (rkq->rkq_qlen == 0)
383
+ rd_kafka_q_io_event(rkq);
384
+
385
+ mtx_unlock(&rkq->rkq_lock);
386
+ } else {
387
+ mtx_unlock(&rkq->rkq_lock);
388
+ rd_kafka_q_yield(fwdq);
389
+ rd_kafka_q_destroy(fwdq);
390
+ }
391
+ }
392
+
393
+ /**
394
+ * @brief Low-level unprotected enqueue that only performs
395
+ * the actual queue enqueue and counter updates.
396
+ * @remark Will not perform locking, signaling, fwdq, READY checking, etc.
397
+ */
398
+ static RD_INLINE RD_UNUSED void
399
+ rd_kafka_q_enq0(rd_kafka_q_t *rkq, rd_kafka_op_t *rko, int at_head) {
400
+ if (likely(!rko->rko_prio))
401
+ TAILQ_INSERT_TAIL(&rkq->rkq_q, rko, rko_link);
402
+ else if (at_head)
403
+ TAILQ_INSERT_HEAD(&rkq->rkq_q, rko, rko_link);
404
+ else
405
+ TAILQ_INSERT_SORTED(&rkq->rkq_q, rko, rd_kafka_op_t *, rko_link,
406
+ rd_kafka_op_cmp_prio);
407
+ rkq->rkq_qlen++;
408
+ rkq->rkq_qsize += rko->rko_len;
409
+ }
410
+
411
+
412
+ /**
413
+ * @brief Enqueue \p rko either at head or tail of \p rkq.
414
+ *
415
+ * The provided \p rko is either enqueued or destroyed.
416
+ *
417
+ * \p orig_destq is the original (outermost) dest queue for which
418
+ * this op was enqueued, before any queue forwarding has kicked in.
419
+ * The rko_serve callback from the orig_destq will be set on the rko
420
+ * if there is no rko_serve callback already set, and the \p rko isn't
421
+ * failed because the final queue is disabled.
422
+ *
423
+ * @returns 1 if op was enqueued or 0 if queue is disabled and
424
+ * there was no replyq to enqueue on in which case the rko is destroyed.
425
+ *
426
+ * @locality any thread.
427
+ */
428
+ static RD_INLINE RD_UNUSED int rd_kafka_q_enq1(rd_kafka_q_t *rkq,
429
+ rd_kafka_op_t *rko,
430
+ rd_kafka_q_t *orig_destq,
431
+ int at_head,
432
+ int do_lock) {
433
+ rd_kafka_q_t *fwdq;
434
+
435
+ if (do_lock)
436
+ mtx_lock(&rkq->rkq_lock);
437
+
438
+ rd_dassert(rkq->rkq_refcnt > 0);
439
+
440
+ if (unlikely(!(rkq->rkq_flags & RD_KAFKA_Q_F_READY))) {
441
+ /* Queue has been disabled, reply to and fail the rko. */
442
+ if (do_lock)
443
+ mtx_unlock(&rkq->rkq_lock);
444
+
445
+ return rd_kafka_op_reply(rko, RD_KAFKA_RESP_ERR__DESTROY);
446
+ }
447
+
448
+ if (!(fwdq = rd_kafka_q_fwd_get(rkq, 0))) {
449
+ if (!rko->rko_serve && orig_destq->rkq_serve) {
450
+ /* Store original queue's serve callback and opaque
451
+ * prior to forwarding. */
452
+ rko->rko_serve = orig_destq->rkq_serve;
453
+ rko->rko_serve_opaque = orig_destq->rkq_opaque;
454
+ }
455
+
456
+ rd_kafka_q_enq0(rkq, rko, at_head);
457
+ cnd_signal(&rkq->rkq_cond);
458
+ if (rkq->rkq_qlen == 1)
459
+ rd_kafka_q_io_event(rkq);
460
+
461
+ if (do_lock)
462
+ mtx_unlock(&rkq->rkq_lock);
463
+ } else {
464
+ if (do_lock)
465
+ mtx_unlock(&rkq->rkq_lock);
466
+ rd_kafka_q_enq1(fwdq, rko, orig_destq, at_head, 1 /*do lock*/);
467
+ rd_kafka_q_destroy(fwdq);
468
+ }
469
+
470
+ return 1;
471
+ }
472
+
473
+ /**
474
+ * @brief Enqueue the 'rko' op at the tail of the queue 'rkq'.
475
+ *
476
+ * The provided 'rko' is either enqueued or destroyed.
477
+ *
478
+ * @returns 1 if op was enqueued or 0 if queue is disabled and
479
+ * there was no replyq to enqueue on in which case the rko is destroyed.
480
+ *
481
+ * @locality any thread.
482
+ * @locks rkq MUST NOT be locked
483
+ */
484
+ static RD_INLINE RD_UNUSED int rd_kafka_q_enq(rd_kafka_q_t *rkq,
485
+ rd_kafka_op_t *rko) {
486
+ return rd_kafka_q_enq1(rkq, rko, rkq, 0 /*at tail*/, 1 /*do lock*/);
487
+ }
488
+
489
+
490
+ /**
491
+ * @brief Re-enqueue rko at head of rkq.
492
+ *
493
+ * The provided 'rko' is either enqueued or destroyed.
494
+ *
495
+ * @returns 1 if op was enqueued or 0 if queue is disabled and
496
+ * there was no replyq to enqueue on in which case the rko is destroyed.
497
+ *
498
+ * @locality any thread
499
+ * @locks rkq MUST BE locked
500
+ */
501
+ static RD_INLINE RD_UNUSED int rd_kafka_q_reenq(rd_kafka_q_t *rkq,
502
+ rd_kafka_op_t *rko) {
503
+ return rd_kafka_q_enq1(rkq, rko, rkq, 1 /*at head*/, 0 /*don't lock*/);
504
+ }
505
+
506
+
507
+ /**
508
+ * Dequeue 'rko' from queue 'rkq'.
509
+ *
510
+ * NOTE: rkq_lock MUST be held
511
+ * Locality: any thread
512
+ */
513
+ static RD_INLINE RD_UNUSED void rd_kafka_q_deq0(rd_kafka_q_t *rkq,
514
+ rd_kafka_op_t *rko) {
515
+ rd_dassert(rkq->rkq_qlen > 0 &&
516
+ rkq->rkq_qsize >= (int64_t)rko->rko_len);
517
+
518
+ TAILQ_REMOVE(&rkq->rkq_q, rko, rko_link);
519
+ rkq->rkq_qlen--;
520
+ rkq->rkq_qsize -= rko->rko_len;
521
+ }
522
+
523
+
524
+ /**
525
+ * @brief Mark queue as served / read.
526
+ *
527
+ * This is currently used by the queue reader side to reset the io-event
528
+ * wakeup flag.
529
+ *
530
+ * Should be called by all queue readers.
531
+ *
532
+ * @locks_required rkq must be locked.
533
+ */
534
+ static RD_INLINE RD_UNUSED void rd_kafka_q_mark_served(rd_kafka_q_t *rkq) {
535
+ if (rkq->rkq_qio)
536
+ rkq->rkq_qio->sent = rd_false;
537
+ }
538
+
539
+
540
+ /**
541
+ * Concat all elements of 'srcq' onto tail of 'rkq'.
542
+ * 'rkq' will be be locked (if 'do_lock'==1), but 'srcq' will not.
543
+ * NOTE: 'srcq' will be reset.
544
+ *
545
+ * Locality: any thread.
546
+ *
547
+ * @returns 0 if operation was performed or -1 if rkq is disabled.
548
+ */
549
+ static RD_INLINE RD_UNUSED int
550
+ rd_kafka_q_concat0(rd_kafka_q_t *rkq, rd_kafka_q_t *srcq, int do_lock) {
551
+ int r = 0;
552
+
553
+ while (srcq->rkq_fwdq) /* Resolve source queue */
554
+ srcq = srcq->rkq_fwdq;
555
+ if (unlikely(srcq->rkq_qlen == 0))
556
+ return 0; /* Don't do anything if source queue is empty */
557
+
558
+ if (do_lock)
559
+ mtx_lock(&rkq->rkq_lock);
560
+ if (!rkq->rkq_fwdq) {
561
+ rd_kafka_op_t *rko;
562
+
563
+ rd_dassert(TAILQ_EMPTY(&srcq->rkq_q) || srcq->rkq_qlen > 0);
564
+ if (unlikely(!(rkq->rkq_flags & RD_KAFKA_Q_F_READY))) {
565
+ if (do_lock)
566
+ mtx_unlock(&rkq->rkq_lock);
567
+ return -1;
568
+ }
569
+ /* First insert any prioritized ops from srcq
570
+ * in the right position in rkq. */
571
+ while ((rko = TAILQ_FIRST(&srcq->rkq_q)) && rko->rko_prio > 0) {
572
+ TAILQ_REMOVE(&srcq->rkq_q, rko, rko_link);
573
+ TAILQ_INSERT_SORTED(&rkq->rkq_q, rko, rd_kafka_op_t *,
574
+ rko_link, rd_kafka_op_cmp_prio);
575
+ }
576
+
577
+ TAILQ_CONCAT(&rkq->rkq_q, &srcq->rkq_q, rko_link);
578
+ if (rkq->rkq_qlen == 0)
579
+ rd_kafka_q_io_event(rkq);
580
+ rkq->rkq_qlen += srcq->rkq_qlen;
581
+ rkq->rkq_qsize += srcq->rkq_qsize;
582
+ cnd_signal(&rkq->rkq_cond);
583
+
584
+ rd_kafka_q_mark_served(srcq);
585
+ rd_kafka_q_reset(srcq);
586
+ } else
587
+ r = rd_kafka_q_concat0(rkq->rkq_fwdq ? rkq->rkq_fwdq : rkq,
588
+ srcq, rkq->rkq_fwdq ? do_lock : 0);
589
+ if (do_lock)
590
+ mtx_unlock(&rkq->rkq_lock);
591
+
592
+ return r;
593
+ }
594
+
595
+ #define rd_kafka_q_concat(dstq, srcq) rd_kafka_q_concat0(dstq, srcq, 1 /*lock*/)
596
+
597
+
598
+ /**
599
+ * @brief Prepend all elements of 'srcq' onto head of 'rkq'.
600
+ * 'rkq' will be be locked (if 'do_lock'==1), but 'srcq' will not.
601
+ * 'srcq' will be reset.
602
+ *
603
+ * @remark Will not respect priority of ops, srcq will be prepended in its
604
+ * original form to rkq.
605
+ *
606
+ * @locality any thread.
607
+ */
608
+ static RD_INLINE RD_UNUSED void
609
+ rd_kafka_q_prepend0(rd_kafka_q_t *rkq, rd_kafka_q_t *srcq, int do_lock) {
610
+ if (do_lock)
611
+ mtx_lock(&rkq->rkq_lock);
612
+ if (!rkq->rkq_fwdq && !srcq->rkq_fwdq) {
613
+ /* FIXME: prio-aware */
614
+ /* Concat rkq on srcq */
615
+ TAILQ_CONCAT(&srcq->rkq_q, &rkq->rkq_q, rko_link);
616
+ /* Move srcq to rkq */
617
+ TAILQ_MOVE(&rkq->rkq_q, &srcq->rkq_q, rko_link);
618
+ if (rkq->rkq_qlen == 0 && srcq->rkq_qlen > 0)
619
+ rd_kafka_q_io_event(rkq);
620
+ rkq->rkq_qlen += srcq->rkq_qlen;
621
+ rkq->rkq_qsize += srcq->rkq_qsize;
622
+
623
+ rd_kafka_q_mark_served(srcq);
624
+ rd_kafka_q_reset(srcq);
625
+ } else
626
+ rd_kafka_q_prepend0(rkq->rkq_fwdq ? rkq->rkq_fwdq : rkq,
627
+ srcq->rkq_fwdq ? srcq->rkq_fwdq : srcq,
628
+ rkq->rkq_fwdq ? do_lock : 0);
629
+ if (do_lock)
630
+ mtx_unlock(&rkq->rkq_lock);
631
+ }
632
+
633
+ #define rd_kafka_q_prepend(dstq, srcq) \
634
+ rd_kafka_q_prepend0(dstq, srcq, 1 /*lock*/)
635
+
636
+
637
+ /* Returns the number of elements in the queue */
638
+ static RD_INLINE RD_UNUSED int rd_kafka_q_len(rd_kafka_q_t *rkq) {
639
+ int qlen;
640
+ rd_kafka_q_t *fwdq;
641
+ mtx_lock(&rkq->rkq_lock);
642
+ if (!(fwdq = rd_kafka_q_fwd_get(rkq, 0))) {
643
+ qlen = rkq->rkq_qlen;
644
+ mtx_unlock(&rkq->rkq_lock);
645
+ } else {
646
+ mtx_unlock(&rkq->rkq_lock);
647
+ qlen = rd_kafka_q_len(fwdq);
648
+ rd_kafka_q_destroy(fwdq);
649
+ }
650
+ return qlen;
651
+ }
652
+
653
+ /* Returns the total size of elements in the queue */
654
+ static RD_INLINE RD_UNUSED uint64_t rd_kafka_q_size(rd_kafka_q_t *rkq) {
655
+ uint64_t sz;
656
+ rd_kafka_q_t *fwdq;
657
+ mtx_lock(&rkq->rkq_lock);
658
+ if (!(fwdq = rd_kafka_q_fwd_get(rkq, 0))) {
659
+ sz = rkq->rkq_qsize;
660
+ mtx_unlock(&rkq->rkq_lock);
661
+ } else {
662
+ mtx_unlock(&rkq->rkq_lock);
663
+ sz = rd_kafka_q_size(fwdq);
664
+ rd_kafka_q_destroy(fwdq);
665
+ }
666
+ return sz;
667
+ }
668
+
669
+ /**
670
+ * @brief Construct a temporary on-stack replyq with increased
671
+ * \p rkq refcount (unless NULL), version, and debug id.
672
+ */
673
+ static RD_INLINE RD_UNUSED rd_kafka_replyq_t
674
+ rd_kafka_replyq_make(rd_kafka_q_t *rkq, int version, const char *id) {
675
+ rd_kafka_replyq_t replyq = RD_ZERO_INIT;
676
+
677
+ if (rkq) {
678
+ replyq.q = rd_kafka_q_keep(rkq);
679
+ replyq.version = version;
680
+ #if ENABLE_DEVEL
681
+ replyq._id = rd_strdup(id);
682
+ #endif
683
+ }
684
+
685
+ return replyq;
686
+ }
687
+
688
+ /* Construct temporary on-stack replyq with increased Q refcount and
689
+ * optional VERSION. */
690
+ #define RD_KAFKA_REPLYQ(Q, VERSION) \
691
+ rd_kafka_replyq_make(Q, VERSION, __FUNCTION__)
692
+
693
+ /* Construct temporary on-stack replyq for indicating no replyq. */
694
+ #if ENABLE_DEVEL
695
+ #define RD_KAFKA_NO_REPLYQ \
696
+ (rd_kafka_replyq_t) { \
697
+ NULL, 0, NULL \
698
+ }
699
+ #else
700
+ #define RD_KAFKA_NO_REPLYQ \
701
+ (rd_kafka_replyq_t) { \
702
+ NULL, 0 \
703
+ }
704
+ #endif
705
+
706
+
707
+ /**
708
+ * @returns true if the replyq is valid, else false.
709
+ */
710
+ static RD_INLINE RD_UNUSED rd_bool_t
711
+ rd_kafka_replyq_is_valid(rd_kafka_replyq_t *replyq) {
712
+ rd_bool_t valid = rd_true;
713
+
714
+ if (!replyq->q)
715
+ return rd_false;
716
+
717
+ rd_kafka_q_lock(replyq->q);
718
+ valid = rd_kafka_q_ready(replyq->q);
719
+ rd_kafka_q_unlock(replyq->q);
720
+
721
+ return valid;
722
+ }
723
+
724
+
725
+
726
+ /**
727
+ * Set up replyq.
728
+ * Q refcnt is increased.
729
+ */
730
+ static RD_INLINE RD_UNUSED void rd_kafka_set_replyq(rd_kafka_replyq_t *replyq,
731
+ rd_kafka_q_t *rkq,
732
+ int32_t version) {
733
+ replyq->q = rkq ? rd_kafka_q_keep(rkq) : NULL;
734
+ replyq->version = version;
735
+ #if ENABLE_DEVEL
736
+ replyq->_id = rd_strdup(__FUNCTION__);
737
+ #endif
738
+ }
739
+
740
+ /**
741
+ * Set rko's replyq with an optional version (versionptr != NULL).
742
+ * Q refcnt is increased.
743
+ */
744
+ static RD_INLINE RD_UNUSED void
745
+ rd_kafka_op_set_replyq(rd_kafka_op_t *rko,
746
+ rd_kafka_q_t *rkq,
747
+ rd_atomic32_t *versionptr) {
748
+ rd_kafka_set_replyq(&rko->rko_replyq, rkq,
749
+ versionptr ? rd_atomic32_get(versionptr) : 0);
750
+ }
751
+
752
+ /* Set reply rko's version from replyq's version */
753
+ #define rd_kafka_op_get_reply_version(REPLY_RKO, ORIG_RKO) \
754
+ do { \
755
+ (REPLY_RKO)->rko_version = (ORIG_RKO)->rko_replyq.version; \
756
+ } while (0)
757
+
758
+
759
+ /* Clear replyq holder without decreasing any .q references. */
760
+ static RD_INLINE RD_UNUSED void
761
+ rd_kafka_replyq_clear(rd_kafka_replyq_t *replyq) {
762
+ memset(replyq, 0, sizeof(*replyq));
763
+ }
764
+
765
+ /**
766
+ * @brief Make a copy of \p src in \p dst, with its own queue reference
767
+ */
768
+ static RD_INLINE RD_UNUSED void rd_kafka_replyq_copy(rd_kafka_replyq_t *dst,
769
+ rd_kafka_replyq_t *src) {
770
+ dst->version = src->version;
771
+ dst->q = src->q;
772
+ if (dst->q)
773
+ rd_kafka_q_keep(dst->q);
774
+ #if ENABLE_DEVEL
775
+ if (src->_id)
776
+ dst->_id = rd_strdup(src->_id);
777
+ else
778
+ dst->_id = NULL;
779
+ #endif
780
+ }
781
+
782
+
783
+ /**
784
+ * Clear replyq holder and destroy any .q references.
785
+ */
786
+ static RD_INLINE RD_UNUSED void
787
+ rd_kafka_replyq_destroy(rd_kafka_replyq_t *replyq) {
788
+ if (replyq->q)
789
+ rd_kafka_q_destroy(replyq->q);
790
+ #if ENABLE_DEVEL
791
+ if (replyq->_id) {
792
+ rd_free(replyq->_id);
793
+ replyq->_id = NULL;
794
+ }
795
+ #endif
796
+ rd_kafka_replyq_clear(replyq);
797
+ }
798
+
799
+
800
+ /**
801
+ * @brief Wrapper for rd_kafka_q_enq() that takes a replyq,
802
+ * steals its queue reference, enqueues the op with the replyq version,
803
+ * and then destroys the queue reference.
804
+ *
805
+ * If \p version is non-zero it will be updated, else replyq->version.
806
+ *
807
+ * @returns Same as rd_kafka_q_enq()
808
+ */
809
+ static RD_INLINE RD_UNUSED int rd_kafka_replyq_enq(rd_kafka_replyq_t *replyq,
810
+ rd_kafka_op_t *rko,
811
+ int version) {
812
+ rd_kafka_q_t *rkq = replyq->q;
813
+ int r;
814
+
815
+ if (version)
816
+ rko->rko_version = version;
817
+ else
818
+ rko->rko_version = replyq->version;
819
+
820
+ /* The replyq queue reference is done after we've enqueued the rko
821
+ * so clear it here. */
822
+ replyq->q = NULL; /* destroyed separately below */
823
+
824
+ #if ENABLE_DEVEL
825
+ if (replyq->_id) {
826
+ rd_free(replyq->_id);
827
+ replyq->_id = NULL;
828
+ }
829
+ #endif
830
+
831
+ /* Retain replyq->version since it is used by buf_callback
832
+ * when dispatching the callback. */
833
+
834
+ r = rd_kafka_q_enq(rkq, rko);
835
+
836
+ rd_kafka_q_destroy(rkq);
837
+
838
+ return r;
839
+ }
840
+
841
+
842
+
843
+ rd_kafka_op_t *rd_kafka_q_pop_serve(rd_kafka_q_t *rkq,
844
+ rd_ts_t timeout_us,
845
+ int32_t version,
846
+ rd_kafka_q_cb_type_t cb_type,
847
+ rd_kafka_q_serve_cb_t *callback,
848
+ void *opaque);
849
+ rd_kafka_op_t *
850
+ rd_kafka_q_pop_serve_maybe_consume(rd_kafka_q_t *rkq,
851
+ rd_ts_t timeout_us,
852
+ int32_t version,
853
+ rd_kafka_q_cb_type_t cb_type,
854
+ rd_kafka_q_serve_cb_t *callback,
855
+ void *opaque);
856
+ rd_kafka_op_t *
857
+ rd_kafka_q_pop(rd_kafka_q_t *rkq, rd_ts_t timeout_us, int32_t version);
858
+ int rd_kafka_q_serve(rd_kafka_q_t *rkq,
859
+ int timeout_ms,
860
+ int max_cnt,
861
+ rd_kafka_q_cb_type_t cb_type,
862
+ rd_kafka_q_serve_cb_t *callback,
863
+ void *opaque);
864
+ int rd_kafka_q_serve_maybe_consume(rd_kafka_q_t *rkq,
865
+ int timeout_ms,
866
+ int max_cnt,
867
+ rd_kafka_q_cb_type_t cb_type,
868
+ rd_kafka_q_serve_cb_t *callback,
869
+ void *opaque);
870
+
871
+
872
+ int rd_kafka_q_move_cnt(rd_kafka_q_t *dstq,
873
+ rd_kafka_q_t *srcq,
874
+ int cnt,
875
+ int do_locks);
876
+
877
+ int rd_kafka_q_serve_rkmessages(rd_kafka_q_t *rkq,
878
+ int timeout_ms,
879
+ rd_kafka_message_t **rkmessages,
880
+ size_t rkmessages_size);
881
+ rd_kafka_resp_err_t rd_kafka_q_wait_result(rd_kafka_q_t *rkq, int timeout_ms);
882
+
883
+ int rd_kafka_q_apply(rd_kafka_q_t *rkq,
884
+ int (*callback)(rd_kafka_q_t *rkq,
885
+ rd_kafka_op_t *rko,
886
+ void *opaque),
887
+ void *opaque);
888
+
889
+ void rd_kafka_q_fix_offsets(rd_kafka_q_t *rkq,
890
+ int64_t min_offset,
891
+ int64_t base_offset);
892
+
893
+ /**
894
+ * @returns the last op in the queue matching \p op_type and \p allow_err (bool)
895
+ * @remark The \p rkq must be properly locked before this call, the returned rko
896
+ * is not removed from the queue and may thus not be held for longer
897
+ * than the lock is held.
898
+ */
899
+ static RD_INLINE RD_UNUSED rd_kafka_op_t *
900
+ rd_kafka_q_last(rd_kafka_q_t *rkq, rd_kafka_op_type_t op_type, int allow_err) {
901
+ rd_kafka_op_t *rko;
902
+ TAILQ_FOREACH_REVERSE(rko, &rkq->rkq_q, rd_kafka_op_tailq, rko_link) {
903
+ if (rko->rko_type == op_type && (allow_err || !rko->rko_err))
904
+ return rko;
905
+ }
906
+
907
+ return NULL;
908
+ }
909
+
910
+ void rd_kafka_q_io_event_enable(rd_kafka_q_t *rkq,
911
+ rd_socket_t fd,
912
+ const void *payload,
913
+ size_t size);
914
+
915
+ /* Public interface */
916
+ struct rd_kafka_queue_s {
917
+ rd_kafka_q_t *rkqu_q;
918
+ rd_kafka_t *rkqu_rk;
919
+ int rkqu_is_owner; /**< Is owner/creator of rkqu_q */
920
+ };
921
+
922
+
923
+ rd_kafka_queue_t *rd_kafka_queue_new0(rd_kafka_t *rk, rd_kafka_q_t *rkq);
924
+
925
+ void rd_kafka_q_dump(FILE *fp, rd_kafka_q_t *rkq);
926
+
927
+ extern int RD_TLS rd_kafka_yield_thread;
928
+
929
+
930
+
931
+ /**
932
+ * @name Enqueue op once
933
+ * @{
934
+ */
935
+
936
+ /**
937
+ * @brief Minimal rd_kafka_op_t wrapper that ensures that
938
+ * the op is only enqueued on the provided queue once.
939
+ *
940
+ * Typical use-case is for an op to be triggered from multiple sources,
941
+ * but at most once, such as from a timer and some other source.
942
+ */
943
+ typedef struct rd_kafka_enq_once_s {
944
+ mtx_t lock;
945
+ int refcnt;
946
+ rd_kafka_op_t *rko;
947
+ rd_kafka_replyq_t replyq;
948
+ } rd_kafka_enq_once_t;
949
+
950
+
951
+ /**
952
+ * @brief Allocate and set up a new eonce and set the initial refcount to 1.
953
+ * @remark This is to be called by the owner of the rko.
954
+ */
955
+ static RD_INLINE RD_UNUSED rd_kafka_enq_once_t *
956
+ rd_kafka_enq_once_new(rd_kafka_op_t *rko, rd_kafka_replyq_t replyq) {
957
+ rd_kafka_enq_once_t *eonce = rd_calloc(1, sizeof(*eonce));
958
+ mtx_init(&eonce->lock, mtx_plain);
959
+ eonce->rko = rko;
960
+ eonce->replyq = replyq; /* struct copy */
961
+ eonce->refcnt = 1;
962
+ return eonce;
963
+ }
964
+
965
+ /**
966
+ * @brief Re-enable triggering of a eonce even after it has been triggered
967
+ * once.
968
+ *
969
+ * @remark This is to be called by the owner.
970
+ */
971
+ static RD_INLINE RD_UNUSED void
972
+ rd_kafka_enq_once_reenable(rd_kafka_enq_once_t *eonce,
973
+ rd_kafka_op_t *rko,
974
+ rd_kafka_replyq_t replyq) {
975
+ mtx_lock(&eonce->lock);
976
+ eonce->rko = rko;
977
+ rd_kafka_replyq_destroy(&eonce->replyq);
978
+ eonce->replyq = replyq; /* struct copy */
979
+ mtx_unlock(&eonce->lock);
980
+ }
981
+
982
+
983
+ /**
984
+ * @brief Free eonce and its resources. Must only be called with refcnt==0
985
+ * and eonce->lock NOT held.
986
+ */
987
+ static RD_INLINE RD_UNUSED void
988
+ rd_kafka_enq_once_destroy0(rd_kafka_enq_once_t *eonce) {
989
+ /* This must not be called with the rko or replyq still set, which would
990
+ * indicate that no enqueueing was performed and that the owner
991
+ * did not clean up, which is a bug. */
992
+ rd_assert(!eonce->rko);
993
+ rd_assert(!eonce->replyq.q);
994
+ #if ENABLE_DEVEL
995
+ rd_assert(!eonce->replyq._id);
996
+ #endif
997
+ rd_assert(eonce->refcnt == 0);
998
+
999
+ mtx_destroy(&eonce->lock);
1000
+ rd_free(eonce);
1001
+ }
1002
+
1003
+
1004
+ /**
1005
+ * @brief Increment refcount for source (non-owner), such as a timer.
1006
+ *
1007
+ * @param srcdesc a human-readable descriptive string of the source.
1008
+ * May be used for future debugging.
1009
+ */
1010
+ static RD_INLINE RD_UNUSED void
1011
+ rd_kafka_enq_once_add_source(rd_kafka_enq_once_t *eonce, const char *srcdesc) {
1012
+ mtx_lock(&eonce->lock);
1013
+ eonce->refcnt++;
1014
+ mtx_unlock(&eonce->lock);
1015
+ }
1016
+
1017
+
1018
+ /**
1019
+ * @brief Decrement refcount for source (non-owner), such as a timer.
1020
+ *
1021
+ * @param srcdesc a human-readable descriptive string of the source.
1022
+ * May be used for future debugging.
1023
+ *
1024
+ * @remark Must only be called from the owner with the owner
1025
+ * still holding its own refcount.
1026
+ * This API is used to undo an add_source() from the
1027
+ * same code.
1028
+ */
1029
+ static RD_INLINE RD_UNUSED void
1030
+ rd_kafka_enq_once_del_source(rd_kafka_enq_once_t *eonce, const char *srcdesc) {
1031
+ int do_destroy;
1032
+
1033
+ mtx_lock(&eonce->lock);
1034
+ rd_assert(eonce->refcnt > 0);
1035
+ eonce->refcnt--;
1036
+ do_destroy = eonce->refcnt == 0;
1037
+ mtx_unlock(&eonce->lock);
1038
+
1039
+ if (do_destroy) {
1040
+ /* We're the last refcount holder, clean up eonce. */
1041
+ rd_kafka_enq_once_destroy0(eonce);
1042
+ }
1043
+ }
1044
+
1045
+ /**
1046
+ * @brief Trigger a source's reference where the eonce resides on
1047
+ * an rd_list_t. This is typically used as a free_cb for
1048
+ * rd_list_destroy() and the trigger error code is
1049
+ * always RD_KAFKA_RESP_ERR__DESTROY.
1050
+ */
1051
+ void rd_kafka_enq_once_trigger_destroy(void *ptr);
1052
+
1053
+
1054
+ /**
1055
+ * @brief Decrement refcount for source (non-owner) and return the rko
1056
+ * if still set.
1057
+ *
1058
+ * @remark Must only be called by sources (non-owner) but only on the
1059
+ * the owner's thread to make sure the rko is not freed.
1060
+ *
1061
+ * @remark The rko remains set on the eonce.
1062
+ */
1063
+ static RD_INLINE RD_UNUSED rd_kafka_op_t *
1064
+ rd_kafka_enq_once_del_source_return(rd_kafka_enq_once_t *eonce,
1065
+ const char *srcdesc) {
1066
+ rd_bool_t do_destroy;
1067
+ rd_kafka_op_t *rko;
1068
+
1069
+ mtx_lock(&eonce->lock);
1070
+
1071
+ rd_assert(eonce->refcnt > 0);
1072
+ /* Owner must still hold a eonce reference, or the eonce must
1073
+ * have been disabled by the owner (no rko) */
1074
+ rd_assert(eonce->refcnt > 1 || !eonce->rko);
1075
+ eonce->refcnt--;
1076
+ do_destroy = eonce->refcnt == 0;
1077
+
1078
+ rko = eonce->rko;
1079
+ mtx_unlock(&eonce->lock);
1080
+
1081
+ if (do_destroy) {
1082
+ /* We're the last refcount holder, clean up eonce. */
1083
+ rd_kafka_enq_once_destroy0(eonce);
1084
+ }
1085
+
1086
+ return rko;
1087
+ }
1088
+
1089
+ /**
1090
+ * @brief Trigger enqueuing of the rko (unless already enqueued)
1091
+ * and drops the source's refcount.
1092
+ *
1093
+ * @remark Must only be called by sources (non-owner).
1094
+ */
1095
+ static RD_INLINE RD_UNUSED void
1096
+ rd_kafka_enq_once_trigger(rd_kafka_enq_once_t *eonce,
1097
+ rd_kafka_resp_err_t err,
1098
+ const char *srcdesc) {
1099
+ int do_destroy;
1100
+ rd_kafka_op_t *rko = NULL;
1101
+ rd_kafka_replyq_t replyq = RD_ZERO_INIT;
1102
+
1103
+ mtx_lock(&eonce->lock);
1104
+
1105
+ rd_assert(eonce->refcnt > 0);
1106
+ eonce->refcnt--;
1107
+ do_destroy = eonce->refcnt == 0;
1108
+
1109
+ if (eonce->rko) {
1110
+ /* Not already enqueued, do it.
1111
+ * Detach the rko and replyq from the eonce and unlock the eonce
1112
+ * before enqueuing rko on reply to avoid recursive locks
1113
+ * if the replyq has been disabled and the ops
1114
+ * destructor is called (which might then access the eonce
1115
+ * to clean up). */
1116
+ rko = eonce->rko;
1117
+ replyq = eonce->replyq;
1118
+
1119
+ eonce->rko = NULL;
1120
+ rd_kafka_replyq_clear(&eonce->replyq);
1121
+
1122
+ /* Reply is enqueued at the end of this function */
1123
+ }
1124
+ mtx_unlock(&eonce->lock);
1125
+
1126
+ if (do_destroy) {
1127
+ /* We're the last refcount holder, clean up eonce. */
1128
+ rd_kafka_enq_once_destroy0(eonce);
1129
+ }
1130
+
1131
+ if (rko) {
1132
+ rko->rko_err = err;
1133
+ rd_kafka_replyq_enq(&replyq, rko, replyq.version);
1134
+ rd_kafka_replyq_destroy(&replyq);
1135
+ }
1136
+ }
1137
+
1138
+ /**
1139
+ * @brief Destroy eonce, must only be called by the owner.
1140
+ * There may be outstanding refcounts by non-owners after this call
1141
+ */
1142
+ static RD_INLINE RD_UNUSED void
1143
+ rd_kafka_enq_once_destroy(rd_kafka_enq_once_t *eonce) {
1144
+ int do_destroy;
1145
+
1146
+ mtx_lock(&eonce->lock);
1147
+ rd_assert(eonce->refcnt > 0);
1148
+ eonce->refcnt--;
1149
+ do_destroy = eonce->refcnt == 0;
1150
+
1151
+ eonce->rko = NULL;
1152
+ rd_kafka_replyq_destroy(&eonce->replyq);
1153
+
1154
+ mtx_unlock(&eonce->lock);
1155
+
1156
+ if (do_destroy) {
1157
+ /* We're the last refcount holder, clean up eonce. */
1158
+ rd_kafka_enq_once_destroy0(eonce);
1159
+ }
1160
+ }
1161
+
1162
+
1163
+ /**
1164
+ * @brief Disable the owner's eonce, extracting, resetting and returning
1165
+ * the \c rko object.
1166
+ *
1167
+ * This is the same as rd_kafka_enq_once_destroy() but returning
1168
+ * the rko.
1169
+ *
1170
+ * Use this for owner-thread triggering where the enqueuing of the
1171
+ * rko on the replyq is not necessary.
1172
+ *
1173
+ * @returns the eonce's rko object, if still available, else NULL.
1174
+ */
1175
+ static RD_INLINE RD_UNUSED rd_kafka_op_t *
1176
+ rd_kafka_enq_once_disable(rd_kafka_enq_once_t *eonce) {
1177
+ int do_destroy;
1178
+ rd_kafka_op_t *rko;
1179
+
1180
+ mtx_lock(&eonce->lock);
1181
+ rd_assert(eonce->refcnt > 0);
1182
+ eonce->refcnt--;
1183
+ do_destroy = eonce->refcnt == 0;
1184
+
1185
+ /* May be NULL */
1186
+ rko = eonce->rko;
1187
+ eonce->rko = NULL;
1188
+ rd_kafka_replyq_destroy(&eonce->replyq);
1189
+
1190
+ mtx_unlock(&eonce->lock);
1191
+
1192
+ if (do_destroy) {
1193
+ /* We're the last refcount holder, clean up eonce. */
1194
+ rd_kafka_enq_once_destroy0(eonce);
1195
+ }
1196
+
1197
+ return rko;
1198
+ }
1199
+
1200
+ /**
1201
+ * @brief Returns true if the queue can contain fetched messages.
1202
+ *
1203
+ * @locks rd_kafka_q_lock(rkq) if do_lock is set.
1204
+ */
1205
+ static RD_INLINE RD_UNUSED rd_bool_t
1206
+ rd_kafka_q_can_contain_fetched_msgs(rd_kafka_q_t *rkq, rd_bool_t do_lock) {
1207
+ rd_bool_t val;
1208
+ if (do_lock)
1209
+ mtx_lock(&rkq->rkq_lock);
1210
+ val = rkq->rkq_flags & RD_KAFKA_Q_F_CONSUMER;
1211
+ if (do_lock)
1212
+ mtx_unlock(&rkq->rkq_lock);
1213
+ return val;
1214
+ }
1215
+
1216
+
1217
+ /**@}*/
1218
+
1219
+
1220
+ #endif /* _RDKAFKA_QUEUE_H_ */