@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,1781 @@
1
+ /*
2
+ * librdkafka - Apache Kafka C library
3
+ *
4
+ * Copyright (c) 2012-2022, Magnus Edenhill
5
+ * 2023, Confluent Inc.
6
+ * All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions are met:
10
+ *
11
+ * 1. Redistributions of source code must retain the above copyright notice,
12
+ * this list of conditions and the following disclaimer.
13
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
14
+ * this list of conditions and the following disclaimer in the documentation
15
+ * and/or other materials provided with the distribution.
16
+ *
17
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
+ * POSSIBILITY OF SUCH DAMAGE.
28
+ */
29
+
30
+ /**
31
+ * Apache Kafka consumer & producer performance tester
32
+ * using the Kafka driver from librdkafka
33
+ * (https://github.com/confluentinc/librdkafka)
34
+ */
35
+
36
+ #ifdef _MSC_VER
37
+ #define _CRT_SECURE_NO_WARNINGS /* Silence nonsense on MSVC */
38
+ #endif
39
+
40
+ #include "../src/rd.h"
41
+
42
+ #define _GNU_SOURCE /* for strndup() */
43
+ #include <ctype.h>
44
+ #include <signal.h>
45
+ #include <string.h>
46
+ #include <errno.h>
47
+
48
+ /* Typical include path would be <librdkafka/rdkafka.h>, but this program
49
+ * is built from within the librdkafka source tree and thus differs. */
50
+ #include "rdkafka.h" /* for Kafka driver */
51
+ /* Do not include these defines from your program, they will not be
52
+ * provided by librdkafka. */
53
+ #include "rd.h"
54
+ #include "rdtime.h"
55
+
56
+ #ifdef _WIN32
57
+ #include "../win32/wingetopt.h"
58
+ #include "../win32/wintime.h"
59
+ #endif
60
+
61
+
62
+ static volatile sig_atomic_t run = 1;
63
+ static int forever = 1;
64
+ static rd_ts_t dispintvl = 1000;
65
+ static int do_seq = 0;
66
+ static int exit_after = 0;
67
+ static int exit_eof = 0;
68
+ static FILE *stats_fp;
69
+ static int dr_disp_div;
70
+ static int verbosity = 1;
71
+ static int latency_mode = 0;
72
+ static FILE *latency_fp = NULL;
73
+ static int msgcnt = -1;
74
+ static int incremental_mode = 0;
75
+ static int partition_cnt = 0;
76
+ static int eof_cnt = 0;
77
+ static int with_dr = 1;
78
+ static int read_hdrs = 0;
79
+
80
+
81
+ static void stop(int sig) {
82
+ if (!run)
83
+ exit(0);
84
+ run = 0;
85
+ }
86
+
87
+ static long int msgs_wait_cnt = 0;
88
+ static long int msgs_wait_produce_cnt = 0;
89
+ static rd_ts_t t_end;
90
+ static rd_kafka_t *global_rk;
91
+
92
+ struct avg {
93
+ int64_t val;
94
+ int cnt;
95
+ uint64_t ts_start;
96
+ };
97
+
98
+ static struct {
99
+ rd_ts_t t_start;
100
+ rd_ts_t t_end;
101
+ rd_ts_t t_end_send;
102
+ uint64_t msgs;
103
+ uint64_t msgs_last;
104
+ uint64_t msgs_dr_ok;
105
+ uint64_t msgs_dr_err;
106
+ uint64_t bytes_dr_ok;
107
+ uint64_t bytes;
108
+ uint64_t bytes_last;
109
+ uint64_t tx;
110
+ uint64_t tx_err;
111
+ uint64_t avg_rtt;
112
+ uint64_t offset;
113
+ rd_ts_t t_fetch_latency;
114
+ rd_ts_t t_last;
115
+ rd_ts_t t_enobufs_last;
116
+ rd_ts_t t_total;
117
+ rd_ts_t latency_last;
118
+ rd_ts_t latency_lo;
119
+ rd_ts_t latency_hi;
120
+ rd_ts_t latency_sum;
121
+ int latency_cnt;
122
+ int64_t last_offset;
123
+ } cnt;
124
+
125
+
126
+ uint64_t wall_clock(void) {
127
+ struct timeval tv;
128
+ gettimeofday(&tv, NULL);
129
+ return ((uint64_t)tv.tv_sec * 1000000LLU) + ((uint64_t)tv.tv_usec);
130
+ }
131
+
132
+ static void err_cb(rd_kafka_t *rk, int err, const char *reason, void *opaque) {
133
+ if (err == RD_KAFKA_RESP_ERR__FATAL) {
134
+ char errstr[512];
135
+ err = rd_kafka_fatal_error(rk, errstr, sizeof(errstr));
136
+ printf("%% FATAL ERROR CALLBACK: %s: %s: %s\n",
137
+ rd_kafka_name(rk), rd_kafka_err2str(err), errstr);
138
+ } else {
139
+ printf("%% ERROR CALLBACK: %s: %s: %s\n", rd_kafka_name(rk),
140
+ rd_kafka_err2str(err), reason);
141
+ }
142
+ }
143
+
144
+ static void throttle_cb(rd_kafka_t *rk,
145
+ const char *broker_name,
146
+ int32_t broker_id,
147
+ int throttle_time_ms,
148
+ void *opaque) {
149
+ printf("%% THROTTLED %dms by %s (%" PRId32 ")\n", throttle_time_ms,
150
+ broker_name, broker_id);
151
+ }
152
+
153
+ static void offset_commit_cb(rd_kafka_t *rk,
154
+ rd_kafka_resp_err_t err,
155
+ rd_kafka_topic_partition_list_t *offsets,
156
+ void *opaque) {
157
+ int i;
158
+
159
+ if (err || verbosity >= 2)
160
+ printf("%% Offset commit of %d partition(s): %s\n",
161
+ offsets->cnt, rd_kafka_err2str(err));
162
+
163
+ for (i = 0; i < offsets->cnt; i++) {
164
+ rd_kafka_topic_partition_t *rktpar = &offsets->elems[i];
165
+ if (rktpar->err || verbosity >= 2)
166
+ printf("%% %s [%" PRId32 "] @ %" PRId64 ": %s\n",
167
+ rktpar->topic, rktpar->partition, rktpar->offset,
168
+ rd_kafka_err2str(err));
169
+ }
170
+ }
171
+
172
+ /**
173
+ * @brief Add latency measurement
174
+ */
175
+ static void latency_add(int64_t ts, const char *who) {
176
+ if (ts > cnt.latency_hi)
177
+ cnt.latency_hi = ts;
178
+ if (!cnt.latency_lo || ts < cnt.latency_lo)
179
+ cnt.latency_lo = ts;
180
+ cnt.latency_last = ts;
181
+ cnt.latency_cnt++;
182
+ cnt.latency_sum += ts;
183
+ if (latency_fp)
184
+ fprintf(latency_fp, "%" PRIu64 "\n", ts);
185
+ }
186
+
187
+
188
+ static void msg_delivered(rd_kafka_t *rk,
189
+ const rd_kafka_message_t *rkmessage,
190
+ void *opaque) {
191
+ static rd_ts_t last;
192
+ rd_ts_t now = rd_clock();
193
+ static int msgs;
194
+
195
+ msgs++;
196
+
197
+ msgs_wait_cnt--;
198
+
199
+ if (rkmessage->err)
200
+ cnt.msgs_dr_err++;
201
+ else {
202
+ cnt.msgs_dr_ok++;
203
+ cnt.bytes_dr_ok += rkmessage->len;
204
+ }
205
+
206
+ if (latency_mode) {
207
+ /* Extract latency */
208
+ int64_t source_ts;
209
+ if (sscanf(rkmessage->payload, "LATENCY:%" SCNd64,
210
+ &source_ts) == 1)
211
+ latency_add(wall_clock() - source_ts, "producer");
212
+ }
213
+
214
+
215
+ if ((rkmessage->err && (cnt.msgs_dr_err < 50 ||
216
+ !(cnt.msgs_dr_err % (dispintvl / 1000)))) ||
217
+ !last || msgs_wait_cnt < 5 || !(msgs_wait_cnt % dr_disp_div) ||
218
+ (now - last) >= dispintvl * 1000 || verbosity >= 3) {
219
+ if (rkmessage->err && verbosity >= 2)
220
+ printf("%% Message delivery failed (broker %" PRId32
221
+ "): "
222
+ "%s [%" PRId32
223
+ "]: "
224
+ "%s (%li remain)\n",
225
+ rd_kafka_message_broker_id(rkmessage),
226
+ rd_kafka_topic_name(rkmessage->rkt),
227
+ rkmessage->partition,
228
+ rd_kafka_err2str(rkmessage->err), msgs_wait_cnt);
229
+ else if (verbosity > 2)
230
+ printf("%% Message delivered (offset %" PRId64
231
+ ", broker %" PRId32
232
+ "): "
233
+ "%li remain\n",
234
+ rkmessage->offset,
235
+ rd_kafka_message_broker_id(rkmessage),
236
+ msgs_wait_cnt);
237
+ if (verbosity >= 3 && do_seq)
238
+ printf(" --> \"%.*s\"\n", (int)rkmessage->len,
239
+ (const char *)rkmessage->payload);
240
+ last = now;
241
+ }
242
+
243
+ cnt.last_offset = rkmessage->offset;
244
+
245
+ if (msgs_wait_produce_cnt == 0 && msgs_wait_cnt == 0 && !forever) {
246
+ if (verbosity >= 2 && cnt.msgs > 0) {
247
+ double error_percent =
248
+ (double)(cnt.msgs - cnt.msgs_dr_ok) / cnt.msgs *
249
+ 100;
250
+ printf(
251
+ "%% Messages delivered with failure "
252
+ "percentage of %.5f%%\n",
253
+ error_percent);
254
+ }
255
+ t_end = rd_clock();
256
+ run = 0;
257
+ }
258
+
259
+ if (exit_after && exit_after <= msgs) {
260
+ printf("%% Hard exit after %i messages, as requested\n",
261
+ exit_after);
262
+ exit(0);
263
+ }
264
+ }
265
+
266
+
267
+ static void msg_consume(rd_kafka_message_t *rkmessage, void *opaque) {
268
+
269
+ if (rkmessage->err) {
270
+ if (rkmessage->err == RD_KAFKA_RESP_ERR__PARTITION_EOF) {
271
+ cnt.offset = rkmessage->offset;
272
+
273
+ if (verbosity >= 1)
274
+ printf(
275
+ "%% Consumer reached end of "
276
+ "%s [%" PRId32
277
+ "] "
278
+ "message queue at offset %" PRId64 "\n",
279
+ rd_kafka_topic_name(rkmessage->rkt),
280
+ rkmessage->partition, rkmessage->offset);
281
+
282
+ if (exit_eof && ++eof_cnt == partition_cnt)
283
+ run = 0;
284
+
285
+ return;
286
+ }
287
+
288
+ printf("%% Consume error for topic \"%s\" [%" PRId32
289
+ "] "
290
+ "offset %" PRId64 ": %s\n",
291
+ rkmessage->rkt ? rd_kafka_topic_name(rkmessage->rkt)
292
+ : "",
293
+ rkmessage->partition, rkmessage->offset,
294
+ rd_kafka_message_errstr(rkmessage));
295
+
296
+ if (rkmessage->err == RD_KAFKA_RESP_ERR__UNKNOWN_PARTITION ||
297
+ rkmessage->err == RD_KAFKA_RESP_ERR__UNKNOWN_TOPIC)
298
+ run = 0;
299
+
300
+ cnt.msgs_dr_err++;
301
+ return;
302
+ }
303
+
304
+ /* Start measuring from first message received */
305
+ if (!cnt.t_start)
306
+ cnt.t_start = cnt.t_last = rd_clock();
307
+
308
+ cnt.offset = rkmessage->offset;
309
+ cnt.msgs++;
310
+ cnt.bytes += rkmessage->len;
311
+
312
+ if (verbosity >= 3 || (verbosity >= 2 && !(cnt.msgs % 1000000)))
313
+ printf("@%" PRId64 ": %.*s: %.*s\n", rkmessage->offset,
314
+ (int)rkmessage->key_len, (char *)rkmessage->key,
315
+ (int)rkmessage->len, (char *)rkmessage->payload);
316
+
317
+
318
+ if (latency_mode) {
319
+ int64_t remote_ts, ts;
320
+
321
+ if (rkmessage->len > 8 &&
322
+ !memcmp(rkmessage->payload, "LATENCY:", 8) &&
323
+ sscanf(rkmessage->payload, "LATENCY:%" SCNd64,
324
+ &remote_ts) == 1) {
325
+ ts = wall_clock() - remote_ts;
326
+ if (ts > 0 && ts < (1000000 * 60 * 5)) {
327
+ latency_add(ts, "consumer");
328
+ } else {
329
+ if (verbosity >= 1)
330
+ printf(
331
+ "Received latency timestamp is too "
332
+ "far off: %" PRId64
333
+ "us (message offset %" PRId64
334
+ "): ignored\n",
335
+ ts, rkmessage->offset);
336
+ }
337
+ } else if (verbosity > 1)
338
+ printf("not a LATENCY payload: %.*s\n",
339
+ (int)rkmessage->len, (char *)rkmessage->payload);
340
+ }
341
+
342
+ if (read_hdrs) {
343
+ rd_kafka_headers_t *hdrs;
344
+ /* Force parsing of headers but don't do anything with them. */
345
+ rd_kafka_message_headers(rkmessage, &hdrs);
346
+ }
347
+
348
+ if (msgcnt != -1 && (int)cnt.msgs >= msgcnt)
349
+ run = 0;
350
+ }
351
+
352
+
353
+ static void rebalance_cb(rd_kafka_t *rk,
354
+ rd_kafka_resp_err_t err,
355
+ rd_kafka_topic_partition_list_t *partitions,
356
+ void *opaque) {
357
+ rd_kafka_error_t *error = NULL;
358
+ rd_kafka_resp_err_t ret_err = RD_KAFKA_RESP_ERR_NO_ERROR;
359
+
360
+ if (exit_eof && !strcmp(rd_kafka_rebalance_protocol(rk), "COOPERATIVE"))
361
+ fprintf(stderr,
362
+ "%% This example has not been modified to "
363
+ "support -e (exit on EOF) when "
364
+ "partition.assignment.strategy "
365
+ "is set to an incremental/cooperative strategy: "
366
+ "-e will not behave as expected\n");
367
+
368
+ switch (err) {
369
+ case RD_KAFKA_RESP_ERR__ASSIGN_PARTITIONS:
370
+ fprintf(stderr,
371
+ "%% Group rebalanced (%s): "
372
+ "%d new partition(s) assigned\n",
373
+ rd_kafka_rebalance_protocol(rk), partitions->cnt);
374
+
375
+ if (!strcmp(rd_kafka_rebalance_protocol(rk), "COOPERATIVE")) {
376
+ error = rd_kafka_incremental_assign(rk, partitions);
377
+ } else {
378
+ ret_err = rd_kafka_assign(rk, partitions);
379
+ eof_cnt = 0;
380
+ }
381
+
382
+ partition_cnt += partitions->cnt;
383
+ break;
384
+
385
+ case RD_KAFKA_RESP_ERR__REVOKE_PARTITIONS:
386
+ fprintf(stderr,
387
+ "%% Group rebalanced (%s): %d partition(s) revoked\n",
388
+ rd_kafka_rebalance_protocol(rk), partitions->cnt);
389
+
390
+ if (!strcmp(rd_kafka_rebalance_protocol(rk), "COOPERATIVE")) {
391
+ error = rd_kafka_incremental_unassign(rk, partitions);
392
+ partition_cnt -= partitions->cnt;
393
+ } else {
394
+ ret_err = rd_kafka_assign(rk, NULL);
395
+ partition_cnt = 0;
396
+ }
397
+
398
+ eof_cnt = 0; /* FIXME: Not correct for incremental case */
399
+ break;
400
+
401
+ default:
402
+ break;
403
+ }
404
+
405
+ if (error) {
406
+ fprintf(stderr, "%% incremental assign failure: %s\n",
407
+ rd_kafka_error_string(error));
408
+ rd_kafka_error_destroy(error);
409
+ } else if (ret_err) {
410
+ fprintf(stderr, "%% assign failure: %s\n",
411
+ rd_kafka_err2str(ret_err));
412
+ }
413
+ }
414
+
415
+
416
+ /**
417
+ * Find and extract single value from a two-level search.
418
+ * First find 'field1', then find 'field2' and extract its value.
419
+ * Returns 0 on miss else the value.
420
+ */
421
+ static uint64_t json_parse_fields(const char *json,
422
+ const char **end,
423
+ const char *field1,
424
+ const char *field2) {
425
+ const char *t = json;
426
+ const char *t2;
427
+ int len1 = (int)strlen(field1);
428
+ int len2 = (int)strlen(field2);
429
+
430
+ while ((t2 = strstr(t, field1))) {
431
+ uint64_t v;
432
+
433
+ t = t2;
434
+ t += len1;
435
+
436
+ /* Find field */
437
+ if (!(t2 = strstr(t, field2)))
438
+ continue;
439
+ t2 += len2;
440
+
441
+ while (isspace((int)*t2))
442
+ t2++;
443
+
444
+ v = strtoull(t2, (char **)&t, 10);
445
+ if (t2 == t)
446
+ continue;
447
+
448
+ *end = t;
449
+ return v;
450
+ }
451
+
452
+ *end = t + strlen(t);
453
+ return 0;
454
+ }
455
+
456
+ /**
457
+ * Parse various values from rdkafka stats
458
+ */
459
+ static void json_parse_stats(const char *json) {
460
+ const char *t;
461
+ #define MAX_AVGS 100 /* max number of brokers to scan for rtt */
462
+ uint64_t avg_rtt[MAX_AVGS + 1];
463
+ int avg_rtt_i = 0;
464
+
465
+ /* Store totals at end of array */
466
+ avg_rtt[MAX_AVGS] = 0;
467
+
468
+ /* Extract all broker RTTs */
469
+ t = json;
470
+ while (avg_rtt_i < MAX_AVGS && *t) {
471
+ avg_rtt[avg_rtt_i] =
472
+ json_parse_fields(t, &t, "\"rtt\":", "\"avg\":");
473
+
474
+ /* Skip low RTT values, means no messages are passing */
475
+ if (avg_rtt[avg_rtt_i] < 100 /*0.1ms*/)
476
+ continue;
477
+
478
+
479
+ avg_rtt[MAX_AVGS] += avg_rtt[avg_rtt_i];
480
+ avg_rtt_i++;
481
+ }
482
+
483
+ if (avg_rtt_i > 0)
484
+ avg_rtt[MAX_AVGS] /= avg_rtt_i;
485
+
486
+ cnt.avg_rtt = avg_rtt[MAX_AVGS];
487
+ }
488
+
489
+
490
+ static int stats_cb(rd_kafka_t *rk, char *json, size_t json_len, void *opaque) {
491
+
492
+ /* Extract values for our own stats */
493
+ json_parse_stats(json);
494
+
495
+ if (stats_fp)
496
+ fprintf(stats_fp, "%s\n", json);
497
+ return 0;
498
+ }
499
+
500
+ #define _OTYPE_TAB 0x1 /* tabular format */
501
+ #define _OTYPE_SUMMARY 0x2 /* summary format */
502
+ #define _OTYPE_FORCE 0x4 /* force output regardless of interval timing */
503
+ static void
504
+ print_stats(rd_kafka_t *rk, int mode, int otype, const char *compression) {
505
+ rd_ts_t now = rd_clock();
506
+ rd_ts_t t_total;
507
+ static int rows_written = 0;
508
+ int print_header;
509
+ double latency_avg = 0.0f;
510
+ char extra[512];
511
+ int extra_of = 0;
512
+ *extra = '\0';
513
+
514
+ if (!(otype & _OTYPE_FORCE) &&
515
+ (((otype & _OTYPE_SUMMARY) && verbosity == 0) ||
516
+ cnt.t_last + dispintvl > now))
517
+ return;
518
+
519
+ print_header = !rows_written || (verbosity > 0 && !(rows_written % 20));
520
+
521
+ if (cnt.t_end_send)
522
+ t_total = cnt.t_end_send - cnt.t_start;
523
+ else if (cnt.t_end)
524
+ t_total = cnt.t_end - cnt.t_start;
525
+ else if (cnt.t_start)
526
+ t_total = now - cnt.t_start;
527
+ else
528
+ t_total = 1;
529
+
530
+ if (latency_mode && cnt.latency_cnt)
531
+ latency_avg = (double)cnt.latency_sum / (double)cnt.latency_cnt;
532
+
533
+ if (mode == 'P') {
534
+
535
+ if (otype & _OTYPE_TAB) {
536
+ #define ROW_START() \
537
+ do { \
538
+ } while (0)
539
+ #define COL_HDR(NAME) printf("| %10.10s ", (NAME))
540
+ #define COL_PR64(NAME, VAL) printf("| %10" PRIu64 " ", (VAL))
541
+ #define COL_PRF(NAME, VAL) printf("| %10.2f ", (VAL))
542
+ #define ROW_END() \
543
+ do { \
544
+ printf("\n"); \
545
+ rows_written++; \
546
+ } while (0)
547
+
548
+ if (print_header) {
549
+ /* First time, print header */
550
+ ROW_START();
551
+ COL_HDR("elapsed");
552
+ COL_HDR("msgs");
553
+ COL_HDR("bytes");
554
+ COL_HDR("rtt");
555
+ COL_HDR("dr");
556
+ COL_HDR("dr_m/s");
557
+ COL_HDR("dr_MB/s");
558
+ COL_HDR("dr_err");
559
+ COL_HDR("tx_err");
560
+ COL_HDR("outq");
561
+ COL_HDR("offset");
562
+ if (latency_mode) {
563
+ COL_HDR("lat_curr");
564
+ COL_HDR("lat_avg");
565
+ COL_HDR("lat_lo");
566
+ COL_HDR("lat_hi");
567
+ }
568
+
569
+ ROW_END();
570
+ }
571
+
572
+ ROW_START();
573
+ COL_PR64("elapsed", t_total / 1000);
574
+ COL_PR64("msgs", cnt.msgs);
575
+ COL_PR64("bytes", cnt.bytes);
576
+ COL_PR64("rtt", cnt.avg_rtt / 1000);
577
+ COL_PR64("dr", cnt.msgs_dr_ok);
578
+ COL_PR64("dr_m/s",
579
+ ((cnt.msgs_dr_ok * 1000000) / t_total));
580
+ COL_PRF("dr_MB/s",
581
+ (float)((cnt.bytes_dr_ok) / (float)t_total));
582
+ COL_PR64("dr_err", cnt.msgs_dr_err);
583
+ COL_PR64("tx_err", cnt.tx_err);
584
+ COL_PR64("outq",
585
+ rk ? (uint64_t)rd_kafka_outq_len(rk) : 0);
586
+ COL_PR64("offset", (uint64_t)cnt.last_offset);
587
+ if (latency_mode) {
588
+ COL_PRF("lat_curr", cnt.latency_last / 1000.0f);
589
+ COL_PRF("lat_avg", latency_avg / 1000.0f);
590
+ COL_PRF("lat_lo", cnt.latency_lo / 1000.0f);
591
+ COL_PRF("lat_hi", cnt.latency_hi / 1000.0f);
592
+ }
593
+ ROW_END();
594
+ }
595
+
596
+ if (otype & _OTYPE_SUMMARY) {
597
+ printf("%% %" PRIu64
598
+ " messages produced "
599
+ "(%" PRIu64
600
+ " bytes), "
601
+ "%" PRIu64
602
+ " delivered "
603
+ "(offset %" PRId64 ", %" PRIu64
604
+ " failed) "
605
+ "in %" PRIu64 "ms: %" PRIu64
606
+ " msgs/s and "
607
+ "%.02f MB/s, "
608
+ "%" PRIu64
609
+ " produce failures, %i in queue, "
610
+ "%s compression\n",
611
+ cnt.msgs, cnt.bytes, cnt.msgs_dr_ok,
612
+ cnt.last_offset, cnt.msgs_dr_err, t_total / 1000,
613
+ ((cnt.msgs_dr_ok * 1000000) / t_total),
614
+ (float)((cnt.bytes_dr_ok) / (float)t_total),
615
+ cnt.tx_err, rk ? rd_kafka_outq_len(rk) : 0,
616
+ compression);
617
+ }
618
+
619
+ } else {
620
+
621
+ if (otype & _OTYPE_TAB) {
622
+ if (print_header) {
623
+ /* First time, print header */
624
+ ROW_START();
625
+ COL_HDR("elapsed");
626
+ COL_HDR("msgs");
627
+ COL_HDR("bytes");
628
+ COL_HDR("rtt");
629
+ COL_HDR("m/s");
630
+ COL_HDR("MB/s");
631
+ COL_HDR("rx_err");
632
+ COL_HDR("offset");
633
+ if (latency_mode) {
634
+ COL_HDR("lat_curr");
635
+ COL_HDR("lat_avg");
636
+ COL_HDR("lat_lo");
637
+ COL_HDR("lat_hi");
638
+ }
639
+ ROW_END();
640
+ }
641
+
642
+ ROW_START();
643
+ COL_PR64("elapsed", t_total / 1000);
644
+ COL_PR64("msgs", cnt.msgs);
645
+ COL_PR64("bytes", cnt.bytes);
646
+ COL_PR64("rtt", cnt.avg_rtt / 1000);
647
+ COL_PR64("m/s", ((cnt.msgs * 1000000) / t_total));
648
+ COL_PRF("MB/s", (float)((cnt.bytes) / (float)t_total));
649
+ COL_PR64("rx_err", cnt.msgs_dr_err);
650
+ COL_PR64("offset", cnt.offset);
651
+ if (latency_mode) {
652
+ COL_PRF("lat_curr", cnt.latency_last / 1000.0f);
653
+ COL_PRF("lat_avg", latency_avg / 1000.0f);
654
+ COL_PRF("lat_lo", cnt.latency_lo / 1000.0f);
655
+ COL_PRF("lat_hi", cnt.latency_hi / 1000.0f);
656
+ }
657
+ ROW_END();
658
+ }
659
+
660
+ if (otype & _OTYPE_SUMMARY) {
661
+ if (latency_avg >= 1.0f)
662
+ extra_of += rd_snprintf(
663
+ extra + extra_of, sizeof(extra) - extra_of,
664
+ ", latency "
665
+ "curr/avg/lo/hi "
666
+ "%.2f/%.2f/%.2f/%.2fms",
667
+ cnt.latency_last / 1000.0f,
668
+ latency_avg / 1000.0f,
669
+ cnt.latency_lo / 1000.0f,
670
+ cnt.latency_hi / 1000.0f);
671
+ printf("%% %" PRIu64 " messages (%" PRIu64
672
+ " bytes) "
673
+ "consumed in %" PRIu64 "ms: %" PRIu64
674
+ " msgs/s "
675
+ "(%.02f MB/s)"
676
+ "%s\n",
677
+ cnt.msgs, cnt.bytes, t_total / 1000,
678
+ ((cnt.msgs * 1000000) / t_total),
679
+ (float)((cnt.bytes) / (float)t_total), extra);
680
+ }
681
+
682
+ if (incremental_mode && now > cnt.t_last) {
683
+ uint64_t i_msgs = cnt.msgs - cnt.msgs_last;
684
+ uint64_t i_bytes = cnt.bytes - cnt.bytes_last;
685
+ uint64_t i_time = cnt.t_last ? now - cnt.t_last : 0;
686
+
687
+ printf("%% INTERVAL: %" PRIu64
688
+ " messages "
689
+ "(%" PRIu64
690
+ " bytes) "
691
+ "consumed in %" PRIu64 "ms: %" PRIu64
692
+ " msgs/s "
693
+ "(%.02f MB/s)"
694
+ "%s\n",
695
+ i_msgs, i_bytes, i_time / 1000,
696
+ ((i_msgs * 1000000) / i_time),
697
+ (float)((i_bytes) / (float)i_time), extra);
698
+ }
699
+ }
700
+
701
+ cnt.t_last = now;
702
+ cnt.msgs_last = cnt.msgs;
703
+ cnt.bytes_last = cnt.bytes;
704
+ }
705
+
706
+
707
+ static void sig_usr1(int sig) {
708
+ rd_kafka_dump(stdout, global_rk);
709
+ }
710
+
711
+
712
+ /**
713
+ * @brief Read config from file
714
+ * @returns -1 on error, else 0.
715
+ */
716
+ static int read_conf_file(rd_kafka_conf_t *conf, const char *path) {
717
+ FILE *fp;
718
+ char buf[512];
719
+ int line = 0;
720
+ char errstr[512];
721
+
722
+ if (!(fp = fopen(path, "r"))) {
723
+ fprintf(stderr, "%% Failed to open %s: %s\n", path,
724
+ strerror(errno));
725
+ return -1;
726
+ }
727
+
728
+ while (fgets(buf, sizeof(buf), fp)) {
729
+ char *s = buf;
730
+ char *t;
731
+ rd_kafka_conf_res_t r = RD_KAFKA_CONF_UNKNOWN;
732
+
733
+ line++;
734
+
735
+ while (isspace((int)*s))
736
+ s++;
737
+
738
+ if (!*s || *s == '#')
739
+ continue;
740
+
741
+ if ((t = strchr(buf, '\n')))
742
+ *t = '\0';
743
+
744
+ t = strchr(buf, '=');
745
+ if (!t || t == s || !*(t + 1)) {
746
+ fprintf(stderr, "%% %s:%d: expected key=value\n", path,
747
+ line);
748
+ fclose(fp);
749
+ return -1;
750
+ }
751
+
752
+ *(t++) = '\0';
753
+
754
+ /* Try global config */
755
+ r = rd_kafka_conf_set(conf, s, t, errstr, sizeof(errstr));
756
+
757
+ if (r == RD_KAFKA_CONF_OK)
758
+ continue;
759
+
760
+ fprintf(stderr, "%% %s:%d: %s=%s: %s\n", path, line, s, t,
761
+ errstr);
762
+ fclose(fp);
763
+ return -1;
764
+ }
765
+
766
+ fclose(fp);
767
+
768
+ return 0;
769
+ }
770
+
771
+
772
+ static rd_kafka_resp_err_t do_produce(rd_kafka_t *rk,
773
+ rd_kafka_topic_t *rkt,
774
+ int32_t partition,
775
+ int msgflags,
776
+ void *payload,
777
+ size_t size,
778
+ const void *key,
779
+ size_t key_size,
780
+ const rd_kafka_headers_t *hdrs) {
781
+
782
+ /* Send/Produce message. */
783
+ if (hdrs) {
784
+ rd_kafka_headers_t *hdrs_copy;
785
+ rd_kafka_resp_err_t err;
786
+
787
+ hdrs_copy = rd_kafka_headers_copy(hdrs);
788
+
789
+ err = rd_kafka_producev(
790
+ rk, RD_KAFKA_V_RKT(rkt), RD_KAFKA_V_PARTITION(partition),
791
+ RD_KAFKA_V_MSGFLAGS(msgflags),
792
+ RD_KAFKA_V_VALUE(payload, size),
793
+ RD_KAFKA_V_KEY(key, key_size),
794
+ RD_KAFKA_V_HEADERS(hdrs_copy), RD_KAFKA_V_END);
795
+
796
+ if (err)
797
+ rd_kafka_headers_destroy(hdrs_copy);
798
+
799
+ return err;
800
+
801
+ } else {
802
+ if (rd_kafka_produce(rkt, partition, msgflags, payload, size,
803
+ key, key_size, NULL) == -1)
804
+ return rd_kafka_last_error();
805
+ }
806
+
807
+ return RD_KAFKA_RESP_ERR_NO_ERROR;
808
+ }
809
+
810
+ /**
811
+ * @brief Sleep for \p sleep_us microseconds.
812
+ */
813
+ static void do_sleep(int sleep_us) {
814
+ if (sleep_us > 100) {
815
+ #ifdef _WIN32
816
+ Sleep(sleep_us / 1000);
817
+ #else
818
+ usleep(sleep_us);
819
+ #endif
820
+ } else {
821
+ rd_ts_t next = rd_clock() + (rd_ts_t)sleep_us;
822
+ while (next > rd_clock())
823
+ ;
824
+ }
825
+ }
826
+
827
+
828
+ int main(int argc, char **argv) {
829
+ char *brokers = NULL;
830
+ char mode = 'C';
831
+ char *topic = NULL;
832
+ const char *key = NULL;
833
+ int *partitions = NULL;
834
+ int opt;
835
+ int sendflags = 0;
836
+ char *msgpattern = "librdkafka_performance testing!";
837
+ int msgsize = -1;
838
+ const char *debug = NULL;
839
+ int do_conf_dump = 0;
840
+ rd_ts_t now;
841
+ char errstr[512];
842
+ uint64_t seq = 0;
843
+ int seed = (int)time(NULL);
844
+ rd_kafka_t *rk;
845
+ rd_kafka_topic_t *rkt;
846
+ rd_kafka_conf_t *conf;
847
+ rd_kafka_queue_t *rkqu = NULL;
848
+ const char *compression = "no";
849
+ int64_t start_offset = 0;
850
+ int batch_size = 0;
851
+ int idle = 0;
852
+ const char *stats_cmd = NULL;
853
+ char *stats_intvlstr = NULL;
854
+ char tmp[128];
855
+ char *tmp2;
856
+ int otype = _OTYPE_SUMMARY;
857
+ double dtmp;
858
+ int rate_sleep = 0;
859
+ rd_kafka_topic_partition_list_t *topics;
860
+ int exitcode = 0;
861
+ rd_kafka_headers_t *hdrs = NULL;
862
+ rd_kafka_resp_err_t err;
863
+
864
+ /* Kafka configuration */
865
+ conf = rd_kafka_conf_new();
866
+ rd_kafka_conf_set_error_cb(conf, err_cb);
867
+ rd_kafka_conf_set_throttle_cb(conf, throttle_cb);
868
+ rd_kafka_conf_set_offset_commit_cb(conf, offset_commit_cb);
869
+
870
+ #ifdef SIGIO
871
+ /* Quick termination */
872
+ rd_snprintf(tmp, sizeof(tmp), "%i", SIGIO);
873
+ rd_kafka_conf_set(conf, "internal.termination.signal", tmp, NULL, 0);
874
+ #endif
875
+
876
+ /* Producer config */
877
+ rd_kafka_conf_set(conf, "linger.ms", "1000", NULL, 0);
878
+ rd_kafka_conf_set(conf, "message.send.max.retries", "3", NULL, 0);
879
+ rd_kafka_conf_set(conf, "retry.backoff.ms", "500", NULL, 0);
880
+
881
+ /* Consumer config */
882
+ /* Tell rdkafka to (try to) maintain 1M messages
883
+ * in its internal receive buffers. This is to avoid
884
+ * application -> rdkafka -> broker per-message ping-pong
885
+ * latency.
886
+ * The larger the local queue, the higher the performance.
887
+ * Try other values with: ... -X queued.min.messages=1000
888
+ */
889
+ rd_kafka_conf_set(conf, "queued.min.messages", "1000000", NULL, 0);
890
+ rd_kafka_conf_set(conf, "session.timeout.ms", "6000", NULL, 0);
891
+ rd_kafka_conf_set(conf, "auto.offset.reset", "earliest", NULL, 0);
892
+
893
+ topics = rd_kafka_topic_partition_list_new(1);
894
+
895
+ while ((opt = getopt(argc, argv,
896
+ "PCG:t:p:b:s:k:c:fi:MDd:m:S:x:"
897
+ "R:a:z:o:X:B:eT:Y:qvIur:lA:OwNH:")) != -1) {
898
+ switch (opt) {
899
+ case 'G':
900
+ if (rd_kafka_conf_set(conf, "group.id", optarg, errstr,
901
+ sizeof(errstr)) !=
902
+ RD_KAFKA_CONF_OK) {
903
+ fprintf(stderr, "%% %s\n", errstr);
904
+ exit(1);
905
+ }
906
+ /* FALLTHRU */
907
+ case 'P':
908
+ case 'C':
909
+ mode = opt;
910
+ break;
911
+ case 't':
912
+ rd_kafka_topic_partition_list_add(
913
+ topics, optarg, RD_KAFKA_PARTITION_UA);
914
+ break;
915
+ case 'p':
916
+ partition_cnt++;
917
+ partitions = realloc(partitions, sizeof(*partitions) *
918
+ partition_cnt);
919
+ partitions[partition_cnt - 1] = atoi(optarg);
920
+ break;
921
+
922
+ case 'b':
923
+ brokers = optarg;
924
+ break;
925
+ case 's':
926
+ msgsize = atoi(optarg);
927
+ break;
928
+ case 'k':
929
+ key = optarg;
930
+ break;
931
+ case 'c':
932
+ msgcnt = atoi(optarg);
933
+ break;
934
+ case 'D':
935
+ sendflags |= RD_KAFKA_MSG_F_FREE;
936
+ break;
937
+ case 'i':
938
+ dispintvl = atoi(optarg);
939
+ break;
940
+ case 'm':
941
+ msgpattern = optarg;
942
+ break;
943
+ case 'S':
944
+ seq = strtoull(optarg, NULL, 10);
945
+ do_seq = 1;
946
+ break;
947
+ case 'x':
948
+ exit_after = atoi(optarg);
949
+ break;
950
+ case 'R':
951
+ seed = atoi(optarg);
952
+ break;
953
+ case 'a':
954
+ if (rd_kafka_conf_set(conf, "acks", optarg, errstr,
955
+ sizeof(errstr)) !=
956
+ RD_KAFKA_CONF_OK) {
957
+ fprintf(stderr, "%% %s\n", errstr);
958
+ exit(1);
959
+ }
960
+ break;
961
+ case 'B':
962
+ batch_size = atoi(optarg);
963
+ break;
964
+ case 'z':
965
+ if (rd_kafka_conf_set(conf, "compression.codec", optarg,
966
+ errstr, sizeof(errstr)) !=
967
+ RD_KAFKA_CONF_OK) {
968
+ fprintf(stderr, "%% %s\n", errstr);
969
+ exit(1);
970
+ }
971
+ compression = optarg;
972
+ break;
973
+ case 'o':
974
+ if (!strcmp(optarg, "end"))
975
+ start_offset = RD_KAFKA_OFFSET_END;
976
+ else if (!strcmp(optarg, "beginning"))
977
+ start_offset = RD_KAFKA_OFFSET_BEGINNING;
978
+ else if (!strcmp(optarg, "stored"))
979
+ start_offset = RD_KAFKA_OFFSET_STORED;
980
+ else {
981
+ start_offset = strtoll(optarg, NULL, 10);
982
+
983
+ if (start_offset < 0)
984
+ start_offset =
985
+ RD_KAFKA_OFFSET_TAIL(-start_offset);
986
+ }
987
+
988
+ break;
989
+ case 'e':
990
+ exit_eof = 1;
991
+ break;
992
+ case 'd':
993
+ debug = optarg;
994
+ break;
995
+ case 'H':
996
+ if (!strcmp(optarg, "parse"))
997
+ read_hdrs = 1;
998
+ else {
999
+ char *name, *val;
1000
+ size_t name_sz = -1;
1001
+
1002
+ name = optarg;
1003
+ val = strchr(name, '=');
1004
+ if (val) {
1005
+ name_sz = (size_t)(val - name);
1006
+ val++; /* past the '=' */
1007
+ }
1008
+
1009
+ if (!hdrs)
1010
+ hdrs = rd_kafka_headers_new(8);
1011
+
1012
+ err = rd_kafka_header_add(hdrs, name, name_sz,
1013
+ val, -1);
1014
+ if (err) {
1015
+ fprintf(
1016
+ stderr,
1017
+ "%% Failed to add header %s: %s\n",
1018
+ name, rd_kafka_err2str(err));
1019
+ exit(1);
1020
+ }
1021
+ }
1022
+ break;
1023
+ case 'X': {
1024
+ char *name, *val;
1025
+ rd_kafka_conf_res_t res;
1026
+
1027
+ if (!strcmp(optarg, "list") ||
1028
+ !strcmp(optarg, "help")) {
1029
+ rd_kafka_conf_properties_show(stdout);
1030
+ exit(0);
1031
+ }
1032
+
1033
+ if (!strcmp(optarg, "dump")) {
1034
+ do_conf_dump = 1;
1035
+ continue;
1036
+ }
1037
+
1038
+ name = optarg;
1039
+ if (!(val = strchr(name, '='))) {
1040
+ fprintf(stderr,
1041
+ "%% Expected "
1042
+ "-X property=value, not %s\n",
1043
+ name);
1044
+ exit(1);
1045
+ }
1046
+
1047
+ *val = '\0';
1048
+ val++;
1049
+
1050
+ if (!strcmp(name, "file")) {
1051
+ if (read_conf_file(conf, val) == -1)
1052
+ exit(1);
1053
+ break;
1054
+ }
1055
+
1056
+ res = rd_kafka_conf_set(conf, name, val, errstr,
1057
+ sizeof(errstr));
1058
+
1059
+ if (res != RD_KAFKA_CONF_OK) {
1060
+ fprintf(stderr, "%% %s\n", errstr);
1061
+ exit(1);
1062
+ }
1063
+ } break;
1064
+
1065
+ case 'T':
1066
+ stats_intvlstr = optarg;
1067
+ break;
1068
+ case 'Y':
1069
+ stats_cmd = optarg;
1070
+ break;
1071
+
1072
+ case 'q':
1073
+ verbosity--;
1074
+ break;
1075
+
1076
+ case 'v':
1077
+ verbosity++;
1078
+ break;
1079
+
1080
+ case 'I':
1081
+ idle = 1;
1082
+ break;
1083
+
1084
+ case 'u':
1085
+ otype = _OTYPE_TAB;
1086
+ verbosity--; /* remove some fluff */
1087
+ break;
1088
+
1089
+ case 'r':
1090
+ dtmp = strtod(optarg, &tmp2);
1091
+ if (tmp2 == optarg ||
1092
+ (dtmp >= -0.001 && dtmp <= 0.001)) {
1093
+ fprintf(stderr, "%% Invalid rate: %s\n",
1094
+ optarg);
1095
+ exit(1);
1096
+ }
1097
+
1098
+ rate_sleep = (int)(1000000.0 / dtmp);
1099
+ break;
1100
+
1101
+ case 'l':
1102
+ latency_mode = 1;
1103
+ break;
1104
+
1105
+ case 'A':
1106
+ if (!(latency_fp = fopen(optarg, "w"))) {
1107
+ fprintf(stderr, "%% Cant open %s: %s\n", optarg,
1108
+ strerror(errno));
1109
+ exit(1);
1110
+ }
1111
+ break;
1112
+
1113
+ case 'M':
1114
+ incremental_mode = 1;
1115
+ break;
1116
+
1117
+ case 'N':
1118
+ with_dr = 0;
1119
+ break;
1120
+
1121
+ default:
1122
+ fprintf(stderr, "Unknown option: %c\n", opt);
1123
+ goto usage;
1124
+ }
1125
+ }
1126
+
1127
+ if (topics->cnt == 0 || optind != argc) {
1128
+ if (optind < argc)
1129
+ fprintf(stderr, "Unknown argument: %s\n", argv[optind]);
1130
+ usage:
1131
+ fprintf(
1132
+ stderr,
1133
+ "Usage: %s [-C|-P] -t <topic> "
1134
+ "[-p <partition>] [-b <broker,broker..>] [options..]\n"
1135
+ "\n"
1136
+ "librdkafka version %s (0x%08x)\n"
1137
+ "\n"
1138
+ " Options:\n"
1139
+ " -C | -P | Consumer or Producer mode\n"
1140
+ " -G <groupid> High-level Kafka Consumer mode\n"
1141
+ " -t <topic> Topic to consume / produce\n"
1142
+ " -p <num> Partition (defaults to random). "
1143
+ "Multiple partitions are allowed in -C consumer mode.\n"
1144
+ " -M Print consumer interval stats\n"
1145
+ " -b <brokers> Broker address list (host[:port],..)\n"
1146
+ " -s <size> Message size (producer)\n"
1147
+ " -k <key> Message key (producer)\n"
1148
+ " -H <name[=value]> Add header to message (producer)\n"
1149
+ " -H parse Read message headers (consumer)\n"
1150
+ " -c <cnt> Messages to transmit/receive\n"
1151
+ " -x <cnt> Hard exit after transmitting <cnt> "
1152
+ "messages (producer)\n"
1153
+ " -D Copy/Duplicate data buffer (producer)\n"
1154
+ " -i <ms> Display interval\n"
1155
+ " -m <msg> Message payload pattern\n"
1156
+ " -S <start> Send a sequence number starting at "
1157
+ "<start> as payload\n"
1158
+ " -R <seed> Random seed value (defaults to time)\n"
1159
+ " -a <acks> Required acks (producer): "
1160
+ "-1, 0, 1, >1\n"
1161
+ " -B <size> Consume batch size (# of msgs)\n"
1162
+ " -z <codec> Enable compression:\n"
1163
+ " none|gzip|snappy\n"
1164
+ " -o <offset> Start offset (consumer)\n"
1165
+ " beginning, end, NNNNN or -NNNNN\n"
1166
+ " -d [facs..] Enable debugging contexts:\n"
1167
+ " %s\n"
1168
+ " -X <prop=name> Set arbitrary librdkafka "
1169
+ "configuration property\n"
1170
+ " -X file=<path> Read config from file.\n"
1171
+ " -X list Show full list of supported properties.\n"
1172
+ " -X dump Show configuration\n"
1173
+ " -T <intvl> Enable statistics from librdkafka at "
1174
+ "specified interval (ms)\n"
1175
+ " -Y <command> Pipe statistics to <command>\n"
1176
+ " -I Idle: dont produce any messages\n"
1177
+ " -q Decrease verbosity\n"
1178
+ " -v Increase verbosity (default 1)\n"
1179
+ " -u Output stats in table format\n"
1180
+ " -r <rate> Producer msg/s limit\n"
1181
+ " -l Latency measurement.\n"
1182
+ " Needs two matching instances, one\n"
1183
+ " consumer and one producer, both\n"
1184
+ " running with the -l switch.\n"
1185
+ " -l Producer: per-message latency stats\n"
1186
+ " -A <file> Write per-message latency stats to "
1187
+ "<file>. Requires -l\n"
1188
+ " -O Report produced offset (producer)\n"
1189
+ " -N No delivery reports (producer)\n"
1190
+ "\n"
1191
+ " In Consumer mode:\n"
1192
+ " consumes messages and prints thruput\n"
1193
+ " If -B <..> is supplied the batch consumer\n"
1194
+ " mode is used, else the callback mode is used.\n"
1195
+ "\n"
1196
+ " In Producer mode:\n"
1197
+ " writes messages of size -s <..> and prints thruput\n"
1198
+ "\n",
1199
+ argv[0], rd_kafka_version_str(), rd_kafka_version(),
1200
+ RD_KAFKA_DEBUG_CONTEXTS);
1201
+ exit(1);
1202
+ }
1203
+
1204
+
1205
+ dispintvl *= 1000; /* us */
1206
+
1207
+ if (verbosity > 1)
1208
+ printf("%% Using random seed %i, verbosity level %i\n", seed,
1209
+ verbosity);
1210
+ srand(seed);
1211
+ signal(SIGINT, stop);
1212
+ #ifdef SIGUSR1
1213
+ signal(SIGUSR1, sig_usr1);
1214
+ #endif
1215
+
1216
+
1217
+ if (debug && rd_kafka_conf_set(conf, "debug", debug, errstr,
1218
+ sizeof(errstr)) != RD_KAFKA_CONF_OK) {
1219
+ printf("%% Debug configuration failed: %s: %s\n", errstr,
1220
+ debug);
1221
+ exit(1);
1222
+ }
1223
+
1224
+ /* Always enable stats (for RTT extraction), and if user supplied
1225
+ * the -T <intvl> option we let her take part of the stats aswell. */
1226
+ rd_kafka_conf_set_stats_cb(conf, stats_cb);
1227
+
1228
+ if (!stats_intvlstr) {
1229
+ /* if no user-desired stats, adjust stats interval
1230
+ * to the display interval. */
1231
+ rd_snprintf(tmp, sizeof(tmp), "%" PRId64, dispintvl / 1000);
1232
+ }
1233
+
1234
+ if (rd_kafka_conf_set(conf, "statistics.interval.ms",
1235
+ stats_intvlstr ? stats_intvlstr : tmp, errstr,
1236
+ sizeof(errstr)) != RD_KAFKA_CONF_OK) {
1237
+ fprintf(stderr, "%% %s\n", errstr);
1238
+ exit(1);
1239
+ }
1240
+
1241
+ if (do_conf_dump) {
1242
+ const char **arr;
1243
+ size_t cnt;
1244
+ int pass;
1245
+
1246
+ for (pass = 0; pass < 2; pass++) {
1247
+ int i;
1248
+
1249
+ if (pass == 0) {
1250
+ arr = rd_kafka_conf_dump(conf, &cnt);
1251
+ printf("# Global config\n");
1252
+ } else {
1253
+ rd_kafka_topic_conf_t *topic_conf =
1254
+ rd_kafka_conf_get_default_topic_conf(conf);
1255
+
1256
+ if (topic_conf) {
1257
+ printf("# Topic config\n");
1258
+ arr = rd_kafka_topic_conf_dump(
1259
+ topic_conf, &cnt);
1260
+ } else {
1261
+ arr = NULL;
1262
+ }
1263
+ }
1264
+
1265
+ if (!arr)
1266
+ continue;
1267
+
1268
+ for (i = 0; i < (int)cnt; i += 2)
1269
+ printf("%s = %s\n", arr[i], arr[i + 1]);
1270
+
1271
+ printf("\n");
1272
+
1273
+ rd_kafka_conf_dump_free(arr, cnt);
1274
+ }
1275
+
1276
+ exit(0);
1277
+ }
1278
+
1279
+ if (latency_mode)
1280
+ do_seq = 0;
1281
+
1282
+ if (stats_intvlstr) {
1283
+ /* User enabled stats (-T) */
1284
+
1285
+ #ifndef _WIN32
1286
+ if (stats_cmd) {
1287
+ if (!(stats_fp = popen(stats_cmd,
1288
+ #ifdef __linux__
1289
+ "we"
1290
+ #else
1291
+ "w"
1292
+ #endif
1293
+ ))) {
1294
+ fprintf(stderr,
1295
+ "%% Failed to start stats command: "
1296
+ "%s: %s",
1297
+ stats_cmd, strerror(errno));
1298
+ exit(1);
1299
+ }
1300
+ } else
1301
+ #endif
1302
+ stats_fp = stdout;
1303
+ }
1304
+
1305
+ if (msgcnt != -1)
1306
+ forever = 0;
1307
+
1308
+ if (msgsize == -1)
1309
+ msgsize = (int)strlen(msgpattern);
1310
+
1311
+ topic = topics->elems[0].topic;
1312
+
1313
+ if (mode == 'C' || mode == 'G')
1314
+ rd_kafka_conf_set(conf, "enable.partition.eof", "true", NULL,
1315
+ 0);
1316
+
1317
+ if (read_hdrs && mode == 'P') {
1318
+ fprintf(stderr, "%% producer can not read headers\n");
1319
+ exit(1);
1320
+ }
1321
+
1322
+ if (hdrs && mode != 'P') {
1323
+ fprintf(stderr, "%% consumer can not add headers\n");
1324
+ exit(1);
1325
+ }
1326
+
1327
+ /* Set bootstrap servers */
1328
+ if (brokers &&
1329
+ rd_kafka_conf_set(conf, "bootstrap.servers", brokers, errstr,
1330
+ sizeof(errstr)) != RD_KAFKA_CONF_OK) {
1331
+ fprintf(stderr, "%% %s\n", errstr);
1332
+ exit(1);
1333
+ }
1334
+
1335
+ if (mode == 'P') {
1336
+ /*
1337
+ * Producer
1338
+ */
1339
+ char *sbuf;
1340
+ char *pbuf;
1341
+ int outq;
1342
+ int keylen = key ? (int)strlen(key) : 0;
1343
+ off_t rof = 0;
1344
+ size_t plen = strlen(msgpattern);
1345
+ int partition =
1346
+ partitions ? partitions[0] : RD_KAFKA_PARTITION_UA;
1347
+
1348
+ if (latency_mode) {
1349
+ int minlen = (int)(strlen("LATENCY:") +
1350
+ strlen("18446744073709551615 ") + 1);
1351
+ msgsize = RD_MAX(minlen, msgsize);
1352
+ sendflags |= RD_KAFKA_MSG_F_COPY;
1353
+ } else if (do_seq) {
1354
+ int minlen = (int)strlen("18446744073709551615 ") + 1;
1355
+ if (msgsize < minlen)
1356
+ msgsize = minlen;
1357
+
1358
+ /* Force duplication of payload */
1359
+ sendflags |= RD_KAFKA_MSG_F_FREE;
1360
+ }
1361
+
1362
+ sbuf = malloc(msgsize);
1363
+
1364
+ /* Copy payload content to new buffer */
1365
+ while (rof < msgsize) {
1366
+ size_t xlen = RD_MIN((size_t)msgsize - rof, plen);
1367
+ memcpy(sbuf + rof, msgpattern, xlen);
1368
+ rof += (off_t)xlen;
1369
+ }
1370
+
1371
+ if (msgcnt == -1)
1372
+ printf("%% Sending messages of size %i bytes\n",
1373
+ msgsize);
1374
+ else
1375
+ printf("%% Sending %i messages of size %i bytes\n",
1376
+ msgcnt, msgsize);
1377
+
1378
+ if (with_dr)
1379
+ rd_kafka_conf_set_dr_msg_cb(conf, msg_delivered);
1380
+
1381
+ /* Create Kafka handle */
1382
+ if (!(rk = rd_kafka_new(RD_KAFKA_PRODUCER, conf, errstr,
1383
+ sizeof(errstr)))) {
1384
+ fprintf(stderr,
1385
+ "%% Failed to create Kafka producer: %s\n",
1386
+ errstr);
1387
+ exit(1);
1388
+ }
1389
+
1390
+ global_rk = rk;
1391
+
1392
+ /* Explicitly create topic to avoid per-msg lookups. */
1393
+ rkt = rd_kafka_topic_new(rk, topic, NULL);
1394
+
1395
+
1396
+ if (rate_sleep && verbosity >= 2)
1397
+ fprintf(stderr,
1398
+ "%% Inter message rate limiter sleep %ius\n",
1399
+ rate_sleep);
1400
+
1401
+ dr_disp_div = msgcnt / 50;
1402
+ if (dr_disp_div == 0)
1403
+ dr_disp_div = 10;
1404
+
1405
+ cnt.t_start = cnt.t_last = rd_clock();
1406
+
1407
+ msgs_wait_produce_cnt = msgcnt;
1408
+
1409
+ while (run && (msgcnt == -1 || (int)cnt.msgs < msgcnt)) {
1410
+ /* Send/Produce message. */
1411
+
1412
+ if (idle) {
1413
+ rd_kafka_poll(rk, 1000);
1414
+ continue;
1415
+ }
1416
+
1417
+ if (latency_mode) {
1418
+ rd_snprintf(sbuf, msgsize - 1,
1419
+ "LATENCY:%" PRIu64, wall_clock());
1420
+ } else if (do_seq) {
1421
+ rd_snprintf(sbuf, msgsize - 1, "%" PRIu64 ": ",
1422
+ seq);
1423
+ seq++;
1424
+ }
1425
+
1426
+ if (sendflags & RD_KAFKA_MSG_F_FREE) {
1427
+ /* Duplicate memory */
1428
+ pbuf = malloc(msgsize);
1429
+ memcpy(pbuf, sbuf, msgsize);
1430
+ } else
1431
+ pbuf = sbuf;
1432
+
1433
+ if (msgsize == 0)
1434
+ pbuf = NULL;
1435
+
1436
+ cnt.tx++;
1437
+ while (run && (err = do_produce(
1438
+ rk, rkt, partition, sendflags, pbuf,
1439
+ msgsize, key, keylen, hdrs))) {
1440
+ if (err == RD_KAFKA_RESP_ERR__UNKNOWN_PARTITION)
1441
+ printf(
1442
+ "%% No such partition: "
1443
+ "%" PRId32 "\n",
1444
+ partition);
1445
+ else if (verbosity >= 3 ||
1446
+ (err !=
1447
+ RD_KAFKA_RESP_ERR__QUEUE_FULL &&
1448
+ verbosity >= 1))
1449
+ printf(
1450
+ "%% produce error: %s%s\n",
1451
+ rd_kafka_err2str(err),
1452
+ err == RD_KAFKA_RESP_ERR__QUEUE_FULL
1453
+ ? " (backpressure)"
1454
+ : "");
1455
+
1456
+ cnt.tx_err++;
1457
+ if (err != RD_KAFKA_RESP_ERR__QUEUE_FULL) {
1458
+ run = 0;
1459
+ break;
1460
+ }
1461
+ now = rd_clock();
1462
+ if (verbosity >= 2 &&
1463
+ cnt.t_enobufs_last + dispintvl <= now) {
1464
+ printf(
1465
+ "%% Backpressure %i "
1466
+ "(tx %" PRIu64
1467
+ ", "
1468
+ "txerr %" PRIu64 ")\n",
1469
+ rd_kafka_outq_len(rk), cnt.tx,
1470
+ cnt.tx_err);
1471
+ cnt.t_enobufs_last = now;
1472
+ }
1473
+
1474
+ /* Poll to handle delivery reports */
1475
+ rd_kafka_poll(rk, 10);
1476
+
1477
+ print_stats(rk, mode, otype, compression);
1478
+ }
1479
+
1480
+ msgs_wait_cnt++;
1481
+ if (msgs_wait_produce_cnt != -1)
1482
+ msgs_wait_produce_cnt--;
1483
+ cnt.msgs++;
1484
+ cnt.bytes += msgsize;
1485
+
1486
+ /* Must poll to handle delivery reports */
1487
+ if (rate_sleep) {
1488
+ rd_ts_t next = rd_clock() + (rd_ts_t)rate_sleep;
1489
+ do {
1490
+ rd_kafka_poll(
1491
+ rk,
1492
+ (int)RD_MAX(0, (next - rd_clock()) /
1493
+ 1000));
1494
+ } while (next > rd_clock());
1495
+ } else if (cnt.msgs % 1000 == 0) {
1496
+ rd_kafka_poll(rk, 0);
1497
+ }
1498
+
1499
+ print_stats(rk, mode, otype, compression);
1500
+ }
1501
+
1502
+ forever = 0;
1503
+ if (verbosity >= 2)
1504
+ printf(
1505
+ "%% All messages produced, "
1506
+ "now waiting for %li deliveries\n",
1507
+ msgs_wait_cnt);
1508
+
1509
+ /* Wait for messages to be delivered */
1510
+ while (run && rd_kafka_poll(rk, 1000) != -1)
1511
+ print_stats(rk, mode, otype, compression);
1512
+
1513
+
1514
+ outq = rd_kafka_outq_len(rk);
1515
+ if (verbosity >= 2)
1516
+ printf("%% %i messages in outq\n", outq);
1517
+ cnt.msgs -= outq;
1518
+ cnt.t_end = t_end;
1519
+
1520
+ if (cnt.tx_err > 0)
1521
+ printf("%% %" PRIu64 " backpressures for %" PRIu64
1522
+ " produce calls: %.3f%% backpressure rate\n",
1523
+ cnt.tx_err, cnt.tx,
1524
+ ((double)cnt.tx_err / (double)cnt.tx) * 100.0);
1525
+
1526
+ /* Destroy topic */
1527
+ rd_kafka_topic_destroy(rkt);
1528
+
1529
+ /* Destroy the handle */
1530
+ rd_kafka_destroy(rk);
1531
+ global_rk = rk = NULL;
1532
+
1533
+ free(sbuf);
1534
+
1535
+ exitcode = cnt.msgs == cnt.msgs_dr_ok ? 0 : 1;
1536
+
1537
+ } else if (mode == 'C') {
1538
+ /*
1539
+ * Consumer
1540
+ */
1541
+
1542
+ rd_kafka_message_t **rkmessages = NULL;
1543
+ size_t i = 0;
1544
+
1545
+ /* Create Kafka handle */
1546
+ if (!(rk = rd_kafka_new(RD_KAFKA_CONSUMER, conf, errstr,
1547
+ sizeof(errstr)))) {
1548
+ fprintf(stderr,
1549
+ "%% Failed to create Kafka consumer: %s\n",
1550
+ errstr);
1551
+ exit(1);
1552
+ }
1553
+
1554
+ global_rk = rk;
1555
+
1556
+ /* Create topic to consume from */
1557
+ rkt = rd_kafka_topic_new(rk, topic, NULL);
1558
+
1559
+ /* Batch consumer */
1560
+ if (batch_size)
1561
+ rkmessages = malloc(sizeof(*rkmessages) * batch_size);
1562
+
1563
+ /* Start consuming */
1564
+ rkqu = rd_kafka_queue_new(rk);
1565
+ for (i = 0; i < (size_t)partition_cnt; ++i) {
1566
+ const int r = rd_kafka_consume_start_queue(
1567
+ rkt, partitions[i], start_offset, rkqu);
1568
+
1569
+ if (r == -1) {
1570
+ fprintf(
1571
+ stderr, "%% Error creating queue: %s\n",
1572
+ rd_kafka_err2str(rd_kafka_last_error()));
1573
+ exit(1);
1574
+ }
1575
+ }
1576
+
1577
+ while (run && (msgcnt == -1 || msgcnt > (int)cnt.msgs)) {
1578
+ /* Consume messages.
1579
+ * A message may either be a real message, or
1580
+ * an error signaling (if rkmessage->err is set).
1581
+ */
1582
+ uint64_t fetch_latency;
1583
+ ssize_t r;
1584
+
1585
+ fetch_latency = rd_clock();
1586
+
1587
+ if (batch_size) {
1588
+ int partition = partitions
1589
+ ? partitions[0]
1590
+ : RD_KAFKA_PARTITION_UA;
1591
+
1592
+ /* Batch fetch mode */
1593
+ r = rd_kafka_consume_batch(rkt, partition, 1000,
1594
+ rkmessages,
1595
+ batch_size);
1596
+ if (r != -1) {
1597
+ for (i = 0; (ssize_t)i < r; i++) {
1598
+ msg_consume(rkmessages[i],
1599
+ NULL);
1600
+ rd_kafka_message_destroy(
1601
+ rkmessages[i]);
1602
+ }
1603
+ }
1604
+ } else {
1605
+ /* Queue mode */
1606
+ r = rd_kafka_consume_callback_queue(
1607
+ rkqu, 1000, msg_consume, NULL);
1608
+ }
1609
+
1610
+ cnt.t_fetch_latency += rd_clock() - fetch_latency;
1611
+ if (r == -1)
1612
+ fprintf(
1613
+ stderr, "%% Error: %s\n",
1614
+ rd_kafka_err2str(rd_kafka_last_error()));
1615
+ else if (r > 0 && rate_sleep) {
1616
+ /* Simulate processing time
1617
+ * if `-r <rate>` was set. */
1618
+ do_sleep(rate_sleep);
1619
+ }
1620
+
1621
+
1622
+ print_stats(rk, mode, otype, compression);
1623
+
1624
+ /* Poll to handle stats callbacks */
1625
+ rd_kafka_poll(rk, 0);
1626
+ }
1627
+ cnt.t_end = rd_clock();
1628
+
1629
+ /* Stop consuming */
1630
+ for (i = 0; i < (size_t)partition_cnt; ++i) {
1631
+ int r = rd_kafka_consume_stop(rkt, (int32_t)i);
1632
+ if (r == -1) {
1633
+ fprintf(
1634
+ stderr, "%% Error in consume_stop: %s\n",
1635
+ rd_kafka_err2str(rd_kafka_last_error()));
1636
+ }
1637
+ }
1638
+ rd_kafka_queue_destroy(rkqu);
1639
+
1640
+ /* Destroy topic */
1641
+ rd_kafka_topic_destroy(rkt);
1642
+
1643
+ if (batch_size)
1644
+ free(rkmessages);
1645
+
1646
+ /* Destroy the handle */
1647
+ rd_kafka_destroy(rk);
1648
+
1649
+ global_rk = rk = NULL;
1650
+
1651
+ } else if (mode == 'G') {
1652
+ /*
1653
+ * High-level balanced Consumer
1654
+ */
1655
+ rd_kafka_message_t **rkmessages = NULL;
1656
+
1657
+ rd_kafka_conf_set_rebalance_cb(conf, rebalance_cb);
1658
+
1659
+ /* Create Kafka handle */
1660
+ if (!(rk = rd_kafka_new(RD_KAFKA_CONSUMER, conf, errstr,
1661
+ sizeof(errstr)))) {
1662
+ fprintf(stderr,
1663
+ "%% Failed to create Kafka consumer: %s\n",
1664
+ errstr);
1665
+ exit(1);
1666
+ }
1667
+
1668
+ /* Forward all events to consumer queue */
1669
+ rd_kafka_poll_set_consumer(rk);
1670
+
1671
+ global_rk = rk;
1672
+
1673
+ err = rd_kafka_subscribe(rk, topics);
1674
+ if (err) {
1675
+ fprintf(stderr, "%% Subscribe failed: %s\n",
1676
+ rd_kafka_err2str(err));
1677
+ exit(1);
1678
+ }
1679
+ fprintf(stderr, "%% Waiting for group rebalance..\n");
1680
+
1681
+ if (batch_size) {
1682
+ rkmessages = malloc(sizeof(*rkmessages) * batch_size);
1683
+ } else {
1684
+ rkmessages = malloc(sizeof(*rkmessages));
1685
+ }
1686
+
1687
+ rkqu = rd_kafka_queue_get_consumer(rk);
1688
+
1689
+ while (run && (msgcnt == -1 || msgcnt > (int)cnt.msgs)) {
1690
+ /* Consume messages.
1691
+ * A message may either be a real message, or
1692
+ * an event (if rkmessage->err is set).
1693
+ */
1694
+ uint64_t fetch_latency;
1695
+ ssize_t r;
1696
+
1697
+ fetch_latency = rd_clock();
1698
+
1699
+ if (batch_size) {
1700
+ /* Batch fetch mode */
1701
+ ssize_t i = 0;
1702
+ r = rd_kafka_consume_batch_queue(
1703
+ rkqu, 1000, rkmessages, batch_size);
1704
+ if (r != -1) {
1705
+ for (i = 0; i < r; i++) {
1706
+ msg_consume(rkmessages[i],
1707
+ NULL);
1708
+ rd_kafka_message_destroy(
1709
+ rkmessages[i]);
1710
+ }
1711
+ }
1712
+
1713
+ if (r == -1)
1714
+ fprintf(stderr, "%% Error: %s\n",
1715
+ rd_kafka_err2str(
1716
+ rd_kafka_last_error()));
1717
+ else if (r > 0 && rate_sleep) {
1718
+ /* Simulate processing time
1719
+ * if `-r <rate>` was set. */
1720
+ do_sleep(rate_sleep);
1721
+ }
1722
+
1723
+ } else {
1724
+ rkmessages[0] =
1725
+ rd_kafka_consumer_poll(rk, 1000);
1726
+ if (rkmessages[0]) {
1727
+ msg_consume(rkmessages[0], NULL);
1728
+ rd_kafka_message_destroy(rkmessages[0]);
1729
+
1730
+ /* Simulate processing time
1731
+ * if `-r <rate>` was set. */
1732
+ if (rate_sleep)
1733
+ do_sleep(rate_sleep);
1734
+ }
1735
+ }
1736
+
1737
+ cnt.t_fetch_latency += rd_clock() - fetch_latency;
1738
+
1739
+ print_stats(rk, mode, otype, compression);
1740
+ }
1741
+ cnt.t_end = rd_clock();
1742
+
1743
+ err = rd_kafka_consumer_close(rk);
1744
+ if (err)
1745
+ fprintf(stderr, "%% Failed to close consumer: %s\n",
1746
+ rd_kafka_err2str(err));
1747
+
1748
+ free(rkmessages);
1749
+ rd_kafka_queue_destroy(rkqu);
1750
+ rd_kafka_destroy(rk);
1751
+ }
1752
+
1753
+ if (hdrs)
1754
+ rd_kafka_headers_destroy(hdrs);
1755
+
1756
+ print_stats(NULL, mode, otype | _OTYPE_FORCE, compression);
1757
+
1758
+ if (cnt.t_fetch_latency && cnt.msgs)
1759
+ printf("%% Average application fetch latency: %" PRIu64 "us\n",
1760
+ cnt.t_fetch_latency / cnt.msgs);
1761
+
1762
+ if (latency_fp)
1763
+ fclose(latency_fp);
1764
+
1765
+ if (stats_fp) {
1766
+ #ifndef _WIN32
1767
+ pclose(stats_fp);
1768
+ #endif
1769
+ stats_fp = NULL;
1770
+ }
1771
+
1772
+ if (partitions)
1773
+ free(partitions);
1774
+
1775
+ rd_kafka_topic_partition_list_destroy(topics);
1776
+
1777
+ /* Let background threads clean up and terminate cleanly. */
1778
+ rd_kafka_wait_destroyed(2000);
1779
+
1780
+ return exitcode;
1781
+ }