@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,1422 @@
1
+ /*
2
+ * librdkafka - The Apache Kafka C/C++ library
3
+ *
4
+ * Copyright (c) 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 Fetcher
33
+ *
34
+ */
35
+
36
+ #include "rdkafka_int.h"
37
+ #include "rdkafka_offset.h"
38
+ #include "rdkafka_msgset.h"
39
+ #include "rdkafka_fetcher.h"
40
+ #include "rdkafka_request.h"
41
+
42
+
43
+ /**
44
+ * Backoff the next Fetch request (due to error).
45
+ */
46
+ static void rd_kafka_broker_fetch_backoff(rd_kafka_broker_t *rkb,
47
+ rd_kafka_resp_err_t err) {
48
+ int backoff_ms = rkb->rkb_rk->rk_conf.fetch_error_backoff_ms;
49
+ rkb->rkb_ts_fetch_backoff = rd_clock() + (backoff_ms * 1000);
50
+ rd_rkb_dbg(rkb, FETCH, "BACKOFF", "Fetch backoff for %dms: %s",
51
+ backoff_ms, rd_kafka_err2str(err));
52
+ }
53
+
54
+ /**
55
+ * @brief Backoff the next Fetch for specific partition
56
+ *
57
+ * @returns the absolute backoff time (the current time for no backoff).
58
+ */
59
+ static rd_ts_t rd_kafka_toppar_fetch_backoff(rd_kafka_broker_t *rkb,
60
+ rd_kafka_toppar_t *rktp,
61
+ rd_kafka_resp_err_t err) {
62
+ int backoff_ms;
63
+
64
+ /* Don't back off on reaching end of partition */
65
+ if (err == RD_KAFKA_RESP_ERR__PARTITION_EOF) {
66
+ rktp->rktp_ts_fetch_backoff = 0;
67
+ return rd_clock(); /* Immediate: No practical backoff */
68
+ }
69
+
70
+ if (err == RD_KAFKA_RESP_ERR__QUEUE_FULL)
71
+ backoff_ms = rkb->rkb_rk->rk_conf.fetch_queue_backoff_ms;
72
+ else
73
+ backoff_ms = rkb->rkb_rk->rk_conf.fetch_error_backoff_ms;
74
+
75
+ if (unlikely(!backoff_ms)) {
76
+ rktp->rktp_ts_fetch_backoff = 0;
77
+ return rd_clock(); /* Immediate: No practical backoff */
78
+ }
79
+
80
+ /* Certain errors that may require manual intervention should have
81
+ * a longer backoff time. */
82
+ if (err == RD_KAFKA_RESP_ERR_TOPIC_AUTHORIZATION_FAILED)
83
+ backoff_ms = RD_MAX(1000, backoff_ms * 10);
84
+
85
+ rktp->rktp_ts_fetch_backoff = rd_clock() + (backoff_ms * 1000);
86
+
87
+ rd_rkb_dbg(rkb, FETCH, "BACKOFF",
88
+ "%s [%" PRId32 "]: Fetch backoff for %dms%s%s",
89
+ rktp->rktp_rkt->rkt_topic->str, rktp->rktp_partition,
90
+ backoff_ms, err ? ": " : "",
91
+ err ? rd_kafka_err2str(err) : "");
92
+
93
+ return rktp->rktp_ts_fetch_backoff;
94
+ }
95
+
96
+ /**
97
+ * @brief Handle preferred replica in fetch response.
98
+ *
99
+ * @locks rd_kafka_toppar_lock(rktp) and
100
+ * rd_kafka_rdlock(rk) must NOT be held.
101
+ *
102
+ * @locality broker thread
103
+ */
104
+ static void rd_kafka_fetch_preferred_replica_handle(rd_kafka_toppar_t *rktp,
105
+ rd_kafka_buf_t *rkbuf,
106
+ rd_kafka_broker_t *rkb,
107
+ int32_t preferred_id) {
108
+ const rd_ts_t one_minute = 60 * 1000 * 1000;
109
+ const rd_ts_t five_seconds = 5 * 1000 * 1000;
110
+ rd_kafka_broker_t *preferred_rkb;
111
+ rd_kafka_t *rk = rktp->rktp_rkt->rkt_rk;
112
+ rd_ts_t new_intvl =
113
+ rd_interval_immediate(&rktp->rktp_new_lease_intvl, one_minute, 0);
114
+
115
+ if (new_intvl < 0) {
116
+ /* In lieu of KIP-320, the toppar is delegated back to
117
+ * the leader in the event of an offset out-of-range
118
+ * error (KIP-392 error case #4) because this scenario
119
+ * implies the preferred replica is out-of-sync.
120
+ *
121
+ * If program execution reaches here, the leader has
122
+ * relatively quickly instructed the client back to
123
+ * a preferred replica, quite possibly the same one
124
+ * as before (possibly resulting from stale metadata),
125
+ * so we back off the toppar to slow down potential
126
+ * back-and-forth.
127
+ */
128
+
129
+ if (rd_interval_immediate(&rktp->rktp_new_lease_log_intvl,
130
+ one_minute, 0) > 0)
131
+ rd_rkb_log(rkb, LOG_NOTICE, "FETCH",
132
+ "%.*s [%" PRId32
133
+ "]: preferred replica "
134
+ "(%" PRId32
135
+ ") lease changing too quickly "
136
+ "(%" PRId64
137
+ "s < 60s): possibly due to "
138
+ "unavailable replica or stale cluster "
139
+ "state: backing off next fetch",
140
+ RD_KAFKAP_STR_PR(rktp->rktp_rkt->rkt_topic),
141
+ rktp->rktp_partition, preferred_id,
142
+ (one_minute - -new_intvl) / (1000 * 1000));
143
+
144
+ rd_kafka_toppar_fetch_backoff(rkb, rktp,
145
+ RD_KAFKA_RESP_ERR_NO_ERROR);
146
+ }
147
+
148
+ rd_kafka_rdlock(rk);
149
+ preferred_rkb = rd_kafka_broker_find_by_nodeid(rk, preferred_id);
150
+ rd_kafka_rdunlock(rk);
151
+
152
+ if (preferred_rkb) {
153
+ rd_interval_reset_to_now(&rktp->rktp_lease_intvl, 0);
154
+ rd_kafka_toppar_lock(rktp);
155
+ rd_kafka_toppar_broker_update(rktp, preferred_id, preferred_rkb,
156
+ "preferred replica updated");
157
+ rd_kafka_toppar_unlock(rktp);
158
+ rd_kafka_broker_destroy(preferred_rkb);
159
+ return;
160
+ }
161
+
162
+ if (rd_interval_immediate(&rktp->rktp_metadata_intvl, five_seconds, 0) >
163
+ 0) {
164
+ rd_rkb_log(rkb, LOG_NOTICE, "FETCH",
165
+ "%.*s [%" PRId32 "]: preferred replica (%" PRId32
166
+ ") "
167
+ "is unknown: refreshing metadata",
168
+ RD_KAFKAP_STR_PR(rktp->rktp_rkt->rkt_topic),
169
+ rktp->rktp_partition, preferred_id);
170
+
171
+ rd_kafka_metadata_refresh_brokers(
172
+ rktp->rktp_rkt->rkt_rk, NULL,
173
+ "preferred replica unavailable");
174
+ }
175
+
176
+ rd_kafka_toppar_fetch_backoff(rkb, rktp,
177
+ RD_KAFKA_RESP_ERR_REPLICA_NOT_AVAILABLE);
178
+ }
179
+
180
+
181
+ /**
182
+ * @brief Handle partition-specific Fetch error.
183
+ */
184
+ static void rd_kafka_fetch_reply_handle_partition_error(
185
+ rd_kafka_broker_t *rkb,
186
+ rd_kafka_toppar_t *rktp,
187
+ const struct rd_kafka_toppar_ver *tver,
188
+ rd_kafka_resp_err_t err,
189
+ int64_t HighwaterMarkOffset) {
190
+
191
+ rd_rkb_dbg(rkb, FETCH, "FETCHERR",
192
+ "%.*s [%" PRId32 "]: Fetch failed at %s: %s",
193
+ RD_KAFKAP_STR_PR(rktp->rktp_rkt->rkt_topic),
194
+ rktp->rktp_partition,
195
+ rd_kafka_fetch_pos2str(rktp->rktp_offsets.fetch_pos),
196
+ rd_kafka_err2name(err));
197
+
198
+ /* Some errors should be passed to the
199
+ * application while some handled by rdkafka */
200
+ switch (err) {
201
+ /* Errors handled by rdkafka */
202
+ case RD_KAFKA_RESP_ERR_OFFSET_NOT_AVAILABLE:
203
+ case RD_KAFKA_RESP_ERR_UNKNOWN_TOPIC_OR_PART:
204
+ case RD_KAFKA_RESP_ERR_LEADER_NOT_AVAILABLE:
205
+ case RD_KAFKA_RESP_ERR_NOT_LEADER_OR_FOLLOWER:
206
+ case RD_KAFKA_RESP_ERR_BROKER_NOT_AVAILABLE:
207
+ case RD_KAFKA_RESP_ERR_REPLICA_NOT_AVAILABLE:
208
+ case RD_KAFKA_RESP_ERR_KAFKA_STORAGE_ERROR:
209
+ case RD_KAFKA_RESP_ERR_UNKNOWN_LEADER_EPOCH:
210
+ case RD_KAFKA_RESP_ERR_FENCED_LEADER_EPOCH:
211
+ case RD_KAFKA_RESP_ERR_UNKNOWN_TOPIC_ID:
212
+ if (err == RD_KAFKA_RESP_ERR_OFFSET_NOT_AVAILABLE) {
213
+ /* Occurs when:
214
+ * - Msg exists on broker but
215
+ * offset > HWM, or:
216
+ * - HWM is >= offset, but msg not
217
+ * yet available at that offset
218
+ * (replica is out of sync).
219
+ * - partition leader is out of sync.
220
+ *
221
+ * Handle by requesting metadata update, changing back
222
+ * to the leader, and then retrying FETCH
223
+ * (with backoff).
224
+ */
225
+ rd_rkb_dbg(rkb, MSG, "FETCH",
226
+ "Topic %s [%" PRId32
227
+ "]: %s not "
228
+ "available on broker %" PRId32
229
+ " (leader %" PRId32
230
+ "): updating metadata and retrying",
231
+ rktp->rktp_rkt->rkt_topic->str,
232
+ rktp->rktp_partition,
233
+ rd_kafka_fetch_pos2str(
234
+ rktp->rktp_offsets.fetch_pos),
235
+ rktp->rktp_broker_id, rktp->rktp_leader_id);
236
+ }
237
+
238
+ if (err == RD_KAFKA_RESP_ERR_UNKNOWN_LEADER_EPOCH) {
239
+ rd_rkb_dbg(rkb, MSG | RD_KAFKA_DBG_CONSUMER, "FETCH",
240
+ "Topic %s [%" PRId32
241
+ "]: Fetch failed at %s: %s: broker %" PRId32
242
+ "has not yet caught up on latest metadata: "
243
+ "retrying",
244
+ rktp->rktp_rkt->rkt_topic->str,
245
+ rktp->rktp_partition,
246
+ rd_kafka_fetch_pos2str(
247
+ rktp->rktp_offsets.fetch_pos),
248
+ rd_kafka_err2str(err), rktp->rktp_broker_id);
249
+ }
250
+
251
+ if (rktp->rktp_broker_id != rktp->rktp_leader_id) {
252
+ rd_kafka_toppar_delegate_to_leader(rktp);
253
+ }
254
+ /* Request metadata information update*/
255
+ rd_kafka_toppar_leader_unavailable(rktp, "fetch", err);
256
+ break;
257
+
258
+ case RD_KAFKA_RESP_ERR_OFFSET_OUT_OF_RANGE: {
259
+ rd_kafka_fetch_pos_t err_pos;
260
+
261
+ if (rktp->rktp_broker_id != rktp->rktp_leader_id &&
262
+ rktp->rktp_offsets.fetch_pos.offset > HighwaterMarkOffset) {
263
+ rd_kafka_log(rkb->rkb_rk, LOG_WARNING, "FETCH",
264
+ "Topic %s [%" PRId32
265
+ "]: %s "
266
+ " out of range (HighwaterMark %" PRId64
267
+ " fetching from "
268
+ "broker %" PRId32 " (leader %" PRId32
269
+ "): reverting to leader",
270
+ rktp->rktp_rkt->rkt_topic->str,
271
+ rktp->rktp_partition,
272
+ rd_kafka_fetch_pos2str(
273
+ rktp->rktp_offsets.fetch_pos),
274
+ HighwaterMarkOffset, rktp->rktp_broker_id,
275
+ rktp->rktp_leader_id);
276
+
277
+ /* Out of range error cannot be taken as definitive
278
+ * when fetching from follower.
279
+ * Revert back to the leader in lieu of KIP-320.
280
+ */
281
+ rd_kafka_toppar_delegate_to_leader(rktp);
282
+ break;
283
+ }
284
+
285
+ /* Application error */
286
+ err_pos = rktp->rktp_offsets.fetch_pos;
287
+ rktp->rktp_offsets.fetch_pos.offset = RD_KAFKA_OFFSET_INVALID;
288
+ rktp->rktp_offsets.fetch_pos.leader_epoch = -1;
289
+ rd_kafka_offset_reset(rktp, rd_kafka_broker_id(rkb), err_pos,
290
+ err,
291
+ "fetch failed due to requested offset "
292
+ "not available on the broker");
293
+ } break;
294
+
295
+ case RD_KAFKA_RESP_ERR_TOPIC_AUTHORIZATION_FAILED:
296
+ /* If we're not authorized to access the
297
+ * topic mark it as errored to deny
298
+ * further Fetch requests. */
299
+ if (rktp->rktp_last_error != err) {
300
+ rd_kafka_consumer_err(
301
+ rktp->rktp_fetchq, rd_kafka_broker_id(rkb), err,
302
+ tver->version, NULL, rktp,
303
+ rktp->rktp_offsets.fetch_pos.offset,
304
+ "Fetch from broker %" PRId32 " failed: %s",
305
+ rd_kafka_broker_id(rkb), rd_kafka_err2str(err));
306
+ rktp->rktp_last_error = err;
307
+ }
308
+ break;
309
+
310
+
311
+ /* Application errors */
312
+ case RD_KAFKA_RESP_ERR__PARTITION_EOF:
313
+ if (rkb->rkb_rk->rk_conf.enable_partition_eof)
314
+ rd_kafka_consumer_err(
315
+ rktp->rktp_fetchq, rd_kafka_broker_id(rkb), err,
316
+ tver->version, NULL, rktp,
317
+ rktp->rktp_offsets.fetch_pos.offset,
318
+ "Fetch from broker %" PRId32
319
+ " reached end of "
320
+ "partition at offset %" PRId64
321
+ " (HighwaterMark %" PRId64 ")",
322
+ rd_kafka_broker_id(rkb),
323
+ rktp->rktp_offsets.fetch_pos.offset,
324
+ HighwaterMarkOffset);
325
+ break;
326
+
327
+ case RD_KAFKA_RESP_ERR_MSG_SIZE_TOO_LARGE:
328
+ default: /* and all other errors */
329
+ rd_dassert(tver->version > 0);
330
+ rd_kafka_consumer_err(
331
+ rktp->rktp_fetchq, rd_kafka_broker_id(rkb), err,
332
+ tver->version, NULL, rktp,
333
+ rktp->rktp_offsets.fetch_pos.offset,
334
+ "Fetch from broker %" PRId32 " failed at %s: %s",
335
+ rd_kafka_broker_id(rkb),
336
+ rd_kafka_fetch_pos2str(rktp->rktp_offsets.fetch_pos),
337
+ rd_kafka_err2str(err));
338
+ break;
339
+ }
340
+
341
+ /* Back off the next fetch for this partition */
342
+ rd_kafka_toppar_fetch_backoff(rkb, rktp, err);
343
+ }
344
+
345
+ static void rd_kafkap_Fetch_reply_tags_set_topic_cnt(
346
+ rd_kafkap_Fetch_reply_tags_t *reply_tags,
347
+ int32_t TopicCnt) {
348
+ reply_tags->TopicCnt = TopicCnt;
349
+ rd_dassert(!reply_tags->Topics);
350
+ reply_tags->Topics = rd_calloc(TopicCnt, sizeof(*reply_tags->Topics));
351
+ }
352
+
353
+ static void
354
+ rd_kafkap_Fetch_reply_tags_set_topic(rd_kafkap_Fetch_reply_tags_t *reply_tags,
355
+ int TopicIdx,
356
+ rd_kafka_Uuid_t TopicId,
357
+ int32_t PartitionCnt) {
358
+ reply_tags->Topics[TopicIdx].TopicId = TopicId;
359
+ reply_tags->Topics[TopicIdx].PartitionCnt = PartitionCnt;
360
+ rd_dassert(!reply_tags->Topics[TopicIdx].Partitions);
361
+ reply_tags->Topics[TopicIdx].Partitions = rd_calloc(
362
+ PartitionCnt, sizeof(*reply_tags->Topics[TopicIdx].Partitions));
363
+ }
364
+
365
+
366
+ static void
367
+ rd_kafkap_Fetch_reply_tags_destroy(rd_kafkap_Fetch_reply_tags_t *reply_tags) {
368
+ int i;
369
+ for (i = 0; i < reply_tags->TopicCnt; i++) {
370
+ RD_IF_FREE(reply_tags->Topics[i].Partitions, rd_free);
371
+ }
372
+ RD_IF_FREE(reply_tags->Topics, rd_free);
373
+ RD_IF_FREE(reply_tags->NodeEndpoints.NodeEndpoints, rd_free);
374
+ }
375
+
376
+ static int rd_kafkap_Fetch_reply_tags_partition_parse(
377
+ rd_kafka_buf_t *rkbuf,
378
+ uint64_t tagtype,
379
+ uint64_t taglen,
380
+ rd_kafkap_Fetch_reply_tags_Topic_t *TopicTags,
381
+ rd_kafkap_Fetch_reply_tags_Partition_t *PartitionTags) {
382
+ switch (tagtype) {
383
+ case 1: /* CurrentLeader */
384
+ if (rd_kafka_buf_read_CurrentLeader(
385
+ rkbuf, &PartitionTags->CurrentLeader) == -1)
386
+ goto err_parse;
387
+ TopicTags->partitions_with_leader_change_cnt++;
388
+ return 1;
389
+ default:
390
+ return 0;
391
+ }
392
+ err_parse:
393
+ return -1;
394
+ }
395
+
396
+ static int
397
+ rd_kafkap_Fetch_reply_tags_parse(rd_kafka_buf_t *rkbuf,
398
+ uint64_t tagtype,
399
+ uint64_t taglen,
400
+ rd_kafkap_Fetch_reply_tags_t *tags) {
401
+ switch (tagtype) {
402
+ case 0: /* NodeEndpoints */
403
+ if (rd_kafka_buf_read_NodeEndpoints(rkbuf,
404
+ &tags->NodeEndpoints) == -1)
405
+ goto err_parse;
406
+ return 1;
407
+ default:
408
+ return 0;
409
+ }
410
+ err_parse:
411
+ return -1;
412
+ }
413
+
414
+ static void
415
+ rd_kafka_handle_Fetch_metadata_update(rd_kafka_broker_t *rkb,
416
+ rd_kafkap_Fetch_reply_tags_t *FetchTags) {
417
+ if (FetchTags->topics_with_leader_change_cnt &&
418
+ FetchTags->NodeEndpoints.NodeEndpoints) {
419
+ rd_kafka_metadata_t *md = NULL;
420
+ rd_kafka_metadata_internal_t *mdi = NULL;
421
+ rd_tmpabuf_t tbuf;
422
+ int32_t nodeid;
423
+ rd_kafka_op_t *rko;
424
+ int i, changed_topic, changed_partition;
425
+
426
+ rd_kafka_broker_lock(rkb);
427
+ nodeid = rkb->rkb_nodeid;
428
+ rd_kafka_broker_unlock(rkb);
429
+
430
+ rd_tmpabuf_new(&tbuf, 0, rd_true /*assert on fail*/);
431
+ rd_tmpabuf_add_alloc(&tbuf, sizeof(*mdi));
432
+ rd_kafkap_leader_discovery_tmpabuf_add_alloc_brokers(
433
+ &tbuf, &FetchTags->NodeEndpoints);
434
+ rd_kafkap_leader_discovery_tmpabuf_add_alloc_topics(
435
+ &tbuf, FetchTags->topics_with_leader_change_cnt);
436
+ for (i = 0; i < FetchTags->TopicCnt; i++) {
437
+ if (!FetchTags->Topics[i]
438
+ .partitions_with_leader_change_cnt)
439
+ continue;
440
+ rd_kafkap_leader_discovery_tmpabuf_add_alloc_topic(
441
+ &tbuf, NULL,
442
+ FetchTags->Topics[i]
443
+ .partitions_with_leader_change_cnt);
444
+ }
445
+ rd_tmpabuf_finalize(&tbuf);
446
+
447
+ mdi = rd_tmpabuf_alloc(&tbuf, sizeof(*mdi));
448
+ md = &mdi->metadata;
449
+
450
+ rd_kafkap_leader_discovery_metadata_init(mdi, nodeid);
451
+
452
+ rd_kafkap_leader_discovery_set_brokers(
453
+ &tbuf, mdi, &FetchTags->NodeEndpoints);
454
+
455
+ rd_kafkap_leader_discovery_set_topic_cnt(
456
+ &tbuf, mdi, FetchTags->topics_with_leader_change_cnt);
457
+
458
+ changed_topic = 0;
459
+ for (i = 0; i < FetchTags->TopicCnt; i++) {
460
+ int j;
461
+ if (!FetchTags->Topics[i]
462
+ .partitions_with_leader_change_cnt)
463
+ continue;
464
+
465
+ rd_kafkap_leader_discovery_set_topic(
466
+ &tbuf, mdi, changed_topic,
467
+ FetchTags->Topics[i].TopicId, NULL,
468
+ FetchTags->Topics[i]
469
+ .partitions_with_leader_change_cnt);
470
+
471
+ changed_partition = 0;
472
+ for (j = 0; j < FetchTags->Topics[i].PartitionCnt;
473
+ j++) {
474
+ if (FetchTags->Topics[i]
475
+ .Partitions[j]
476
+ .CurrentLeader.LeaderId < 0)
477
+ continue;
478
+
479
+ rd_kafkap_Fetch_reply_tags_Partition_t
480
+ *Partition =
481
+ &FetchTags->Topics[i].Partitions[j];
482
+ rd_kafkap_leader_discovery_set_CurrentLeader(
483
+ &tbuf, mdi, changed_topic,
484
+ changed_partition, Partition->Partition,
485
+ &Partition->CurrentLeader);
486
+ changed_partition++;
487
+ }
488
+ changed_topic++;
489
+ }
490
+
491
+ rko = rd_kafka_op_new(RD_KAFKA_OP_METADATA_UPDATE);
492
+ rko->rko_u.metadata.md = md;
493
+ rko->rko_u.metadata.mdi = mdi;
494
+ rd_kafka_q_enq(rkb->rkb_rk->rk_ops, rko);
495
+ }
496
+ }
497
+
498
+ /**
499
+ * @brief Per-partition FetchResponse parsing and handling.
500
+ *
501
+ * @returns an error on buffer parse failure, else RD_KAFKA_RESP_ERR_NO_ERROR.
502
+ */
503
+ static rd_kafka_resp_err_t rd_kafka_fetch_reply_handle_partition(
504
+ rd_kafka_broker_t *rkb,
505
+ const rd_kafkap_str_t *topic,
506
+ rd_kafka_topic_t *rkt /*possibly NULL*/,
507
+ rd_kafka_buf_t *rkbuf,
508
+ rd_kafka_buf_t *request,
509
+ int16_t ErrorCode,
510
+ rd_kafkap_Fetch_reply_tags_Topic_t *TopicTags,
511
+ rd_kafkap_Fetch_reply_tags_Partition_t *PartitionTags) {
512
+ const int log_decode_errors = LOG_ERR;
513
+ struct rd_kafka_toppar_ver *tver, tver_skel;
514
+ rd_kafka_toppar_t *rktp = NULL;
515
+ rd_kafka_aborted_txns_t *aborted_txns = NULL;
516
+ rd_slice_t save_slice;
517
+ int32_t fetch_version;
518
+ struct {
519
+ int32_t Partition;
520
+ int16_t ErrorCode;
521
+ int64_t HighwaterMarkOffset;
522
+ int64_t LastStableOffset; /* v4 */
523
+ int64_t LogStartOffset; /* v5 */
524
+ int32_t MessageSetSize;
525
+ int32_t PreferredReadReplica; /* v11 */
526
+ } hdr;
527
+ rd_kafka_resp_err_t err;
528
+ int64_t end_offset;
529
+
530
+ rd_kafka_buf_read_i32(rkbuf, &hdr.Partition);
531
+ rd_kafka_buf_read_i16(rkbuf, &hdr.ErrorCode);
532
+ if (PartitionTags)
533
+ PartitionTags->Partition = hdr.Partition;
534
+ if (ErrorCode)
535
+ hdr.ErrorCode = ErrorCode;
536
+ rd_kafka_buf_read_i64(rkbuf, &hdr.HighwaterMarkOffset);
537
+
538
+ end_offset = hdr.HighwaterMarkOffset;
539
+
540
+ hdr.LastStableOffset = RD_KAFKA_OFFSET_INVALID;
541
+ hdr.LogStartOffset = RD_KAFKA_OFFSET_INVALID;
542
+ if (rd_kafka_buf_ApiVersion(request) >= 4) {
543
+ int32_t AbortedTxnCnt;
544
+ int k;
545
+ rd_kafka_buf_read_i64(rkbuf, &hdr.LastStableOffset);
546
+ if (rd_kafka_buf_ApiVersion(request) >= 5)
547
+ rd_kafka_buf_read_i64(rkbuf, &hdr.LogStartOffset);
548
+
549
+ rd_kafka_buf_read_arraycnt(rkbuf, &AbortedTxnCnt,
550
+ RD_KAFKAP_ABORTED_TRANSACTIONS_MAX);
551
+
552
+ if (rkb->rkb_rk->rk_conf.isolation_level ==
553
+ RD_KAFKA_READ_UNCOMMITTED) {
554
+
555
+ if (unlikely(AbortedTxnCnt > 0)) {
556
+ rd_rkb_log(rkb, LOG_ERR, "FETCH",
557
+ "%.*s [%" PRId32
558
+ "]: "
559
+ "%" PRId32
560
+ " aborted transaction(s) "
561
+ "encountered in READ_UNCOMMITTED "
562
+ "fetch response: ignoring.",
563
+ RD_KAFKAP_STR_PR(topic),
564
+ hdr.Partition, AbortedTxnCnt);
565
+ for (k = 0; k < AbortedTxnCnt; k++) {
566
+ rd_kafka_buf_skip(rkbuf, (8 + 8));
567
+ /* AbortedTransaction tags */
568
+ rd_kafka_buf_skip_tags(rkbuf);
569
+ }
570
+ }
571
+ } else {
572
+ /* Older brokers may return LSO -1,
573
+ * in which case we use the HWM. */
574
+ if (hdr.LastStableOffset >= 0)
575
+ end_offset = hdr.LastStableOffset;
576
+
577
+ if (AbortedTxnCnt > 0) {
578
+ aborted_txns =
579
+ rd_kafka_aborted_txns_new(AbortedTxnCnt);
580
+ for (k = 0; k < AbortedTxnCnt; k++) {
581
+ int64_t PID;
582
+ int64_t FirstOffset;
583
+ rd_kafka_buf_read_i64(rkbuf, &PID);
584
+ rd_kafka_buf_read_i64(rkbuf,
585
+ &FirstOffset);
586
+ /* AbortedTransaction tags */
587
+ rd_kafka_buf_skip_tags(rkbuf);
588
+ rd_kafka_aborted_txns_add(
589
+ aborted_txns, PID, FirstOffset);
590
+ }
591
+ rd_kafka_aborted_txns_sort(aborted_txns);
592
+ }
593
+ }
594
+ }
595
+
596
+ if (rd_kafka_buf_ApiVersion(request) >= 11)
597
+ rd_kafka_buf_read_i32(rkbuf, &hdr.PreferredReadReplica);
598
+ else
599
+ hdr.PreferredReadReplica = -1;
600
+ /* Compact Records Array */
601
+ rd_kafka_buf_read_arraycnt(rkbuf, &hdr.MessageSetSize, -1);
602
+
603
+ if (unlikely(hdr.MessageSetSize < 0))
604
+ rd_kafka_buf_parse_fail(
605
+ rkbuf,
606
+ "%.*s [%" PRId32 "]: invalid MessageSetSize %" PRId32,
607
+ RD_KAFKAP_STR_PR(topic), hdr.Partition, hdr.MessageSetSize);
608
+
609
+ /* Look up topic+partition */
610
+ if (likely(rkt != NULL)) {
611
+ rd_kafka_topic_rdlock(rkt);
612
+ rktp = rd_kafka_toppar_get(rkt, hdr.Partition,
613
+ 0 /*no ua-on-miss*/);
614
+ rd_kafka_topic_rdunlock(rkt);
615
+ }
616
+
617
+ if (unlikely(!rkt || !rktp)) {
618
+ rd_rkb_dbg(rkb, TOPIC, "UNKTOPIC",
619
+ "Received Fetch response (error %hu) for unknown "
620
+ "topic %.*s [%" PRId32 "]: ignoring",
621
+ hdr.ErrorCode, RD_KAFKAP_STR_PR(topic),
622
+ hdr.Partition);
623
+ rd_kafka_buf_skip(rkbuf, hdr.MessageSetSize);
624
+ goto done;
625
+ }
626
+
627
+ rd_kafka_toppar_lock(rktp);
628
+ rktp->rktp_lo_offset = hdr.LogStartOffset;
629
+ rktp->rktp_hi_offset = hdr.HighwaterMarkOffset;
630
+ /* Let the LastStable offset be the effective
631
+ * end_offset based on protocol version, that is:
632
+ * if connected to a broker that does not support
633
+ * LastStableOffset we use the HighwaterMarkOffset. */
634
+ rktp->rktp_ls_offset = end_offset;
635
+ rd_kafka_toppar_unlock(rktp);
636
+
637
+ if (hdr.PreferredReadReplica != -1) {
638
+
639
+ rd_kafka_fetch_preferred_replica_handle(
640
+ rktp, rkbuf, rkb, hdr.PreferredReadReplica);
641
+
642
+ if (unlikely(hdr.MessageSetSize != 0)) {
643
+ rd_rkb_log(rkb, LOG_WARNING, "FETCH",
644
+ "%.*s [%" PRId32
645
+ "]: Fetch response has both preferred read "
646
+ "replica and non-zero message set size: "
647
+ "%" PRId32 ": skipping messages",
648
+ RD_KAFKAP_STR_PR(rktp->rktp_rkt->rkt_topic),
649
+ rktp->rktp_partition, hdr.MessageSetSize);
650
+ rd_kafka_buf_skip(rkbuf, hdr.MessageSetSize);
651
+ }
652
+ goto done;
653
+ }
654
+
655
+ rd_kafka_toppar_lock(rktp);
656
+
657
+ /* Make sure toppar hasn't moved to another broker
658
+ * during the lifetime of the request. */
659
+ if (unlikely(rktp->rktp_broker != rkb)) {
660
+ rd_kafka_toppar_unlock(rktp);
661
+ rd_rkb_dbg(rkb, MSG, "FETCH",
662
+ "%.*s [%" PRId32
663
+ "]: partition broker has changed: "
664
+ "discarding fetch response",
665
+ RD_KAFKAP_STR_PR(topic), hdr.Partition);
666
+ rd_kafka_buf_skip(rkbuf, hdr.MessageSetSize);
667
+ goto done;
668
+ }
669
+
670
+ fetch_version = rktp->rktp_fetch_version;
671
+ rd_kafka_toppar_unlock(rktp);
672
+
673
+ /* Check if this Fetch is for an outdated fetch version,
674
+ * or the original rktp was removed and a new one
675
+ * created (due to partition count decreasing and
676
+ * then increasing again, which can happen in
677
+ * desynchronized clusters): if so ignore it. */
678
+ tver_skel.rktp = rktp;
679
+ tver = rd_list_find(request->rkbuf_rktp_vers, &tver_skel,
680
+ rd_kafka_toppar_ver_cmp);
681
+ rd_kafka_assert(NULL, tver);
682
+ if (tver->rktp != rktp || tver->version < fetch_version) {
683
+ rd_rkb_dbg(rkb, MSG, "DROP",
684
+ "%s [%" PRId32
685
+ "]: dropping outdated fetch response "
686
+ "(v%d < %d or old rktp)",
687
+ rktp->rktp_rkt->rkt_topic->str, rktp->rktp_partition,
688
+ tver->version, fetch_version);
689
+ rd_atomic64_add(&rktp->rktp_c.rx_ver_drops, 1);
690
+ rd_kafka_buf_skip(rkbuf, hdr.MessageSetSize);
691
+ goto done;
692
+ }
693
+
694
+ rd_rkb_dbg(rkb, MSG, "FETCH",
695
+ "Topic %.*s [%" PRId32 "] MessageSet size %" PRId32
696
+ ", error \"%s\", MaxOffset %" PRId64 ", LSO %" PRId64
697
+ ", Ver %" PRId32 "/%" PRId32,
698
+ RD_KAFKAP_STR_PR(topic), hdr.Partition, hdr.MessageSetSize,
699
+ rd_kafka_err2str(hdr.ErrorCode), hdr.HighwaterMarkOffset,
700
+ hdr.LastStableOffset, tver->version, fetch_version);
701
+
702
+ /* If this is the last message of the queue,
703
+ * signal EOF back to the application. */
704
+ if (end_offset == rktp->rktp_offsets.fetch_pos.offset &&
705
+ rktp->rktp_offsets.eof_offset != end_offset) {
706
+ hdr.ErrorCode = RD_KAFKA_RESP_ERR__PARTITION_EOF;
707
+ rktp->rktp_offsets.eof_offset = end_offset;
708
+ }
709
+
710
+ if (unlikely(hdr.ErrorCode != RD_KAFKA_RESP_ERR_NO_ERROR)) {
711
+ /* Handle partition-level errors. */
712
+ rd_kafka_fetch_reply_handle_partition_error(
713
+ rkb, rktp, tver, hdr.ErrorCode, hdr.HighwaterMarkOffset);
714
+
715
+ rd_kafka_buf_skip(rkbuf, hdr.MessageSetSize);
716
+ goto done;
717
+ }
718
+
719
+ /* No error, clear any previous fetch error. */
720
+ rktp->rktp_last_error = RD_KAFKA_RESP_ERR_NO_ERROR;
721
+
722
+ if (unlikely(hdr.MessageSetSize <= 0))
723
+ goto done;
724
+
725
+ /**
726
+ * Parse MessageSet
727
+ */
728
+ if (!rd_slice_narrow_relative(&rkbuf->rkbuf_reader, &save_slice,
729
+ (size_t)hdr.MessageSetSize))
730
+ rd_kafka_buf_check_len(rkbuf, hdr.MessageSetSize);
731
+
732
+ /* Parse messages */
733
+ err = rd_kafka_msgset_parse(rkbuf, request, rktp, aborted_txns, tver);
734
+
735
+
736
+ rd_slice_widen(&rkbuf->rkbuf_reader, &save_slice);
737
+ /* Continue with next partition regardless of
738
+ * parse errors (which are partition-specific) */
739
+
740
+ /* On error: back off the fetcher for this partition */
741
+ if (unlikely(err))
742
+ rd_kafka_toppar_fetch_backoff(rkb, rktp, err);
743
+
744
+ goto done;
745
+
746
+ err_parse:
747
+ if (aborted_txns)
748
+ rd_kafka_aborted_txns_destroy(aborted_txns);
749
+ if (rktp)
750
+ rd_kafka_toppar_destroy(rktp); /*from get()*/
751
+ return rkbuf->rkbuf_err;
752
+
753
+ done:
754
+ if (aborted_txns)
755
+ rd_kafka_aborted_txns_destroy(aborted_txns);
756
+ if (likely(rktp != NULL))
757
+ rd_kafka_toppar_destroy(rktp); /*from get()*/
758
+
759
+ if (PartitionTags) {
760
+ /* Set default LeaderId and LeaderEpoch */
761
+ PartitionTags->CurrentLeader.LeaderId = -1;
762
+ PartitionTags->CurrentLeader.LeaderEpoch = -1;
763
+ }
764
+ rd_kafka_buf_read_tags(rkbuf,
765
+ rd_kafkap_Fetch_reply_tags_partition_parse,
766
+ TopicTags, PartitionTags);
767
+
768
+ return RD_KAFKA_RESP_ERR_NO_ERROR;
769
+ }
770
+
771
+ /**
772
+ * Parses and handles a Fetch reply.
773
+ * Returns 0 on success or an error code on failure.
774
+ */
775
+ static rd_kafka_resp_err_t
776
+ rd_kafka_fetch_reply_handle(rd_kafka_broker_t *rkb,
777
+ rd_kafka_buf_t *rkbuf,
778
+ rd_kafka_buf_t *request) {
779
+ int32_t TopicArrayCnt;
780
+ int i;
781
+ const int log_decode_errors = LOG_ERR;
782
+ rd_kafka_topic_t *rkt = NULL;
783
+ int16_t ErrorCode = RD_KAFKA_RESP_ERR_NO_ERROR;
784
+ rd_kafkap_Fetch_reply_tags_t FetchTags = RD_ZERO_INIT;
785
+ rd_bool_t has_fetch_tags = rd_false;
786
+
787
+ if (rd_kafka_buf_ApiVersion(request) >= 1) {
788
+ int32_t Throttle_Time;
789
+ rd_kafka_buf_read_i32(rkbuf, &Throttle_Time);
790
+
791
+ rd_kafka_op_throttle_time(rkb, rkb->rkb_rk->rk_rep,
792
+ Throttle_Time);
793
+ }
794
+
795
+ if (rd_kafka_buf_ApiVersion(request) >= 7) {
796
+ int32_t SessionId;
797
+ rd_kafka_buf_read_i16(rkbuf, &ErrorCode);
798
+ rd_kafka_buf_read_i32(rkbuf, &SessionId);
799
+ }
800
+
801
+ rd_kafka_buf_read_arraycnt(rkbuf, &TopicArrayCnt, RD_KAFKAP_TOPICS_MAX);
802
+ /* Verify that TopicArrayCnt seems to be in line with remaining size */
803
+ rd_kafka_buf_check_len(rkbuf,
804
+ TopicArrayCnt * (3 /*topic min size*/ +
805
+ 4 /*PartitionArrayCnt*/ + 4 +
806
+ 2 + 8 + 4 /*inner header*/));
807
+
808
+ if (rd_kafka_buf_ApiVersion(request) >= 12) {
809
+ has_fetch_tags = rd_true;
810
+ rd_kafkap_Fetch_reply_tags_set_topic_cnt(&FetchTags,
811
+ TopicArrayCnt);
812
+ }
813
+
814
+ for (i = 0; i < TopicArrayCnt; i++) {
815
+ rd_kafkap_str_t topic = RD_ZERO_INIT;
816
+ rd_kafka_Uuid_t topic_id = RD_KAFKA_UUID_ZERO;
817
+ int32_t PartitionArrayCnt;
818
+ int j;
819
+
820
+ if (rd_kafka_buf_ApiVersion(request) > 12) {
821
+ rd_kafka_buf_read_uuid(rkbuf, &topic_id);
822
+ rkt = rd_kafka_topic_find_by_topic_id(rkb->rkb_rk,
823
+ topic_id);
824
+ if (rkt)
825
+ topic = *rkt->rkt_topic;
826
+ } else {
827
+ rd_kafka_buf_read_str(rkbuf, &topic);
828
+ rkt = rd_kafka_topic_find0(rkb->rkb_rk, &topic);
829
+ }
830
+
831
+ rd_kafka_buf_read_arraycnt(rkbuf, &PartitionArrayCnt,
832
+ RD_KAFKAP_PARTITIONS_MAX);
833
+ if (rd_kafka_buf_ApiVersion(request) >= 12) {
834
+ rd_kafkap_Fetch_reply_tags_set_topic(
835
+ &FetchTags, i, topic_id, PartitionArrayCnt);
836
+ }
837
+
838
+ for (j = 0; j < PartitionArrayCnt; j++) {
839
+ if (rd_kafka_fetch_reply_handle_partition(
840
+ rkb, &topic, rkt, rkbuf, request, ErrorCode,
841
+ has_fetch_tags ? &FetchTags.Topics[i] : NULL,
842
+ has_fetch_tags
843
+ ? &FetchTags.Topics[i].Partitions[j]
844
+ : NULL))
845
+ goto err_parse;
846
+ }
847
+ if (has_fetch_tags &&
848
+ FetchTags.Topics[i].partitions_with_leader_change_cnt) {
849
+ FetchTags.topics_with_leader_change_cnt++;
850
+ }
851
+
852
+ if (rkt) {
853
+ rd_kafka_topic_destroy0(rkt);
854
+ rkt = NULL;
855
+ }
856
+ /* Topic Tags */
857
+ rd_kafka_buf_skip_tags(rkbuf);
858
+ }
859
+
860
+ /* Top level tags */
861
+ rd_kafka_buf_read_tags(rkbuf, rd_kafkap_Fetch_reply_tags_parse,
862
+ &FetchTags);
863
+
864
+ if (rd_kafka_buf_read_remain(rkbuf) != 0) {
865
+ rd_kafka_buf_parse_fail(rkbuf,
866
+ "Remaining data after message set "
867
+ "parse: %" PRIusz " bytes",
868
+ rd_kafka_buf_read_remain(rkbuf));
869
+ RD_NOTREACHED();
870
+ }
871
+ rd_kafka_handle_Fetch_metadata_update(rkb, &FetchTags);
872
+ rd_kafkap_Fetch_reply_tags_destroy(&FetchTags);
873
+
874
+ return 0;
875
+
876
+ err_parse:
877
+ if (rkt)
878
+ rd_kafka_topic_destroy0(rkt);
879
+ rd_kafkap_Fetch_reply_tags_destroy(&FetchTags);
880
+ rd_rkb_dbg(rkb, MSG, "BADMSG",
881
+ "Bad message (Fetch v%d): "
882
+ "is broker.version.fallback incorrectly set?",
883
+ (int)request->rkbuf_reqhdr.ApiVersion);
884
+ return rkbuf->rkbuf_err;
885
+ }
886
+
887
+
888
+
889
+ /**
890
+ * @broker FetchResponse handling.
891
+ *
892
+ * @locality broker thread (or any thread if err == __DESTROY).
893
+ */
894
+ static void rd_kafka_broker_fetch_reply(rd_kafka_t *rk,
895
+ rd_kafka_broker_t *rkb,
896
+ rd_kafka_resp_err_t err,
897
+ rd_kafka_buf_t *reply,
898
+ rd_kafka_buf_t *request,
899
+ void *opaque) {
900
+
901
+ if (err == RD_KAFKA_RESP_ERR__DESTROY)
902
+ return; /* Terminating */
903
+
904
+ rd_kafka_assert(rkb->rkb_rk, rkb->rkb_fetching > 0);
905
+ rkb->rkb_fetching = 0;
906
+
907
+ /* Parse and handle the messages (unless the request errored) */
908
+ if (!err && reply)
909
+ err = rd_kafka_fetch_reply_handle(rkb, reply, request);
910
+
911
+ if (unlikely(err)) {
912
+ char tmp[128];
913
+
914
+ rd_rkb_dbg(rkb, MSG, "FETCH", "Fetch reply: %s",
915
+ rd_kafka_err2str(err));
916
+ switch (err) {
917
+ case RD_KAFKA_RESP_ERR_UNKNOWN_TOPIC_OR_PART:
918
+ case RD_KAFKA_RESP_ERR_LEADER_NOT_AVAILABLE:
919
+ case RD_KAFKA_RESP_ERR_NOT_LEADER_FOR_PARTITION:
920
+ case RD_KAFKA_RESP_ERR_BROKER_NOT_AVAILABLE:
921
+ case RD_KAFKA_RESP_ERR_REPLICA_NOT_AVAILABLE:
922
+ case RD_KAFKA_RESP_ERR_UNKNOWN_TOPIC_ID:
923
+ /* Request metadata information update */
924
+ rd_snprintf(tmp, sizeof(tmp), "FetchRequest failed: %s",
925
+ rd_kafka_err2str(err));
926
+ rd_kafka_metadata_refresh_known_topics(
927
+ rkb->rkb_rk, NULL, rd_true /*force*/, tmp);
928
+ /* FALLTHRU */
929
+
930
+ case RD_KAFKA_RESP_ERR__TRANSPORT:
931
+ case RD_KAFKA_RESP_ERR_REQUEST_TIMED_OUT:
932
+ case RD_KAFKA_RESP_ERR__MSG_TIMED_OUT:
933
+ /* The fetch is already intervalled from
934
+ * consumer_serve() so dont retry. */
935
+ break;
936
+
937
+ default:
938
+ break;
939
+ }
940
+
941
+ rd_kafka_broker_fetch_backoff(rkb, err);
942
+ /* FALLTHRU */
943
+ }
944
+ }
945
+
946
+ /**
947
+ * @brief Check if any toppars have a zero topic id.
948
+ *
949
+ */
950
+ static rd_bool_t can_use_topic_ids(rd_kafka_broker_t *rkb) {
951
+ rd_kafka_toppar_t *rktp = rkb->rkb_active_toppar_next;
952
+ do {
953
+ if (RD_KAFKA_UUID_IS_ZERO(rktp->rktp_rkt->rkt_topic_id))
954
+ return rd_false;
955
+ } while ((rktp = CIRCLEQ_LOOP_NEXT(&rkb->rkb_active_toppars, rktp,
956
+ rktp_activelink)) !=
957
+ rkb->rkb_active_toppar_next);
958
+
959
+ return rd_true;
960
+ }
961
+
962
+ /**
963
+ * @brief Build and send a Fetch request message for all underflowed toppars
964
+ * for a specific broker.
965
+ *
966
+ * @returns the number of partitions included in the FetchRequest, if any.
967
+ *
968
+ * @locality broker thread
969
+ */
970
+ int rd_kafka_broker_fetch_toppars(rd_kafka_broker_t *rkb, rd_ts_t now) {
971
+ rd_kafka_toppar_t *rktp;
972
+ rd_kafka_buf_t *rkbuf;
973
+ int cnt = 0;
974
+ size_t of_TopicArrayCnt = 0;
975
+ int TopicArrayCnt = 0;
976
+ size_t of_PartitionArrayCnt = 0;
977
+ int PartitionArrayCnt = 0;
978
+ rd_kafka_topic_t *rkt_last = NULL;
979
+ int16_t ApiVersion = 0;
980
+
981
+ /* Create buffer and segments:
982
+ * 1 x ReplicaId MaxWaitTime MinBytes TopicArrayCnt
983
+ * N x topic name
984
+ * N x PartitionArrayCnt Partition FetchOffset MaxBytes
985
+ * where N = number of toppars.
986
+ * Since we dont keep track of the number of topics served by
987
+ * this broker, only the partition count, we do a worst-case calc
988
+ * when allocating and assume each partition is on its own topic
989
+ */
990
+
991
+ if (unlikely(rkb->rkb_active_toppar_cnt == 0))
992
+ return 0;
993
+
994
+ ApiVersion = rd_kafka_broker_ApiVersion_supported(rkb, RD_KAFKAP_Fetch,
995
+ 0, 16, NULL);
996
+
997
+ /* Fallback to version 12 if topic id is null which can happen if
998
+ * inter.broker.protocol.version is < 2.8 */
999
+ if (ApiVersion > 12 && !can_use_topic_ids(rkb))
1000
+ ApiVersion = 12;
1001
+
1002
+ rkbuf = rd_kafka_buf_new_flexver_request(
1003
+ rkb, RD_KAFKAP_Fetch, 1,
1004
+ /* MaxWaitTime+MinBytes+MaxBytes+IsolationLevel+
1005
+ * SessionId+Epoch+TopicCnt */
1006
+ 4 + 4 + 4 + 1 + 4 + 4 + 4 +
1007
+ /* N x PartCnt+Partition+CurrentLeaderEpoch+FetchOffset+
1008
+ * LastFetchedEpoch+LogStartOffset+MaxBytes+?TopicNameLen?*/
1009
+ (rkb->rkb_active_toppar_cnt *
1010
+ (4 + 4 + 4 + 8 + 4 + 8 + 4 + 40)) +
1011
+ /* ForgottenTopicsCnt */
1012
+ 4 +
1013
+ /* N x ForgottenTopicsData */
1014
+ 0,
1015
+ ApiVersion >= 12);
1016
+
1017
+ if (rkb->rkb_features & RD_KAFKA_FEATURE_MSGVER2)
1018
+ rd_kafka_buf_ApiVersion_set(rkbuf, ApiVersion,
1019
+ RD_KAFKA_FEATURE_MSGVER2);
1020
+ else if (rkb->rkb_features & RD_KAFKA_FEATURE_MSGVER1)
1021
+ rd_kafka_buf_ApiVersion_set(rkbuf, ApiVersion,
1022
+ RD_KAFKA_FEATURE_MSGVER1);
1023
+ else if (rkb->rkb_features & RD_KAFKA_FEATURE_THROTTLETIME)
1024
+ rd_kafka_buf_ApiVersion_set(rkbuf, ApiVersion,
1025
+ RD_KAFKA_FEATURE_THROTTLETIME);
1026
+
1027
+
1028
+ /* FetchRequest header */
1029
+ if (rd_kafka_buf_ApiVersion(rkbuf) <= 14)
1030
+ /* ReplicaId */
1031
+ rd_kafka_buf_write_i32(rkbuf, -1);
1032
+
1033
+ /* MaxWaitTime */
1034
+ rd_kafka_buf_write_i32(rkbuf, rkb->rkb_rk->rk_conf.fetch_wait_max_ms);
1035
+ /* MinBytes */
1036
+ rd_kafka_buf_write_i32(rkbuf, rkb->rkb_rk->rk_conf.fetch_min_bytes);
1037
+
1038
+ if (rd_kafka_buf_ApiVersion(rkbuf) >= 3)
1039
+ /* MaxBytes */
1040
+ rd_kafka_buf_write_i32(rkbuf,
1041
+ rkb->rkb_rk->rk_conf.fetch_max_bytes);
1042
+
1043
+ if (rd_kafka_buf_ApiVersion(rkbuf) >= 4)
1044
+ /* IsolationLevel */
1045
+ rd_kafka_buf_write_i8(rkbuf,
1046
+ rkb->rkb_rk->rk_conf.isolation_level);
1047
+
1048
+ if (rd_kafka_buf_ApiVersion(rkbuf) >= 7) {
1049
+ /* SessionId */
1050
+ rd_kafka_buf_write_i32(rkbuf, 0);
1051
+ /* Epoch */
1052
+ rd_kafka_buf_write_i32(rkbuf, -1);
1053
+ }
1054
+
1055
+ /* Write zero TopicArrayCnt but store pointer for later update */
1056
+ of_TopicArrayCnt = rd_kafka_buf_write_arraycnt_pos(rkbuf);
1057
+
1058
+ /* Prepare map for storing the fetch version for each partition,
1059
+ * this will later be checked in Fetch response to purge outdated
1060
+ * responses (e.g., after a seek). */
1061
+ rkbuf->rkbuf_rktp_vers =
1062
+ rd_list_new(0, (void *)rd_kafka_toppar_ver_destroy);
1063
+ rd_list_prealloc_elems(rkbuf->rkbuf_rktp_vers,
1064
+ sizeof(struct rd_kafka_toppar_ver),
1065
+ rkb->rkb_active_toppar_cnt, 0);
1066
+
1067
+ /* Round-robin start of the list. */
1068
+ rktp = rkb->rkb_active_toppar_next;
1069
+ do {
1070
+ struct rd_kafka_toppar_ver *tver;
1071
+
1072
+ if (rkt_last != rktp->rktp_rkt) {
1073
+ if (rkt_last != NULL) {
1074
+ /* Update PartitionArrayCnt */
1075
+ rd_kafka_buf_finalize_arraycnt(
1076
+ rkbuf, of_PartitionArrayCnt,
1077
+ PartitionArrayCnt);
1078
+ /* Topic tags */
1079
+ rd_kafka_buf_write_tags_empty(rkbuf);
1080
+ }
1081
+ if (rd_kafka_buf_ApiVersion(rkbuf) > 12) {
1082
+ /* Topic id must be non-zero here */
1083
+ rd_dassert(!RD_KAFKA_UUID_IS_ZERO(
1084
+ rktp->rktp_rkt->rkt_topic_id));
1085
+ /* Topic ID */
1086
+ rd_kafka_buf_write_uuid(
1087
+ rkbuf, &rktp->rktp_rkt->rkt_topic_id);
1088
+ } else {
1089
+ /* Topic name */
1090
+ rd_kafka_buf_write_kstr(
1091
+ rkbuf, rktp->rktp_rkt->rkt_topic);
1092
+ }
1093
+
1094
+ TopicArrayCnt++;
1095
+ rkt_last = rktp->rktp_rkt;
1096
+ /* Partition count */
1097
+ of_PartitionArrayCnt =
1098
+ rd_kafka_buf_write_arraycnt_pos(rkbuf);
1099
+ PartitionArrayCnt = 0;
1100
+ }
1101
+
1102
+ PartitionArrayCnt++;
1103
+
1104
+ /* Partition */
1105
+ rd_kafka_buf_write_i32(rkbuf, rktp->rktp_partition);
1106
+
1107
+ if (rd_kafka_buf_ApiVersion(rkbuf) >= 9) {
1108
+ /* CurrentLeaderEpoch */
1109
+ if (rktp->rktp_leader_epoch < 0 &&
1110
+ rd_kafka_has_reliable_leader_epochs(rkb)) {
1111
+ /* If current leader epoch is set to -1 and
1112
+ * the broker has reliable leader epochs,
1113
+ * send 0 instead, so that epoch is checked
1114
+ * and optionally metadata is refreshed.
1115
+ * This can happen if metadata is read initially
1116
+ * without an existing topic (see
1117
+ * rd_kafka_topic_metadata_update2).
1118
+ */
1119
+ rd_kafka_buf_write_i32(rkbuf, 0);
1120
+ } else {
1121
+ rd_kafka_buf_write_i32(rkbuf,
1122
+ rktp->rktp_leader_epoch);
1123
+ }
1124
+ }
1125
+ /* FetchOffset */
1126
+ rd_kafka_buf_write_i64(rkbuf,
1127
+ rktp->rktp_offsets.fetch_pos.offset);
1128
+ if (rd_kafka_buf_ApiVersion(rkbuf) >= 12)
1129
+ /* LastFetchedEpoch - only used by follower replica */
1130
+ rd_kafka_buf_write_i32(rkbuf, -1);
1131
+ if (rd_kafka_buf_ApiVersion(rkbuf) >= 5)
1132
+ /* LogStartOffset - only used by follower replica */
1133
+ rd_kafka_buf_write_i64(rkbuf, -1);
1134
+
1135
+ /* MaxBytes */
1136
+ rd_kafka_buf_write_i32(rkbuf, rktp->rktp_fetch_msg_max_bytes);
1137
+
1138
+ /* Partition tags */
1139
+ rd_kafka_buf_write_tags_empty(rkbuf);
1140
+
1141
+ rd_rkb_dbg(rkb, FETCH, "FETCH",
1142
+ "Fetch topic %.*s [%" PRId32 "] at offset %" PRId64
1143
+ " (leader epoch %" PRId32
1144
+ ", current leader epoch %" PRId32 ", v%d)",
1145
+ RD_KAFKAP_STR_PR(rktp->rktp_rkt->rkt_topic),
1146
+ rktp->rktp_partition,
1147
+ rktp->rktp_offsets.fetch_pos.offset,
1148
+ rktp->rktp_offsets.fetch_pos.leader_epoch,
1149
+ rktp->rktp_leader_epoch, rktp->rktp_fetch_version);
1150
+
1151
+ /* We must have a valid fetch offset when we get here */
1152
+ rd_dassert(rktp->rktp_offsets.fetch_pos.offset >= 0);
1153
+
1154
+ /* Add toppar + op version mapping. */
1155
+ tver = rd_list_add(rkbuf->rkbuf_rktp_vers, NULL);
1156
+ tver->rktp = rd_kafka_toppar_keep(rktp);
1157
+ tver->version = rktp->rktp_fetch_version;
1158
+
1159
+ cnt++;
1160
+ } while ((rktp = CIRCLEQ_LOOP_NEXT(&rkb->rkb_active_toppars, rktp,
1161
+ rktp_activelink)) !=
1162
+ rkb->rkb_active_toppar_next);
1163
+
1164
+ /* Update next toppar to fetch in round-robin list. */
1165
+ rd_kafka_broker_active_toppar_next(
1166
+ rkb, rktp ? CIRCLEQ_LOOP_NEXT(&rkb->rkb_active_toppars, rktp,
1167
+ rktp_activelink)
1168
+ : NULL);
1169
+
1170
+ rd_rkb_dbg(rkb, FETCH, "FETCH", "Fetch %i/%i/%i toppar(s)", cnt,
1171
+ rkb->rkb_active_toppar_cnt, rkb->rkb_toppar_cnt);
1172
+ if (!cnt) {
1173
+ rd_kafka_buf_destroy(rkbuf);
1174
+ return cnt;
1175
+ }
1176
+
1177
+ if (rkt_last != NULL) {
1178
+ /* Update last topic's PartitionArrayCnt */
1179
+ rd_kafka_buf_finalize_arraycnt(rkbuf, of_PartitionArrayCnt,
1180
+ PartitionArrayCnt);
1181
+ /* Topic tags */
1182
+ rd_kafka_buf_write_tags_empty(rkbuf);
1183
+ }
1184
+
1185
+ /* Update TopicArrayCnt */
1186
+ rd_kafka_buf_finalize_arraycnt(rkbuf, of_TopicArrayCnt, TopicArrayCnt);
1187
+
1188
+
1189
+ if (rd_kafka_buf_ApiVersion(rkbuf) >= 7)
1190
+ /* Length of the ForgottenTopics list (KIP-227). Broker
1191
+ * use only - not used by the consumer. */
1192
+ rd_kafka_buf_write_arraycnt(rkbuf, 0);
1193
+
1194
+ if (rd_kafka_buf_ApiVersion(rkbuf) >= 11)
1195
+ /* RackId */
1196
+ rd_kafka_buf_write_kstr(rkbuf,
1197
+ rkb->rkb_rk->rk_conf.client_rack);
1198
+
1199
+ /* Consider Fetch requests blocking if fetch.wait.max.ms >= 1s */
1200
+ if (rkb->rkb_rk->rk_conf.fetch_wait_max_ms >= 1000)
1201
+ rkbuf->rkbuf_flags |= RD_KAFKA_OP_F_BLOCKING;
1202
+
1203
+ /* Use configured timeout */
1204
+ rd_kafka_buf_set_timeout(rkbuf,
1205
+ rkb->rkb_rk->rk_conf.socket_timeout_ms +
1206
+ rkb->rkb_rk->rk_conf.fetch_wait_max_ms,
1207
+ now);
1208
+
1209
+ /* Sort toppar versions for quicker lookups in Fetch response. */
1210
+ rd_list_sort(rkbuf->rkbuf_rktp_vers, rd_kafka_toppar_ver_cmp);
1211
+
1212
+ rkb->rkb_fetching = 1;
1213
+ rd_kafka_broker_buf_enq1(rkb, rkbuf, rd_kafka_broker_fetch_reply, NULL);
1214
+
1215
+ return cnt;
1216
+ }
1217
+
1218
+ /**
1219
+ * @brief Decide whether it should start fetching from next fetch start
1220
+ * or continue with current fetch pos.
1221
+ *
1222
+ * @param rktp the toppar
1223
+ *
1224
+ * @returns rd_true if it should start fetching from next fetch start,
1225
+ * rd_false otherwise.
1226
+ *
1227
+ * @locality any
1228
+ * @locks toppar_lock() MUST be held
1229
+ */
1230
+ static rd_bool_t rd_kafka_toppar_fetch_decide_start_from_next_fetch_start(
1231
+ rd_kafka_toppar_t *rktp) {
1232
+ return rktp->rktp_op_version > rktp->rktp_fetch_version ||
1233
+ rd_kafka_fetch_pos_cmp(&rktp->rktp_next_fetch_start,
1234
+ &rktp->rktp_last_next_fetch_start) ||
1235
+ rktp->rktp_offsets.fetch_pos.offset == RD_KAFKA_OFFSET_INVALID;
1236
+ }
1237
+
1238
+ /**
1239
+ * @brief Return next fetch start position:
1240
+ * if it should start fetching from next fetch start
1241
+ * or continue with current fetch pos.
1242
+ *
1243
+ * @param rktp The toppar
1244
+ *
1245
+ * @returns Next fetch start position
1246
+ *
1247
+ * @locality any
1248
+ * @locks toppar_lock() MUST be held
1249
+ */
1250
+ rd_kafka_fetch_pos_t
1251
+ rd_kafka_toppar_fetch_decide_next_fetch_start_pos(rd_kafka_toppar_t *rktp) {
1252
+ if (rd_kafka_toppar_fetch_decide_start_from_next_fetch_start(rktp))
1253
+ return rktp->rktp_next_fetch_start;
1254
+ else
1255
+ return rktp->rktp_offsets.fetch_pos;
1256
+ }
1257
+
1258
+ /**
1259
+ * @brief Decide whether this toppar should be on the fetch list or not.
1260
+ *
1261
+ * Also:
1262
+ * - update toppar's op version (for broker thread's copy)
1263
+ * - finalize statistics (move rktp_offsets to rktp_offsets_fin)
1264
+ *
1265
+ * @returns the partition's Fetch backoff timestamp, or 0 if no backoff.
1266
+ *
1267
+ * @locality broker thread
1268
+ * @locks none
1269
+ */
1270
+ rd_ts_t rd_kafka_toppar_fetch_decide(rd_kafka_toppar_t *rktp,
1271
+ rd_kafka_broker_t *rkb,
1272
+ int force_remove) {
1273
+ int should_fetch = 1;
1274
+ const char *reason = "";
1275
+ int32_t version;
1276
+ rd_ts_t ts_backoff = 0;
1277
+ rd_bool_t lease_expired = rd_false;
1278
+
1279
+ rd_kafka_toppar_lock(rktp);
1280
+
1281
+ /* Check for preferred replica lease expiry */
1282
+ lease_expired = rktp->rktp_leader_id != rktp->rktp_broker_id &&
1283
+ rd_interval(&rktp->rktp_lease_intvl,
1284
+ 5 * 60 * 1000 * 1000 /*5 minutes*/, 0) > 0;
1285
+ if (lease_expired) {
1286
+ /* delegate_to_leader() requires no locks to be held */
1287
+ rd_kafka_toppar_unlock(rktp);
1288
+ rd_kafka_toppar_delegate_to_leader(rktp);
1289
+ rd_kafka_toppar_lock(rktp);
1290
+
1291
+ reason = "preferred replica lease expired";
1292
+ should_fetch = 0;
1293
+ goto done;
1294
+ }
1295
+
1296
+ /* Forced removal from fetch list */
1297
+ if (unlikely(force_remove)) {
1298
+ reason = "forced removal";
1299
+ should_fetch = 0;
1300
+ goto done;
1301
+ }
1302
+
1303
+ if (unlikely((rktp->rktp_flags & RD_KAFKA_TOPPAR_F_REMOVE) != 0)) {
1304
+ reason = "partition removed";
1305
+ should_fetch = 0;
1306
+ goto done;
1307
+ }
1308
+
1309
+ /* Skip toppars not in active fetch state */
1310
+ if (rktp->rktp_fetch_state != RD_KAFKA_TOPPAR_FETCH_ACTIVE) {
1311
+ reason = "not in active fetch state";
1312
+ should_fetch = 0;
1313
+ goto done;
1314
+ }
1315
+
1316
+ /* Update broker thread's fetch op version */
1317
+ version = rktp->rktp_op_version;
1318
+ if (rd_kafka_toppar_fetch_decide_start_from_next_fetch_start(rktp)) {
1319
+ /* New version barrier, something was modified from the
1320
+ * control plane. Reset and start over.
1321
+ * Alternatively only the next_offset changed but not the
1322
+ * barrier, which is the case when automatically triggering
1323
+ * offset.reset (such as on PARTITION_EOF or
1324
+ * OFFSET_OUT_OF_RANGE). */
1325
+
1326
+ rd_kafka_dbg(
1327
+ rktp->rktp_rkt->rkt_rk, TOPIC, "FETCHDEC",
1328
+ "Topic %s [%" PRId32
1329
+ "]: fetch decide: "
1330
+ "updating to version %d (was %d) at %s "
1331
+ "(was %s)",
1332
+ rktp->rktp_rkt->rkt_topic->str, rktp->rktp_partition,
1333
+ version, rktp->rktp_fetch_version,
1334
+ rd_kafka_fetch_pos2str(rktp->rktp_next_fetch_start),
1335
+ rd_kafka_fetch_pos2str(rktp->rktp_offsets.fetch_pos));
1336
+
1337
+ rd_kafka_offset_stats_reset(&rktp->rktp_offsets);
1338
+
1339
+ /* New start offset */
1340
+ rktp->rktp_offsets.fetch_pos = rktp->rktp_next_fetch_start;
1341
+ rktp->rktp_last_next_fetch_start = rktp->rktp_next_fetch_start;
1342
+
1343
+ rktp->rktp_fetch_version = version;
1344
+
1345
+ /* Clear last error to propagate new fetch
1346
+ * errors if encountered. */
1347
+ rktp->rktp_last_error = RD_KAFKA_RESP_ERR_NO_ERROR;
1348
+
1349
+ rd_kafka_q_purge_toppar_version(rktp->rktp_fetchq, rktp,
1350
+ version);
1351
+ }
1352
+
1353
+
1354
+ if (RD_KAFKA_TOPPAR_IS_PAUSED(rktp)) {
1355
+ should_fetch = 0;
1356
+ reason = "paused";
1357
+
1358
+ } else if (RD_KAFKA_OFFSET_IS_LOGICAL(
1359
+ rktp->rktp_next_fetch_start.offset)) {
1360
+ should_fetch = 0;
1361
+ reason = "no concrete offset";
1362
+ } else if (rktp->rktp_ts_fetch_backoff > rd_clock()) {
1363
+ reason = "fetch backed off";
1364
+ ts_backoff = rktp->rktp_ts_fetch_backoff;
1365
+ should_fetch = 0;
1366
+ } else if (rd_kafka_q_len(rktp->rktp_fetchq) >=
1367
+ rkb->rkb_rk->rk_conf.queued_min_msgs) {
1368
+ /* Skip toppars who's local message queue is already above
1369
+ * the lower threshold. */
1370
+ reason = "queued.min.messages exceeded";
1371
+ ts_backoff = rd_kafka_toppar_fetch_backoff(
1372
+ rkb, rktp, RD_KAFKA_RESP_ERR__QUEUE_FULL);
1373
+ should_fetch = 0;
1374
+
1375
+ } else if ((int64_t)rd_kafka_q_size(rktp->rktp_fetchq) >=
1376
+ rkb->rkb_rk->rk_conf.queued_max_msg_bytes) {
1377
+ reason = "queued.max.messages.kbytes exceeded";
1378
+ ts_backoff = rd_kafka_toppar_fetch_backoff(
1379
+ rkb, rktp, RD_KAFKA_RESP_ERR__QUEUE_FULL);
1380
+ should_fetch = 0;
1381
+ }
1382
+
1383
+ done:
1384
+ /* Copy offset stats to finalized place holder. */
1385
+ rktp->rktp_offsets_fin = rktp->rktp_offsets;
1386
+
1387
+ if (rktp->rktp_fetch != should_fetch) {
1388
+ rd_rkb_dbg(
1389
+ rkb, FETCH, "FETCH",
1390
+ "Topic %s [%" PRId32
1391
+ "] in state %s at %s "
1392
+ "(%d/%d msgs, %" PRId64
1393
+ "/%d kb queued, "
1394
+ "opv %" PRId32 ") is %s%s",
1395
+ rktp->rktp_rkt->rkt_topic->str, rktp->rktp_partition,
1396
+ rd_kafka_fetch_states[rktp->rktp_fetch_state],
1397
+ rd_kafka_fetch_pos2str(rktp->rktp_next_fetch_start),
1398
+ rd_kafka_q_len(rktp->rktp_fetchq),
1399
+ rkb->rkb_rk->rk_conf.queued_min_msgs,
1400
+ rd_kafka_q_size(rktp->rktp_fetchq) / 1024,
1401
+ rkb->rkb_rk->rk_conf.queued_max_msg_kbytes,
1402
+ rktp->rktp_fetch_version,
1403
+ should_fetch ? "fetchable" : "not fetchable: ", reason);
1404
+
1405
+ if (should_fetch) {
1406
+ rd_dassert(rktp->rktp_fetch_version > 0);
1407
+ rd_kafka_broker_active_toppar_add(
1408
+ rkb, rktp, *reason ? reason : "fetchable");
1409
+ } else {
1410
+ rd_kafka_broker_active_toppar_del(rkb, rktp, reason);
1411
+ }
1412
+ }
1413
+
1414
+ rd_kafka_toppar_unlock(rktp);
1415
+
1416
+ /* Non-fetching partitions will have an
1417
+ * indefinate backoff, unless explicitly specified. */
1418
+ if (!should_fetch && !ts_backoff)
1419
+ ts_backoff = RD_TS_MAX;
1420
+
1421
+ return ts_backoff;
1422
+ }