@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,1309 @@
1
+ /*
2
+ * librdkafka - Apache Kafka C library
3
+ *
4
+ * Copyright (c) 2015-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
+ #ifdef _WIN32
30
+ #pragma comment(lib, "ws2_32.lib")
31
+ #endif
32
+
33
+ #define __need_IOV_MAX
34
+
35
+ #define _DARWIN_C_SOURCE /* MSG_DONTWAIT */
36
+
37
+ #include "rdkafka_int.h"
38
+ #include "rdaddr.h"
39
+ #include "rdkafka_transport.h"
40
+ #include "rdkafka_transport_int.h"
41
+ #include "rdkafka_broker.h"
42
+ #include "rdkafka_interceptor.h"
43
+
44
+ #include <errno.h>
45
+
46
+ /* AIX doesn't have MSG_DONTWAIT */
47
+ #ifndef MSG_DONTWAIT
48
+ #define MSG_DONTWAIT MSG_NONBLOCK
49
+ #endif
50
+
51
+ #if WITH_SSL
52
+ #include "rdkafka_ssl.h"
53
+ #endif
54
+
55
+ /**< Current thread's rd_kafka_transport_t instance.
56
+ * This pointer is set up when calling any OpenSSL APIs that might
57
+ * trigger SSL callbacks, and is used to retrieve the SSL object's
58
+ * corresponding rd_kafka_transport_t instance.
59
+ * There is an set/get_ex_data() API in OpenSSL, but it requires storing
60
+ * a unique index somewhere, which we can't do without having a singleton
61
+ * object, so instead we cut out the middle man and store the
62
+ * rd_kafka_transport_t pointer directly in the thread-local memory. */
63
+ RD_TLS rd_kafka_transport_t *rd_kafka_curr_transport;
64
+
65
+
66
+ static int rd_kafka_transport_poll(rd_kafka_transport_t *rktrans, int tmout);
67
+
68
+
69
+ /**
70
+ * Low-level socket close
71
+ */
72
+ static void rd_kafka_transport_close0(rd_kafka_t *rk, rd_socket_t s) {
73
+ if (rk->rk_conf.closesocket_cb)
74
+ rk->rk_conf.closesocket_cb((int)s, rk->rk_conf.opaque);
75
+ else
76
+ rd_socket_close(s);
77
+ }
78
+
79
+ /**
80
+ * Close and destroy a transport handle
81
+ */
82
+ void rd_kafka_transport_close(rd_kafka_transport_t *rktrans) {
83
+ #if WITH_SSL
84
+ rd_kafka_curr_transport = rktrans;
85
+ if (rktrans->rktrans_ssl)
86
+ rd_kafka_transport_ssl_close(rktrans);
87
+ #endif
88
+
89
+ rd_kafka_sasl_close(rktrans);
90
+
91
+ if (rktrans->rktrans_recv_buf)
92
+ rd_kafka_buf_destroy(rktrans->rktrans_recv_buf);
93
+
94
+ #ifdef _WIN32
95
+ WSACloseEvent(rktrans->rktrans_wsaevent);
96
+ #endif
97
+
98
+ if (rktrans->rktrans_s != -1)
99
+ rd_kafka_transport_close0(rktrans->rktrans_rkb->rkb_rk,
100
+ rktrans->rktrans_s);
101
+
102
+ rd_free(rktrans);
103
+ }
104
+
105
+ /**
106
+ * @brief shutdown(2) a transport's underlying socket.
107
+ *
108
+ * This will prohibit further sends and receives.
109
+ * rd_kafka_transport_close() must still be called to close the socket.
110
+ */
111
+ void rd_kafka_transport_shutdown(rd_kafka_transport_t *rktrans) {
112
+ shutdown(rktrans->rktrans_s,
113
+ #ifdef _WIN32
114
+ SD_BOTH
115
+ #else
116
+ SHUT_RDWR
117
+ #endif
118
+ );
119
+ }
120
+
121
+
122
+ #ifndef _WIN32
123
+ /**
124
+ * @brief sendmsg() abstraction, converting a list of segments to iovecs.
125
+ * @remark should only be called if the number of segments is > 1.
126
+ */
127
+ static ssize_t rd_kafka_transport_socket_sendmsg(rd_kafka_transport_t *rktrans,
128
+ rd_slice_t *slice,
129
+ char *errstr,
130
+ size_t errstr_size) {
131
+ struct iovec iov[IOV_MAX];
132
+ struct msghdr msg = {.msg_iov = iov};
133
+ size_t iovlen;
134
+ ssize_t r;
135
+ size_t r2;
136
+
137
+ rd_slice_get_iov(slice, msg.msg_iov, &iovlen, IOV_MAX,
138
+ /* FIXME: Measure the effects of this */
139
+ rktrans->rktrans_sndbuf_size);
140
+ msg.msg_iovlen = (int)iovlen;
141
+
142
+ #ifdef __sun
143
+ /* See recvmsg() comment. Setting it here to be safe. */
144
+ rd_socket_errno = EAGAIN;
145
+ #endif
146
+
147
+ r = sendmsg(rktrans->rktrans_s, &msg,
148
+ MSG_DONTWAIT
149
+ #ifdef MSG_NOSIGNAL
150
+ | MSG_NOSIGNAL
151
+ #endif
152
+ );
153
+
154
+ if (r == -1) {
155
+ if (rd_socket_errno == EAGAIN)
156
+ return 0;
157
+ rd_snprintf(errstr, errstr_size, "%s", rd_strerror(errno));
158
+ return -1;
159
+ }
160
+
161
+ /* Update buffer read position */
162
+ r2 = rd_slice_read(slice, NULL, (size_t)r);
163
+ rd_assert((size_t)r == r2 &&
164
+ *"BUG: wrote more bytes than available in slice");
165
+
166
+ return r;
167
+ }
168
+ #endif
169
+
170
+
171
+ /**
172
+ * @brief Plain send() abstraction
173
+ */
174
+ static ssize_t rd_kafka_transport_socket_send0(rd_kafka_transport_t *rktrans,
175
+ rd_slice_t *slice,
176
+ char *errstr,
177
+ size_t errstr_size) {
178
+ ssize_t sum = 0;
179
+ const void *p;
180
+ size_t rlen;
181
+
182
+ while ((rlen = rd_slice_peeker(slice, &p))) {
183
+ ssize_t r;
184
+ size_t r2;
185
+
186
+ r = send(rktrans->rktrans_s, p,
187
+ #ifdef _WIN32
188
+ (int)rlen, (int)0
189
+ #else
190
+ rlen, 0
191
+ #endif
192
+ );
193
+
194
+ #ifdef _WIN32
195
+ if (unlikely(r == RD_SOCKET_ERROR)) {
196
+ if (sum > 0 || rd_socket_errno == WSAEWOULDBLOCK) {
197
+ rktrans->rktrans_blocked = rd_true;
198
+ return sum;
199
+ } else {
200
+ rd_snprintf(
201
+ errstr, errstr_size, "%s",
202
+ rd_socket_strerror(rd_socket_errno));
203
+ return -1;
204
+ }
205
+ }
206
+
207
+ rktrans->rktrans_blocked = rd_false;
208
+ #else
209
+ if (unlikely(r <= 0)) {
210
+ if (r == 0 || rd_socket_errno == EAGAIN)
211
+ return 0;
212
+ rd_snprintf(errstr, errstr_size, "%s",
213
+ rd_socket_strerror(rd_socket_errno));
214
+ return -1;
215
+ }
216
+ #endif
217
+
218
+ /* Update buffer read position */
219
+ r2 = rd_slice_read(slice, NULL, (size_t)r);
220
+ rd_assert((size_t)r == r2 &&
221
+ *"BUG: wrote more bytes than available in slice");
222
+
223
+
224
+ sum += r;
225
+
226
+ /* FIXME: remove this and try again immediately and let
227
+ * the next write() call fail instead? */
228
+ if ((size_t)r < rlen)
229
+ break;
230
+ }
231
+
232
+ return sum;
233
+ }
234
+
235
+
236
+ static ssize_t rd_kafka_transport_socket_send(rd_kafka_transport_t *rktrans,
237
+ rd_slice_t *slice,
238
+ char *errstr,
239
+ size_t errstr_size) {
240
+ #ifndef _WIN32
241
+ /* FIXME: Use sendmsg() with iovecs if there's more than one segment
242
+ * remaining, otherwise (or if platform does not have sendmsg)
243
+ * use plain send(). */
244
+ return rd_kafka_transport_socket_sendmsg(rktrans, slice, errstr,
245
+ errstr_size);
246
+ #endif
247
+ return rd_kafka_transport_socket_send0(rktrans, slice, errstr,
248
+ errstr_size);
249
+ }
250
+
251
+
252
+
253
+ #ifndef _WIN32
254
+ /**
255
+ * @brief recvmsg() abstraction, converting a list of segments to iovecs.
256
+ * @remark should only be called if the number of segments is > 1.
257
+ */
258
+ static ssize_t rd_kafka_transport_socket_recvmsg(rd_kafka_transport_t *rktrans,
259
+ rd_buf_t *rbuf,
260
+ char *errstr,
261
+ size_t errstr_size) {
262
+ ssize_t r;
263
+ struct iovec iov[IOV_MAX];
264
+ struct msghdr msg = {.msg_iov = iov};
265
+ size_t iovlen;
266
+
267
+ rd_buf_get_write_iov(rbuf, msg.msg_iov, &iovlen, IOV_MAX,
268
+ /* FIXME: Measure the effects of this */
269
+ rktrans->rktrans_rcvbuf_size);
270
+ msg.msg_iovlen = (int)iovlen;
271
+
272
+ #ifdef __sun
273
+ /* SunOS doesn't seem to set errno when recvmsg() fails
274
+ * due to no data and MSG_DONTWAIT is set. */
275
+ rd_socket_errno = EAGAIN;
276
+ #endif
277
+ r = recvmsg(rktrans->rktrans_s, &msg, MSG_DONTWAIT);
278
+ if (unlikely(r <= 0)) {
279
+ if (r == -1 && rd_socket_errno == EAGAIN)
280
+ return 0;
281
+ else if (r == 0) {
282
+ /* Receive 0 after POLLIN event means
283
+ * connection closed. */
284
+ rd_snprintf(errstr, errstr_size,
285
+ "Disconnected: connection closed by "
286
+ "peer: receive 0 after POLLIN");
287
+ return -1;
288
+ } else if (r == -1 && rd_socket_errno == ECONNRESET) {
289
+ rd_snprintf(errstr, errstr_size,
290
+ "Disconnected: connection "
291
+ "reset by peer");
292
+ return -1;
293
+ } else if (r == -1) {
294
+ rd_snprintf(errstr, errstr_size, "%s",
295
+ rd_strerror(errno));
296
+ return -1;
297
+ }
298
+ }
299
+
300
+ /* Update buffer write position */
301
+ rd_buf_write(rbuf, NULL, (size_t)r);
302
+
303
+ return r;
304
+ }
305
+ #endif
306
+
307
+
308
+ /**
309
+ * @brief Plain recv()
310
+ */
311
+ static ssize_t rd_kafka_transport_socket_recv0(rd_kafka_transport_t *rktrans,
312
+ rd_buf_t *rbuf,
313
+ char *errstr,
314
+ size_t errstr_size) {
315
+ ssize_t sum = 0;
316
+ void *p;
317
+ size_t len;
318
+
319
+ while ((len = rd_buf_get_writable(rbuf, &p))) {
320
+ ssize_t r;
321
+
322
+ r = recv(rktrans->rktrans_s, p,
323
+ #ifdef _WIN32
324
+ (int)
325
+ #endif
326
+ len,
327
+ 0);
328
+
329
+ if (unlikely(r == RD_SOCKET_ERROR)) {
330
+ if (rd_socket_errno == EAGAIN
331
+ #ifdef _WIN32
332
+ || rd_socket_errno == WSAEWOULDBLOCK
333
+ #endif
334
+ )
335
+ return sum;
336
+ else {
337
+ rd_snprintf(
338
+ errstr, errstr_size, "%s",
339
+ rd_socket_strerror(rd_socket_errno));
340
+ return -1;
341
+ }
342
+ } else if (unlikely(r == 0)) {
343
+ /* Receive 0 after POLLIN event means
344
+ * connection closed. */
345
+ rd_snprintf(errstr, errstr_size,
346
+ "Disconnected: connection closed by "
347
+ "peer: receive 0 after POLLIN");
348
+ return -1;
349
+ }
350
+
351
+ /* Update buffer write position */
352
+ rd_buf_write(rbuf, NULL, (size_t)r);
353
+
354
+ sum += r;
355
+
356
+ /* FIXME: remove this and try again immediately and let
357
+ * the next recv() call fail instead? */
358
+ if ((size_t)r < len)
359
+ break;
360
+ }
361
+ return sum;
362
+ }
363
+
364
+
365
+ static ssize_t rd_kafka_transport_socket_recv(rd_kafka_transport_t *rktrans,
366
+ rd_buf_t *buf,
367
+ char *errstr,
368
+ size_t errstr_size) {
369
+ #ifndef _WIN32
370
+ return rd_kafka_transport_socket_recvmsg(rktrans, buf, errstr,
371
+ errstr_size);
372
+ #endif
373
+ return rd_kafka_transport_socket_recv0(rktrans, buf, errstr,
374
+ errstr_size);
375
+ }
376
+
377
+
378
+
379
+ /**
380
+ * CONNECT state is failed (errstr!=NULL) or done (TCP is up, SSL is working..).
381
+ * From this state we either hand control back to the broker code,
382
+ * or if authentication is configured we ente the AUTH state.
383
+ */
384
+ void rd_kafka_transport_connect_done(rd_kafka_transport_t *rktrans,
385
+ char *errstr) {
386
+ rd_kafka_broker_t *rkb = rktrans->rktrans_rkb;
387
+
388
+ rd_kafka_curr_transport = rktrans;
389
+
390
+ rd_kafka_broker_connect_done(rkb, errstr);
391
+ }
392
+
393
+
394
+
395
+ ssize_t rd_kafka_transport_send(rd_kafka_transport_t *rktrans,
396
+ rd_slice_t *slice,
397
+ char *errstr,
398
+ size_t errstr_size) {
399
+ ssize_t r;
400
+ #if WITH_SSL
401
+ if (rktrans->rktrans_ssl) {
402
+ rd_kafka_curr_transport = rktrans;
403
+ r = rd_kafka_transport_ssl_send(rktrans, slice, errstr,
404
+ errstr_size);
405
+ } else
406
+ #endif
407
+ r = rd_kafka_transport_socket_send(rktrans, slice, errstr,
408
+ errstr_size);
409
+
410
+ return r;
411
+ }
412
+
413
+
414
+ ssize_t rd_kafka_transport_recv(rd_kafka_transport_t *rktrans,
415
+ rd_buf_t *rbuf,
416
+ char *errstr,
417
+ size_t errstr_size) {
418
+ ssize_t r;
419
+
420
+ #if WITH_SSL
421
+ if (rktrans->rktrans_ssl) {
422
+ rd_kafka_curr_transport = rktrans;
423
+ r = rd_kafka_transport_ssl_recv(rktrans, rbuf, errstr,
424
+ errstr_size);
425
+ } else
426
+ #endif
427
+ r = rd_kafka_transport_socket_recv(rktrans, rbuf, errstr,
428
+ errstr_size);
429
+
430
+ return r;
431
+ }
432
+
433
+
434
+
435
+ /**
436
+ * @brief Notify transport layer of full request sent.
437
+ */
438
+ void rd_kafka_transport_request_sent(rd_kafka_broker_t *rkb,
439
+ rd_kafka_buf_t *rkbuf) {
440
+ rd_kafka_transport_t *rktrans = rkb->rkb_transport;
441
+
442
+ /* Call on_request_sent interceptors */
443
+ rd_kafka_interceptors_on_request_sent(
444
+ rkb->rkb_rk, (int)rktrans->rktrans_s, rkb->rkb_name,
445
+ rkb->rkb_nodeid, rkbuf->rkbuf_reqhdr.ApiKey,
446
+ rkbuf->rkbuf_reqhdr.ApiVersion, rkbuf->rkbuf_corrid,
447
+ rd_slice_size(&rkbuf->rkbuf_reader));
448
+ }
449
+
450
+
451
+
452
+ /**
453
+ * Length framed receive handling.
454
+ * Currently only supports a the following framing:
455
+ * [int32_t:big_endian_length_of_payload][payload]
456
+ *
457
+ * To be used on POLLIN event, will return:
458
+ * -1: on fatal error (errstr will be updated, *rkbufp remains unset)
459
+ * 0: still waiting for data (*rkbufp remains unset)
460
+ * 1: data complete, (buffer returned in *rkbufp)
461
+ */
462
+ int rd_kafka_transport_framed_recv(rd_kafka_transport_t *rktrans,
463
+ rd_kafka_buf_t **rkbufp,
464
+ char *errstr,
465
+ size_t errstr_size) {
466
+ rd_kafka_buf_t *rkbuf = rktrans->rktrans_recv_buf;
467
+ ssize_t r;
468
+ const int log_decode_errors = LOG_ERR;
469
+
470
+ /* States:
471
+ * !rktrans_recv_buf: initial state; set up buf to receive header.
472
+ * rkbuf_totlen == 0: awaiting header
473
+ * rkbuf_totlen > 0: awaiting payload
474
+ */
475
+
476
+ if (!rkbuf) {
477
+ rkbuf = rd_kafka_buf_new(1, 4 /*length field's length*/);
478
+ /* Set up buffer reader for the length field */
479
+ rd_buf_write_ensure(&rkbuf->rkbuf_buf, 4, 4);
480
+ rktrans->rktrans_recv_buf = rkbuf;
481
+ }
482
+
483
+
484
+ r = rd_kafka_transport_recv(rktrans, &rkbuf->rkbuf_buf, errstr,
485
+ errstr_size);
486
+ if (r == 0)
487
+ return 0;
488
+ else if (r == -1)
489
+ return -1;
490
+
491
+ if (rkbuf->rkbuf_totlen == 0) {
492
+ /* Frame length not known yet. */
493
+ int32_t frame_len;
494
+
495
+ if (rd_buf_write_pos(&rkbuf->rkbuf_buf) < sizeof(frame_len)) {
496
+ /* Wait for entire frame header. */
497
+ return 0;
498
+ }
499
+
500
+ /* Initialize reader */
501
+ rd_slice_init(&rkbuf->rkbuf_reader, &rkbuf->rkbuf_buf, 0, 4);
502
+
503
+ /* Reader header: payload length */
504
+ rd_kafka_buf_read_i32(rkbuf, &frame_len);
505
+
506
+ if (frame_len < 0 ||
507
+ frame_len > rktrans->rktrans_rkb->rkb_rk->rk_conf
508
+ .recv_max_msg_size) {
509
+ rd_snprintf(errstr, errstr_size,
510
+ "Invalid frame size %" PRId32, frame_len);
511
+ return -1;
512
+ }
513
+
514
+ rkbuf->rkbuf_totlen = 4 + frame_len;
515
+ if (frame_len == 0) {
516
+ /* Payload is empty, we're done. */
517
+ rktrans->rktrans_recv_buf = NULL;
518
+ *rkbufp = rkbuf;
519
+ return 1;
520
+ }
521
+
522
+ /* Allocate memory to hold entire frame payload in contigious
523
+ * memory. */
524
+ rd_buf_write_ensure_contig(&rkbuf->rkbuf_buf, frame_len);
525
+
526
+ /* Try reading directly, there is probably more data available*/
527
+ return rd_kafka_transport_framed_recv(rktrans, rkbufp, errstr,
528
+ errstr_size);
529
+ }
530
+
531
+ if (rd_buf_write_pos(&rkbuf->rkbuf_buf) == rkbuf->rkbuf_totlen) {
532
+ /* Payload is complete. */
533
+ rktrans->rktrans_recv_buf = NULL;
534
+ *rkbufp = rkbuf;
535
+ return 1;
536
+ }
537
+
538
+ /* Wait for more data */
539
+ return 0;
540
+
541
+ err_parse:
542
+ rd_snprintf(errstr, errstr_size, "Frame header parsing failed: %s",
543
+ rd_kafka_err2str(rkbuf->rkbuf_err));
544
+ return -1;
545
+ }
546
+
547
+
548
+ /**
549
+ * @brief Final socket setup after a connection has been established
550
+ */
551
+ void rd_kafka_transport_post_connect_setup(rd_kafka_transport_t *rktrans) {
552
+ rd_kafka_broker_t *rkb = rktrans->rktrans_rkb;
553
+ unsigned int slen;
554
+
555
+ /* Get send and receive buffer sizes to allow limiting
556
+ * the total number of bytes passed with iovecs to sendmsg()
557
+ * and recvmsg(). */
558
+ slen = sizeof(rktrans->rktrans_rcvbuf_size);
559
+ if (getsockopt(rktrans->rktrans_s, SOL_SOCKET, SO_RCVBUF,
560
+ (void *)&rktrans->rktrans_rcvbuf_size,
561
+ &slen) == RD_SOCKET_ERROR) {
562
+ rd_rkb_log(rkb, LOG_WARNING, "RCVBUF",
563
+ "Failed to get socket receive "
564
+ "buffer size: %s: assuming 1MB",
565
+ rd_socket_strerror(rd_socket_errno));
566
+ rktrans->rktrans_rcvbuf_size = 1024 * 1024;
567
+ } else if (rktrans->rktrans_rcvbuf_size < 1024 * 64)
568
+ rktrans->rktrans_rcvbuf_size =
569
+ 1024 * 64; /* Use at least 64KB */
570
+
571
+ slen = sizeof(rktrans->rktrans_sndbuf_size);
572
+ if (getsockopt(rktrans->rktrans_s, SOL_SOCKET, SO_SNDBUF,
573
+ (void *)&rktrans->rktrans_sndbuf_size,
574
+ &slen) == RD_SOCKET_ERROR) {
575
+ rd_rkb_log(rkb, LOG_WARNING, "RCVBUF",
576
+ "Failed to get socket send "
577
+ "buffer size: %s: assuming 1MB",
578
+ rd_socket_strerror(rd_socket_errno));
579
+ rktrans->rktrans_sndbuf_size = 1024 * 1024;
580
+ } else if (rktrans->rktrans_sndbuf_size < 1024 * 64)
581
+ rktrans->rktrans_sndbuf_size =
582
+ 1024 * 64; /* Use at least 64KB */
583
+ }
584
+
585
+
586
+ /**
587
+ * TCP connection established.
588
+ * Set up socket options, SSL, etc.
589
+ *
590
+ * Locality: broker thread
591
+ */
592
+ static void rd_kafka_transport_connected(rd_kafka_transport_t *rktrans) {
593
+ rd_kafka_broker_t *rkb = rktrans->rktrans_rkb;
594
+
595
+ rd_rkb_dbg(
596
+ rkb, BROKER, "CONNECT", "Connected to %s",
597
+ rd_sockaddr2str(rkb->rkb_addr_last,
598
+ RD_SOCKADDR2STR_F_PORT | RD_SOCKADDR2STR_F_FAMILY));
599
+
600
+ rd_kafka_transport_post_connect_setup(rktrans);
601
+
602
+ #if WITH_SSL
603
+ if (rkb->rkb_proto == RD_KAFKA_PROTO_SSL ||
604
+ rkb->rkb_proto == RD_KAFKA_PROTO_SASL_SSL) {
605
+ char errstr[512];
606
+
607
+ rd_kafka_broker_lock(rkb);
608
+ rd_kafka_broker_set_state(rkb,
609
+ RD_KAFKA_BROKER_STATE_SSL_HANDSHAKE);
610
+ rd_kafka_broker_unlock(rkb);
611
+
612
+ /* Set up SSL connection.
613
+ * This is also an asynchronous operation so dont
614
+ * propagate to broker_connect_done() just yet. */
615
+ if (rd_kafka_transport_ssl_connect(rkb, rktrans, errstr,
616
+ sizeof(errstr)) == -1) {
617
+ rd_kafka_transport_connect_done(rktrans, errstr);
618
+ return;
619
+ }
620
+ return;
621
+ }
622
+ #endif
623
+
624
+ /* Propagate connect success */
625
+ rd_kafka_transport_connect_done(rktrans, NULL);
626
+ }
627
+
628
+
629
+
630
+ /**
631
+ * @brief the kernel SO_ERROR in \p errp for the given transport.
632
+ * @returns 0 if getsockopt() was succesful (and \p and errp can be trusted),
633
+ * else -1 in which case \p errp 's value is undefined.
634
+ */
635
+ static int rd_kafka_transport_get_socket_error(rd_kafka_transport_t *rktrans,
636
+ int *errp) {
637
+ socklen_t intlen = sizeof(*errp);
638
+
639
+ if (getsockopt(rktrans->rktrans_s, SOL_SOCKET, SO_ERROR, (void *)errp,
640
+ &intlen) == -1) {
641
+ rd_rkb_dbg(rktrans->rktrans_rkb, BROKER, "SO_ERROR",
642
+ "Failed to get socket error: %s",
643
+ rd_socket_strerror(rd_socket_errno));
644
+ return -1;
645
+ }
646
+
647
+ return 0;
648
+ }
649
+
650
+
651
+ /**
652
+ * IO event handler.
653
+ *
654
+ * @param socket_errstr Is an optional (else NULL) error string from the
655
+ * socket layer.
656
+ *
657
+ * Locality: broker thread
658
+ */
659
+ static void rd_kafka_transport_io_event(rd_kafka_transport_t *rktrans,
660
+ int events,
661
+ const char *socket_errstr) {
662
+ char errstr[512];
663
+ int r;
664
+ rd_kafka_broker_t *rkb = rktrans->rktrans_rkb;
665
+
666
+ switch (rkb->rkb_state) {
667
+ case RD_KAFKA_BROKER_STATE_CONNECT:
668
+ /* Asynchronous connect finished, read status. */
669
+ if (!(events & (POLLOUT | POLLERR | POLLHUP)))
670
+ return;
671
+
672
+ if (socket_errstr)
673
+ rd_kafka_broker_fail(
674
+ rkb, LOG_ERR, RD_KAFKA_RESP_ERR__TRANSPORT,
675
+ "Connect to %s failed: %s",
676
+ rd_sockaddr2str(rkb->rkb_addr_last,
677
+ RD_SOCKADDR2STR_F_PORT |
678
+ RD_SOCKADDR2STR_F_FAMILY),
679
+ socket_errstr);
680
+ else if (rd_kafka_transport_get_socket_error(rktrans, &r) ==
681
+ -1) {
682
+ rd_kafka_broker_fail(
683
+ rkb, LOG_ERR, RD_KAFKA_RESP_ERR__TRANSPORT,
684
+ "Connect to %s failed: "
685
+ "unable to get status from "
686
+ "socket %d: %s",
687
+ rd_sockaddr2str(rkb->rkb_addr_last,
688
+ RD_SOCKADDR2STR_F_PORT |
689
+ RD_SOCKADDR2STR_F_FAMILY),
690
+ rktrans->rktrans_s, rd_strerror(rd_socket_errno));
691
+ } else if (r != 0) {
692
+ /* Connect failed */
693
+ rd_snprintf(
694
+ errstr, sizeof(errstr), "Connect to %s failed: %s",
695
+ rd_sockaddr2str(rkb->rkb_addr_last,
696
+ RD_SOCKADDR2STR_F_PORT |
697
+ RD_SOCKADDR2STR_F_FAMILY),
698
+ rd_strerror(r));
699
+
700
+ rd_kafka_transport_connect_done(rktrans, errstr);
701
+ } else {
702
+ /* Connect succeeded */
703
+ rd_kafka_transport_connected(rktrans);
704
+ }
705
+ break;
706
+
707
+ case RD_KAFKA_BROKER_STATE_SSL_HANDSHAKE:
708
+ #if WITH_SSL
709
+ rd_assert(rktrans->rktrans_ssl);
710
+
711
+ /* Currently setting up SSL connection:
712
+ * perform handshake. */
713
+ r = rd_kafka_transport_ssl_handshake(rktrans);
714
+
715
+ if (r == 0 /* handshake still in progress */ &&
716
+ (events & POLLHUP)) {
717
+ rd_kafka_broker_conn_closed(
718
+ rkb, RD_KAFKA_RESP_ERR__TRANSPORT,
719
+ "Disconnected: during "
720
+ "SSL connection handshake");
721
+ return;
722
+ }
723
+
724
+ #else
725
+ RD_NOTREACHED();
726
+ #endif
727
+ break;
728
+
729
+ case RD_KAFKA_BROKER_STATE_AUTH_LEGACY:
730
+ /* SASL authentication.
731
+ * Prior to broker version v1.0.0 this is performed
732
+ * directly on the socket without Kafka framing. */
733
+ if (rd_kafka_sasl_io_event(rktrans, events, errstr,
734
+ sizeof(errstr)) == -1) {
735
+ rd_kafka_broker_fail(
736
+ rkb, LOG_ERR, RD_KAFKA_RESP_ERR__AUTHENTICATION,
737
+ "SASL authentication failure: %s", errstr);
738
+ return;
739
+ }
740
+
741
+ if (events & POLLHUP) {
742
+ rd_kafka_broker_fail(rkb, LOG_ERR,
743
+ RD_KAFKA_RESP_ERR__AUTHENTICATION,
744
+ "Disconnected: hung up from "
745
+ "peer in state AUTH_LEGACY");
746
+
747
+ return;
748
+ }
749
+
750
+ break;
751
+
752
+ case RD_KAFKA_BROKER_STATE_APIVERSION_QUERY:
753
+ case RD_KAFKA_BROKER_STATE_AUTH_HANDSHAKE:
754
+ case RD_KAFKA_BROKER_STATE_AUTH_REQ:
755
+ case RD_KAFKA_BROKER_STATE_UP:
756
+
757
+ if (events & POLLIN) {
758
+ while (rkb->rkb_state >= RD_KAFKA_BROKER_STATE_UP &&
759
+ rd_kafka_recv(rkb) > 0)
760
+ ;
761
+
762
+ /* If connection went down: bail out early */
763
+ if (rkb->rkb_state == RD_KAFKA_BROKER_STATE_DOWN)
764
+ return;
765
+ }
766
+
767
+ if (events & POLLHUP) {
768
+ rd_kafka_broker_conn_closed(
769
+ rkb, RD_KAFKA_RESP_ERR__TRANSPORT,
770
+ "Disconnected: connection closed by "
771
+ "peer: POLLHUP");
772
+ return;
773
+ }
774
+
775
+ if (events & POLLOUT) {
776
+ while (rd_kafka_send(rkb) > 0)
777
+ ;
778
+ }
779
+ break;
780
+
781
+ case RD_KAFKA_BROKER_STATE_INIT:
782
+ case RD_KAFKA_BROKER_STATE_DOWN:
783
+ case RD_KAFKA_BROKER_STATE_TRY_CONNECT:
784
+ case RD_KAFKA_BROKER_STATE_REAUTH:
785
+ rd_kafka_assert(rkb->rkb_rk, !*"bad state");
786
+ }
787
+ }
788
+
789
+
790
+
791
+ #ifdef _WIN32
792
+ /**
793
+ * @brief Convert WSA FD_.. events to POLL.. events.
794
+ */
795
+ static RD_INLINE int rd_kafka_transport_wsa2events(long wevents) {
796
+ int events = 0;
797
+
798
+ if (unlikely(wevents == 0))
799
+ return 0;
800
+
801
+ if (wevents & FD_READ)
802
+ events |= POLLIN;
803
+ if (wevents & (FD_WRITE | FD_CONNECT))
804
+ events |= POLLOUT;
805
+ if (wevents & FD_CLOSE)
806
+ events |= POLLHUP;
807
+
808
+ rd_dassert(events != 0);
809
+
810
+ return events;
811
+ }
812
+
813
+ /**
814
+ * @brief Convert POLL.. events to WSA FD_.. events.
815
+ */
816
+ static RD_INLINE int rd_kafka_transport_events2wsa(int events,
817
+ rd_bool_t is_connecting) {
818
+ long wevents = FD_CLOSE;
819
+
820
+ if (unlikely(is_connecting))
821
+ return wevents | FD_CONNECT;
822
+
823
+ if (events & POLLIN)
824
+ wevents |= FD_READ;
825
+ if (events & POLLOUT)
826
+ wevents |= FD_WRITE;
827
+
828
+ return wevents;
829
+ }
830
+
831
+
832
+ /**
833
+ * @returns the WinSocket events (as POLL.. events) for the broker socket.
834
+ */
835
+ static int rd_kafka_transport_get_wsa_events(rd_kafka_transport_t *rktrans) {
836
+ const int try_bits[4 * 2] = {FD_READ_BIT, POLLIN, FD_WRITE_BIT,
837
+ POLLOUT, FD_CONNECT_BIT, POLLOUT,
838
+ FD_CLOSE_BIT, POLLHUP};
839
+ int r, i;
840
+ WSANETWORKEVENTS netevents;
841
+ int events = 0;
842
+ const char *socket_errstr = NULL;
843
+ rd_kafka_broker_t *rkb = rktrans->rktrans_rkb;
844
+
845
+ /* Get Socket event */
846
+ r = WSAEnumNetworkEvents(rktrans->rktrans_s, rktrans->rktrans_wsaevent,
847
+ &netevents);
848
+ if (unlikely(r == SOCKET_ERROR)) {
849
+ rd_rkb_log(rkb, LOG_ERR, "WSAWAIT",
850
+ "WSAEnumNetworkEvents() failed: %s",
851
+ rd_socket_strerror(rd_socket_errno));
852
+ socket_errstr = rd_socket_strerror(rd_socket_errno);
853
+ return POLLHUP | POLLERR;
854
+ }
855
+
856
+ /* Get fired events and errors for each event type */
857
+ for (i = 0; i < RD_ARRAYSIZE(try_bits); i += 2) {
858
+ const int bit = try_bits[i];
859
+ const int event = try_bits[i + 1];
860
+
861
+ if (!(netevents.lNetworkEvents & (1 << bit)))
862
+ continue;
863
+
864
+ if (unlikely(netevents.iErrorCode[bit])) {
865
+ socket_errstr =
866
+ rd_socket_strerror(netevents.iErrorCode[bit]);
867
+ events |= POLLHUP;
868
+ } else {
869
+ events |= event;
870
+
871
+ if (bit == FD_WRITE_BIT) {
872
+ /* Writing no longer blocked */
873
+ rktrans->rktrans_blocked = rd_false;
874
+ }
875
+ }
876
+ }
877
+
878
+ return events;
879
+ }
880
+
881
+
882
+ /**
883
+ * @brief Win32: Poll transport and \p rkq cond events.
884
+ *
885
+ * @returns the transport socket POLL.. event bits.
886
+ */
887
+ static int rd_kafka_transport_io_serve_win32(rd_kafka_transport_t *rktrans,
888
+ rd_kafka_q_t *rkq,
889
+ int timeout_ms) {
890
+ const DWORD wsaevent_cnt = 3;
891
+ WSAEVENT wsaevents[3] = {
892
+ rkq->rkq_cond.mEvents[0], /* rkq: cnd_signal */
893
+ rkq->rkq_cond.mEvents[1], /* rkq: cnd_broadcast */
894
+ rktrans->rktrans_wsaevent, /* socket */
895
+ };
896
+ DWORD r;
897
+ int events = 0;
898
+ rd_kafka_broker_t *rkb = rktrans->rktrans_rkb;
899
+ rd_bool_t set_pollout = rd_false;
900
+ rd_bool_t cnd_is_waiting = rd_false;
901
+
902
+ /* WSA only sets FD_WRITE (e.g., POLLOUT) when the socket was
903
+ * previously blocked, unlike BSD sockets that set POLLOUT as long as
904
+ * the socket isn't blocked. So we need to imitate the BSD behaviour
905
+ * here and cut the timeout short if a write is wanted and the socket
906
+ * is not currently blocked. */
907
+ if (rktrans->rktrans_rkb->rkb_state != RD_KAFKA_BROKER_STATE_CONNECT &&
908
+ !rktrans->rktrans_blocked &&
909
+ (rktrans->rktrans_pfd[0].events & POLLOUT)) {
910
+ timeout_ms = 0;
911
+ set_pollout = rd_true;
912
+ } else {
913
+ /* Check if the queue already has ops enqueued in which case we
914
+ * cut the timeout short. Else add this thread as waiting on the
915
+ * queue's condvar so that cnd_signal() (et.al.) will perform
916
+ * SetEvent() and thus wake up this thread in case a new op is
917
+ * added to the queue. */
918
+ mtx_lock(&rkq->rkq_lock);
919
+ if (rkq->rkq_qlen > 0) {
920
+ timeout_ms = 0;
921
+ } else {
922
+ cnd_is_waiting = rd_true;
923
+ cnd_wait_enter(&rkq->rkq_cond);
924
+ }
925
+ mtx_unlock(&rkq->rkq_lock);
926
+ }
927
+
928
+ /* Wait for IO and queue events */
929
+ r = WSAWaitForMultipleEvents(wsaevent_cnt, wsaevents, FALSE, timeout_ms,
930
+ FALSE);
931
+
932
+ if (cnd_is_waiting) {
933
+ mtx_lock(&rkq->rkq_lock);
934
+ cnd_wait_exit(&rkq->rkq_cond);
935
+ mtx_unlock(&rkq->rkq_lock);
936
+ }
937
+
938
+ if (unlikely(r == WSA_WAIT_FAILED)) {
939
+ rd_rkb_log(rkb, LOG_CRIT, "WSAWAIT",
940
+ "WSAWaitForMultipleEvents failed: %s",
941
+ rd_socket_strerror(rd_socket_errno));
942
+ return POLLERR;
943
+ } else if (r != WSA_WAIT_TIMEOUT) {
944
+ r -= WSA_WAIT_EVENT_0;
945
+
946
+ /* Reset the cond events if any of them were triggered */
947
+ if (r < 2) {
948
+ ResetEvent(rkq->rkq_cond.mEvents[0]);
949
+ ResetEvent(rkq->rkq_cond.mEvents[1]);
950
+ }
951
+
952
+ /* Get the socket events. */
953
+ events = rd_kafka_transport_get_wsa_events(rktrans);
954
+ }
955
+
956
+ /* As explained above we need to set the POLLOUT flag
957
+ * in case it is wanted but not triggered by Winsocket so that
958
+ * io_event() knows it can attempt to send more data. */
959
+ if (likely(set_pollout && !(events & (POLLHUP | POLLERR | POLLOUT))))
960
+ events |= POLLOUT;
961
+
962
+ return events;
963
+ }
964
+ #endif
965
+
966
+
967
+ /**
968
+ * @brief Poll and serve IOs
969
+ *
970
+ * @returns 0 if \p rkq may need additional blocking/timeout polling, else 1.
971
+ *
972
+ * @locality broker thread
973
+ */
974
+ int rd_kafka_transport_io_serve(rd_kafka_transport_t *rktrans,
975
+ rd_kafka_q_t *rkq,
976
+ int timeout_ms) {
977
+ rd_kafka_broker_t *rkb = rktrans->rktrans_rkb;
978
+ int events;
979
+
980
+ rd_kafka_curr_transport = rktrans;
981
+
982
+ if (
983
+ #ifndef _WIN32
984
+ /* BSD sockets use POLLOUT to indicate success to connect.
985
+ * Windows has its own flag for this (FD_CONNECT). */
986
+ rkb->rkb_state == RD_KAFKA_BROKER_STATE_CONNECT ||
987
+ #endif
988
+ (rkb->rkb_state > RD_KAFKA_BROKER_STATE_SSL_HANDSHAKE &&
989
+ rd_kafka_bufq_cnt(&rkb->rkb_waitresps) < rkb->rkb_max_inflight &&
990
+ rd_kafka_bufq_cnt(&rkb->rkb_outbufs) > 0))
991
+ rd_kafka_transport_poll_set(rkb->rkb_transport, POLLOUT);
992
+
993
+ #ifdef _WIN32
994
+ /* BSD sockets use POLLIN and a following recv() returning 0 to
995
+ * to indicate connection close.
996
+ * Windows has its own flag for this (FD_CLOSE). */
997
+ if (rd_kafka_bufq_cnt(&rkb->rkb_waitresps) > 0)
998
+ #endif
999
+ rd_kafka_transport_poll_set(rkb->rkb_transport, POLLIN);
1000
+
1001
+ /* On Windows we can wait for both IO and condvars (rkq)
1002
+ * simultaneously.
1003
+ *
1004
+ * On *nix/BSD sockets we use a local pipe (pfd[1]) to wake
1005
+ * up the rkq. */
1006
+ #ifdef _WIN32
1007
+ events = rd_kafka_transport_io_serve_win32(rktrans, rkq, timeout_ms);
1008
+
1009
+ #else
1010
+ if (rd_kafka_transport_poll(rktrans, timeout_ms) < 1)
1011
+ return 0; /* No events, caller can block on \p rkq poll */
1012
+
1013
+ /* Broker socket events */
1014
+ events = rktrans->rktrans_pfd[0].revents;
1015
+ #endif
1016
+
1017
+ if (events) {
1018
+ rd_kafka_transport_poll_clear(rktrans, POLLOUT | POLLIN);
1019
+
1020
+ rd_kafka_transport_io_event(rktrans, events, NULL);
1021
+ }
1022
+
1023
+ return 1;
1024
+ }
1025
+
1026
+
1027
+ /**
1028
+ * @brief Create a new transport object using existing socket \p s.
1029
+ */
1030
+ rd_kafka_transport_t *rd_kafka_transport_new(rd_kafka_broker_t *rkb,
1031
+ rd_socket_t s,
1032
+ char *errstr,
1033
+ size_t errstr_size) {
1034
+ rd_kafka_transport_t *rktrans;
1035
+ int on = 1;
1036
+ int r;
1037
+
1038
+ #ifdef SO_NOSIGPIPE
1039
+ /* Disable SIGPIPE signalling for this socket on OSX */
1040
+ if (setsockopt(s, SOL_SOCKET, SO_NOSIGPIPE, &on, sizeof(on)) == -1)
1041
+ rd_rkb_dbg(rkb, BROKER, "SOCKET",
1042
+ "Failed to set SO_NOSIGPIPE: %s",
1043
+ rd_socket_strerror(rd_socket_errno));
1044
+ #endif
1045
+
1046
+ #ifdef SO_KEEPALIVE
1047
+ /* Enable TCP keep-alives, if configured. */
1048
+ if (rkb->rkb_rk->rk_conf.socket_keepalive) {
1049
+ if (setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (void *)&on,
1050
+ sizeof(on)) == RD_SOCKET_ERROR)
1051
+ rd_rkb_dbg(rkb, BROKER, "SOCKET",
1052
+ "Failed to set SO_KEEPALIVE: %s",
1053
+ rd_socket_strerror(rd_socket_errno));
1054
+ }
1055
+ #endif
1056
+
1057
+ #ifdef TCP_NODELAY
1058
+ if (rkb->rkb_rk->rk_conf.socket_nagle_disable) {
1059
+ int one = 1;
1060
+ if (setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (void *)&one,
1061
+ sizeof(one)) == RD_SOCKET_ERROR)
1062
+ rd_rkb_log(rkb, LOG_WARNING, "NAGLE",
1063
+ "Failed to disable Nagle (TCP_NODELAY) "
1064
+ "on socket: %s",
1065
+ rd_socket_strerror(rd_socket_errno));
1066
+ }
1067
+ #endif
1068
+
1069
+ /* Set socket send & receive buffer sizes if configuerd */
1070
+ if (rkb->rkb_rk->rk_conf.socket_sndbuf_size != 0) {
1071
+ if (setsockopt(
1072
+ s, SOL_SOCKET, SO_SNDBUF,
1073
+ (void *)&rkb->rkb_rk->rk_conf.socket_sndbuf_size,
1074
+ sizeof(rkb->rkb_rk->rk_conf.socket_sndbuf_size)) ==
1075
+ RD_SOCKET_ERROR)
1076
+ rd_rkb_log(rkb, LOG_WARNING, "SNDBUF",
1077
+ "Failed to set socket send "
1078
+ "buffer size to %i: %s",
1079
+ rkb->rkb_rk->rk_conf.socket_sndbuf_size,
1080
+ rd_socket_strerror(rd_socket_errno));
1081
+ }
1082
+
1083
+ if (rkb->rkb_rk->rk_conf.socket_rcvbuf_size != 0) {
1084
+ if (setsockopt(
1085
+ s, SOL_SOCKET, SO_RCVBUF,
1086
+ (void *)&rkb->rkb_rk->rk_conf.socket_rcvbuf_size,
1087
+ sizeof(rkb->rkb_rk->rk_conf.socket_rcvbuf_size)) ==
1088
+ RD_SOCKET_ERROR)
1089
+ rd_rkb_log(rkb, LOG_WARNING, "RCVBUF",
1090
+ "Failed to set socket receive "
1091
+ "buffer size to %i: %s",
1092
+ rkb->rkb_rk->rk_conf.socket_rcvbuf_size,
1093
+ rd_socket_strerror(rd_socket_errno));
1094
+ }
1095
+
1096
+ /* Set the socket to non-blocking */
1097
+ if ((r = rd_fd_set_nonblocking(s))) {
1098
+ rd_snprintf(errstr, errstr_size,
1099
+ "Failed to set socket non-blocking: %s",
1100
+ rd_socket_strerror(r));
1101
+ return NULL;
1102
+ }
1103
+
1104
+
1105
+ rktrans = rd_calloc(1, sizeof(*rktrans));
1106
+ rktrans->rktrans_rkb = rkb;
1107
+ rktrans->rktrans_s = s;
1108
+
1109
+ #ifdef _WIN32
1110
+ rktrans->rktrans_wsaevent = WSACreateEvent();
1111
+ rd_assert(rktrans->rktrans_wsaevent != NULL);
1112
+ #endif
1113
+
1114
+ return rktrans;
1115
+ }
1116
+
1117
+
1118
+ /**
1119
+ * Initiate asynchronous connection attempt.
1120
+ *
1121
+ * Locality: broker thread
1122
+ */
1123
+ rd_kafka_transport_t *rd_kafka_transport_connect(rd_kafka_broker_t *rkb,
1124
+ const rd_sockaddr_inx_t *sinx,
1125
+ char *errstr,
1126
+ size_t errstr_size) {
1127
+ rd_kafka_transport_t *rktrans;
1128
+ int s = -1;
1129
+ int r;
1130
+
1131
+ rkb->rkb_addr_last = sinx;
1132
+
1133
+ s = rkb->rkb_rk->rk_conf.socket_cb(sinx->in.sin_family, SOCK_STREAM,
1134
+ IPPROTO_TCP,
1135
+ rkb->rkb_rk->rk_conf.opaque);
1136
+ if (s == -1) {
1137
+ rd_snprintf(errstr, errstr_size, "Failed to create socket: %s",
1138
+ rd_socket_strerror(rd_socket_errno));
1139
+ return NULL;
1140
+ }
1141
+
1142
+ rktrans = rd_kafka_transport_new(rkb, s, errstr, errstr_size);
1143
+ if (!rktrans) {
1144
+ rd_kafka_transport_close0(rkb->rkb_rk, s);
1145
+ return NULL;
1146
+ }
1147
+
1148
+ rd_rkb_dbg(rkb, BROKER, "CONNECT",
1149
+ "Connecting to %s (%s) "
1150
+ "with socket %i",
1151
+ rd_sockaddr2str(sinx, RD_SOCKADDR2STR_F_FAMILY |
1152
+ RD_SOCKADDR2STR_F_PORT),
1153
+ rd_kafka_secproto_names[rkb->rkb_proto], s);
1154
+
1155
+ /* Connect to broker */
1156
+ if (rkb->rkb_rk->rk_conf.connect_cb) {
1157
+ rd_kafka_broker_lock(rkb); /* for rkb_nodename */
1158
+ r = rkb->rkb_rk->rk_conf.connect_cb(
1159
+ s, (struct sockaddr *)sinx, RD_SOCKADDR_INX_LEN(sinx),
1160
+ rkb->rkb_nodename, rkb->rkb_rk->rk_conf.opaque);
1161
+ rd_kafka_broker_unlock(rkb);
1162
+ } else {
1163
+ if (connect(s, (struct sockaddr *)sinx,
1164
+ RD_SOCKADDR_INX_LEN(sinx)) == RD_SOCKET_ERROR &&
1165
+ (rd_socket_errno != EINPROGRESS
1166
+ #ifdef _WIN32
1167
+ && rd_socket_errno != WSAEWOULDBLOCK
1168
+ #endif
1169
+ ))
1170
+ r = rd_socket_errno;
1171
+ else
1172
+ r = 0;
1173
+ }
1174
+
1175
+ if (r != 0) {
1176
+ rd_rkb_dbg(rkb, BROKER, "CONNECT",
1177
+ "Couldn't connect to %s: %s (%i)",
1178
+ rd_sockaddr2str(sinx, RD_SOCKADDR2STR_F_PORT |
1179
+ RD_SOCKADDR2STR_F_FAMILY),
1180
+ rd_socket_strerror(r), r);
1181
+ rd_snprintf(errstr, errstr_size,
1182
+ "Failed to connect to broker at %s: %s",
1183
+ rd_sockaddr2str(sinx, RD_SOCKADDR2STR_F_NICE),
1184
+ rd_socket_strerror(r));
1185
+
1186
+ rd_kafka_transport_close(rktrans);
1187
+ return NULL;
1188
+ }
1189
+
1190
+ /* Set up transport handle */
1191
+ rktrans->rktrans_pfd[rktrans->rktrans_pfd_cnt++].fd = s;
1192
+ if (rkb->rkb_wakeup_fd[0] != -1) {
1193
+ rktrans->rktrans_pfd[rktrans->rktrans_pfd_cnt].events = POLLIN;
1194
+ rktrans->rktrans_pfd[rktrans->rktrans_pfd_cnt++].fd =
1195
+ rkb->rkb_wakeup_fd[0];
1196
+ }
1197
+
1198
+
1199
+ /* Poll writability to trigger on connection success/failure. */
1200
+ rd_kafka_transport_poll_set(rktrans, POLLOUT);
1201
+
1202
+ return rktrans;
1203
+ }
1204
+
1205
+
1206
+ #ifdef _WIN32
1207
+ /**
1208
+ * @brief Set the WinSocket event poll bit to \p events.
1209
+ */
1210
+ static void rd_kafka_transport_poll_set_wsa(rd_kafka_transport_t *rktrans,
1211
+ int events) {
1212
+ int r;
1213
+ r = WSAEventSelect(
1214
+ rktrans->rktrans_s, rktrans->rktrans_wsaevent,
1215
+ rd_kafka_transport_events2wsa(rktrans->rktrans_pfd[0].events,
1216
+ rktrans->rktrans_rkb->rkb_state ==
1217
+ RD_KAFKA_BROKER_STATE_CONNECT));
1218
+ if (unlikely(r != 0)) {
1219
+ rd_rkb_log(rktrans->rktrans_rkb, LOG_CRIT, "WSAEVENT",
1220
+ "WSAEventSelect() failed: %s",
1221
+ rd_socket_strerror(rd_socket_errno));
1222
+ }
1223
+ }
1224
+ #endif
1225
+
1226
+ void rd_kafka_transport_poll_set(rd_kafka_transport_t *rktrans, int event) {
1227
+ if ((rktrans->rktrans_pfd[0].events & event) == event)
1228
+ return;
1229
+
1230
+ rktrans->rktrans_pfd[0].events |= event;
1231
+
1232
+ #ifdef _WIN32
1233
+ rd_kafka_transport_poll_set_wsa(rktrans,
1234
+ rktrans->rktrans_pfd[0].events);
1235
+ #endif
1236
+ }
1237
+
1238
+ void rd_kafka_transport_poll_clear(rd_kafka_transport_t *rktrans, int event) {
1239
+ if (!(rktrans->rktrans_pfd[0].events & event))
1240
+ return;
1241
+
1242
+ rktrans->rktrans_pfd[0].events &= ~event;
1243
+
1244
+ #ifdef _WIN32
1245
+ rd_kafka_transport_poll_set_wsa(rktrans,
1246
+ rktrans->rktrans_pfd[0].events);
1247
+ #endif
1248
+ }
1249
+
1250
+ #ifndef _WIN32
1251
+ /**
1252
+ * @brief Poll transport fds.
1253
+ *
1254
+ * @returns 1 if an event was raised, else 0, or -1 on error.
1255
+ */
1256
+ static int rd_kafka_transport_poll(rd_kafka_transport_t *rktrans, int tmout) {
1257
+ int r;
1258
+
1259
+ r = poll(rktrans->rktrans_pfd, rktrans->rktrans_pfd_cnt, tmout);
1260
+ if (r <= 0)
1261
+ return r;
1262
+
1263
+ if (rktrans->rktrans_pfd[1].revents & POLLIN) {
1264
+ /* Read wake-up fd data and throw away, just used for wake-ups*/
1265
+ char buf[1024];
1266
+ while (rd_socket_read((int)rktrans->rktrans_pfd[1].fd, buf,
1267
+ sizeof(buf)) > 0)
1268
+ ; /* Read all buffered signalling bytes */
1269
+ }
1270
+
1271
+ return 1;
1272
+ }
1273
+ #endif
1274
+
1275
+ #ifdef _WIN32
1276
+ /**
1277
+ * @brief A socket write operation would block, flag the socket
1278
+ * as blocked so that POLLOUT events are handled correctly.
1279
+ *
1280
+ * This is really only used on Windows where POLLOUT (FD_WRITE) is
1281
+ * edge-triggered rather than level-triggered.
1282
+ */
1283
+ void rd_kafka_transport_set_blocked(rd_kafka_transport_t *rktrans,
1284
+ rd_bool_t blocked) {
1285
+ rktrans->rktrans_blocked = blocked;
1286
+ }
1287
+ #endif
1288
+
1289
+
1290
+ #if 0
1291
+ /**
1292
+ * Global cleanup.
1293
+ * This is dangerous and SHOULD NOT be called since it will rip
1294
+ * the rug from under the application if it uses any of this functionality
1295
+ * in its own code. This means we might leak some memory on exit.
1296
+ */
1297
+ void rd_kafka_transport_term (void) {
1298
+ #ifdef _WIN32
1299
+ (void)WSACleanup(); /* FIXME: dangerous */
1300
+ #endif
1301
+ }
1302
+ #endif
1303
+
1304
+ void rd_kafka_transport_init(void) {
1305
+ #ifdef _WIN32
1306
+ WSADATA d;
1307
+ (void)WSAStartup(MAKEWORD(2, 2), &d);
1308
+ #endif
1309
+ }