@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,950 @@
1
+ /*
2
+ * librdkafka - Apache Kafka C library
3
+ *
4
+ * Copyright (c) 2023, Confluent Inc.
5
+ * All rights reserved.
6
+ *
7
+ * Redistribution and use in source and binary forms, with or without
8
+ * modification, are permitted provided that the following conditions are met:
9
+ *
10
+ * 1. Redistributions of source code must retain the above copyright notice,
11
+ * this list of conditions and the following disclaimer.
12
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
13
+ * this list of conditions and the following disclaimer in the documentation
14
+ * and/or other materials provided with the distribution.
15
+ *
16
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26
+ * POSSIBILITY OF SUCH DAMAGE.
27
+ */
28
+
29
+ #include "test.h"
30
+
31
+ #include "../src/rdkafka_proto.h"
32
+
33
+
34
+ struct _produce_args {
35
+ const char *topic;
36
+ int sleep;
37
+ rd_kafka_conf_t *conf;
38
+ };
39
+
40
+ static int produce_concurrent_thread(void *args) {
41
+ rd_kafka_t *p1;
42
+ test_curr->exp_dr_err = RD_KAFKA_RESP_ERR_NO_ERROR;
43
+ test_curr->exp_dr_status = RD_KAFKA_MSG_STATUS_PERSISTED;
44
+
45
+ struct _produce_args *produce_args = args;
46
+ rd_sleep(produce_args->sleep);
47
+
48
+ p1 = test_create_handle(RD_KAFKA_PRODUCER, produce_args->conf);
49
+ TEST_CALL_ERR__(
50
+ rd_kafka_producev(p1, RD_KAFKA_V_TOPIC(produce_args->topic),
51
+ RD_KAFKA_V_VALUE("hi", 2), RD_KAFKA_V_END));
52
+ rd_kafka_flush(p1, -1);
53
+ rd_kafka_destroy(p1);
54
+ return 0;
55
+ }
56
+
57
+ /**
58
+ * @brief Send a produce request in the middle of an offset validation
59
+ * and expect that the fetched message is discarded, don't producing
60
+ * a duplicate when state becomes active again. See #4249.
61
+ */
62
+ static void do_test_no_duplicates_during_offset_validation(void) {
63
+ const char *topic = test_mk_topic_name(__FUNCTION__, 1);
64
+ const char *c1_groupid = topic;
65
+ rd_kafka_t *c1;
66
+ rd_kafka_conf_t *conf, *conf_producer;
67
+ const char *bootstraps;
68
+ rd_kafka_mock_cluster_t *mcluster;
69
+ int initial_msg_count = 5;
70
+ thrd_t thrd;
71
+ struct _produce_args args = RD_ZERO_INIT;
72
+ uint64_t testid = test_id_generate();
73
+
74
+ SUB_TEST_QUICK();
75
+
76
+ mcluster = test_mock_cluster_new(1, &bootstraps);
77
+ rd_kafka_mock_topic_create(mcluster, topic, 1, 1);
78
+
79
+ /* Slow down OffsetForLeaderEpoch so a produce and
80
+ * subsequent fetch can happen while it's in-flight */
81
+ rd_kafka_mock_broker_push_request_error_rtts(
82
+ mcluster, 1, RD_KAFKAP_OffsetForLeaderEpoch, 1,
83
+ RD_KAFKA_RESP_ERR_NO_ERROR, 5000);
84
+
85
+ test_conf_init(&conf_producer, NULL, 60);
86
+ test_conf_set(conf_producer, "bootstrap.servers", bootstraps);
87
+
88
+
89
+ /* Seed the topic with messages */
90
+ test_produce_msgs_easy_v(topic, testid, 0, 0, initial_msg_count, 10,
91
+ "bootstrap.servers", bootstraps,
92
+ "batch.num.messages", "1", NULL);
93
+
94
+ args.topic = topic;
95
+ /* Makes that the message is produced while an offset validation
96
+ * is ongoing */
97
+ args.sleep = 5;
98
+ args.conf = conf_producer;
99
+ /* Spin up concurrent thread */
100
+ if (thrd_create(&thrd, produce_concurrent_thread, (void *)&args) !=
101
+ thrd_success)
102
+ TEST_FAIL("Failed to create thread");
103
+
104
+ test_conf_init(&conf, NULL, 60);
105
+
106
+ test_conf_set(conf, "bootstrap.servers", bootstraps);
107
+ /* Makes that an offset validation happens at the same
108
+ * time a new message is being produced */
109
+ test_conf_set(conf, "topic.metadata.refresh.interval.ms", "5000");
110
+ test_conf_set(conf, "auto.offset.reset", "earliest");
111
+ test_conf_set(conf, "enable.auto.commit", "false");
112
+ test_conf_set(conf, "enable.auto.offset.store", "false");
113
+ test_conf_set(conf, "enable.partition.eof", "true");
114
+
115
+ c1 = test_create_consumer(c1_groupid, NULL, conf, NULL);
116
+ test_consumer_subscribe(c1, topic);
117
+
118
+ /* Consume initial messages */
119
+ test_consumer_poll("MSG_INIT", c1, testid, 0, 0, initial_msg_count,
120
+ NULL);
121
+ /* EOF after initial messages */
122
+ test_consumer_poll("MSG_EOF", c1, testid, 1, initial_msg_count, 0,
123
+ NULL);
124
+ /* Concurrent producer message and EOF */
125
+ test_consumer_poll("MSG_AND_EOF", c1, testid, 1, initial_msg_count, 1,
126
+ NULL);
127
+ /* Only an EOF, not a duplicate message */
128
+ test_consumer_poll("MSG_EOF2", c1, testid, 1, initial_msg_count, 0,
129
+ NULL);
130
+
131
+ thrd_join(thrd, NULL);
132
+
133
+ rd_kafka_destroy(c1);
134
+
135
+ test_mock_cluster_destroy(mcluster);
136
+
137
+ TEST_LATER_CHECK();
138
+ SUB_TEST_PASS();
139
+ }
140
+
141
+
142
+ /**
143
+ * @brief Test that a permanent error doesn't cause an offset reset.
144
+ * See issues #4293, #4427.
145
+ * @param err The error OffsetForLeaderEpoch fails with.
146
+ */
147
+ static void do_test_permanent_error_retried(rd_kafka_resp_err_t err) {
148
+ rd_kafka_mock_cluster_t *mcluster;
149
+ rd_kafka_conf_t *conf;
150
+ const char *bootstraps;
151
+ const char *topic = test_mk_topic_name(__FUNCTION__, 1);
152
+ const char *c1_groupid = topic;
153
+ rd_kafka_t *c1;
154
+ rd_kafka_topic_partition_list_t *rktpars;
155
+ rd_kafka_topic_partition_t *rktpar;
156
+ int msg_count = 5;
157
+ uint64_t testid = test_id_generate();
158
+
159
+ SUB_TEST_QUICK("err: %s", rd_kafka_err2name(err));
160
+
161
+ mcluster = test_mock_cluster_new(3, &bootstraps);
162
+ rd_kafka_mock_topic_create(mcluster, topic, 1, 1);
163
+
164
+ /* Seed the topic with messages */
165
+ test_produce_msgs_easy_v(topic, testid, 0, 0, msg_count, 10,
166
+ "bootstrap.servers", bootstraps,
167
+ "batch.num.messages", "1", NULL);
168
+
169
+ /* Make OffsetForLeaderEpoch fail with the corresponding error code */
170
+ rd_kafka_mock_push_request_errors(
171
+ mcluster, RD_KAFKAP_OffsetForLeaderEpoch, 1, err);
172
+
173
+ test_conf_init(&conf, NULL, 60);
174
+
175
+ test_conf_set(conf, "bootstrap.servers", bootstraps);
176
+ test_conf_set(conf, "topic.metadata.refresh.interval.ms", "5000");
177
+ test_conf_set(conf, "auto.offset.reset", "latest");
178
+ test_conf_set(conf, "enable.auto.commit", "false");
179
+ test_conf_set(conf, "enable.auto.offset.store", "false");
180
+ test_conf_set(conf, "enable.partition.eof", "true");
181
+
182
+ c1 = test_create_consumer(c1_groupid, NULL, conf, NULL);
183
+ test_consumer_subscribe(c1, topic);
184
+
185
+ /* EOF because of reset to latest */
186
+ test_consumer_poll("MSG_EOF", c1, testid, 1, 0, 0, NULL);
187
+
188
+ rd_kafka_mock_partition_set_leader(mcluster, topic, 0, 2);
189
+
190
+ /* Seek to 0 for validating the offset. */
191
+ rktpars = rd_kafka_topic_partition_list_new(1);
192
+ rktpar = rd_kafka_topic_partition_list_add(rktpars, topic, 0);
193
+ rktpar->offset = 0;
194
+
195
+ /* Will validate the offset and start fetching again
196
+ * from offset 0. */
197
+ rd_kafka_topic_partition_set_leader_epoch(rktpar, 0);
198
+ rd_kafka_seek_partitions(c1, rktpars, -1);
199
+ rd_kafka_topic_partition_list_destroy(rktpars);
200
+
201
+ /* Read all messages after seek to zero.
202
+ * In case of permanent error, instead, it resets to latest and
203
+ * gets an EOF. */
204
+ test_consumer_poll("MSG_ALL", c1, testid, 0, 0, 5, NULL);
205
+
206
+ rd_kafka_destroy(c1);
207
+
208
+ test_mock_cluster_destroy(mcluster);
209
+
210
+ TEST_LATER_CHECK();
211
+ SUB_TEST_PASS();
212
+ }
213
+
214
+
215
+ /**
216
+ * @brief If there's an OffsetForLeaderEpoch request which fails, and the leader
217
+ * changes meanwhile, we end up in an infinite loop of OffsetForLeaderEpoch
218
+ * requests.
219
+ * Specifically:
220
+ * a. Leader Change - causes OffsetForLeaderEpoch
221
+ * request 'A'.
222
+ * b. Request 'A' fails with a retriable error, and we retry it.
223
+ * c. While waiting for Request 'A', the leader changes again, and we send a
224
+ * Request 'B', but the leader epoch is not updated correctly in this
225
+ * request, causing a loop.
226
+ *
227
+ * See #4425.
228
+ */
229
+ static void do_test_two_leader_changes(void) {
230
+ const char *topic = test_mk_topic_name(__FUNCTION__, 1);
231
+ const char *c1_groupid = topic;
232
+ rd_kafka_t *c1;
233
+ const char *bootstraps;
234
+ rd_kafka_mock_cluster_t *mcluster;
235
+ int msg_cnt = 5;
236
+ uint64_t testid = test_id_generate();
237
+ rd_kafka_conf_t *conf;
238
+
239
+ SUB_TEST_QUICK();
240
+
241
+ mcluster = test_mock_cluster_new(2, &bootstraps);
242
+ rd_kafka_mock_topic_create(mcluster, topic, 1, 2);
243
+ rd_kafka_mock_partition_set_leader(mcluster, topic, 0, 1);
244
+
245
+ /* Seed the topic with messages */
246
+ test_produce_msgs_easy_v(topic, testid, 0, 0, msg_cnt, 10,
247
+ "bootstrap.servers", bootstraps,
248
+ "batch.num.messages", "1", NULL);
249
+
250
+ test_conf_init(&conf, NULL, 60);
251
+ test_conf_set(conf, "bootstrap.servers", bootstraps);
252
+ test_conf_set(conf, "auto.offset.reset", "earliest");
253
+
254
+ c1 = test_create_consumer(c1_groupid, NULL, conf, NULL);
255
+ test_consumer_subscribe(c1, topic);
256
+
257
+ /* Consume initial messages and join the group, etc. */
258
+ test_consumer_poll("MSG_INIT", c1, testid, 0, 0, msg_cnt, NULL);
259
+
260
+ /* The leader will change from 1->2, and the OffsetForLeaderEpoch will
261
+ * be sent to broker 2. We need to first fail it with
262
+ * an error, and then give enough time to change the leader before
263
+ * returning a success. */
264
+ rd_kafka_mock_broker_push_request_error_rtts(
265
+ mcluster, 2, RD_KAFKAP_OffsetForLeaderEpoch, 2,
266
+ RD_KAFKA_RESP_ERR_KAFKA_STORAGE_ERROR, 900,
267
+ RD_KAFKA_RESP_ERR_NO_ERROR, 1000);
268
+
269
+ rd_kafka_mock_partition_set_leader(mcluster, topic, 0, 2);
270
+ rd_kafka_poll(c1, 1000);
271
+ /* Enough time to make a request, fail with a retriable error, and
272
+ * retry. */
273
+ rd_sleep(1);
274
+
275
+ /* Reset leader. */
276
+ rd_kafka_mock_partition_set_leader(mcluster, topic, 0, 1);
277
+ rd_kafka_poll(c1, 1000);
278
+ rd_sleep(1);
279
+
280
+ /* There should be no infinite loop of OffsetForLeaderEpoch, and
281
+ * consequently, we should be able to consume these messages as a sign
282
+ * of success. */
283
+ test_produce_msgs_easy_v(topic, testid, 0, 0, msg_cnt, 10,
284
+ "bootstrap.servers", bootstraps,
285
+ "batch.num.messages", "1", NULL);
286
+
287
+ test_consumer_poll("MSG_INIT", c1, testid, 0, 0, msg_cnt, NULL);
288
+
289
+
290
+ rd_kafka_destroy(c1);
291
+
292
+ test_mock_cluster_destroy(mcluster);
293
+
294
+ TEST_LATER_CHECK();
295
+ SUB_TEST_PASS();
296
+ }
297
+
298
+ /**
299
+ * @brief Storing an offset without leader epoch should still be allowed
300
+ * and the greater than check should apply only to the offset.
301
+ * See #4384.
302
+ */
303
+ static void do_test_store_offset_without_leader_epoch(void) {
304
+ rd_kafka_mock_cluster_t *mcluster;
305
+ rd_kafka_conf_t *conf;
306
+ const char *bootstraps;
307
+ const char *topic = test_mk_topic_name(__FUNCTION__, 1);
308
+ const char *c1_groupid = topic;
309
+ rd_kafka_t *c1;
310
+ rd_kafka_topic_t *rdk_topic;
311
+ uint64_t testid = test_id_generate();
312
+ rd_kafka_topic_partition_list_t *rktpars;
313
+ rd_kafka_topic_partition_t *rktpar;
314
+ int32_t leader_epoch;
315
+
316
+ SUB_TEST_QUICK();
317
+
318
+ mcluster = test_mock_cluster_new(3, &bootstraps);
319
+ rd_kafka_mock_topic_create(mcluster, topic, 1, 1);
320
+
321
+ test_conf_init(&conf, NULL, 60);
322
+ test_conf_set(conf, "bootstrap.servers", bootstraps);
323
+ test_conf_set(conf, "topic.metadata.refresh.interval.ms", "5000");
324
+ test_conf_set(conf, "auto.offset.reset", "earliest");
325
+ test_conf_set(conf, "enable.auto.commit", "false");
326
+ test_conf_set(conf, "enable.auto.offset.store", "false");
327
+ test_conf_set(conf, "enable.partition.eof", "true");
328
+
329
+ c1 = test_create_consumer(c1_groupid, NULL, conf, NULL);
330
+ test_consumer_subscribe(c1, topic);
331
+
332
+ /* Leader epoch becomes 1. */
333
+ rd_kafka_mock_partition_set_leader(mcluster, topic, 0, 2);
334
+
335
+ /* Read EOF. */
336
+ test_consumer_poll("MSG_ALL", c1, testid, 1, 0, 0, NULL);
337
+
338
+ TEST_SAY(
339
+ "Storing offset without leader epoch with rd_kafka_offset_store");
340
+ rdk_topic = rd_kafka_topic_new(c1, topic, NULL);
341
+ /* Legacy function stores offset + 1 */
342
+ rd_kafka_offset_store(rdk_topic, 0, 1);
343
+ rd_kafka_topic_destroy(rdk_topic);
344
+
345
+ rd_kafka_commit(c1, NULL, rd_false);
346
+
347
+ rktpars = rd_kafka_topic_partition_list_new(1);
348
+ rd_kafka_topic_partition_list_add(rktpars, topic, 0);
349
+ rd_kafka_committed(c1, rktpars, -1);
350
+
351
+ TEST_ASSERT(rktpars->elems[0].offset == 2, "expected %d, got %" PRId64,
352
+ 2, rktpars->elems[0].offset);
353
+ leader_epoch =
354
+ rd_kafka_topic_partition_get_leader_epoch(&rktpars->elems[0]);
355
+
356
+ /* OffsetFetch returns the leader epoch even if not set. */
357
+ TEST_ASSERT(leader_epoch == 1, "expected %d, got %" PRId32, 1,
358
+ leader_epoch);
359
+ rd_kafka_topic_partition_list_destroy(rktpars);
360
+
361
+ TEST_SAY(
362
+ "Storing offset without leader epoch with rd_kafka_offsets_store");
363
+ rktpars = rd_kafka_topic_partition_list_new(1);
364
+ rd_kafka_topic_partition_list_add(rktpars, topic, 0)->offset = 5;
365
+ rd_kafka_offsets_store(c1, rktpars);
366
+ rd_kafka_topic_partition_list_destroy(rktpars);
367
+
368
+ TEST_CALL_ERR__(rd_kafka_commit(c1, NULL, rd_false));
369
+
370
+ rktpars = rd_kafka_topic_partition_list_new(1);
371
+ rd_kafka_topic_partition_list_add(rktpars, topic, 0);
372
+ rd_kafka_committed(c1, rktpars, -1);
373
+
374
+ TEST_ASSERT(rktpars->elems[0].offset == 5, "expected %d, got %" PRId64,
375
+ 5, rktpars->elems[0].offset);
376
+ leader_epoch =
377
+ rd_kafka_topic_partition_get_leader_epoch(&rktpars->elems[0]);
378
+ /* OffsetFetch returns the leader epoch even if not set. */
379
+ TEST_ASSERT(leader_epoch == 1, "expected %d, got %" PRId32, 1,
380
+ leader_epoch);
381
+ rd_kafka_topic_partition_list_destroy(rktpars);
382
+
383
+ TEST_SAY(
384
+ "While storing offset with leader epoch it should check that value "
385
+ "first");
386
+ /* Setting it to (6,1), as last one has epoch -1. */
387
+ rktpars = rd_kafka_topic_partition_list_new(1);
388
+ rktpar = rd_kafka_topic_partition_list_add(rktpars, topic, 0);
389
+ rktpar->offset = 6;
390
+ rd_kafka_topic_partition_set_leader_epoch(rktpar, 1);
391
+ rd_kafka_offsets_store(c1, rktpars);
392
+ rd_kafka_topic_partition_list_destroy(rktpars);
393
+
394
+ rd_kafka_commit(c1, NULL, rd_false);
395
+
396
+ /* Trying to store (7,0), it should skip the commit. */
397
+ rktpars = rd_kafka_topic_partition_list_new(1);
398
+ rktpar = rd_kafka_topic_partition_list_add(rktpars, topic, 0);
399
+ rktpar->offset = 7;
400
+ rd_kafka_topic_partition_set_leader_epoch(rktpar, 0);
401
+ rd_kafka_offsets_store(c1, rktpars);
402
+ rd_kafka_topic_partition_list_destroy(rktpars);
403
+
404
+ rd_kafka_commit(c1, NULL, rd_false);
405
+
406
+ /* Committed offset is (6,1). */
407
+ rktpars = rd_kafka_topic_partition_list_new(1);
408
+ rd_kafka_topic_partition_list_add(rktpars, topic, 0);
409
+ rd_kafka_committed(c1, rktpars, -1);
410
+
411
+ TEST_ASSERT(rktpars->elems[0].offset == 6, "expected %d, got %" PRId64,
412
+ 6, rktpars->elems[0].offset);
413
+ leader_epoch =
414
+ rd_kafka_topic_partition_get_leader_epoch(&rktpars->elems[0]);
415
+ TEST_ASSERT(leader_epoch == 1, "expected %d, got %" PRId32, 1,
416
+ leader_epoch);
417
+ rd_kafka_topic_partition_list_destroy(rktpars);
418
+
419
+ rd_kafka_destroy(c1);
420
+
421
+ test_mock_cluster_destroy(mcluster);
422
+
423
+ TEST_LATER_CHECK();
424
+ SUB_TEST_PASS();
425
+ }
426
+
427
+ static rd_bool_t is_broker_fetch_request(rd_kafka_mock_request_t *request,
428
+ void *opaque) {
429
+ return rd_kafka_mock_request_id(request) == *(int *)(opaque) &&
430
+ rd_kafka_mock_request_api_key(request) == RD_KAFKAP_Fetch;
431
+ }
432
+
433
+ static rd_bool_t
434
+ is_offset_for_leader_epoch_request(rd_kafka_mock_request_t *request,
435
+ void *opaque) {
436
+ return rd_kafka_mock_request_id(request) == *(int *)(opaque) &&
437
+ rd_kafka_mock_request_api_key(request) ==
438
+ RD_KAFKAP_OffsetForLeaderEpoch;
439
+ }
440
+
441
+ static rd_bool_t is_metadata_request(rd_kafka_mock_request_t *request,
442
+ void *opaque) {
443
+ return rd_kafka_mock_request_api_key(request) == RD_KAFKAP_Metadata;
444
+ }
445
+
446
+ /**
447
+ * @brief A second leader change is triggered after first one switches
448
+ * to a leader supporting KIP-320, the second leader either:
449
+ *
450
+ * - variation 0: doesn't support KIP-320 (leader epoch -1).
451
+ * This can happed during a cluster roll for upgrading the cluster.
452
+ * See #4796.
453
+ * - variation 1: the leader epoch is the same as previous leader.
454
+ * This can happen when the broker doesn't need that a validation
455
+ * should be performed after a leader change.
456
+ *
457
+ * In both cases no validation should be performed
458
+ * and it should continue fetching messages on the new leader.
459
+ */
460
+ static void do_test_leader_change_no_validation(int variation) {
461
+ const char *topic = test_mk_topic_name(__FUNCTION__, 1);
462
+ const char *c1_groupid = topic;
463
+ rd_kafka_t *c1;
464
+ const char *bootstraps;
465
+ rd_kafka_mock_cluster_t *mcluster;
466
+ int msg_cnt = 5;
467
+ uint64_t testid = test_id_generate();
468
+ rd_kafka_conf_t *conf;
469
+ int i, leader = 1;
470
+ size_t matching_requests;
471
+ /* No KIP-320 support on second leader change */
472
+ int32_t leader_epoch = -1;
473
+ if (variation == 1) {
474
+ /* Same leader epoch on second leader change */
475
+ leader_epoch = 2;
476
+ }
477
+
478
+ SUB_TEST_QUICK("variation: %d", variation);
479
+
480
+ mcluster = test_mock_cluster_new(2, &bootstraps);
481
+ rd_kafka_mock_topic_create(mcluster, topic, 1, 2);
482
+ rd_kafka_mock_partition_set_leader(mcluster, topic, 0, 1);
483
+
484
+ /* Seed the topic with messages */
485
+ test_produce_msgs_easy_v(topic, testid, 0, 0, msg_cnt, 10,
486
+ "bootstrap.servers", bootstraps,
487
+ "batch.num.messages", "1", NULL);
488
+
489
+ test_conf_init(&conf, NULL, 60);
490
+ test_conf_set(conf, "bootstrap.servers", bootstraps);
491
+ test_conf_set(conf, "auto.offset.reset", "earliest");
492
+ test_conf_set(conf, "enable.auto.commit", "false");
493
+
494
+ c1 = test_create_consumer(c1_groupid, NULL, conf, NULL);
495
+ test_consumer_subscribe(c1, topic);
496
+
497
+ rd_kafka_mock_start_request_tracking(mcluster);
498
+ TEST_SAY("Consume initial messages and join the group, etc.\n");
499
+ test_consumer_poll("MSG_INIT", c1, testid, 0, 0, msg_cnt, NULL);
500
+
501
+ TEST_SAY("Wait Fetch request to broker 1\n");
502
+ matching_requests = test_mock_wait_matching_requests(
503
+ mcluster, 1, 1000, is_broker_fetch_request, &leader);
504
+ TEST_ASSERT_LATER(matching_requests > 0,
505
+ "Expected at least one Fetch request to broker 1");
506
+
507
+ /* No validation is performed on first fetch. */
508
+ TEST_SAY("Wait no OffsetForLeaderEpoch request to broker 1\n");
509
+ matching_requests = test_mock_wait_matching_requests(
510
+ mcluster, 0, 1000, is_offset_for_leader_epoch_request, &leader);
511
+ TEST_ASSERT_LATER(matching_requests == 0,
512
+ "Expected no OffsetForLeaderEpoch request"
513
+ " to broker 1, got %" PRIusz,
514
+ matching_requests);
515
+ rd_kafka_mock_stop_request_tracking(mcluster);
516
+
517
+ /* The leader will change from 1->2, and the OffsetForLeaderEpoch will
518
+ * be sent to broker 2. Leader epoch becomes 1. */
519
+ rd_kafka_mock_start_request_tracking(mcluster);
520
+ TEST_SAY("Changing leader to broker 2\n");
521
+ rd_kafka_mock_partition_set_leader(mcluster, topic, 0, 2);
522
+ leader = 2;
523
+ rd_kafka_poll(c1, 1000);
524
+
525
+ TEST_SAY("Wait Fetch request to broker 2\n");
526
+ matching_requests = test_mock_wait_matching_requests(
527
+ mcluster, 1, 1000, is_broker_fetch_request, &leader);
528
+ TEST_ASSERT_LATER(matching_requests > 0,
529
+ "Expected at least one fetch request to broker 2");
530
+
531
+ TEST_SAY("Wait OffsetForLeaderEpoch request to broker 2\n");
532
+ matching_requests = test_mock_wait_matching_requests(
533
+ mcluster, 1, 1000, is_offset_for_leader_epoch_request, &leader);
534
+ TEST_ASSERT_LATER(matching_requests == 1,
535
+ "Expected one OffsetForLeaderEpoch request"
536
+ " to broker 2, got %" PRIusz,
537
+ matching_requests);
538
+ rd_kafka_mock_stop_request_tracking(mcluster);
539
+
540
+ /* Reset leader, set leader epoch to `leader_epoch`
541
+ * to trigger this special case. */
542
+ TEST_SAY("Changing leader to broker 1\n");
543
+ for (i = 0; i < 5; i++) {
544
+ rd_kafka_mock_partition_push_leader_response(mcluster, topic, 0,
545
+ 1, leader_epoch);
546
+ }
547
+ rd_kafka_mock_partition_set_leader(mcluster, topic, 0, 1);
548
+ leader = 1;
549
+ rd_kafka_mock_start_request_tracking(mcluster);
550
+ rd_kafka_poll(c1, 1000);
551
+
552
+ TEST_SAY("Wait Fetch request to broker 1\n");
553
+ /* 0 is correct here as second parameter as we don't wait to receive
554
+ * at least one Fetch request, given in the failure case it'll take more
555
+ * than 1s and it's possible a OffsetForLeaderEpoch is received after
556
+ * that, because we ran out of overridden leader responses. */
557
+ matching_requests = test_mock_wait_matching_requests(
558
+ mcluster, 0, 1000, is_broker_fetch_request, &leader);
559
+ TEST_ASSERT_LATER(matching_requests > 0,
560
+ "Expected at least one fetch request to broker 1");
561
+
562
+ /* Given same leader epoch, or -1, is returned,
563
+ * no validation is performed */
564
+ TEST_SAY("Wait no OffsetForLeaderEpoch request to broker 1\n");
565
+ matching_requests = test_mock_wait_matching_requests(
566
+ mcluster, 0, 1000, is_offset_for_leader_epoch_request, &leader);
567
+ TEST_ASSERT_LATER(matching_requests == 0,
568
+ "Expected no OffsetForLeaderEpoch request"
569
+ " to broker 1, got %" PRIusz,
570
+ matching_requests);
571
+ rd_kafka_mock_stop_request_tracking(mcluster);
572
+
573
+ rd_kafka_destroy(c1);
574
+ test_mock_cluster_destroy(mcluster);
575
+
576
+ TEST_LATER_CHECK();
577
+ SUB_TEST_PASS();
578
+ }
579
+
580
+ static int
581
+ is_fatal_cb(rd_kafka_t *rk, rd_kafka_resp_err_t err, const char *reason) {
582
+ /* Ignore UNKNOWN_TOPIC_OR_PART errors. */
583
+ TEST_SAY("is_fatal?: %s: %s\n", rd_kafka_err2str(err), reason);
584
+ if (err == RD_KAFKA_RESP_ERR__UNKNOWN_PARTITION ||
585
+ err == RD_KAFKA_RESP_ERR_UNKNOWN_TOPIC_OR_PART)
586
+ return 0;
587
+ return 1;
588
+ }
589
+
590
+ /**
591
+ * @brief Test partition validation when it's temporarily delegated to
592
+ * the internal broker. There are two variations:
593
+ *
594
+ * variation 1: leader epoch bump is simultaneous to the partition
595
+ * delegation returning from the internal broker to the
596
+ * new leader.
597
+ * variation 2: leader epoch bump is triggered immediately by KIP-951
598
+ * and validation fails, later metadata request fails
599
+ * and partition is delegated to the internal broker.
600
+ * When partition is delegated back to the leader,
601
+ * it finds the same leader epoch but validation must
602
+ * be completed as state is still VALIDATE_EPOCH_WAIT.
603
+ *
604
+ * In both cases, fetch must continue with the new leader and
605
+ * after the validation is completed.
606
+ *
607
+ * See #4804.
608
+ */
609
+ static void do_test_leader_change_from_internal_broker(int variation) {
610
+ const char *topic = test_mk_topic_name(__FUNCTION__, 1);
611
+ const char *c1_groupid = topic;
612
+ rd_kafka_t *c1;
613
+ const char *bootstraps;
614
+ rd_kafka_mock_cluster_t *mcluster;
615
+ int msg_cnt = 5;
616
+ uint64_t testid = test_id_generate();
617
+ rd_kafka_conf_t *conf;
618
+ int leader = 1;
619
+ size_t matching_requests, expected_offset_for_leader_epoch_requests = 1;
620
+
621
+ SUB_TEST_QUICK("variation: %d", variation);
622
+
623
+ mcluster = test_mock_cluster_new(2, &bootstraps);
624
+ rd_kafka_mock_topic_create(mcluster, topic, 1, 2);
625
+ rd_kafka_mock_partition_set_leader(mcluster, topic, 0, 1);
626
+
627
+ /* Seed the topic with messages */
628
+ test_produce_msgs_easy_v(topic, testid, 0, 0, msg_cnt, 10,
629
+ "bootstrap.servers", bootstraps,
630
+ "batch.num.messages", "1", NULL);
631
+
632
+ test_conf_init(&conf, NULL, 60);
633
+ test_conf_set(conf, "bootstrap.servers", bootstraps);
634
+ test_conf_set(conf, "auto.offset.reset", "earliest");
635
+ test_conf_set(conf, "enable.auto.commit", "false");
636
+
637
+ c1 = test_create_consumer(c1_groupid, NULL, conf, NULL);
638
+ test_consumer_subscribe(c1, topic);
639
+ test_curr->is_fatal_cb = is_fatal_cb;
640
+
641
+ rd_kafka_mock_start_request_tracking(mcluster);
642
+ TEST_SAY("Consume initial messages and join the group, etc.\n");
643
+ test_consumer_poll("MSG_INIT", c1, testid, 0, 0, msg_cnt, NULL);
644
+
645
+ TEST_SAY("Wait Fetch request to broker 1\n");
646
+ matching_requests = test_mock_wait_matching_requests(
647
+ mcluster, 1, 1000, is_broker_fetch_request, &leader);
648
+ TEST_ASSERT_LATER(matching_requests > 0,
649
+ "Expected at least one Fetch request to broker 1");
650
+
651
+ /* No validation is performed on first fetch. */
652
+ TEST_SAY("Wait no OffsetForLeaderEpoch request to broker 1\n");
653
+ matching_requests = test_mock_wait_matching_requests(
654
+ mcluster, 0, 1000, is_offset_for_leader_epoch_request, &leader);
655
+ TEST_ASSERT_LATER(matching_requests == 0,
656
+ "Expected no OffsetForLeaderEpoch request"
657
+ " to broker 1, got %" PRIusz,
658
+ matching_requests);
659
+ rd_kafka_mock_stop_request_tracking(mcluster);
660
+
661
+ /* The leader will change from 1->2, and the OffsetForLeaderEpoch will
662
+ * be sent to broker 2. Leader epoch becomes 1. */
663
+ rd_kafka_mock_start_request_tracking(mcluster);
664
+ TEST_SAY("Changing leader to broker 2\n");
665
+ rd_kafka_mock_partition_set_leader(mcluster, topic, 0, 2);
666
+ leader = 2;
667
+ rd_kafka_poll(c1, 1000);
668
+
669
+ TEST_SAY("Wait Fetch request to broker 2\n");
670
+ matching_requests = test_mock_wait_matching_requests(
671
+ mcluster, 1, 1000, is_broker_fetch_request, &leader);
672
+ TEST_ASSERT_LATER(matching_requests > 0,
673
+ "Expected at least one fetch request to broker 2");
674
+
675
+ TEST_SAY("Wait OffsetForLeaderEpoch request to broker 2\n");
676
+ matching_requests = test_mock_wait_matching_requests(
677
+ mcluster, 1, 1000, is_offset_for_leader_epoch_request, &leader);
678
+ TEST_ASSERT_LATER(matching_requests == 1,
679
+ "Expected one OffsetForLeaderEpoch request"
680
+ " to broker 2, got %" PRIusz,
681
+ matching_requests);
682
+ rd_kafka_mock_stop_request_tracking(mcluster);
683
+
684
+ /* Reset leader, Metadata request fails in between and delegates
685
+ * the partition to the internal broker. */
686
+ TEST_SAY("Changing leader to broker 1\n");
687
+ if (variation == 0) {
688
+ /* Fail Fetch request too, otherwise KIP-951 mechanism is faster
689
+ * than the Metadata request. */
690
+ rd_kafka_mock_push_request_errors(
691
+ mcluster, RD_KAFKAP_Fetch, 1,
692
+ RD_KAFKA_RESP_ERR_UNKNOWN_TOPIC_OR_PART);
693
+ } else if (variation == 1) {
694
+ /* First OffsetForLeaderEpoch is triggered by KIP-951,
695
+ * it updates leader epoch, then it fails, triggers metadata
696
+ * refresh,
697
+ * Metadata fails too and partition is delegated to the internal
698
+ * broker.
699
+ * Validation is retried three times during this period
700
+ * and it should fail because we want to see what happens
701
+ * next when partition isn't delegated to the internal
702
+ * broker anymore. */
703
+ rd_kafka_mock_push_request_errors(
704
+ mcluster, RD_KAFKAP_OffsetForLeaderEpoch, 3,
705
+ RD_KAFKA_RESP_ERR_UNKNOWN_TOPIC_OR_PART,
706
+ RD_KAFKA_RESP_ERR_UNKNOWN_TOPIC_OR_PART,
707
+ RD_KAFKA_RESP_ERR_UNKNOWN_TOPIC_OR_PART);
708
+ }
709
+
710
+ /* This causes a Metadata request error. */
711
+ rd_kafka_mock_topic_set_error(mcluster, topic,
712
+ RD_KAFKA_RESP_ERR_UNKNOWN_TOPIC_OR_PART);
713
+ rd_kafka_mock_partition_set_leader(mcluster, topic, 0, 1);
714
+ leader = 1;
715
+ rd_kafka_mock_start_request_tracking(mcluster);
716
+ rd_kafka_poll(c1, 1000);
717
+
718
+ TEST_SAY(
719
+ "Wait a Metadata request that fails and delegates partition to"
720
+ " the internal broker.\n");
721
+ matching_requests = test_mock_wait_matching_requests(
722
+ mcluster, 1, 1000, is_metadata_request, NULL);
723
+ TEST_ASSERT_LATER(matching_requests > 0,
724
+ "Expected at least one Metadata request");
725
+ TEST_SAY(
726
+ "Reset partition error status."
727
+ " Partition is delegated to broker 1.\n");
728
+ rd_kafka_mock_topic_set_error(mcluster, topic,
729
+ RD_KAFKA_RESP_ERR_NO_ERROR);
730
+
731
+ TEST_SAY("Wait Fetch request to broker 1\n");
732
+ matching_requests = test_mock_wait_matching_requests(
733
+ mcluster, 1, 2000, is_broker_fetch_request, &leader);
734
+ TEST_ASSERT_LATER(matching_requests > 0,
735
+ "Expected at least one fetch request to broker 1");
736
+
737
+ TEST_SAY("Wait OffsetForLeaderEpoch request to broker 1\n");
738
+ if (variation == 1) {
739
+ /* There's three OffsetForLeaderEpoch requests more in
740
+ * variation 1. See previous comment. */
741
+ expected_offset_for_leader_epoch_requests += 3;
742
+ }
743
+ matching_requests = test_mock_wait_matching_requests(
744
+ mcluster, 1, 1000, is_offset_for_leader_epoch_request, &leader);
745
+ TEST_ASSERT_LATER(
746
+ matching_requests == expected_offset_for_leader_epoch_requests,
747
+ "Expected %" PRIusz
748
+ " OffsetForLeaderEpoch request"
749
+ " to broker 1, got %" PRIusz,
750
+ expected_offset_for_leader_epoch_requests, matching_requests);
751
+ rd_kafka_mock_stop_request_tracking(mcluster);
752
+
753
+ rd_kafka_destroy(c1);
754
+ test_mock_cluster_destroy(mcluster);
755
+
756
+ TEST_LATER_CHECK();
757
+ SUB_TEST_PASS();
758
+ test_curr->is_fatal_cb = NULL;
759
+ }
760
+
761
+ /**
762
+ * @brief Opaque for do_test_list_offsets_leader_change.
763
+ */
764
+ typedef struct do_test_list_offsets_leader_change_s {
765
+ rd_kafka_mock_cluster_t *mcluster;
766
+ const char *topic;
767
+ int msg_cnt;
768
+ int variation;
769
+ } do_test_list_offsets_leader_change_t;
770
+
771
+ /**
772
+ * @brief Rebalance callback for do_test_list_offsets_leader_change.
773
+ */
774
+ static void do_test_list_offsets_leader_change_rebalance_cb(
775
+ rd_kafka_t *rk,
776
+ rd_kafka_resp_err_t err,
777
+ rd_kafka_topic_partition_list_t *partitions,
778
+ void *opaque) {
779
+ TEST_SAY("Rebalance callback: %s with %d partition(s)\n",
780
+ rd_kafka_err2str(err), partitions->cnt);
781
+ do_test_list_offsets_leader_change_t *test = opaque;
782
+ switch (err) {
783
+ case RD_KAFKA_RESP_ERR__ASSIGN_PARTITIONS: {
784
+ int retries = 0;
785
+ int64_t low, high;
786
+ rd_kafka_resp_err_t list_offsets_err =
787
+ RD_KAFKA_RESP_ERR_NO_ERROR;
788
+
789
+ TEST_ASSERT(partitions->cnt == 1,
790
+ "Expected 1 assigned partition, got %d",
791
+ partitions->cnt);
792
+
793
+ /* Change leader to 2 */
794
+ rd_kafka_mock_partition_set_leader(test->mcluster, test->topic,
795
+ 0, 2);
796
+
797
+ do {
798
+ /* Set a wrong leader epoch that should not be used
799
+ * for listing offsets. */
800
+ rd_kafka_topic_partition_set_leader_epoch(
801
+ &partitions->elems[0], 1234);
802
+
803
+ if (test->variation == 0) {
804
+ partitions->elems[0].offset = 1;
805
+ list_offsets_err = rd_kafka_offsets_for_times(
806
+ rk, partitions, 1000);
807
+ } else {
808
+ list_offsets_err =
809
+ rd_kafka_query_watermark_offsets(
810
+ rk, partitions->elems[0].topic,
811
+ partitions->elems[0].partition, &low,
812
+ &high, 1000);
813
+ }
814
+ retries++;
815
+ if (retries == 1) {
816
+ TEST_ASSERT(
817
+ list_offsets_err ==
818
+ RD_KAFKA_RESP_ERR_NOT_LEADER_FOR_PARTITION,
819
+ "Expected NOT_LEADER_FOR_PARTITION, got %s",
820
+ rd_kafka_err2str(list_offsets_err));
821
+ }
822
+ if (retries > 2)
823
+ TEST_FAIL(
824
+ "Offsets for times failed %d times "
825
+ " during the rebalance callback",
826
+ retries);
827
+ } while (list_offsets_err != RD_KAFKA_RESP_ERR_NO_ERROR);
828
+
829
+ TEST_ASSERT(retries == 2,
830
+ "There must be exactly 2 retries, "
831
+ "got %d",
832
+ retries);
833
+
834
+
835
+ if (test->variation == 0) {
836
+ /* Mock handler currently returns
837
+ * RD_KAFKA_OFFSET_SPEC_LATEST
838
+ * in the offsets for times case */
839
+ TEST_ASSERT(partitions->elems[0].offset ==
840
+ RD_KAFKA_OFFSET_SPEC_LATEST,
841
+ "Expected offset for times LATEST,"
842
+ " got %" PRId64,
843
+ partitions->elems[0].offset);
844
+ } else {
845
+ TEST_ASSERT(0 == low,
846
+ "Expected low offset 0"
847
+ ", got %" PRId64,
848
+ low);
849
+ TEST_ASSERT(10 == high,
850
+ "Expected high offset 10"
851
+ ", got %" PRId64,
852
+ high);
853
+ partitions->elems[0].offset = high;
854
+ }
855
+
856
+ test_consumer_assign_by_rebalance_protocol("rebalance", rk,
857
+ partitions);
858
+
859
+ break;
860
+ }
861
+ case RD_KAFKA_RESP_ERR__REVOKE_PARTITIONS:
862
+ test_consumer_unassign_by_rebalance_protocol("rebalance", rk,
863
+ partitions);
864
+ break;
865
+ default:
866
+ break;
867
+ }
868
+ }
869
+
870
+ /**
871
+ * @brief Test that listing offsets during a leader change works as expected.
872
+ * by returning a NOT_LEADER_FOR_PARTITION error and clearing the cache.
873
+ *
874
+ * There are two variations:
875
+ * - variation 0: uses rd_kafka_offsets_for_times
876
+ * - variation 1: uses rd_kafka_query_watermark_offsets
877
+ */
878
+ static void do_test_list_offsets_leader_change(int variation) {
879
+ const char *topic = test_mk_topic_name(__FUNCTION__, 1);
880
+ const char *c1_groupid = topic;
881
+ rd_kafka_t *c1;
882
+ const char *bootstraps;
883
+ rd_kafka_mock_cluster_t *mcluster;
884
+ int msg_cnt = 10;
885
+ uint64_t testid = test_id_generate();
886
+ rd_kafka_conf_t *conf;
887
+ do_test_list_offsets_leader_change_t opaque;
888
+
889
+ SUB_TEST_QUICK("%s", variation == 0 ? "offsets_for_times"
890
+ : "query_watermark_offsets");
891
+
892
+ mcluster = test_mock_cluster_new(2, &bootstraps);
893
+ rd_kafka_mock_topic_create(mcluster, topic, 1, 2);
894
+ rd_kafka_mock_partition_set_leader(mcluster, topic, 0, 1);
895
+
896
+ /* Seed the topic with messages */
897
+ test_produce_msgs_easy_v(topic, testid, 0, 0, msg_cnt, 10,
898
+ "bootstrap.servers", bootstraps, NULL);
899
+
900
+ test_conf_init(&conf, NULL, 60);
901
+ test_conf_set(conf, "bootstrap.servers", bootstraps);
902
+ test_conf_set(conf, "auto.offset.reset", "earliest");
903
+ rd_kafka_conf_set_rebalance_cb(
904
+ conf, do_test_list_offsets_leader_change_rebalance_cb);
905
+ opaque.mcluster = mcluster;
906
+ opaque.topic = topic;
907
+ opaque.msg_cnt = msg_cnt;
908
+ opaque.variation = variation;
909
+ rd_kafka_conf_set_opaque(conf, &opaque);
910
+
911
+ c1 = test_create_consumer(c1_groupid, NULL, conf, NULL);
912
+ test_consumer_subscribe(c1, topic);
913
+
914
+ /* Consumes no messages if assignment starts from
915
+ * latest as set in the rebalance callback,
916
+ * otherwise it's configured as earliest. */
917
+ test_consumer_poll_no_msgs("MSG_INIT", c1, testid, 5000);
918
+
919
+ rd_kafka_destroy(c1);
920
+
921
+ test_mock_cluster_destroy(mcluster);
922
+
923
+ TEST_LATER_CHECK();
924
+ SUB_TEST_PASS();
925
+ }
926
+
927
+ int main_0139_offset_validation_mock(int argc, char **argv) {
928
+
929
+ TEST_SKIP_MOCK_CLUSTER(0);
930
+
931
+ do_test_no_duplicates_during_offset_validation();
932
+
933
+ do_test_permanent_error_retried(RD_KAFKA_RESP_ERR__SSL);
934
+ do_test_permanent_error_retried(RD_KAFKA_RESP_ERR__RESOLVE);
935
+
936
+ do_test_two_leader_changes();
937
+
938
+ do_test_store_offset_without_leader_epoch();
939
+
940
+ do_test_leader_change_no_validation(0);
941
+ do_test_leader_change_no_validation(1);
942
+
943
+ do_test_leader_change_from_internal_broker(0);
944
+ do_test_leader_change_from_internal_broker(1);
945
+
946
+ do_test_list_offsets_leader_change(0);
947
+ do_test_list_offsets_leader_change(1);
948
+
949
+ return 0;
950
+ }