@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,1010 @@
1
+ /*
2
+ * librdkafka - The Apache Kafka C/C++ library
3
+ *
4
+ * Copyright (c) 2020-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
+ /**
32
+ * @name Consumer assignment state.
33
+ *
34
+ * Responsible for managing the state of assigned partitions.
35
+ *
36
+ *
37
+ ******************************************************************************
38
+ * rd_kafka_assignment_serve()
39
+ * ---------------------------
40
+ *
41
+ * It is important to call rd_kafka_assignment_serve() after each change
42
+ * to the assignment through assignment_add, assignment_subtract or
43
+ * assignment_clear as those functions only modify the assignment but does
44
+ * not take any action to transition partitions to or from the assignment
45
+ * states.
46
+ *
47
+ * The reason assignment_serve() is not automatically called from these
48
+ * functions is for the caller to be able to set the current state before
49
+ * the side-effects of serve() kick in, such as the call to
50
+ * rd_kafka_cgrp_assignment_done() that in turn will set the cgrp state.
51
+ *
52
+ *
53
+ *
54
+ ******************************************************************************
55
+ * Querying for committed offsets (.queried list)
56
+ * ----------------------------------------------
57
+ *
58
+ * We only allow one outstanding query (fetch committed offset), this avoids
59
+ * complex handling of partitions that are assigned, unassigned and reassigned
60
+ * all within the window of a OffsetFetch request.
61
+ * Consider the following case:
62
+ *
63
+ * 1. tp1 and tp2 are incrementally assigned.
64
+ * 2. An OffsetFetchRequest is sent for tp1 and tp2
65
+ * 3. tp2 is incremental unassigned.
66
+ * 4. Broker sends OffsetFetchResponse with offsets tp1=10, tp2=20.
67
+ * 4. Some other consumer commits offsets 30 for tp2.
68
+ * 5. tp2 is incrementally assigned again.
69
+ * 6. The OffsetFetchResponse is received.
70
+ *
71
+ * Without extra handling the consumer would start fetching tp1 at offset 10
72
+ * (which is correct) and tp2 at offset 20 (which is incorrect, the last
73
+ * committed offset is now 30).
74
+ *
75
+ * To alleviate this situation we remove unassigned partitions from the
76
+ * .queried list, and in the OffsetFetch response handler we only use offsets
77
+ * for partitions that are on the .queried list.
78
+ *
79
+ * To make sure the tp1 offset is used and not re-queried we only allow
80
+ * one outstanding OffsetFetch request at the time, meaning that at step 5
81
+ * a new OffsetFetch request will not be sent and tp2 will remain in the
82
+ * .pending list until the outstanding OffsetFetch response is received in
83
+ * step 6. At this point tp2 will transition to .queried and a new
84
+ * OffsetFetch request will be sent.
85
+ *
86
+ * This explanation is more verbose than the code involved.
87
+ *
88
+ ******************************************************************************
89
+ *
90
+ *
91
+ * @remark Try to keep any cgrp state out of this file.
92
+ *
93
+ * FIXME: There are some pretty obvious optimizations that needs to be done here
94
+ * with regards to partition_list_t lookups. But we can do that when
95
+ * we know the current implementation works correctly.
96
+ */
97
+
98
+ #include "rdkafka_int.h"
99
+ #include "rdkafka_offset.h"
100
+ #include "rdkafka_request.h"
101
+
102
+
103
+ static void rd_kafka_assignment_dump(rd_kafka_t *rk) {
104
+ rd_kafka_dbg(rk, CGRP, "DUMP",
105
+ "Assignment dump (started_cnt=%d, wait_stop_cnt=%d)",
106
+ rk->rk_consumer.assignment.started_cnt,
107
+ rk->rk_consumer.assignment.wait_stop_cnt);
108
+
109
+ rd_kafka_topic_partition_list_log(rk, "DUMP_ALL", RD_KAFKA_DBG_CGRP,
110
+ rk->rk_consumer.assignment.all);
111
+
112
+ rd_kafka_topic_partition_list_log(rk, "DUMP_PND", RD_KAFKA_DBG_CGRP,
113
+ rk->rk_consumer.assignment.pending);
114
+
115
+ rd_kafka_topic_partition_list_log(rk, "DUMP_QRY", RD_KAFKA_DBG_CGRP,
116
+ rk->rk_consumer.assignment.queried);
117
+
118
+ rd_kafka_topic_partition_list_log(rk, "DUMP_REM", RD_KAFKA_DBG_CGRP,
119
+ rk->rk_consumer.assignment.removed);
120
+ }
121
+
122
+ /**
123
+ * @brief Apply the fetched committed offsets to the current assignment's
124
+ * queried partitions.
125
+ *
126
+ * @param err is the request-level error, if any. The caller is responsible
127
+ * for raising this error to the application. It is only used here
128
+ * to avoid taking actions.
129
+ *
130
+ * Called from the FetchOffsets response handler below.
131
+ */
132
+ static void
133
+ rd_kafka_assignment_apply_offsets(rd_kafka_t *rk,
134
+ rd_kafka_topic_partition_list_t *offsets,
135
+ rd_kafka_resp_err_t err) {
136
+ rd_kafka_topic_partition_t *rktpar;
137
+
138
+ RD_KAFKA_TPLIST_FOREACH(rktpar, offsets) {
139
+ /* May be NULL, borrow ref. */
140
+ rd_kafka_toppar_t *rktp =
141
+ rd_kafka_topic_partition_toppar(rk, rktpar);
142
+
143
+ if (!rd_kafka_topic_partition_list_del(
144
+ rk->rk_consumer.assignment.queried, rktpar->topic,
145
+ rktpar->partition)) {
146
+ rd_kafka_dbg(rk, CGRP, "OFFSETFETCH",
147
+ "Ignoring OffsetFetch "
148
+ "response for %s [%" PRId32
149
+ "] which is no "
150
+ "longer in the queried list "
151
+ "(possibly unassigned?)",
152
+ rktpar->topic, rktpar->partition);
153
+ continue;
154
+ }
155
+
156
+ if (err == RD_KAFKA_RESP_ERR_STALE_MEMBER_EPOCH ||
157
+ rktpar->err == RD_KAFKA_RESP_ERR_STALE_MEMBER_EPOCH) {
158
+ rd_kafka_topic_partition_t *rktpar_copy;
159
+
160
+ rd_kafka_dbg(rk, CGRP, "OFFSETFETCH",
161
+ "Adding %s [%" PRId32
162
+ "] back to pending "
163
+ "list because of stale member epoch",
164
+ rktpar->topic, rktpar->partition);
165
+
166
+ rktpar_copy = rd_kafka_topic_partition_list_add_copy(
167
+ rk->rk_consumer.assignment.pending, rktpar);
168
+ /* Need to reset offset to STORED to query for
169
+ * the committed offset again. If the offset is
170
+ * kept INVALID then auto.offset.reset will be
171
+ * triggered.
172
+ *
173
+ * Not necessary if err is UNSTABLE_OFFSET_COMMIT
174
+ * because the buffer is retried there. */
175
+ rktpar_copy->offset = RD_KAFKA_OFFSET_STORED;
176
+
177
+ } else if (err == RD_KAFKA_RESP_ERR_UNSTABLE_OFFSET_COMMIT ||
178
+ rktpar->err ==
179
+ RD_KAFKA_RESP_ERR_UNSTABLE_OFFSET_COMMIT) {
180
+ /* Ongoing transactions are blocking offset retrieval.
181
+ * This is typically retried from the OffsetFetch
182
+ * handler but we can come here if the assignment
183
+ * (and thus the assignment.version) was changed while
184
+ * the OffsetFetch request was in-flight, in which case
185
+ * we put this partition back on the pending list for
186
+ * later handling by the assignment state machine. */
187
+
188
+ rd_kafka_dbg(rk, CGRP, "OFFSETFETCH",
189
+ "Adding %s [%" PRId32
190
+ "] back to pending "
191
+ "list because on-going transaction is "
192
+ "blocking offset retrieval",
193
+ rktpar->topic, rktpar->partition);
194
+
195
+ rd_kafka_topic_partition_list_add_copy(
196
+ rk->rk_consumer.assignment.pending, rktpar);
197
+
198
+ } else if (rktpar->err) {
199
+ /* Partition-level error */
200
+ rd_kafka_consumer_err(
201
+ rk->rk_consumer.q, RD_KAFKA_NODEID_UA, rktpar->err,
202
+ 0, rktpar->topic, rktp, RD_KAFKA_OFFSET_INVALID,
203
+ "Failed to fetch committed offset for "
204
+ "group \"%s\" topic %s [%" PRId32 "]: %s",
205
+ rk->rk_group_id->str, rktpar->topic,
206
+ rktpar->partition, rd_kafka_err2str(rktpar->err));
207
+
208
+ /* The partition will not be added back to .pending
209
+ * and thus only reside on .all until the application
210
+ * unassigns it and possible re-assigns it. */
211
+
212
+ } else if (!err) {
213
+ /* If rktpar->offset is RD_KAFKA_OFFSET_INVALID it means
214
+ * there was no committed offset for this partition.
215
+ * serve_pending() will now start this partition
216
+ * since the offset is set to INVALID (rather than
217
+ * STORED) and the partition fetcher will employ
218
+ * auto.offset.reset to know what to do. */
219
+
220
+ /* Add partition to pending list where serve()
221
+ * will start the fetcher. */
222
+ rd_kafka_dbg(rk, CGRP, "OFFSETFETCH",
223
+ "Adding %s [%" PRId32
224
+ "] back to pending "
225
+ "list with offset %s",
226
+ rktpar->topic, rktpar->partition,
227
+ rd_kafka_offset2str(rktpar->offset));
228
+
229
+ rd_kafka_topic_partition_list_add_copy(
230
+ rk->rk_consumer.assignment.pending, rktpar);
231
+ }
232
+ /* Do nothing for request-level errors (err is set). */
233
+ }
234
+
235
+ /* In case of stale member epoch we retry to serve the
236
+ * assignment only after a successful ConsumerGroupHeartbeat. */
237
+ if (offsets->cnt > 0 && err != RD_KAFKA_RESP_ERR_STALE_MEMBER_EPOCH)
238
+ rd_kafka_assignment_serve(rk);
239
+ }
240
+
241
+
242
+
243
+ /**
244
+ * @brief Reply handler for OffsetFetch queries from the assignment code.
245
+ *
246
+ * @param opaque Is a malloced int64_t* containing the assignment version at the
247
+ * time of the request.
248
+ *
249
+ * @locality rdkafka main thread
250
+ */
251
+ static void rd_kafka_assignment_handle_OffsetFetch(rd_kafka_t *rk,
252
+ rd_kafka_broker_t *rkb,
253
+ rd_kafka_resp_err_t err,
254
+ rd_kafka_buf_t *reply,
255
+ rd_kafka_buf_t *request,
256
+ void *opaque) {
257
+ rd_kafka_topic_partition_list_t *offsets = NULL;
258
+ int64_t *req_assignment_version = (int64_t *)opaque;
259
+ /* Only allow retries if there's been no change to the assignment,
260
+ * otherwise rely on assignment state machine to retry. */
261
+ rd_bool_t allow_retry =
262
+ *req_assignment_version == rk->rk_consumer.assignment.version;
263
+
264
+ if (err == RD_KAFKA_RESP_ERR__DESTROY) {
265
+ /* Termination, quick cleanup. */
266
+ rd_free(req_assignment_version);
267
+ return;
268
+ }
269
+
270
+ err = rd_kafka_handle_OffsetFetch(
271
+ rk, rkb, err, reply, request, &offsets,
272
+ rd_true /* Update toppars */, rd_true /* Add parts */, allow_retry);
273
+ if (err == RD_KAFKA_RESP_ERR__IN_PROGRESS) {
274
+ if (offsets)
275
+ rd_kafka_topic_partition_list_destroy(offsets);
276
+ return; /* retrying */
277
+ }
278
+
279
+ rd_free(req_assignment_version);
280
+
281
+ /* offsets may be NULL for certain errors, such
282
+ * as ERR__TRANSPORT. */
283
+ if (!offsets && !allow_retry) {
284
+ rd_dassert(err);
285
+ if (!err)
286
+ err = RD_KAFKA_RESP_ERR__NO_OFFSET;
287
+
288
+ rd_kafka_dbg(rk, CGRP, "OFFSET", "Offset fetch error: %s",
289
+ rd_kafka_err2str(err));
290
+ rd_kafka_consumer_err(
291
+ rk->rk_consumer.q, rd_kafka_broker_id(rkb), err, 0, NULL,
292
+ NULL, RD_KAFKA_OFFSET_INVALID,
293
+ "Failed to fetch committed "
294
+ "offsets for partitions "
295
+ "in group \"%s\": %s",
296
+ rk->rk_group_id->str, rd_kafka_err2str(err));
297
+
298
+ return;
299
+ }
300
+
301
+ if (err) {
302
+ switch (err) {
303
+ case RD_KAFKA_RESP_ERR_STALE_MEMBER_EPOCH:
304
+ rk->rk_cgrp->rkcg_consumer_flags |=
305
+ RD_KAFKA_CGRP_CONSUMER_F_SERVE_PENDING;
306
+ rd_kafka_cgrp_consumer_expedite_next_heartbeat(
307
+ rk->rk_cgrp,
308
+ "OffsetFetch error: Stale member epoch");
309
+ break;
310
+ case RD_KAFKA_RESP_ERR_UNKNOWN_MEMBER_ID:
311
+ rd_kafka_cgrp_consumer_expedite_next_heartbeat(
312
+ rk->rk_cgrp, "OffsetFetch error: Unknown member");
313
+ break;
314
+ default:
315
+ rd_kafka_dbg(
316
+ rk, CGRP, "OFFSET",
317
+ "Offset fetch error for %d partition(s): %s",
318
+ offsets->cnt, rd_kafka_err2str(err));
319
+ rd_kafka_consumer_err(
320
+ rk->rk_consumer.q, rd_kafka_broker_id(rkb), err, 0,
321
+ NULL, NULL, RD_KAFKA_OFFSET_INVALID,
322
+ "Failed to fetch committed offsets for "
323
+ "%d partition(s) in group \"%s\": %s",
324
+ offsets->cnt, rk->rk_group_id->str,
325
+ rd_kafka_err2str(err));
326
+ }
327
+ }
328
+
329
+ /* Apply the fetched offsets to the assignment */
330
+ rd_kafka_assignment_apply_offsets(rk, offsets, err);
331
+
332
+ rd_kafka_topic_partition_list_destroy(offsets);
333
+ }
334
+
335
+
336
+ /**
337
+ * @brief Decommission all partitions in the removed list.
338
+ *
339
+ * @returns >0 if there are removal operations in progress, else 0.
340
+ */
341
+ static int rd_kafka_assignment_serve_removals(rd_kafka_t *rk) {
342
+ rd_kafka_topic_partition_t *rktpar;
343
+ int valid_offsets = 0;
344
+
345
+ RD_KAFKA_TPLIST_FOREACH(rktpar, rk->rk_consumer.assignment.removed) {
346
+ rd_kafka_toppar_t *rktp =
347
+ rd_kafka_topic_partition_ensure_toppar(
348
+ rk, rktpar, rd_true); /* Borrow ref */
349
+ int was_pending, was_queried;
350
+
351
+ /* Remove partition from pending and querying lists,
352
+ * if it happens to be there.
353
+ * Outstanding OffsetFetch query results will be ignored
354
+ * for partitions that are no longer on the .queried list. */
355
+ was_pending = rd_kafka_topic_partition_list_del(
356
+ rk->rk_consumer.assignment.pending, rktpar->topic,
357
+ rktpar->partition);
358
+ was_queried = rd_kafka_topic_partition_list_del(
359
+ rk->rk_consumer.assignment.queried, rktpar->topic,
360
+ rktpar->partition);
361
+
362
+ if (rktp->rktp_started) {
363
+ /* Partition was started, stop the fetcher. */
364
+ rd_assert(rk->rk_consumer.assignment.started_cnt > 0);
365
+
366
+ rd_kafka_toppar_op_fetch_stop(
367
+ rktp, RD_KAFKA_REPLYQ(rk->rk_ops, 0));
368
+ rk->rk_consumer.assignment.wait_stop_cnt++;
369
+ }
370
+
371
+ /* Reset the (lib) pause flag which may have been set by
372
+ * the cgrp when scheduling the rebalance callback. */
373
+ rd_kafka_toppar_op_pause_resume(rktp, rd_false /*resume*/,
374
+ RD_KAFKA_TOPPAR_F_LIB_PAUSE,
375
+ RD_KAFKA_NO_REPLYQ);
376
+
377
+ rd_kafka_toppar_lock(rktp);
378
+
379
+ /* Save the currently stored offset and epoch on .removed
380
+ * so it will be committed below. */
381
+ rd_kafka_topic_partition_set_from_fetch_pos(
382
+ rktpar, rktp->rktp_stored_pos);
383
+ rd_kafka_topic_partition_set_metadata_from_rktp_stored(rktpar,
384
+ rktp);
385
+ valid_offsets += !RD_KAFKA_OFFSET_IS_LOGICAL(rktpar->offset);
386
+
387
+ /* Reset the stored offset to invalid so that
388
+ * a manual offset-less commit() or the auto-committer
389
+ * will not commit a stored offset from a previous
390
+ * assignment (issue #2782). */
391
+ rd_kafka_offset_store0(
392
+ rktp, RD_KAFKA_FETCH_POS(RD_KAFKA_OFFSET_INVALID, -1), NULL,
393
+ 0, rd_true, RD_DONT_LOCK);
394
+
395
+ /* Partition is no longer desired */
396
+ rd_kafka_toppar_desired_del(rktp);
397
+
398
+ rd_assert((rktp->rktp_flags & RD_KAFKA_TOPPAR_F_ASSIGNED));
399
+ rktp->rktp_flags &= ~RD_KAFKA_TOPPAR_F_ASSIGNED;
400
+
401
+ rd_kafka_toppar_unlock(rktp);
402
+
403
+ rd_kafka_dbg(rk, CGRP, "REMOVE",
404
+ "Removing %s [%" PRId32
405
+ "] from assignment "
406
+ "(started=%s, pending=%s, queried=%s, "
407
+ "stored offset=%s)",
408
+ rktpar->topic, rktpar->partition,
409
+ RD_STR_ToF(rktp->rktp_started),
410
+ RD_STR_ToF(was_pending), RD_STR_ToF(was_queried),
411
+ rd_kafka_offset2str(rktpar->offset));
412
+ }
413
+
414
+ rd_kafka_dbg(rk, CONSUMER | RD_KAFKA_DBG_CGRP, "REMOVE",
415
+ "Served %d removed partition(s), "
416
+ "with %d offset(s) to commit",
417
+ rk->rk_consumer.assignment.removed->cnt, valid_offsets);
418
+
419
+ /* If enable.auto.commit=true:
420
+ * Commit final offsets to broker for the removed partitions,
421
+ * unless this is a consumer destruction with a close() call. */
422
+ if (valid_offsets > 0 &&
423
+ rk->rk_conf.offset_store_method == RD_KAFKA_OFFSET_METHOD_BROKER &&
424
+ rk->rk_cgrp && rk->rk_conf.enable_auto_commit &&
425
+ !rd_kafka_destroy_flags_no_consumer_close(rk))
426
+ rd_kafka_cgrp_assigned_offsets_commit(
427
+ rk->rk_cgrp, rk->rk_consumer.assignment.removed,
428
+ rd_false /* use offsets from .removed */,
429
+ "unassigned partitions");
430
+
431
+ rd_kafka_topic_partition_list_clear(rk->rk_consumer.assignment.removed);
432
+
433
+ return rk->rk_consumer.assignment.wait_stop_cnt +
434
+ rk->rk_consumer.wait_commit_cnt;
435
+ }
436
+
437
+
438
+ /**
439
+ * @brief Serve all partitions in the pending list.
440
+ *
441
+ * This either (asynchronously) queries the partition's committed offset, or
442
+ * if the start offset is known, starts the partition fetcher.
443
+ *
444
+ * @returns >0 if there are pending operations in progress for the current
445
+ * assignment, else 0.
446
+ */
447
+ static int rd_kafka_assignment_serve_pending(rd_kafka_t *rk) {
448
+ rd_kafka_topic_partition_list_t *partitions_to_query = NULL;
449
+ /* We can query committed offsets only if all of the following are true:
450
+ * - We have a group coordinator.
451
+ * - There are no outstanding commits (since we might need to
452
+ * read back those commits as our starting position).
453
+ * - There are no outstanding queries already (since we want to
454
+ * avoid using a earlier queries response for a partition that
455
+ * is unassigned and then assigned again).
456
+ */
457
+ rd_kafka_broker_t *coord =
458
+ rk->rk_cgrp ? rd_kafka_cgrp_get_coord(rk->rk_cgrp) : NULL;
459
+ rd_bool_t can_query_offsets =
460
+ coord && rk->rk_consumer.wait_commit_cnt == 0 &&
461
+ rk->rk_consumer.assignment.queried->cnt == 0;
462
+ int i;
463
+
464
+ if (can_query_offsets)
465
+ partitions_to_query = rd_kafka_topic_partition_list_new(
466
+ rk->rk_consumer.assignment.pending->cnt);
467
+
468
+ /* Scan the list backwards so removals are cheap (no array shuffle) */
469
+ for (i = rk->rk_consumer.assignment.pending->cnt - 1; i >= 0; i--) {
470
+ rd_kafka_topic_partition_t *rktpar =
471
+ &rk->rk_consumer.assignment.pending->elems[i];
472
+ /* Borrow ref */
473
+ rd_kafka_toppar_t *rktp =
474
+ rd_kafka_topic_partition_ensure_toppar(rk, rktpar, rd_true);
475
+
476
+ rd_assert(!rktp->rktp_started);
477
+
478
+ if (!RD_KAFKA_OFFSET_IS_LOGICAL(rktpar->offset) ||
479
+ rktpar->offset == RD_KAFKA_OFFSET_BEGINNING ||
480
+ rktpar->offset == RD_KAFKA_OFFSET_END ||
481
+ rktpar->offset == RD_KAFKA_OFFSET_INVALID ||
482
+ rktpar->offset <= RD_KAFKA_OFFSET_TAIL_BASE) {
483
+ /* The partition fetcher can handle absolute
484
+ * as well as beginning/end/tail start offsets, so we're
485
+ * ready to start the fetcher now.
486
+ * The INVALID offset means there was no committed
487
+ * offset and the partition fetcher will employ
488
+ * auto.offset.reset.
489
+ *
490
+ * Start fetcher for partition and forward partition's
491
+ * fetchq to consumer group's queue. */
492
+
493
+ rd_kafka_dbg(rk, CGRP, "SRVPEND",
494
+ "Starting pending assigned partition "
495
+ "%s [%" PRId32 "] at %s",
496
+ rktpar->topic, rktpar->partition,
497
+ rd_kafka_fetch_pos2str(
498
+ rd_kafka_topic_partition_get_fetch_pos(
499
+ rktpar)));
500
+
501
+ /* Reset the (lib) pause flag which may have been set by
502
+ * the cgrp when scheduling the rebalance callback. */
503
+ rd_kafka_toppar_op_pause_resume(
504
+ rktp, rd_false /*resume*/,
505
+ RD_KAFKA_TOPPAR_F_LIB_PAUSE, RD_KAFKA_NO_REPLYQ);
506
+
507
+ /* Start the fetcher */
508
+ rktp->rktp_started = rd_true;
509
+ rk->rk_consumer.assignment.started_cnt++;
510
+
511
+ rd_kafka_toppar_op_fetch_start(
512
+ rktp,
513
+ rd_kafka_topic_partition_get_fetch_pos(rktpar),
514
+ rk->rk_consumer.q, RD_KAFKA_NO_REPLYQ);
515
+
516
+
517
+ } else if (can_query_offsets) {
518
+ /* Else use the last committed offset for partition.
519
+ * We can't rely on any internal cached committed offset
520
+ * so we'll accumulate a list of partitions that need
521
+ * to be queried and then send FetchOffsetsRequest
522
+ * to the group coordinator. */
523
+
524
+ rd_dassert(!rd_kafka_topic_partition_list_find(
525
+ rk->rk_consumer.assignment.queried, rktpar->topic,
526
+ rktpar->partition));
527
+
528
+ rd_kafka_topic_partition_list_add_copy(
529
+ partitions_to_query, rktpar);
530
+
531
+ rd_kafka_topic_partition_list_add_copy(
532
+ rk->rk_consumer.assignment.queried, rktpar);
533
+
534
+ rd_kafka_dbg(rk, CGRP, "SRVPEND",
535
+ "Querying committed offset for pending "
536
+ "assigned partition %s [%" PRId32 "]",
537
+ rktpar->topic, rktpar->partition);
538
+
539
+
540
+ } else {
541
+ rd_kafka_dbg(
542
+ rk, CGRP, "SRVPEND",
543
+ "Pending assignment partition "
544
+ "%s [%" PRId32
545
+ "] can't fetch committed "
546
+ "offset yet "
547
+ "(cgrp state %s, awaiting %d commits, "
548
+ "%d partition(s) already being queried)",
549
+ rktpar->topic, rktpar->partition,
550
+ rk->rk_cgrp
551
+ ? rd_kafka_cgrp_state_names[rk->rk_cgrp
552
+ ->rkcg_state]
553
+ : "n/a",
554
+ rk->rk_consumer.wait_commit_cnt,
555
+ rk->rk_consumer.assignment.queried->cnt);
556
+
557
+ continue; /* Keep rktpar on pending list */
558
+ }
559
+
560
+ /* Remove rktpar from the pending list */
561
+ rd_kafka_topic_partition_list_del_by_idx(
562
+ rk->rk_consumer.assignment.pending, i);
563
+ }
564
+
565
+
566
+ if (!can_query_offsets) {
567
+ if (coord)
568
+ rd_kafka_broker_destroy(coord);
569
+ return rk->rk_consumer.assignment.pending->cnt +
570
+ rk->rk_consumer.assignment.queried->cnt;
571
+ }
572
+
573
+
574
+ if (partitions_to_query->cnt > 0) {
575
+ int64_t *req_assignment_version = rd_malloc(sizeof(int64_t));
576
+ *req_assignment_version = rk->rk_consumer.assignment.version;
577
+
578
+ rd_kafka_dbg(rk, CGRP, "OFFSETFETCH",
579
+ "Fetching committed offsets for "
580
+ "%d pending partition(s) in assignment",
581
+ partitions_to_query->cnt);
582
+
583
+ rd_kafka_OffsetFetchRequest(
584
+ coord, rk->rk_group_id->str, partitions_to_query, rd_false,
585
+ -1, NULL,
586
+ rk->rk_conf.isolation_level ==
587
+ RD_KAFKA_READ_COMMITTED /*require_stable_offsets*/,
588
+ 0, /* Timeout */
589
+ RD_KAFKA_REPLYQ(rk->rk_ops, 0),
590
+ rd_kafka_assignment_handle_OffsetFetch,
591
+ /* Must be freed by handler */
592
+ (void *)req_assignment_version);
593
+ }
594
+
595
+ if (coord)
596
+ rd_kafka_broker_destroy(coord);
597
+
598
+ rd_kafka_topic_partition_list_destroy(partitions_to_query);
599
+
600
+ return rk->rk_consumer.assignment.pending->cnt +
601
+ rk->rk_consumer.assignment.queried->cnt;
602
+ }
603
+
604
+
605
+
606
+ /**
607
+ * @brief Serve updates to the assignment.
608
+ *
609
+ * Call on:
610
+ * - assignment changes
611
+ * - wait_commit_cnt reaches 0
612
+ * - partition fetcher is stopped
613
+ */
614
+ void rd_kafka_assignment_serve(rd_kafka_t *rk) {
615
+ int inp_removals = 0;
616
+ int inp_pending = 0;
617
+
618
+ rd_kafka_assignment_dump(rk);
619
+
620
+ /* Serve any partitions that should be removed */
621
+ if (rk->rk_consumer.assignment.removed->cnt > 0)
622
+ inp_removals = rd_kafka_assignment_serve_removals(rk);
623
+
624
+ /* Serve any partitions in the pending list that need further action,
625
+ * unless we're waiting for a previous assignment change (an unassign
626
+ * in some form) to propagate, or outstanding offset commits
627
+ * to finish (since we might need the committed offsets as start
628
+ * offsets). */
629
+ if (rk->rk_consumer.assignment.wait_stop_cnt == 0 &&
630
+ rk->rk_consumer.wait_commit_cnt == 0 && inp_removals == 0 &&
631
+ rk->rk_consumer.assignment.pending->cnt > 0)
632
+ inp_pending = rd_kafka_assignment_serve_pending(rk);
633
+
634
+ if (inp_removals + inp_pending +
635
+ rk->rk_consumer.assignment.queried->cnt +
636
+ rk->rk_consumer.assignment.wait_stop_cnt +
637
+ rk->rk_consumer.wait_commit_cnt ==
638
+ 0) {
639
+ /* No assignment operations in progress,
640
+ * signal assignment done back to cgrp to let it
641
+ * transition to its next state if necessary.
642
+ * We may emit this signalling more than necessary and it is
643
+ * up to the cgrp to only take action if needed, based on its
644
+ * state. */
645
+ rd_kafka_cgrp_assignment_done(rk->rk_cgrp);
646
+ } else {
647
+ rd_kafka_dbg(rk, CGRP, "ASSIGNMENT",
648
+ "Current assignment of %d partition(s) "
649
+ "with %d pending adds, %d offset queries, "
650
+ "%d partitions awaiting stop and "
651
+ "%d offset commits in progress",
652
+ rk->rk_consumer.assignment.all->cnt, inp_pending,
653
+ rk->rk_consumer.assignment.queried->cnt,
654
+ rk->rk_consumer.assignment.wait_stop_cnt,
655
+ rk->rk_consumer.wait_commit_cnt);
656
+ }
657
+ }
658
+
659
+
660
+ /**
661
+ * @returns true if the current or previous assignment has operations in
662
+ * progress, such as waiting for partition fetchers to stop.
663
+ */
664
+ rd_bool_t rd_kafka_assignment_in_progress(rd_kafka_t *rk) {
665
+ return rk->rk_consumer.wait_commit_cnt > 0 ||
666
+ rk->rk_consumer.assignment.wait_stop_cnt > 0 ||
667
+ rk->rk_consumer.assignment.pending->cnt > 0 ||
668
+ rk->rk_consumer.assignment.queried->cnt > 0 ||
669
+ rk->rk_consumer.assignment.removed->cnt > 0;
670
+ }
671
+
672
+
673
+ /**
674
+ * @brief Clear the current assignment.
675
+ *
676
+ * @remark Make sure to call rd_kafka_assignment_serve() after successful
677
+ * return from this function.
678
+ *
679
+ * @returns the number of partitions removed.
680
+ */
681
+ int rd_kafka_assignment_clear(rd_kafka_t *rk) {
682
+ int cnt = rk->rk_consumer.assignment.all->cnt;
683
+
684
+ if (cnt == 0) {
685
+ rd_kafka_dbg(rk, CONSUMER | RD_KAFKA_DBG_CGRP, "CLEARASSIGN",
686
+ "No current assignment to clear");
687
+ return 0;
688
+ }
689
+
690
+ rd_kafka_dbg(rk, CONSUMER | RD_KAFKA_DBG_CGRP, "CLEARASSIGN",
691
+ "Clearing current assignment of %d partition(s)",
692
+ rk->rk_consumer.assignment.all->cnt);
693
+
694
+ rd_kafka_topic_partition_list_clear(rk->rk_consumer.assignment.pending);
695
+ rd_kafka_topic_partition_list_clear(rk->rk_consumer.assignment.queried);
696
+
697
+ rd_kafka_topic_partition_list_add_list(
698
+ rk->rk_consumer.assignment.removed, rk->rk_consumer.assignment.all);
699
+ rd_kafka_topic_partition_list_clear(rk->rk_consumer.assignment.all);
700
+
701
+ rk->rk_consumer.assignment.version++;
702
+
703
+ return cnt;
704
+ }
705
+
706
+
707
+ /**
708
+ * @brief Adds \p partitions to the current assignment.
709
+ *
710
+ * Will return error if trying to add a partition that is already in the
711
+ * assignment.
712
+ *
713
+ * @remark Make sure to call rd_kafka_assignment_serve() after successful
714
+ * return from this function.
715
+ */
716
+ rd_kafka_error_t *
717
+ rd_kafka_assignment_add(rd_kafka_t *rk,
718
+ rd_kafka_topic_partition_list_t *partitions) {
719
+ rd_bool_t was_empty = rk->rk_consumer.assignment.all->cnt == 0;
720
+ int i;
721
+
722
+ /* Make sure there are no duplicates, invalid partitions, or
723
+ * invalid offsets in the input partitions. */
724
+ rd_kafka_topic_partition_list_sort(partitions, NULL, NULL);
725
+
726
+ for (i = 0; i < partitions->cnt; i++) {
727
+ rd_kafka_topic_partition_t *rktpar = &partitions->elems[i];
728
+ const rd_kafka_topic_partition_t *prev =
729
+ i > 0 ? &partitions->elems[i - 1] : NULL;
730
+
731
+ if (RD_KAFKA_OFFSET_IS_LOGICAL(rktpar->offset) &&
732
+ rktpar->offset != RD_KAFKA_OFFSET_BEGINNING &&
733
+ rktpar->offset != RD_KAFKA_OFFSET_END &&
734
+ rktpar->offset != RD_KAFKA_OFFSET_STORED &&
735
+ rktpar->offset != RD_KAFKA_OFFSET_INVALID &&
736
+ rktpar->offset > RD_KAFKA_OFFSET_TAIL_BASE)
737
+ return rd_kafka_error_new(
738
+ RD_KAFKA_RESP_ERR__INVALID_ARG,
739
+ "%s [%" PRId32
740
+ "] has invalid start offset %" PRId64,
741
+ rktpar->topic, rktpar->partition, rktpar->offset);
742
+
743
+ if (prev && !rd_kafka_topic_partition_cmp(rktpar, prev))
744
+ return rd_kafka_error_new(
745
+ RD_KAFKA_RESP_ERR__INVALID_ARG,
746
+ "Duplicate %s [%" PRId32 "] in input list",
747
+ rktpar->topic, rktpar->partition);
748
+
749
+ if (rd_kafka_topic_partition_list_find(
750
+ rk->rk_consumer.assignment.all, rktpar->topic,
751
+ rktpar->partition))
752
+ return rd_kafka_error_new(RD_KAFKA_RESP_ERR__CONFLICT,
753
+ "%s [%" PRId32
754
+ "] is already part of the "
755
+ "current assignment",
756
+ rktpar->topic,
757
+ rktpar->partition);
758
+
759
+ /* Translate RD_KAFKA_OFFSET_INVALID to RD_KAFKA_OFFSET_STORED,
760
+ * i.e., read from committed offset, since we use INVALID
761
+ * internally to differentiate between querying for
762
+ * committed offset (STORED) and no committed offset (INVALID).
763
+ */
764
+ if (rktpar->offset == RD_KAFKA_OFFSET_INVALID)
765
+ rktpar->offset = RD_KAFKA_OFFSET_STORED;
766
+
767
+ /* Get toppar object for each partition.
768
+ * This is to make sure the rktp stays alive while unassigning
769
+ * any previous assignment in the call to
770
+ * assignment_clear() below. */
771
+ rd_kafka_topic_partition_ensure_toppar(rk, rktpar, rd_true);
772
+ }
773
+
774
+ /* Mark all partition objects as assigned and reset the stored
775
+ * offsets back to invalid in case it was explicitly stored during
776
+ * the time the partition was not assigned. */
777
+ for (i = 0; i < partitions->cnt; i++) {
778
+ rd_kafka_topic_partition_t *rktpar = &partitions->elems[i];
779
+ rd_kafka_toppar_t *rktp =
780
+ rd_kafka_topic_partition_ensure_toppar(rk, rktpar, rd_true);
781
+
782
+ rd_kafka_toppar_lock(rktp);
783
+
784
+ rd_assert(!(rktp->rktp_flags & RD_KAFKA_TOPPAR_F_ASSIGNED));
785
+ rktp->rktp_flags |= RD_KAFKA_TOPPAR_F_ASSIGNED;
786
+
787
+ /* Reset the stored offset to INVALID to avoid the race
788
+ * condition described in rdkafka_offset.h */
789
+ rd_kafka_offset_store0(
790
+ rktp, RD_KAFKA_FETCH_POS(RD_KAFKA_OFFSET_INVALID, -1), NULL,
791
+ 0, rd_true /* force */, RD_DONT_LOCK);
792
+
793
+ rd_kafka_toppar_unlock(rktp);
794
+ }
795
+
796
+
797
+ /* Add the new list of partitions to the current assignment.
798
+ * Only need to sort the final assignment if it was non-empty
799
+ * to begin with since \p partitions is sorted above. */
800
+ rd_kafka_topic_partition_list_add_list(rk->rk_consumer.assignment.all,
801
+ partitions);
802
+ if (!was_empty)
803
+ rd_kafka_topic_partition_list_sort(
804
+ rk->rk_consumer.assignment.all, NULL, NULL);
805
+
806
+ /* And add to .pending for serve_pending() to handle. */
807
+ rd_kafka_topic_partition_list_add_list(
808
+ rk->rk_consumer.assignment.pending, partitions);
809
+
810
+
811
+ rd_kafka_dbg(rk, CONSUMER | RD_KAFKA_DBG_CGRP, "ASSIGNMENT",
812
+ "Added %d partition(s) to assignment which "
813
+ "now consists of %d partition(s) where of %d are in "
814
+ "pending state and %d are being queried",
815
+ partitions->cnt, rk->rk_consumer.assignment.all->cnt,
816
+ rk->rk_consumer.assignment.pending->cnt,
817
+ rk->rk_consumer.assignment.queried->cnt);
818
+
819
+ rk->rk_consumer.assignment.version++;
820
+
821
+ return NULL;
822
+ }
823
+
824
+
825
+ /**
826
+ * @brief Remove \p partitions from the current assignment.
827
+ *
828
+ * Will return error if trying to remove a partition that is not in the
829
+ * assignment.
830
+ *
831
+ * @remark Make sure to call rd_kafka_assignment_serve() after successful
832
+ * return from this function.
833
+ */
834
+ rd_kafka_error_t *
835
+ rd_kafka_assignment_subtract(rd_kafka_t *rk,
836
+ rd_kafka_topic_partition_list_t *partitions) {
837
+ int i;
838
+ int matched_queried_partitions = 0;
839
+ int assignment_pre_cnt;
840
+
841
+ if (rk->rk_consumer.assignment.all->cnt == 0 && partitions->cnt > 0)
842
+ return rd_kafka_error_new(
843
+ RD_KAFKA_RESP_ERR__INVALID_ARG,
844
+ "Can't subtract from empty assignment");
845
+
846
+ /* Verify that all partitions in \p partitions are in the assignment
847
+ * before starting to modify the assignment. */
848
+ rd_kafka_topic_partition_list_sort(partitions, NULL, NULL);
849
+
850
+ for (i = 0; i < partitions->cnt; i++) {
851
+ rd_kafka_topic_partition_t *rktpar = &partitions->elems[i];
852
+
853
+ if (!rd_kafka_topic_partition_list_find(
854
+ rk->rk_consumer.assignment.all, rktpar->topic,
855
+ rktpar->partition))
856
+ return rd_kafka_error_new(
857
+ RD_KAFKA_RESP_ERR__INVALID_ARG,
858
+ "%s [%" PRId32
859
+ "] can't be unassigned since "
860
+ "it is not in the current assignment",
861
+ rktpar->topic, rktpar->partition);
862
+
863
+ rd_kafka_topic_partition_ensure_toppar(rk, rktpar, rd_true);
864
+ }
865
+
866
+
867
+ assignment_pre_cnt = rk->rk_consumer.assignment.all->cnt;
868
+
869
+ /* Remove partitions in reverse order to avoid excessive
870
+ * array shuffling of .all.
871
+ * Add the removed partitions to .pending for serve() to handle. */
872
+ for (i = partitions->cnt - 1; i >= 0; i--) {
873
+ const rd_kafka_topic_partition_t *rktpar =
874
+ &partitions->elems[i];
875
+
876
+ if (!rd_kafka_topic_partition_list_del(
877
+ rk->rk_consumer.assignment.all, rktpar->topic,
878
+ rktpar->partition))
879
+ RD_BUG("Removed partition %s [%" PRId32
880
+ "] not found "
881
+ "in assignment.all",
882
+ rktpar->topic, rktpar->partition);
883
+
884
+ if (rd_kafka_topic_partition_list_del(
885
+ rk->rk_consumer.assignment.queried, rktpar->topic,
886
+ rktpar->partition))
887
+ matched_queried_partitions++;
888
+ else
889
+ rd_kafka_topic_partition_list_del(
890
+ rk->rk_consumer.assignment.pending, rktpar->topic,
891
+ rktpar->partition);
892
+
893
+ /* Add to .removed list which will be served by
894
+ * serve_removals(). */
895
+ rd_kafka_topic_partition_list_add_copy(
896
+ rk->rk_consumer.assignment.removed, rktpar);
897
+ }
898
+
899
+ rd_kafka_dbg(rk, CGRP, "REMOVEASSIGN",
900
+ "Removed %d partition(s) "
901
+ "(%d with outstanding offset queries) from assignment "
902
+ "of %d partition(s)",
903
+ partitions->cnt, matched_queried_partitions,
904
+ assignment_pre_cnt);
905
+
906
+ if (rk->rk_consumer.assignment.all->cnt == 0) {
907
+ /* Some safe checking */
908
+ rd_assert(rk->rk_consumer.assignment.pending->cnt == 0);
909
+ rd_assert(rk->rk_consumer.assignment.queried->cnt == 0);
910
+ }
911
+
912
+ rk->rk_consumer.assignment.version++;
913
+
914
+ return NULL;
915
+ }
916
+
917
+
918
+ /**
919
+ * @brief Call when partition fetcher has stopped.
920
+ */
921
+ void rd_kafka_assignment_partition_stopped(rd_kafka_t *rk,
922
+ rd_kafka_toppar_t *rktp) {
923
+ rd_assert(rk->rk_consumer.assignment.wait_stop_cnt > 0);
924
+ rk->rk_consumer.assignment.wait_stop_cnt--;
925
+
926
+ rd_assert(rktp->rktp_started);
927
+ rktp->rktp_started = rd_false;
928
+
929
+ rd_assert(rk->rk_consumer.assignment.started_cnt > 0);
930
+ rk->rk_consumer.assignment.started_cnt--;
931
+
932
+ /* If this was the last partition we awaited stop for, serve the
933
+ * assignment to transition any existing assignment to the next state */
934
+ if (rk->rk_consumer.assignment.wait_stop_cnt == 0) {
935
+ rd_kafka_dbg(rk, CGRP, "STOPSERVE",
936
+ "All partitions awaiting stop are now "
937
+ "stopped: serving assignment");
938
+ rd_kafka_assignment_serve(rk);
939
+ }
940
+ }
941
+
942
+
943
+ /**
944
+ * @brief Pause fetching of the currently assigned partitions.
945
+ *
946
+ * Partitions will be resumed by calling rd_kafka_assignment_resume() or
947
+ * from either serve_removals() or serve_pending() above.
948
+ */
949
+ void rd_kafka_assignment_pause(rd_kafka_t *rk, const char *reason) {
950
+
951
+ if (rk->rk_consumer.assignment.all->cnt == 0)
952
+ return;
953
+
954
+ rd_kafka_dbg(rk, CGRP, "PAUSE",
955
+ "Pausing fetchers for %d assigned partition(s): %s",
956
+ rk->rk_consumer.assignment.all->cnt, reason);
957
+
958
+ rd_kafka_toppars_pause_resume(rk, rd_true /*pause*/, RD_ASYNC,
959
+ RD_KAFKA_TOPPAR_F_LIB_PAUSE,
960
+ rk->rk_consumer.assignment.all);
961
+ }
962
+
963
+ /**
964
+ * @brief Resume fetching of the currently assigned partitions which have
965
+ * previously been paused by rd_kafka_assignment_pause().
966
+ */
967
+ void rd_kafka_assignment_resume(rd_kafka_t *rk, const char *reason) {
968
+
969
+ if (rk->rk_consumer.assignment.all->cnt == 0)
970
+ return;
971
+
972
+ rd_kafka_dbg(rk, CGRP, "PAUSE",
973
+ "Resuming fetchers for %d assigned partition(s): %s",
974
+ rk->rk_consumer.assignment.all->cnt, reason);
975
+
976
+ rd_kafka_toppars_pause_resume(rk, rd_false /*resume*/, RD_ASYNC,
977
+ RD_KAFKA_TOPPAR_F_LIB_PAUSE,
978
+ rk->rk_consumer.assignment.all);
979
+ }
980
+
981
+
982
+
983
+ /**
984
+ * @brief Destroy assignment state (but not \p assignment itself)
985
+ */
986
+ void rd_kafka_assignment_destroy(rd_kafka_t *rk) {
987
+ if (!rk->rk_consumer.assignment.all)
988
+ return; /* rd_kafka_assignment_init() not called */
989
+ rd_kafka_topic_partition_list_destroy(rk->rk_consumer.assignment.all);
990
+ rd_kafka_topic_partition_list_destroy(
991
+ rk->rk_consumer.assignment.pending);
992
+ rd_kafka_topic_partition_list_destroy(
993
+ rk->rk_consumer.assignment.queried);
994
+ rd_kafka_topic_partition_list_destroy(
995
+ rk->rk_consumer.assignment.removed);
996
+ }
997
+
998
+
999
+ /**
1000
+ * @brief Initialize the assignment struct.
1001
+ */
1002
+ void rd_kafka_assignment_init(rd_kafka_t *rk) {
1003
+ rk->rk_consumer.assignment.all = rd_kafka_topic_partition_list_new(100);
1004
+ rk->rk_consumer.assignment.pending =
1005
+ rd_kafka_topic_partition_list_new(100);
1006
+ rk->rk_consumer.assignment.queried =
1007
+ rd_kafka_topic_partition_list_new(100);
1008
+ rk->rk_consumer.assignment.removed =
1009
+ rd_kafka_topic_partition_list_new(100);
1010
+ }