@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,1565 @@
1
+ /*
2
+ * librdkafka - Apache Kafka C library
3
+ *
4
+ * Copyright (c) 2012-2022, Magnus Edenhill
5
+ * 2023, Confluent Inc.
6
+ * All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions are met:
10
+ *
11
+ * 1. Redistributions of source code must retain the above copyright notice,
12
+ * this list of conditions and the following disclaimer.
13
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
14
+ * this list of conditions and the following disclaimer in the documentation
15
+ * and/or other materials provided with the distribution.
16
+ *
17
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
+ * POSSIBILITY OF SUCH DAMAGE.
28
+ */
29
+
30
+ // FIXME: Revise this documentation:
31
+ /**
32
+ * This file implements the consumer offset storage.
33
+ * It currently supports local file storage and broker OffsetCommit storage.
34
+ *
35
+ * Regardless of commit method (file, broker, ..) this is how it works:
36
+ * - When rdkafka, or the application, depending on if auto.offset.commit
37
+ * is enabled or not, calls rd_kafka_offset_store() with an offset to store,
38
+ * all it does is set rktp->rktp_stored_offset to this value.
39
+ * This can happen from any thread and is locked by the rktp lock.
40
+ * - The actual commit/write of the offset to its backing store (filesystem)
41
+ * is performed by the main rdkafka thread and scheduled at the configured
42
+ * auto.commit.interval.ms interval.
43
+ * - The write is performed in the main rdkafka thread (in a blocking manner
44
+ * for file based offsets) and once the write has
45
+ * succeeded rktp->rktp_committed_offset is updated to the new value.
46
+ * - If offset.store.sync.interval.ms is configured the main rdkafka thread
47
+ * will also make sure to fsync() each offset file accordingly. (file)
48
+ */
49
+
50
+
51
+ #include "rdkafka_int.h"
52
+ #include "rdkafka_topic.h"
53
+ #include "rdkafka_partition.h"
54
+ #include "rdkafka_offset.h"
55
+ #include "rdkafka_broker.h"
56
+ #include "rdkafka_request.h"
57
+
58
+ #include <stdio.h>
59
+ #include <sys/types.h>
60
+ #include <fcntl.h>
61
+
62
+ #ifdef _WIN32
63
+ #include <io.h>
64
+ #include <share.h>
65
+ #include <sys/stat.h>
66
+ #include <shlwapi.h>
67
+ #endif
68
+
69
+
70
+ /**
71
+ * Convert an absolute or logical offset to string.
72
+ */
73
+ const char *rd_kafka_offset2str(int64_t offset) {
74
+ static RD_TLS char ret[16][32];
75
+ static RD_TLS int i = 0;
76
+
77
+ i = (i + 1) % 16;
78
+
79
+ if (offset >= 0)
80
+ rd_snprintf(ret[i], sizeof(ret[i]), "%" PRId64, offset);
81
+ else if (offset == RD_KAFKA_OFFSET_BEGINNING)
82
+ return "BEGINNING";
83
+ else if (offset == RD_KAFKA_OFFSET_END)
84
+ return "END";
85
+ else if (offset == RD_KAFKA_OFFSET_STORED)
86
+ return "STORED";
87
+ else if (offset == RD_KAFKA_OFFSET_INVALID)
88
+ return "INVALID";
89
+ else if (offset <= RD_KAFKA_OFFSET_TAIL_BASE)
90
+ rd_snprintf(ret[i], sizeof(ret[i]), "TAIL(%lld)",
91
+ llabs(offset - RD_KAFKA_OFFSET_TAIL_BASE));
92
+ else
93
+ rd_snprintf(ret[i], sizeof(ret[i]), "%" PRId64 "?", offset);
94
+
95
+ return ret[i];
96
+ }
97
+
98
+ static void rd_kafka_offset_file_close(rd_kafka_toppar_t *rktp) {
99
+ if (!rktp->rktp_offset_fp)
100
+ return;
101
+
102
+ fclose(rktp->rktp_offset_fp);
103
+ rktp->rktp_offset_fp = NULL;
104
+ }
105
+
106
+
107
+ #ifndef _WIN32
108
+ /**
109
+ * Linux version of open callback providing racefree CLOEXEC.
110
+ */
111
+ int rd_kafka_open_cb_linux(const char *pathname,
112
+ int flags,
113
+ mode_t mode,
114
+ void *opaque) {
115
+ #ifdef O_CLOEXEC
116
+ return open(pathname, flags | O_CLOEXEC, mode);
117
+ #else
118
+ return rd_kafka_open_cb_generic(pathname, flags, mode, opaque);
119
+ #endif
120
+ }
121
+ #endif
122
+
123
+ /**
124
+ * Fallback version of open_cb NOT providing racefree CLOEXEC,
125
+ * but setting CLOEXEC after file open (if FD_CLOEXEC is defined).
126
+ */
127
+ int rd_kafka_open_cb_generic(const char *pathname,
128
+ int flags,
129
+ mode_t mode,
130
+ void *opaque) {
131
+ #ifndef _WIN32
132
+ int fd;
133
+ int on = 1;
134
+ fd = open(pathname, flags, mode);
135
+ if (fd == -1)
136
+ return -1;
137
+ #ifdef FD_CLOEXEC
138
+ fcntl(fd, F_SETFD, FD_CLOEXEC, &on);
139
+ #endif
140
+ return fd;
141
+ #else
142
+ int fd;
143
+ if (_sopen_s(&fd, pathname, flags, _SH_DENYNO, mode) != 0)
144
+ return -1;
145
+ return fd;
146
+ #endif
147
+ }
148
+
149
+
150
+ static int rd_kafka_offset_file_open(rd_kafka_toppar_t *rktp) {
151
+ rd_kafka_t *rk = rktp->rktp_rkt->rkt_rk;
152
+ int fd;
153
+
154
+ #ifndef _WIN32
155
+ mode_t mode = 0644;
156
+ #else
157
+ mode_t mode = _S_IREAD | _S_IWRITE;
158
+ #endif
159
+ if ((fd = rk->rk_conf.open_cb(rktp->rktp_offset_path, O_CREAT | O_RDWR,
160
+ mode, rk->rk_conf.opaque)) == -1) {
161
+ rd_kafka_op_err(rktp->rktp_rkt->rkt_rk, RD_KAFKA_RESP_ERR__FS,
162
+ "%s [%" PRId32
163
+ "]: "
164
+ "Failed to open offset file %s: %s",
165
+ rktp->rktp_rkt->rkt_topic->str,
166
+ rktp->rktp_partition, rktp->rktp_offset_path,
167
+ rd_strerror(errno));
168
+ return -1;
169
+ }
170
+
171
+ rktp->rktp_offset_fp =
172
+ #ifndef _WIN32
173
+ fdopen(fd, "r+");
174
+ #else
175
+ _fdopen(fd, "r+");
176
+ #endif
177
+
178
+ return 0;
179
+ }
180
+
181
+
182
+ static int64_t rd_kafka_offset_file_read(rd_kafka_toppar_t *rktp) {
183
+ char buf[22];
184
+ char *end;
185
+ int64_t offset;
186
+ size_t r;
187
+
188
+ if (fseek(rktp->rktp_offset_fp, 0, SEEK_SET) == -1) {
189
+ rd_kafka_op_err(rktp->rktp_rkt->rkt_rk, RD_KAFKA_RESP_ERR__FS,
190
+ "%s [%" PRId32
191
+ "]: "
192
+ "Seek (for read) failed on offset file %s: %s",
193
+ rktp->rktp_rkt->rkt_topic->str,
194
+ rktp->rktp_partition, rktp->rktp_offset_path,
195
+ rd_strerror(errno));
196
+ rd_kafka_offset_file_close(rktp);
197
+ return RD_KAFKA_OFFSET_INVALID;
198
+ }
199
+
200
+ r = fread(buf, 1, sizeof(buf) - 1, rktp->rktp_offset_fp);
201
+ if (r == 0) {
202
+ rd_kafka_dbg(rktp->rktp_rkt->rkt_rk, TOPIC, "OFFSET",
203
+ "%s [%" PRId32 "]: offset file (%s) is empty",
204
+ rktp->rktp_rkt->rkt_topic->str,
205
+ rktp->rktp_partition, rktp->rktp_offset_path);
206
+ return RD_KAFKA_OFFSET_INVALID;
207
+ }
208
+
209
+ buf[r] = '\0';
210
+
211
+ offset = strtoull(buf, &end, 10);
212
+ if (buf == end) {
213
+ rd_kafka_op_err(rktp->rktp_rkt->rkt_rk, RD_KAFKA_RESP_ERR__FS,
214
+ "%s [%" PRId32
215
+ "]: "
216
+ "Unable to parse offset in %s",
217
+ rktp->rktp_rkt->rkt_topic->str,
218
+ rktp->rktp_partition, rktp->rktp_offset_path);
219
+ return RD_KAFKA_OFFSET_INVALID;
220
+ }
221
+
222
+
223
+ rd_kafka_dbg(rktp->rktp_rkt->rkt_rk, TOPIC, "OFFSET",
224
+ "%s [%" PRId32 "]: Read offset %" PRId64
225
+ " from offset "
226
+ "file (%s)",
227
+ rktp->rktp_rkt->rkt_topic->str, rktp->rktp_partition,
228
+ offset, rktp->rktp_offset_path);
229
+
230
+ return offset;
231
+ }
232
+
233
+
234
+ /**
235
+ * Sync/flush offset file.
236
+ */
237
+ static int rd_kafka_offset_file_sync(rd_kafka_toppar_t *rktp) {
238
+ if (!rktp->rktp_offset_fp)
239
+ return 0;
240
+
241
+ rd_kafka_dbg(rktp->rktp_rkt->rkt_rk, TOPIC, "SYNC",
242
+ "%s [%" PRId32 "]: offset file sync",
243
+ rktp->rktp_rkt->rkt_topic->str, rktp->rktp_partition);
244
+
245
+ #ifndef _WIN32
246
+ (void)fflush(rktp->rktp_offset_fp);
247
+ (void)fsync(fileno(rktp->rktp_offset_fp)); // FIXME
248
+ #else
249
+ // FIXME
250
+ // FlushFileBuffers(_get_osfhandle(fileno(rktp->rktp_offset_fp)));
251
+ #endif
252
+ return 0;
253
+ }
254
+
255
+
256
+ /**
257
+ * Write offset to offset file.
258
+ *
259
+ * Locality: toppar's broker thread
260
+ */
261
+ static rd_kafka_resp_err_t
262
+ rd_kafka_offset_file_commit(rd_kafka_toppar_t *rktp) {
263
+ rd_kafka_topic_t *rkt = rktp->rktp_rkt;
264
+ int attempt;
265
+ rd_kafka_resp_err_t err = RD_KAFKA_RESP_ERR_NO_ERROR;
266
+ int64_t offset = rktp->rktp_stored_pos.offset;
267
+
268
+ for (attempt = 0; attempt < 2; attempt++) {
269
+ char buf[22];
270
+ int len;
271
+
272
+ if (!rktp->rktp_offset_fp)
273
+ if (rd_kafka_offset_file_open(rktp) == -1)
274
+ continue;
275
+
276
+ if (fseek(rktp->rktp_offset_fp, 0, SEEK_SET) == -1) {
277
+ rd_kafka_op_err(
278
+ rktp->rktp_rkt->rkt_rk, RD_KAFKA_RESP_ERR__FS,
279
+ "%s [%" PRId32
280
+ "]: "
281
+ "Seek failed on offset file %s: %s",
282
+ rktp->rktp_rkt->rkt_topic->str,
283
+ rktp->rktp_partition, rktp->rktp_offset_path,
284
+ rd_strerror(errno));
285
+ err = RD_KAFKA_RESP_ERR__FS;
286
+ rd_kafka_offset_file_close(rktp);
287
+ continue;
288
+ }
289
+
290
+ len = rd_snprintf(buf, sizeof(buf), "%" PRId64 "\n", offset);
291
+
292
+ if (fwrite(buf, 1, len, rktp->rktp_offset_fp) < 1) {
293
+ rd_kafka_op_err(
294
+ rktp->rktp_rkt->rkt_rk, RD_KAFKA_RESP_ERR__FS,
295
+ "%s [%" PRId32
296
+ "]: "
297
+ "Failed to write offset %" PRId64
298
+ " to "
299
+ "offset file %s: %s",
300
+ rktp->rktp_rkt->rkt_topic->str,
301
+ rktp->rktp_partition, offset,
302
+ rktp->rktp_offset_path, rd_strerror(errno));
303
+ err = RD_KAFKA_RESP_ERR__FS;
304
+ rd_kafka_offset_file_close(rktp);
305
+ continue;
306
+ }
307
+
308
+ /* Need to flush before truncate to preserve write ordering */
309
+ (void)fflush(rktp->rktp_offset_fp);
310
+
311
+ /* Truncate file */
312
+ #ifdef _WIN32
313
+ if (_chsize_s(_fileno(rktp->rktp_offset_fp), len) == -1)
314
+ ; /* Ignore truncate failures */
315
+ #else
316
+ if (ftruncate(fileno(rktp->rktp_offset_fp), len) == -1)
317
+ ; /* Ignore truncate failures */
318
+ #endif
319
+ rd_kafka_dbg(rktp->rktp_rkt->rkt_rk, TOPIC, "OFFSET",
320
+ "%s [%" PRId32 "]: wrote offset %" PRId64
321
+ " to "
322
+ "file %s",
323
+ rktp->rktp_rkt->rkt_topic->str,
324
+ rktp->rktp_partition, offset,
325
+ rktp->rktp_offset_path);
326
+
327
+ rktp->rktp_committed_pos.offset = offset;
328
+
329
+ /* If sync interval is set to immediate we sync right away. */
330
+ if (rkt->rkt_conf.offset_store_sync_interval_ms == 0)
331
+ rd_kafka_offset_file_sync(rktp);
332
+
333
+
334
+ return RD_KAFKA_RESP_ERR_NO_ERROR;
335
+ }
336
+
337
+
338
+ return err;
339
+ }
340
+
341
+
342
+
343
+ /**
344
+ * Commit a list of offsets asynchronously. Response will be queued on 'replyq'.
345
+ * Optional \p cb will be set on requesting op.
346
+ *
347
+ * Makes a copy of \p offsets (may be NULL for current assignment)
348
+ */
349
+ static rd_kafka_resp_err_t
350
+ rd_kafka_commit0(rd_kafka_t *rk,
351
+ const rd_kafka_topic_partition_list_t *offsets,
352
+ rd_kafka_toppar_t *rktp,
353
+ rd_kafka_replyq_t replyq,
354
+ void (*cb)(rd_kafka_t *rk,
355
+ rd_kafka_resp_err_t err,
356
+ rd_kafka_topic_partition_list_t *offsets,
357
+ void *opaque),
358
+ void *opaque,
359
+ const char *reason) {
360
+ rd_kafka_cgrp_t *rkcg;
361
+ rd_kafka_op_t *rko;
362
+
363
+ if (!(rkcg = rd_kafka_cgrp_get(rk)))
364
+ return RD_KAFKA_RESP_ERR__UNKNOWN_GROUP;
365
+
366
+ rko = rd_kafka_op_new(RD_KAFKA_OP_OFFSET_COMMIT);
367
+ rko->rko_u.offset_commit.reason = rd_strdup(reason);
368
+ rko->rko_replyq = replyq;
369
+ rko->rko_u.offset_commit.cb = cb;
370
+ rko->rko_u.offset_commit.opaque = opaque;
371
+ if (rktp)
372
+ rko->rko_rktp = rd_kafka_toppar_keep(rktp);
373
+
374
+ if (offsets)
375
+ rko->rko_u.offset_commit.partitions =
376
+ rd_kafka_topic_partition_list_copy(offsets);
377
+
378
+ rd_kafka_q_enq(rkcg->rkcg_ops, rko);
379
+
380
+ return RD_KAFKA_RESP_ERR_NO_ERROR;
381
+ }
382
+
383
+ /**
384
+ * NOTE: 'offsets' may be NULL, see official documentation.
385
+ */
386
+ rd_kafka_resp_err_t
387
+ rd_kafka_commit(rd_kafka_t *rk,
388
+ const rd_kafka_topic_partition_list_t *offsets,
389
+ int async) {
390
+ rd_kafka_cgrp_t *rkcg;
391
+ rd_kafka_resp_err_t err;
392
+ rd_kafka_q_t *repq = NULL;
393
+ rd_kafka_replyq_t rq = RD_KAFKA_NO_REPLYQ;
394
+
395
+ if (!(rkcg = rd_kafka_cgrp_get(rk)))
396
+ return RD_KAFKA_RESP_ERR__UNKNOWN_GROUP;
397
+
398
+ if (!async) {
399
+ repq = rd_kafka_q_new(rk);
400
+ rq = RD_KAFKA_REPLYQ(repq, 0);
401
+ }
402
+
403
+ err = rd_kafka_commit0(rk, offsets, NULL, rq, NULL, NULL, "manual");
404
+
405
+ if (!err && !async)
406
+ err = rd_kafka_q_wait_result(repq, RD_POLL_INFINITE);
407
+
408
+ if (!async)
409
+ rd_kafka_q_destroy_owner(repq);
410
+
411
+ return err;
412
+ }
413
+
414
+
415
+ rd_kafka_resp_err_t rd_kafka_commit_message(rd_kafka_t *rk,
416
+ const rd_kafka_message_t *rkmessage,
417
+ int async) {
418
+ rd_kafka_topic_partition_list_t *offsets;
419
+ rd_kafka_topic_partition_t *rktpar;
420
+ rd_kafka_resp_err_t err;
421
+
422
+ if (rkmessage->err)
423
+ return RD_KAFKA_RESP_ERR__INVALID_ARG;
424
+
425
+ offsets = rd_kafka_topic_partition_list_new(1);
426
+ rktpar = rd_kafka_topic_partition_list_add(
427
+ offsets, rd_kafka_topic_name(rkmessage->rkt), rkmessage->partition);
428
+ rktpar->offset = rkmessage->offset + 1;
429
+
430
+ err = rd_kafka_commit(rk, offsets, async);
431
+
432
+ rd_kafka_topic_partition_list_destroy(offsets);
433
+
434
+ return err;
435
+ }
436
+
437
+
438
+
439
+ rd_kafka_resp_err_t
440
+ rd_kafka_commit_queue(rd_kafka_t *rk,
441
+ const rd_kafka_topic_partition_list_t *offsets,
442
+ rd_kafka_queue_t *rkqu,
443
+ void (*cb)(rd_kafka_t *rk,
444
+ rd_kafka_resp_err_t err,
445
+ rd_kafka_topic_partition_list_t *offsets,
446
+ void *opaque),
447
+ void *opaque) {
448
+ rd_kafka_q_t *rkq;
449
+ rd_kafka_resp_err_t err;
450
+
451
+ if (!rd_kafka_cgrp_get(rk))
452
+ return RD_KAFKA_RESP_ERR__UNKNOWN_GROUP;
453
+
454
+ if (rkqu)
455
+ rkq = rkqu->rkqu_q;
456
+ else
457
+ rkq = rd_kafka_q_new(rk);
458
+
459
+ err = rd_kafka_commit0(rk, offsets, NULL, RD_KAFKA_REPLYQ(rkq, 0), cb,
460
+ opaque, "manual");
461
+
462
+ if (!rkqu) {
463
+ rd_kafka_op_t *rko = rd_kafka_q_pop_serve(
464
+ rkq, RD_POLL_INFINITE, 0, RD_KAFKA_Q_CB_FORCE_RETURN, NULL,
465
+ NULL);
466
+ if (!rko)
467
+ err = RD_KAFKA_RESP_ERR__TIMED_OUT;
468
+ else {
469
+ if (cb)
470
+ cb(rk, rko->rko_err,
471
+ rko->rko_u.offset_commit.partitions, opaque);
472
+ err = rko->rko_err;
473
+ rd_kafka_op_destroy(rko);
474
+ }
475
+
476
+ if (rkqu)
477
+ rd_kafka_q_destroy(rkq);
478
+ else
479
+ rd_kafka_q_destroy_owner(rkq);
480
+ }
481
+
482
+ return err;
483
+ }
484
+
485
+
486
+
487
+ /**
488
+ * Called when a broker commit is done.
489
+ *
490
+ * Locality: toppar handler thread
491
+ * Locks: none
492
+ */
493
+ static void
494
+ rd_kafka_offset_broker_commit_cb(rd_kafka_t *rk,
495
+ rd_kafka_resp_err_t err,
496
+ rd_kafka_topic_partition_list_t *offsets,
497
+ void *opaque) {
498
+ rd_kafka_toppar_t *rktp;
499
+ rd_kafka_topic_partition_t *rktpar;
500
+
501
+ if (offsets->cnt == 0) {
502
+ rd_kafka_dbg(rk, TOPIC, "OFFSETCOMMIT",
503
+ "No offsets to commit (commit_cb)");
504
+ return;
505
+ }
506
+
507
+ rktpar = &offsets->elems[0];
508
+
509
+ if (!(rktp =
510
+ rd_kafka_topic_partition_get_toppar(rk, rktpar, rd_false))) {
511
+ rd_kafka_dbg(rk, TOPIC, "OFFSETCOMMIT",
512
+ "No local partition found for %s [%" PRId32
513
+ "] "
514
+ "while parsing OffsetCommit response "
515
+ "(offset %" PRId64 ", error \"%s\")",
516
+ rktpar->topic, rktpar->partition, rktpar->offset,
517
+ rd_kafka_err2str(rktpar->err));
518
+ return;
519
+ }
520
+
521
+ if (!err)
522
+ err = rktpar->err;
523
+
524
+ rd_kafka_toppar_offset_commit_result(rktp, err, offsets);
525
+
526
+ rd_kafka_dbg(rktp->rktp_rkt->rkt_rk, TOPIC, "OFFSET",
527
+ "%s [%" PRId32 "]: offset %" PRId64 " %scommitted: %s",
528
+ rktp->rktp_rkt->rkt_topic->str, rktp->rktp_partition,
529
+ rktpar->offset, err ? "not " : "", rd_kafka_err2str(err));
530
+
531
+ rktp->rktp_committing_pos.offset = 0;
532
+
533
+ rd_kafka_toppar_lock(rktp);
534
+ if (rktp->rktp_flags & RD_KAFKA_TOPPAR_F_OFFSET_STORE_STOPPING)
535
+ rd_kafka_offset_store_term(rktp, err);
536
+ rd_kafka_toppar_unlock(rktp);
537
+
538
+ rd_kafka_toppar_destroy(rktp);
539
+ }
540
+
541
+
542
+ /**
543
+ * @locks_required rd_kafka_toppar_lock(rktp) MUST be held.
544
+ */
545
+ static rd_kafka_resp_err_t
546
+ rd_kafka_offset_broker_commit(rd_kafka_toppar_t *rktp, const char *reason) {
547
+ rd_kafka_topic_partition_list_t *offsets;
548
+ rd_kafka_topic_partition_t *rktpar;
549
+
550
+ rd_kafka_assert(rktp->rktp_rkt->rkt_rk, rktp->rktp_cgrp != NULL);
551
+ rd_kafka_assert(rktp->rktp_rkt->rkt_rk,
552
+ rktp->rktp_flags & RD_KAFKA_TOPPAR_F_OFFSET_STORE);
553
+
554
+ rktp->rktp_committing_pos = rktp->rktp_stored_pos;
555
+
556
+ offsets = rd_kafka_topic_partition_list_new(1);
557
+ rktpar = rd_kafka_topic_partition_list_add(
558
+ offsets, rktp->rktp_rkt->rkt_topic->str, rktp->rktp_partition);
559
+
560
+ rd_kafka_topic_partition_set_from_fetch_pos(rktpar,
561
+ rktp->rktp_committing_pos);
562
+ rd_kafka_topic_partition_set_metadata_from_rktp_stored(rktpar, rktp);
563
+
564
+ rd_kafka_dbg(rktp->rktp_rkt->rkt_rk, TOPIC, "OFFSETCMT",
565
+ "%.*s [%" PRId32 "]: committing %s: %s",
566
+ RD_KAFKAP_STR_PR(rktp->rktp_rkt->rkt_topic),
567
+ rktp->rktp_partition,
568
+ rd_kafka_fetch_pos2str(rktp->rktp_committing_pos), reason);
569
+
570
+ rd_kafka_commit0(rktp->rktp_rkt->rkt_rk, offsets, rktp,
571
+ RD_KAFKA_REPLYQ(rktp->rktp_ops, 0),
572
+ rd_kafka_offset_broker_commit_cb, NULL, reason);
573
+
574
+ rd_kafka_topic_partition_list_destroy(offsets);
575
+
576
+ return RD_KAFKA_RESP_ERR__IN_PROGRESS;
577
+ }
578
+
579
+
580
+
581
+ /**
582
+ * Commit offset to backing store.
583
+ * This might be an async operation.
584
+ *
585
+ * Locality: toppar handler thread
586
+ */
587
+ static rd_kafka_resp_err_t rd_kafka_offset_commit(rd_kafka_toppar_t *rktp,
588
+ const char *reason) {
589
+ rd_kafka_dbg(rktp->rktp_rkt->rkt_rk, TOPIC, "OFFSET",
590
+ "%s [%" PRId32 "]: commit: stored %s > committed %s?",
591
+ rktp->rktp_rkt->rkt_topic->str, rktp->rktp_partition,
592
+ rd_kafka_fetch_pos2str(rktp->rktp_stored_pos),
593
+ rd_kafka_fetch_pos2str(rktp->rktp_committed_pos));
594
+
595
+ /* Already committed */
596
+ if (rd_kafka_fetch_pos_cmp(&rktp->rktp_stored_pos,
597
+ &rktp->rktp_committed_pos) <= 0)
598
+ return RD_KAFKA_RESP_ERR_NO_ERROR;
599
+
600
+ /* Already committing (for async ops) */
601
+ if (rd_kafka_fetch_pos_cmp(&rktp->rktp_stored_pos,
602
+ &rktp->rktp_committing_pos) <= 0)
603
+ return RD_KAFKA_RESP_ERR__PREV_IN_PROGRESS;
604
+
605
+ switch (rktp->rktp_rkt->rkt_conf.offset_store_method) {
606
+ case RD_KAFKA_OFFSET_METHOD_FILE:
607
+ return rd_kafka_offset_file_commit(rktp);
608
+ case RD_KAFKA_OFFSET_METHOD_BROKER:
609
+ return rd_kafka_offset_broker_commit(rktp, reason);
610
+ default:
611
+ /* UNREACHABLE */
612
+ return RD_KAFKA_RESP_ERR__INVALID_ARG;
613
+ }
614
+ }
615
+
616
+
617
+
618
+ /**
619
+ * Sync offset backing store. This is only used for METHOD_FILE.
620
+ *
621
+ * Locality: rktp's broker thread.
622
+ */
623
+ rd_kafka_resp_err_t rd_kafka_offset_sync(rd_kafka_toppar_t *rktp) {
624
+ switch (rktp->rktp_rkt->rkt_conf.offset_store_method) {
625
+ case RD_KAFKA_OFFSET_METHOD_FILE:
626
+ return rd_kafka_offset_file_sync(rktp);
627
+ default:
628
+ return RD_KAFKA_RESP_ERR__INVALID_ARG;
629
+ }
630
+ }
631
+
632
+
633
+ /**
634
+ * Store offset.
635
+ * Typically called from application code.
636
+ *
637
+ * NOTE: No locks must be held.
638
+ *
639
+ * @deprecated Use rd_kafka_offsets_store().
640
+ */
641
+ rd_kafka_resp_err_t rd_kafka_offset_store(rd_kafka_topic_t *app_rkt,
642
+ int32_t partition,
643
+ int64_t offset) {
644
+ rd_kafka_topic_t *rkt = rd_kafka_topic_proper(app_rkt);
645
+ rd_kafka_toppar_t *rktp;
646
+ rd_kafka_resp_err_t err;
647
+ rd_kafka_fetch_pos_t pos =
648
+ RD_KAFKA_FETCH_POS(offset + 1, -1 /*no leader epoch known*/);
649
+
650
+ /* Find toppar */
651
+ rd_kafka_topic_rdlock(rkt);
652
+ if (!(rktp = rd_kafka_toppar_get(rkt, partition, 0 /*!ua_on_miss*/))) {
653
+ rd_kafka_topic_rdunlock(rkt);
654
+ return RD_KAFKA_RESP_ERR__UNKNOWN_PARTITION;
655
+ }
656
+ rd_kafka_topic_rdunlock(rkt);
657
+
658
+ err = rd_kafka_offset_store0(rktp, pos, NULL, 0,
659
+ rd_false /* Don't force */, RD_DO_LOCK);
660
+
661
+ rd_kafka_toppar_destroy(rktp);
662
+
663
+ return err;
664
+ }
665
+
666
+
667
+ rd_kafka_resp_err_t
668
+ rd_kafka_offsets_store(rd_kafka_t *rk,
669
+ rd_kafka_topic_partition_list_t *offsets) {
670
+ int i;
671
+ int ok_cnt = 0;
672
+ rd_kafka_resp_err_t last_err = RD_KAFKA_RESP_ERR_NO_ERROR;
673
+
674
+ if (rk->rk_conf.enable_auto_offset_store)
675
+ return RD_KAFKA_RESP_ERR__INVALID_ARG;
676
+
677
+ for (i = 0; i < offsets->cnt; i++) {
678
+ rd_kafka_topic_partition_t *rktpar = &offsets->elems[i];
679
+ rd_kafka_toppar_t *rktp;
680
+ rd_kafka_fetch_pos_t pos =
681
+ RD_KAFKA_FETCH_POS(rktpar->offset, -1);
682
+
683
+ rktp =
684
+ rd_kafka_topic_partition_get_toppar(rk, rktpar, rd_false);
685
+ if (!rktp) {
686
+ rktpar->err = RD_KAFKA_RESP_ERR__UNKNOWN_PARTITION;
687
+ last_err = rktpar->err;
688
+ continue;
689
+ }
690
+
691
+ pos.leader_epoch =
692
+ rd_kafka_topic_partition_get_leader_epoch(rktpar);
693
+
694
+ rktpar->err = rd_kafka_offset_store0(
695
+ rktp, pos, rktpar->metadata, rktpar->metadata_size,
696
+ rd_false /* don't force */, RD_DO_LOCK);
697
+ rd_kafka_toppar_destroy(rktp);
698
+
699
+ if (rktpar->err)
700
+ last_err = rktpar->err;
701
+ else
702
+ ok_cnt++;
703
+ }
704
+
705
+ return offsets->cnt > 0 && ok_cnt == 0 ? last_err
706
+ : RD_KAFKA_RESP_ERR_NO_ERROR;
707
+ }
708
+
709
+
710
+ rd_kafka_error_t *rd_kafka_offset_store_message(rd_kafka_message_t *rkmessage) {
711
+ rd_kafka_toppar_t *rktp;
712
+ rd_kafka_op_t *rko;
713
+ rd_kafka_resp_err_t err;
714
+ rd_kafka_msg_t *rkm = (rd_kafka_msg_t *)rkmessage;
715
+ rd_kafka_fetch_pos_t pos;
716
+
717
+ if (rkmessage->err)
718
+ return rd_kafka_error_new(RD_KAFKA_RESP_ERR__INVALID_ARG,
719
+ "Message object must not have an "
720
+ "error set");
721
+
722
+ if (unlikely(!(rko = rd_kafka_message2rko(rkmessage)) ||
723
+ !(rktp = rko->rko_rktp)))
724
+ return rd_kafka_error_new(RD_KAFKA_RESP_ERR__INVALID_ARG,
725
+ "Invalid message object, "
726
+ "not a consumed message");
727
+
728
+ pos = RD_KAFKA_FETCH_POS(rkmessage->offset + 1,
729
+ rkm->rkm_u.consumer.leader_epoch);
730
+ err = rd_kafka_offset_store0(rktp, pos, NULL, 0,
731
+ rd_false /* Don't force */, RD_DO_LOCK);
732
+
733
+ if (err == RD_KAFKA_RESP_ERR__STATE)
734
+ return rd_kafka_error_new(err, "Partition is not assigned");
735
+ else if (err)
736
+ return rd_kafka_error_new(err, "Failed to store offset: %s",
737
+ rd_kafka_err2str(err));
738
+
739
+ return NULL;
740
+ }
741
+
742
+
743
+
744
+ /**
745
+ * Decommissions the use of an offset file for a toppar.
746
+ * The file content will not be touched and the file will not be removed.
747
+ */
748
+ static rd_kafka_resp_err_t rd_kafka_offset_file_term(rd_kafka_toppar_t *rktp) {
749
+ rd_kafka_resp_err_t err = RD_KAFKA_RESP_ERR_NO_ERROR;
750
+
751
+ /* Sync offset file if the sync is intervalled (> 0) */
752
+ if (rktp->rktp_rkt->rkt_conf.offset_store_sync_interval_ms > 0) {
753
+ rd_kafka_offset_file_sync(rktp);
754
+ rd_kafka_timer_stop(&rktp->rktp_rkt->rkt_rk->rk_timers,
755
+ &rktp->rktp_offset_sync_tmr, 1 /*lock*/);
756
+ }
757
+
758
+
759
+ rd_kafka_offset_file_close(rktp);
760
+
761
+ rd_free(rktp->rktp_offset_path);
762
+ rktp->rktp_offset_path = NULL;
763
+
764
+ return err;
765
+ }
766
+
767
+ static rd_kafka_op_res_t rd_kafka_offset_reset_op_cb(rd_kafka_t *rk,
768
+ rd_kafka_q_t *rkq,
769
+ rd_kafka_op_t *rko) {
770
+ rd_kafka_toppar_t *rktp = rko->rko_rktp;
771
+ rd_kafka_toppar_lock(rktp);
772
+ rd_kafka_offset_reset(rktp, rko->rko_u.offset_reset.broker_id,
773
+ rko->rko_u.offset_reset.pos, rko->rko_err, "%s",
774
+ rko->rko_u.offset_reset.reason);
775
+ rd_kafka_toppar_unlock(rktp);
776
+ return RD_KAFKA_OP_RES_HANDLED;
777
+ }
778
+
779
+ /**
780
+ * @brief Take action when the offset for a toppar is unusable (due to an
781
+ * error, or offset is logical).
782
+ *
783
+ * @param rktp the toppar
784
+ * @param broker_id Originating broker, if any, else RD_KAFKA_NODEID_UA.
785
+ * @param err_pos a logical offset, or offset corresponding to the error.
786
+ * @param err the error, or RD_KAFKA_RESP_ERR_NO_ERROR if offset is logical.
787
+ * @param fmt a reason string for logging.
788
+ *
789
+ * @locality any. if not main thread, work will be enqued on main thread.
790
+ * @locks_required toppar_lock() MUST be held
791
+ */
792
+ void rd_kafka_offset_reset(rd_kafka_toppar_t *rktp,
793
+ int32_t broker_id,
794
+ rd_kafka_fetch_pos_t err_pos,
795
+ rd_kafka_resp_err_t err,
796
+ const char *fmt,
797
+ ...) {
798
+ rd_kafka_fetch_pos_t pos = {RD_KAFKA_OFFSET_INVALID, -1};
799
+ const char *extra = "";
800
+ char reason[512];
801
+ va_list ap;
802
+
803
+ va_start(ap, fmt);
804
+ rd_vsnprintf(reason, sizeof(reason), fmt, ap);
805
+ va_end(ap);
806
+
807
+ /* Enqueue op for toppar handler thread if we're on the wrong thread. */
808
+ if (!thrd_is_current(rktp->rktp_rkt->rkt_rk->rk_thread)) {
809
+ rd_kafka_op_t *rko =
810
+ rd_kafka_op_new(RD_KAFKA_OP_OFFSET_RESET | RD_KAFKA_OP_CB);
811
+ rko->rko_op_cb = rd_kafka_offset_reset_op_cb;
812
+ rko->rko_err = err;
813
+ rko->rko_rktp = rd_kafka_toppar_keep(rktp);
814
+ rko->rko_u.offset_reset.broker_id = broker_id;
815
+ rko->rko_u.offset_reset.pos = err_pos;
816
+ rko->rko_u.offset_reset.reason = rd_strdup(reason);
817
+ rd_kafka_q_enq(rktp->rktp_ops, rko);
818
+ return;
819
+ }
820
+
821
+ if (err_pos.offset == RD_KAFKA_OFFSET_INVALID || err)
822
+ pos.offset = rktp->rktp_rkt->rkt_conf.auto_offset_reset;
823
+ else
824
+ pos.offset = err_pos.offset;
825
+
826
+ if (pos.offset == RD_KAFKA_OFFSET_INVALID) {
827
+ /* Error, auto.offset.reset tells us to error out. */
828
+ if (broker_id != RD_KAFKA_NODEID_UA)
829
+ rd_kafka_consumer_err(
830
+ rktp->rktp_fetchq, broker_id,
831
+ RD_KAFKA_RESP_ERR__AUTO_OFFSET_RESET, 0, NULL, rktp,
832
+ err_pos.offset, "%s: %s (broker %" PRId32 ")",
833
+ reason, rd_kafka_err2str(err), broker_id);
834
+ else
835
+ rd_kafka_consumer_err(
836
+ rktp->rktp_fetchq, broker_id,
837
+ RD_KAFKA_RESP_ERR__AUTO_OFFSET_RESET, 0, NULL, rktp,
838
+ err_pos.offset, "%s: %s", reason,
839
+ rd_kafka_err2str(err));
840
+
841
+ rd_kafka_toppar_set_fetch_state(rktp,
842
+ RD_KAFKA_TOPPAR_FETCH_NONE);
843
+
844
+ } else if (pos.offset == RD_KAFKA_OFFSET_BEGINNING &&
845
+ rktp->rktp_lo_offset >= 0) {
846
+ /* Use cached log start from last Fetch if available.
847
+ * Note: The cached end offset (rktp_ls_offset) can't be
848
+ * used here since the End offset is a constantly moving
849
+ * target as new messages are produced. */
850
+ extra = "cached BEGINNING offset ";
851
+ pos.offset = rktp->rktp_lo_offset;
852
+ pos.leader_epoch = -1;
853
+ rd_kafka_toppar_next_offset_handle(rktp, pos);
854
+
855
+ } else {
856
+ /* Else query cluster for offset */
857
+ rktp->rktp_query_pos = pos;
858
+ rd_kafka_toppar_set_fetch_state(
859
+ rktp, RD_KAFKA_TOPPAR_FETCH_OFFSET_QUERY);
860
+ }
861
+
862
+ /* Offset resets due to error are logged since they might have quite
863
+ * critical impact. For non-errors, or for auto.offset.reset=error,
864
+ * the reason is simply debug-logged. */
865
+ if (!err || err == RD_KAFKA_RESP_ERR__NO_OFFSET ||
866
+ pos.offset == RD_KAFKA_OFFSET_INVALID)
867
+ rd_kafka_dbg(
868
+ rktp->rktp_rkt->rkt_rk, TOPIC, "OFFSET",
869
+ "%s [%" PRId32 "]: offset reset (at %s, broker %" PRId32
870
+ ") "
871
+ "to %s%s: %s: %s",
872
+ rktp->rktp_rkt->rkt_topic->str, rktp->rktp_partition,
873
+ rd_kafka_fetch_pos2str(err_pos), broker_id, extra,
874
+ rd_kafka_fetch_pos2str(pos), reason, rd_kafka_err2str(err));
875
+ else
876
+ rd_kafka_log(
877
+ rktp->rktp_rkt->rkt_rk, LOG_WARNING, "OFFSET",
878
+ "%s [%" PRId32 "]: offset reset (at %s, broker %" PRId32
879
+ ") to %s%s: %s: %s",
880
+ rktp->rktp_rkt->rkt_topic->str, rktp->rktp_partition,
881
+ rd_kafka_fetch_pos2str(err_pos), broker_id, extra,
882
+ rd_kafka_fetch_pos2str(pos), reason, rd_kafka_err2str(err));
883
+
884
+ /* Note: If rktp is not delegated to the leader, then low and high
885
+ offsets will necessarily be cached from the last FETCH request,
886
+ and so this offset query will never occur in that case for
887
+ BEGINNING / END logical offsets. */
888
+ if (rktp->rktp_fetch_state == RD_KAFKA_TOPPAR_FETCH_OFFSET_QUERY)
889
+ rd_kafka_toppar_offset_request(rktp, rktp->rktp_query_pos,
890
+ err ? 100 : 0);
891
+ }
892
+
893
+
894
+
895
+ /**
896
+ * @brief Offset validation retry timer
897
+ */
898
+ static void rd_kafka_offset_validate_tmr_cb(rd_kafka_timers_t *rkts,
899
+ void *arg) {
900
+ rd_kafka_toppar_t *rktp = arg;
901
+
902
+ rd_kafka_toppar_lock(rktp);
903
+ /* Retry validation only when it's still needed.
904
+ * Even if validation can be started in fetch states ACTIVE and
905
+ * VALIDATE_EPOCH_WAIT, its retry should be done only
906
+ * in fetch state VALIDATE_EPOCH_WAIT. */
907
+ if (rktp->rktp_fetch_state == RD_KAFKA_TOPPAR_FETCH_VALIDATE_EPOCH_WAIT)
908
+ rd_kafka_offset_validate(rktp, "retrying offset validation");
909
+ else {
910
+ rd_kafka_dbg(rktp->rktp_rkt->rkt_rk, FETCH, "VALIDATE",
911
+ "%.*s [%" PRId32
912
+ "]: skipping offset "
913
+ "validation retry in fetch state %s",
914
+ RD_KAFKAP_STR_PR(rktp->rktp_rkt->rkt_topic),
915
+ rktp->rktp_partition,
916
+ rd_kafka_fetch_states[rktp->rktp_fetch_state]);
917
+ }
918
+ rd_kafka_toppar_unlock(rktp);
919
+ }
920
+
921
+
922
+
923
+ /**
924
+ * @brief OffsetForLeaderEpochResponse handler that
925
+ * pushes the matched toppar's to the next state.
926
+ *
927
+ * @locality rdkafka main thread
928
+ */
929
+ static void rd_kafka_toppar_handle_OffsetForLeaderEpoch(rd_kafka_t *rk,
930
+ rd_kafka_broker_t *rkb,
931
+ rd_kafka_resp_err_t err,
932
+ rd_kafka_buf_t *rkbuf,
933
+ rd_kafka_buf_t *request,
934
+ void *opaque) {
935
+ rd_kafka_topic_partition_list_t *parts = NULL;
936
+ rd_kafka_toppar_t *rktp = opaque;
937
+ rd_kafka_topic_partition_t *rktpar;
938
+ int64_t end_offset;
939
+ int32_t end_offset_leader_epoch;
940
+ rd_kafka_toppar_lock(rktp);
941
+ rktp->rktp_flags &= ~RD_KAFKA_TOPPAR_F_VALIDATING;
942
+ rd_kafka_toppar_unlock(rktp);
943
+
944
+ if (err == RD_KAFKA_RESP_ERR__DESTROY) {
945
+ rd_kafka_toppar_destroy(rktp); /* Drop refcnt */
946
+ return;
947
+ }
948
+
949
+ err = rd_kafka_handle_OffsetForLeaderEpoch(rk, rkb, err, rkbuf, request,
950
+ &parts);
951
+
952
+ rd_kafka_toppar_lock(rktp);
953
+
954
+ if (rktp->rktp_fetch_state != RD_KAFKA_TOPPAR_FETCH_VALIDATE_EPOCH_WAIT)
955
+ err = RD_KAFKA_RESP_ERR__OUTDATED;
956
+
957
+ if (unlikely(!err && parts->cnt == 0))
958
+ err = RD_KAFKA_RESP_ERR__UNKNOWN_PARTITION;
959
+
960
+ if (!err) {
961
+ err = (&parts->elems[0])->err;
962
+ }
963
+
964
+ if (err) {
965
+ int actions;
966
+
967
+ rd_rkb_dbg(rkb, FETCH, "OFFSETVALID",
968
+ "%.*s [%" PRId32
969
+ "]: OffsetForLeaderEpoch requested failed: %s",
970
+ RD_KAFKAP_STR_PR(rktp->rktp_rkt->rkt_topic),
971
+ rktp->rktp_partition, rd_kafka_err2str(err));
972
+
973
+ if (err == RD_KAFKA_RESP_ERR__UNSUPPORTED_FEATURE) {
974
+ rd_rkb_dbg(rkb, FETCH, "VALIDATE",
975
+ "%.*s [%" PRId32
976
+ "]: offset and epoch validation not "
977
+ "supported by broker: validation skipped",
978
+ RD_KAFKAP_STR_PR(rktp->rktp_rkt->rkt_topic),
979
+ rktp->rktp_partition);
980
+ rd_kafka_toppar_set_fetch_state(
981
+ rktp, RD_KAFKA_TOPPAR_FETCH_ACTIVE);
982
+ goto done;
983
+
984
+ } else if (err == RD_KAFKA_RESP_ERR__OUTDATED) {
985
+ /* Partition state has changed, this response
986
+ * is outdated. */
987
+ goto done;
988
+ }
989
+
990
+ actions = rd_kafka_err_action(
991
+ rkb, err, request, RD_KAFKA_ERR_ACTION_REFRESH,
992
+ RD_KAFKA_RESP_ERR_UNKNOWN_LEADER_EPOCH,
993
+ RD_KAFKA_ERR_ACTION_REFRESH,
994
+ RD_KAFKA_RESP_ERR_FENCED_LEADER_EPOCH,
995
+ RD_KAFKA_ERR_ACTION_REFRESH,
996
+ RD_KAFKA_RESP_ERR_UNKNOWN_TOPIC_OR_PART,
997
+ RD_KAFKA_ERR_ACTION_REFRESH,
998
+ RD_KAFKA_RESP_ERR_OFFSET_NOT_AVAILABLE,
999
+ RD_KAFKA_ERR_ACTION_REFRESH,
1000
+ RD_KAFKA_RESP_ERR_KAFKA_STORAGE_ERROR,
1001
+ RD_KAFKA_ERR_ACTION_END);
1002
+
1003
+
1004
+ if (actions & RD_KAFKA_ERR_ACTION_REFRESH)
1005
+ /* Metadata refresh is ongoing, so force it */
1006
+ rd_kafka_topic_leader_query0(rk, rktp->rktp_rkt, 1,
1007
+ rd_true /* force */);
1008
+
1009
+ /* No need for refcnt on rktp for timer opaque
1010
+ * since the timer resides on the rktp and will be
1011
+ * stopped on toppar remove.
1012
+ * Retries the validation with a new call even in
1013
+ * case of permanent error. */
1014
+ rd_kafka_timer_start_oneshot(
1015
+ &rk->rk_timers, &rktp->rktp_validate_tmr, rd_false,
1016
+ 500 * 1000 /* 500ms */, rd_kafka_offset_validate_tmr_cb,
1017
+ rktp);
1018
+ goto done;
1019
+ }
1020
+
1021
+
1022
+ rktpar = &parts->elems[0];
1023
+ end_offset = rktpar->offset;
1024
+ end_offset_leader_epoch =
1025
+ rd_kafka_topic_partition_get_leader_epoch(rktpar);
1026
+
1027
+ if (end_offset < 0 || end_offset_leader_epoch < 0) {
1028
+ rd_kafka_offset_reset(
1029
+ rktp, rd_kafka_broker_id(rkb),
1030
+ rktp->rktp_offset_validation_pos,
1031
+ RD_KAFKA_RESP_ERR__LOG_TRUNCATION,
1032
+ "No epoch found less or equal to "
1033
+ "%s: broker end offset is %" PRId64
1034
+ " (offset leader epoch %" PRId32
1035
+ ")."
1036
+ " Reset using configured policy.",
1037
+ rd_kafka_fetch_pos2str(rktp->rktp_offset_validation_pos),
1038
+ end_offset, end_offset_leader_epoch);
1039
+
1040
+ } else if (end_offset < rktp->rktp_offset_validation_pos.offset) {
1041
+
1042
+ if (rktp->rktp_rkt->rkt_conf.auto_offset_reset ==
1043
+ RD_KAFKA_OFFSET_INVALID /* auto.offset.reset=error */) {
1044
+ rd_kafka_offset_reset(
1045
+ rktp, rd_kafka_broker_id(rkb),
1046
+ RD_KAFKA_FETCH_POS(RD_KAFKA_OFFSET_INVALID,
1047
+ rktp->rktp_leader_epoch),
1048
+ RD_KAFKA_RESP_ERR__LOG_TRUNCATION,
1049
+ "Partition log truncation detected at %s: "
1050
+ "broker end offset is %" PRId64
1051
+ " (offset leader epoch %" PRId32
1052
+ "). "
1053
+ "Reset to INVALID.",
1054
+ rd_kafka_fetch_pos2str(
1055
+ rktp->rktp_offset_validation_pos),
1056
+ end_offset, end_offset_leader_epoch);
1057
+
1058
+ } else {
1059
+ rd_kafka_toppar_unlock(rktp);
1060
+
1061
+ /* Seek to the updated end offset */
1062
+ rd_kafka_fetch_pos_t fetch_pos =
1063
+ rd_kafka_topic_partition_get_fetch_pos(rktpar);
1064
+ fetch_pos.validated = rd_true;
1065
+
1066
+ rd_kafka_toppar_op_seek(rktp, fetch_pos,
1067
+ RD_KAFKA_NO_REPLYQ);
1068
+
1069
+ rd_kafka_topic_partition_list_destroy(parts);
1070
+ rd_kafka_toppar_destroy(rktp);
1071
+
1072
+ return;
1073
+ }
1074
+
1075
+ } else {
1076
+ rd_rkb_dbg(rkb, FETCH, "OFFSETVALID",
1077
+ "%.*s [%" PRId32
1078
+ "]: offset and epoch validation "
1079
+ "succeeded: broker end offset %" PRId64
1080
+ " (offset leader epoch %" PRId32 ")",
1081
+ RD_KAFKAP_STR_PR(rktp->rktp_rkt->rkt_topic),
1082
+ rktp->rktp_partition, end_offset,
1083
+ end_offset_leader_epoch);
1084
+
1085
+ rd_kafka_toppar_set_fetch_state(rktp,
1086
+ RD_KAFKA_TOPPAR_FETCH_ACTIVE);
1087
+ }
1088
+
1089
+ done:
1090
+ rd_kafka_toppar_unlock(rktp);
1091
+
1092
+ if (parts)
1093
+ rd_kafka_topic_partition_list_destroy(parts);
1094
+ rd_kafka_toppar_destroy(rktp);
1095
+ }
1096
+
1097
+
1098
+ static rd_kafka_op_res_t rd_kafka_offset_validate_op_cb(rd_kafka_t *rk,
1099
+ rd_kafka_q_t *rkq,
1100
+ rd_kafka_op_t *rko) {
1101
+ rd_kafka_toppar_t *rktp = rko->rko_rktp;
1102
+ rd_kafka_toppar_lock(rktp);
1103
+ rd_kafka_offset_validate(rktp, "%s", rko->rko_u.offset_reset.reason);
1104
+ rd_kafka_toppar_unlock(rktp);
1105
+ return RD_KAFKA_OP_RES_HANDLED;
1106
+ }
1107
+
1108
+ /**
1109
+ * @brief Validate partition epoch and offset (KIP-320).
1110
+ *
1111
+ * @param rktp the toppar
1112
+ * @param err Optional error code that triggered the validation.
1113
+ * @param fmt a reason string for logging.
1114
+ *
1115
+ * @locality any. if not main thread, work will be enqued on main thread.
1116
+ * @locks_required toppar_lock() MUST be held
1117
+ */
1118
+ void rd_kafka_offset_validate(rd_kafka_toppar_t *rktp, const char *fmt, ...) {
1119
+ rd_kafka_topic_partition_list_t *parts;
1120
+ rd_kafka_topic_partition_t *rktpar;
1121
+ char reason[512];
1122
+ va_list ap;
1123
+
1124
+ if (rktp->rktp_rkt->rkt_rk->rk_type != RD_KAFKA_CONSUMER)
1125
+ return;
1126
+
1127
+ va_start(ap, fmt);
1128
+ rd_vsnprintf(reason, sizeof(reason), fmt, ap);
1129
+ va_end(ap);
1130
+
1131
+ /* Enqueue op for toppar handler thread if we're on the wrong thread. */
1132
+ if (!thrd_is_current(rktp->rktp_rkt->rkt_rk->rk_thread)) {
1133
+ /* Reuse OP_OFFSET_RESET type */
1134
+ rd_kafka_op_t *rko =
1135
+ rd_kafka_op_new(RD_KAFKA_OP_OFFSET_RESET | RD_KAFKA_OP_CB);
1136
+ rko->rko_op_cb = rd_kafka_offset_validate_op_cb;
1137
+ rko->rko_rktp = rd_kafka_toppar_keep(rktp);
1138
+ rko->rko_u.offset_reset.reason = rd_strdup(reason);
1139
+ rd_kafka_q_enq(rktp->rktp_ops, rko);
1140
+ return;
1141
+ }
1142
+
1143
+ if (rktp->rktp_fetch_state != RD_KAFKA_TOPPAR_FETCH_ACTIVE &&
1144
+ rktp->rktp_fetch_state !=
1145
+ RD_KAFKA_TOPPAR_FETCH_VALIDATE_EPOCH_WAIT) {
1146
+ rd_kafka_dbg(rktp->rktp_rkt->rkt_rk, FETCH, "VALIDATE",
1147
+ "%.*s [%" PRId32
1148
+ "]: skipping offset "
1149
+ "validation in fetch state %s",
1150
+ RD_KAFKAP_STR_PR(rktp->rktp_rkt->rkt_topic),
1151
+ rktp->rktp_partition,
1152
+ rd_kafka_fetch_states[rktp->rktp_fetch_state]);
1153
+ return;
1154
+ }
1155
+
1156
+
1157
+ if (rktp->rktp_leader_id == -1 || !rktp->rktp_leader ||
1158
+ rktp->rktp_leader->rkb_source == RD_KAFKA_INTERNAL) {
1159
+ rd_kafka_dbg(rktp->rktp_rkt->rkt_rk, FETCH, "VALIDATE",
1160
+ "%.*s [%" PRId32
1161
+ "]: unable to perform offset "
1162
+ "validation: partition leader not available. "
1163
+ "Retrying when available",
1164
+ RD_KAFKAP_STR_PR(rktp->rktp_rkt->rkt_topic),
1165
+ rktp->rktp_partition);
1166
+ return;
1167
+ }
1168
+
1169
+ /* If the fetch start position does not have an epoch set then
1170
+ * there is no point in doing validation.
1171
+ * This is the case for epoch-less seek()s or epoch-less
1172
+ * committed offsets. */
1173
+ if (rktp->rktp_offset_validation_pos.leader_epoch == -1) {
1174
+ rd_kafka_dbg(
1175
+ rktp->rktp_rkt->rkt_rk, FETCH, "VALIDATE",
1176
+ "%.*s [%" PRId32
1177
+ "]: skipping offset "
1178
+ "validation for %s: no leader epoch set",
1179
+ RD_KAFKAP_STR_PR(rktp->rktp_rkt->rkt_topic),
1180
+ rktp->rktp_partition,
1181
+ rd_kafka_fetch_pos2str(rktp->rktp_offset_validation_pos));
1182
+ rd_kafka_toppar_set_fetch_state(rktp,
1183
+ RD_KAFKA_TOPPAR_FETCH_ACTIVE);
1184
+ return;
1185
+ }
1186
+
1187
+ if (rktp->rktp_flags & RD_KAFKA_TOPPAR_F_VALIDATING) {
1188
+ rd_kafka_dbg(
1189
+ rktp->rktp_rkt->rkt_rk, FETCH, "VALIDATE",
1190
+ "%.*s [%" PRId32
1191
+ "]: skipping offset "
1192
+ "validation for %s: validation is already ongoing",
1193
+ RD_KAFKAP_STR_PR(rktp->rktp_rkt->rkt_topic),
1194
+ rktp->rktp_partition,
1195
+ rd_kafka_fetch_pos2str(rktp->rktp_offset_validation_pos));
1196
+ return;
1197
+ }
1198
+
1199
+ rd_kafka_toppar_set_fetch_state(
1200
+ rktp, RD_KAFKA_TOPPAR_FETCH_VALIDATE_EPOCH_WAIT);
1201
+ rktp->rktp_flags |= RD_KAFKA_TOPPAR_F_VALIDATING;
1202
+
1203
+ /* Construct and send OffsetForLeaderEpochRequest */
1204
+ parts = rd_kafka_topic_partition_list_new(1);
1205
+ rktpar = rd_kafka_topic_partition_list_add(
1206
+ parts, rktp->rktp_rkt->rkt_topic->str, rktp->rktp_partition);
1207
+ rd_kafka_topic_partition_set_leader_epoch(
1208
+ rktpar, rktp->rktp_offset_validation_pos.leader_epoch);
1209
+ rd_kafka_topic_partition_set_current_leader_epoch(
1210
+ rktpar, rktp->rktp_leader_epoch);
1211
+ rd_kafka_toppar_keep(rktp); /* for request opaque */
1212
+
1213
+ rd_rkb_dbg(
1214
+ rktp->rktp_leader, FETCH, "VALIDATE",
1215
+ "%.*s [%" PRId32
1216
+ "]: querying broker for epoch "
1217
+ "validation of %s: %s",
1218
+ RD_KAFKAP_STR_PR(rktp->rktp_rkt->rkt_topic), rktp->rktp_partition,
1219
+ rd_kafka_fetch_pos2str(rktp->rktp_offset_validation_pos), reason);
1220
+
1221
+ rd_kafka_OffsetForLeaderEpochRequest(
1222
+ rktp->rktp_leader, parts, RD_KAFKA_REPLYQ(rktp->rktp_ops, 0),
1223
+ rd_kafka_toppar_handle_OffsetForLeaderEpoch, rktp);
1224
+ rd_kafka_topic_partition_list_destroy(parts);
1225
+ }
1226
+
1227
+
1228
+ /**
1229
+ * Escape any special characters in filename 'in' and write escaped
1230
+ * string to 'out' (of max size out_size).
1231
+ */
1232
+ static char *mk_esc_filename(const char *in, char *out, size_t out_size) {
1233
+ const char *s = in;
1234
+ char *o = out;
1235
+
1236
+ while (*s) {
1237
+ const char *esc;
1238
+ size_t esclen;
1239
+
1240
+ switch (*s) {
1241
+ case '/': /* linux */
1242
+ esc = "%2F";
1243
+ esclen = strlen(esc);
1244
+ break;
1245
+ case ':': /* osx, windows */
1246
+ esc = "%3A";
1247
+ esclen = strlen(esc);
1248
+ break;
1249
+ case '\\': /* windows */
1250
+ esc = "%5C";
1251
+ esclen = strlen(esc);
1252
+ break;
1253
+ default:
1254
+ esc = s;
1255
+ esclen = 1;
1256
+ break;
1257
+ }
1258
+
1259
+ if ((size_t)((o + esclen + 1) - out) >= out_size) {
1260
+ /* No more space in output string, truncate. */
1261
+ break;
1262
+ }
1263
+
1264
+ while (esclen-- > 0)
1265
+ *(o++) = *(esc++);
1266
+
1267
+ s++;
1268
+ }
1269
+
1270
+ *o = '\0';
1271
+ return out;
1272
+ }
1273
+
1274
+
1275
+ static void rd_kafka_offset_sync_tmr_cb(rd_kafka_timers_t *rkts, void *arg) {
1276
+ rd_kafka_toppar_t *rktp = arg;
1277
+ rd_kafka_offset_sync(rktp);
1278
+ }
1279
+
1280
+
1281
+ /**
1282
+ * Prepare a toppar for using an offset file.
1283
+ *
1284
+ * Locality: rdkafka main thread
1285
+ * Locks: toppar_lock(rktp) must be held
1286
+ */
1287
+ static void rd_kafka_offset_file_init(rd_kafka_toppar_t *rktp) {
1288
+ char spath[4096 + 1]; /* larger than escfile to avoid warning */
1289
+ const char *path = rktp->rktp_rkt->rkt_conf.offset_store_path;
1290
+ int64_t offset = RD_KAFKA_OFFSET_INVALID;
1291
+
1292
+ if (rd_kafka_path_is_dir(path)) {
1293
+ char tmpfile[1024];
1294
+ char escfile[4096];
1295
+
1296
+ /* Include group.id in filename if configured. */
1297
+ if (!RD_KAFKAP_STR_IS_NULL(rktp->rktp_rkt->rkt_rk->rk_group_id))
1298
+ rd_snprintf(tmpfile, sizeof(tmpfile),
1299
+ "%s-%" PRId32 "-%.*s.offset",
1300
+ rktp->rktp_rkt->rkt_topic->str,
1301
+ rktp->rktp_partition,
1302
+ RD_KAFKAP_STR_PR(
1303
+ rktp->rktp_rkt->rkt_rk->rk_group_id));
1304
+ else
1305
+ rd_snprintf(tmpfile, sizeof(tmpfile),
1306
+ "%s-%" PRId32 ".offset",
1307
+ rktp->rktp_rkt->rkt_topic->str,
1308
+ rktp->rktp_partition);
1309
+
1310
+ /* Escape filename to make it safe. */
1311
+ mk_esc_filename(tmpfile, escfile, sizeof(escfile));
1312
+
1313
+ rd_snprintf(spath, sizeof(spath), "%s%s%s", path,
1314
+ path[strlen(path) - 1] == '/' ? "" : "/", escfile);
1315
+
1316
+ path = spath;
1317
+ }
1318
+
1319
+ rd_kafka_dbg(rktp->rktp_rkt->rkt_rk, TOPIC, "OFFSET",
1320
+ "%s [%" PRId32 "]: using offset file %s",
1321
+ rktp->rktp_rkt->rkt_topic->str, rktp->rktp_partition,
1322
+ path);
1323
+ rktp->rktp_offset_path = rd_strdup(path);
1324
+
1325
+
1326
+ /* Set up the offset file sync interval. */
1327
+ if (rktp->rktp_rkt->rkt_conf.offset_store_sync_interval_ms > 0)
1328
+ rd_kafka_timer_start(
1329
+ &rktp->rktp_rkt->rkt_rk->rk_timers,
1330
+ &rktp->rktp_offset_sync_tmr,
1331
+ rktp->rktp_rkt->rkt_conf.offset_store_sync_interval_ms *
1332
+ 1000ll,
1333
+ rd_kafka_offset_sync_tmr_cb, rktp);
1334
+
1335
+ if (rd_kafka_offset_file_open(rktp) != -1) {
1336
+ /* Read offset from offset file. */
1337
+ offset = rd_kafka_offset_file_read(rktp);
1338
+ }
1339
+
1340
+ if (offset != RD_KAFKA_OFFSET_INVALID) {
1341
+ /* Start fetching from offset */
1342
+ rktp->rktp_stored_pos.offset = offset;
1343
+ rktp->rktp_committed_pos.offset = offset;
1344
+ rd_kafka_toppar_next_offset_handle(rktp, rktp->rktp_stored_pos);
1345
+
1346
+ } else {
1347
+ /* Offset was not usable: perform offset reset logic */
1348
+ rktp->rktp_committed_pos.offset = RD_KAFKA_OFFSET_INVALID;
1349
+ rd_kafka_offset_reset(
1350
+ rktp, RD_KAFKA_NODEID_UA,
1351
+ RD_KAFKA_FETCH_POS(RD_KAFKA_OFFSET_INVALID, -1),
1352
+ RD_KAFKA_RESP_ERR__FS, "non-readable offset file");
1353
+ }
1354
+ }
1355
+
1356
+
1357
+
1358
+ /**
1359
+ * Terminate broker offset store
1360
+ */
1361
+ static rd_kafka_resp_err_t
1362
+ rd_kafka_offset_broker_term(rd_kafka_toppar_t *rktp) {
1363
+ return RD_KAFKA_RESP_ERR_NO_ERROR;
1364
+ }
1365
+
1366
+
1367
+ /**
1368
+ * Prepare a toppar for using broker offset commit (broker 0.8.2 or
1369
+ * later). When using KafkaConsumer (high-level consumer) this
1370
+ * functionality is disabled in favour of the cgrp commits for the
1371
+ * entire set of subscriptions.
1372
+ */
1373
+ static void rd_kafka_offset_broker_init(rd_kafka_toppar_t *rktp) {
1374
+ if (!rd_kafka_is_simple_consumer(rktp->rktp_rkt->rkt_rk))
1375
+ return;
1376
+ rd_kafka_offset_reset(rktp, RD_KAFKA_NODEID_UA,
1377
+ RD_KAFKA_FETCH_POS(RD_KAFKA_OFFSET_STORED, -1),
1378
+ RD_KAFKA_RESP_ERR_NO_ERROR,
1379
+ "query broker for offsets");
1380
+ }
1381
+
1382
+
1383
+ /**
1384
+ * Terminates toppar's offset store, this is the finalizing step after
1385
+ * offset_store_stop().
1386
+ *
1387
+ * Locks: rd_kafka_toppar_lock() MUST be held.
1388
+ */
1389
+ void rd_kafka_offset_store_term(rd_kafka_toppar_t *rktp,
1390
+ rd_kafka_resp_err_t err) {
1391
+ rd_kafka_resp_err_t err2;
1392
+
1393
+ rd_kafka_dbg(rktp->rktp_rkt->rkt_rk, TOPIC, "STORETERM",
1394
+ "%s [%" PRId32 "]: offset store terminating",
1395
+ rktp->rktp_rkt->rkt_topic->str, rktp->rktp_partition);
1396
+
1397
+ rktp->rktp_flags &= ~RD_KAFKA_TOPPAR_F_OFFSET_STORE_STOPPING;
1398
+
1399
+ rd_kafka_timer_stop(&rktp->rktp_rkt->rkt_rk->rk_timers,
1400
+ &rktp->rktp_offset_commit_tmr, 1 /*lock*/);
1401
+
1402
+ switch (rktp->rktp_rkt->rkt_conf.offset_store_method) {
1403
+ case RD_KAFKA_OFFSET_METHOD_FILE:
1404
+ err2 = rd_kafka_offset_file_term(rktp);
1405
+ break;
1406
+ case RD_KAFKA_OFFSET_METHOD_BROKER:
1407
+ err2 = rd_kafka_offset_broker_term(rktp);
1408
+ break;
1409
+ case RD_KAFKA_OFFSET_METHOD_NONE:
1410
+ err2 = RD_KAFKA_RESP_ERR_NO_ERROR;
1411
+ break;
1412
+ }
1413
+
1414
+ /* Prioritize the input error (probably from commit), fall
1415
+ * back on termination error. */
1416
+ if (!err)
1417
+ err = err2;
1418
+
1419
+ rd_kafka_toppar_fetch_stopped(rktp, err);
1420
+ }
1421
+
1422
+
1423
+ /**
1424
+ * Stop toppar's offset store, committing the final offsets, etc.
1425
+ *
1426
+ * Returns RD_KAFKA_RESP_ERR_NO_ERROR on success,
1427
+ * RD_KAFKA_RESP_ERR__IN_PROGRESS if the term triggered an
1428
+ * async operation (e.g., broker offset commit), or
1429
+ * any other error in case of immediate failure.
1430
+ *
1431
+ * The offset layer will call rd_kafka_offset_store_term() when
1432
+ * the offset management has been fully stopped for this partition.
1433
+ *
1434
+ * Locks: rd_kafka_toppar_lock() MUST be held.
1435
+ */
1436
+ rd_kafka_resp_err_t rd_kafka_offset_store_stop(rd_kafka_toppar_t *rktp) {
1437
+ rd_kafka_resp_err_t err = RD_KAFKA_RESP_ERR_NO_ERROR;
1438
+
1439
+ if (!(rktp->rktp_flags & RD_KAFKA_TOPPAR_F_OFFSET_STORE))
1440
+ goto done;
1441
+
1442
+ rktp->rktp_flags |= RD_KAFKA_TOPPAR_F_OFFSET_STORE_STOPPING;
1443
+
1444
+ rd_kafka_dbg(rktp->rktp_rkt->rkt_rk, TOPIC, "OFFSET",
1445
+ "%s [%" PRId32
1446
+ "]: stopping offset store "
1447
+ "(stored %s, committed %s, EOF offset %" PRId64 ")",
1448
+ rktp->rktp_rkt->rkt_topic->str, rktp->rktp_partition,
1449
+ rd_kafka_fetch_pos2str(rktp->rktp_stored_pos),
1450
+ rd_kafka_fetch_pos2str(rktp->rktp_committed_pos),
1451
+ rktp->rktp_offsets_fin.eof_offset);
1452
+
1453
+ /* Store end offset for empty partitions */
1454
+ if (rktp->rktp_rkt->rkt_rk->rk_conf.enable_auto_offset_store &&
1455
+ rktp->rktp_stored_pos.offset == RD_KAFKA_OFFSET_INVALID &&
1456
+ rktp->rktp_offsets_fin.eof_offset > 0)
1457
+ rd_kafka_offset_store0(
1458
+ rktp,
1459
+ RD_KAFKA_FETCH_POS(rktp->rktp_offsets_fin.eof_offset,
1460
+ rktp->rktp_leader_epoch),
1461
+ NULL, 0, rd_true /* force */, RD_DONT_LOCK);
1462
+
1463
+ /* Commit offset to backing store.
1464
+ * This might be an async operation. */
1465
+ if (rd_kafka_is_simple_consumer(rktp->rktp_rkt->rkt_rk) &&
1466
+ rd_kafka_fetch_pos_cmp(&rktp->rktp_stored_pos,
1467
+ &rktp->rktp_committed_pos) > 0)
1468
+ err = rd_kafka_offset_commit(rktp, "offset store stop");
1469
+
1470
+ /* If stop is in progress (async commit), return now. */
1471
+ if (err == RD_KAFKA_RESP_ERR__IN_PROGRESS)
1472
+ return err;
1473
+
1474
+ done:
1475
+ /* Stop is done */
1476
+ rd_kafka_offset_store_term(rktp, err);
1477
+
1478
+ return RD_KAFKA_RESP_ERR_NO_ERROR;
1479
+ }
1480
+
1481
+
1482
+ static void rd_kafka_offset_auto_commit_tmr_cb(rd_kafka_timers_t *rkts,
1483
+ void *arg) {
1484
+ rd_kafka_toppar_t *rktp = arg;
1485
+ rd_kafka_offset_commit(rktp, "auto commit timer");
1486
+ }
1487
+
1488
+ void rd_kafka_offset_query_tmr_cb(rd_kafka_timers_t *rkts, void *arg) {
1489
+ rd_kafka_toppar_t *rktp = arg;
1490
+ rd_kafka_toppar_lock(rktp);
1491
+ rd_kafka_dbg(rktp->rktp_rkt->rkt_rk, TOPIC, "OFFSET",
1492
+ "Topic %s [%" PRId32
1493
+ "]: timed offset query for %s in state %s",
1494
+ rktp->rktp_rkt->rkt_topic->str, rktp->rktp_partition,
1495
+ rd_kafka_fetch_pos2str(rktp->rktp_query_pos),
1496
+ rd_kafka_fetch_states[rktp->rktp_fetch_state]);
1497
+ rd_kafka_toppar_offset_request(rktp, rktp->rktp_query_pos, 0);
1498
+ rd_kafka_toppar_unlock(rktp);
1499
+ }
1500
+
1501
+
1502
+ /**
1503
+ * Initialize toppar's offset store.
1504
+ *
1505
+ * Locality: toppar handler thread
1506
+ */
1507
+ void rd_kafka_offset_store_init(rd_kafka_toppar_t *rktp) {
1508
+ static const char *store_names[] = {"none", "file", "broker"};
1509
+
1510
+ rd_kafka_dbg(rktp->rktp_rkt->rkt_rk, TOPIC, "OFFSET",
1511
+ "%s [%" PRId32 "]: using offset store method: %s",
1512
+ rktp->rktp_rkt->rkt_topic->str, rktp->rktp_partition,
1513
+ store_names[rktp->rktp_rkt->rkt_conf.offset_store_method]);
1514
+
1515
+ /* The committed offset is unknown at this point. */
1516
+ rktp->rktp_committed_pos.offset = RD_KAFKA_OFFSET_INVALID;
1517
+
1518
+ /* Set up the commit interval (for simple consumer). */
1519
+ if (rd_kafka_is_simple_consumer(rktp->rktp_rkt->rkt_rk) &&
1520
+ rktp->rktp_rkt->rkt_conf.auto_commit_interval_ms > 0)
1521
+ rd_kafka_timer_start(
1522
+ &rktp->rktp_rkt->rkt_rk->rk_timers,
1523
+ &rktp->rktp_offset_commit_tmr,
1524
+ rktp->rktp_rkt->rkt_conf.auto_commit_interval_ms * 1000ll,
1525
+ rd_kafka_offset_auto_commit_tmr_cb, rktp);
1526
+
1527
+ switch (rktp->rktp_rkt->rkt_conf.offset_store_method) {
1528
+ case RD_KAFKA_OFFSET_METHOD_FILE:
1529
+ rd_kafka_offset_file_init(rktp);
1530
+ break;
1531
+ case RD_KAFKA_OFFSET_METHOD_BROKER:
1532
+ rd_kafka_offset_broker_init(rktp);
1533
+ break;
1534
+ case RD_KAFKA_OFFSET_METHOD_NONE:
1535
+ break;
1536
+ default:
1537
+ /* NOTREACHED */
1538
+ return;
1539
+ }
1540
+
1541
+ rktp->rktp_flags |= RD_KAFKA_TOPPAR_F_OFFSET_STORE;
1542
+ }
1543
+
1544
+
1545
+ /**
1546
+ * Update toppar app_pos and store_offset (if enabled) to the provided
1547
+ * offset and epoch.
1548
+ */
1549
+ void rd_kafka_update_app_pos(rd_kafka_t *rk,
1550
+ rd_kafka_toppar_t *rktp,
1551
+ rd_kafka_fetch_pos_t pos,
1552
+ rd_dolock_t do_lock) {
1553
+
1554
+ if (do_lock)
1555
+ rd_kafka_toppar_lock(rktp);
1556
+
1557
+ rktp->rktp_app_pos = pos;
1558
+ if (rk->rk_conf.enable_auto_offset_store)
1559
+ rd_kafka_offset_store0(rktp, pos, NULL, 0,
1560
+ /* force: ignore assignment state */
1561
+ rd_true, RD_DONT_LOCK);
1562
+
1563
+ if (do_lock)
1564
+ rd_kafka_toppar_unlock(rktp);
1565
+ }