@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.
- package/LICENSE.txt +20 -0
- package/README.md +636 -0
- package/binding.gyp +154 -0
- package/deps/librdkafka/.clang-format +136 -0
- package/deps/librdkafka/.clang-format-cpp +103 -0
- package/deps/librdkafka/.dir-locals.el +10 -0
- package/deps/librdkafka/.formatignore +33 -0
- package/deps/librdkafka/.gdbmacros +19 -0
- package/deps/librdkafka/.github/CODEOWNERS +1 -0
- package/deps/librdkafka/.github/ISSUE_TEMPLATE +34 -0
- package/deps/librdkafka/.semaphore/run-all-tests.yml +77 -0
- package/deps/librdkafka/.semaphore/semaphore-integration.yml +250 -0
- package/deps/librdkafka/.semaphore/semaphore.yml +378 -0
- package/deps/librdkafka/.semaphore/verify-linux-packages.yml +41 -0
- package/deps/librdkafka/CHANGELOG.md +2208 -0
- package/deps/librdkafka/CMakeLists.txt +291 -0
- package/deps/librdkafka/CODE_OF_CONDUCT.md +46 -0
- package/deps/librdkafka/CONFIGURATION.md +209 -0
- package/deps/librdkafka/CONTRIBUTING.md +431 -0
- package/deps/librdkafka/Doxyfile +2375 -0
- package/deps/librdkafka/INTRODUCTION.md +2481 -0
- package/deps/librdkafka/LICENSE +26 -0
- package/deps/librdkafka/LICENSE.cjson +22 -0
- package/deps/librdkafka/LICENSE.crc32c +28 -0
- package/deps/librdkafka/LICENSE.fnv1a +18 -0
- package/deps/librdkafka/LICENSE.hdrhistogram +27 -0
- package/deps/librdkafka/LICENSE.lz4 +26 -0
- package/deps/librdkafka/LICENSE.murmur2 +25 -0
- package/deps/librdkafka/LICENSE.nanopb +22 -0
- package/deps/librdkafka/LICENSE.opentelemetry +203 -0
- package/deps/librdkafka/LICENSE.pycrc +23 -0
- package/deps/librdkafka/LICENSE.queue +31 -0
- package/deps/librdkafka/LICENSE.regexp +5 -0
- package/deps/librdkafka/LICENSE.snappy +36 -0
- package/deps/librdkafka/LICENSE.tinycthread +26 -0
- package/deps/librdkafka/LICENSE.wingetopt +49 -0
- package/deps/librdkafka/LICENSES.txt +625 -0
- package/deps/librdkafka/Makefile +125 -0
- package/deps/librdkafka/README.md +199 -0
- package/deps/librdkafka/README.win32 +26 -0
- package/deps/librdkafka/STATISTICS.md +624 -0
- package/deps/librdkafka/configure +214 -0
- package/deps/librdkafka/configure.self +331 -0
- package/deps/librdkafka/debian/changelog +111 -0
- package/deps/librdkafka/debian/compat +1 -0
- package/deps/librdkafka/debian/control +71 -0
- package/deps/librdkafka/debian/copyright +99 -0
- package/deps/librdkafka/debian/gbp.conf +9 -0
- package/deps/librdkafka/debian/librdkafka++1.install +1 -0
- package/deps/librdkafka/debian/librdkafka-dev.examples +2 -0
- package/deps/librdkafka/debian/librdkafka-dev.install +9 -0
- package/deps/librdkafka/debian/librdkafka1.docs +5 -0
- package/deps/librdkafka/debian/librdkafka1.install +1 -0
- package/deps/librdkafka/debian/librdkafka1.symbols +135 -0
- package/deps/librdkafka/debian/rules +19 -0
- package/deps/librdkafka/debian/source/format +1 -0
- package/deps/librdkafka/debian/watch +2 -0
- package/deps/librdkafka/dev-conf.sh +123 -0
- package/deps/librdkafka/examples/CMakeLists.txt +79 -0
- package/deps/librdkafka/examples/Makefile +167 -0
- package/deps/librdkafka/examples/README.md +42 -0
- package/deps/librdkafka/examples/alter_consumer_group_offsets.c +338 -0
- package/deps/librdkafka/examples/consumer.c +271 -0
- package/deps/librdkafka/examples/delete_records.c +233 -0
- package/deps/librdkafka/examples/describe_cluster.c +322 -0
- package/deps/librdkafka/examples/describe_consumer_groups.c +455 -0
- package/deps/librdkafka/examples/describe_topics.c +427 -0
- package/deps/librdkafka/examples/elect_leaders.c +317 -0
- package/deps/librdkafka/examples/globals.json +11 -0
- package/deps/librdkafka/examples/idempotent_producer.c +344 -0
- package/deps/librdkafka/examples/incremental_alter_configs.c +347 -0
- package/deps/librdkafka/examples/kafkatest_verifiable_client.cpp +945 -0
- package/deps/librdkafka/examples/list_consumer_group_offsets.c +359 -0
- package/deps/librdkafka/examples/list_consumer_groups.c +365 -0
- package/deps/librdkafka/examples/list_offsets.c +327 -0
- package/deps/librdkafka/examples/misc.c +287 -0
- package/deps/librdkafka/examples/openssl_engine_example.cpp +248 -0
- package/deps/librdkafka/examples/producer.c +251 -0
- package/deps/librdkafka/examples/producer.cpp +228 -0
- package/deps/librdkafka/examples/rdkafka_complex_consumer_example.c +617 -0
- package/deps/librdkafka/examples/rdkafka_complex_consumer_example.cpp +467 -0
- package/deps/librdkafka/examples/rdkafka_consume_batch.cpp +264 -0
- package/deps/librdkafka/examples/rdkafka_example.c +853 -0
- package/deps/librdkafka/examples/rdkafka_example.cpp +679 -0
- package/deps/librdkafka/examples/rdkafka_performance.c +1781 -0
- package/deps/librdkafka/examples/transactions-older-broker.c +668 -0
- package/deps/librdkafka/examples/transactions.c +665 -0
- package/deps/librdkafka/examples/user_scram.c +491 -0
- package/deps/librdkafka/examples/win_ssl_cert_store.cpp +396 -0
- package/deps/librdkafka/lds-gen.py +73 -0
- package/deps/librdkafka/mainpage.doxy +40 -0
- package/deps/librdkafka/mklove/Makefile.base +329 -0
- package/deps/librdkafka/mklove/modules/configure.atomics +144 -0
- package/deps/librdkafka/mklove/modules/configure.base +2484 -0
- package/deps/librdkafka/mklove/modules/configure.builtin +70 -0
- package/deps/librdkafka/mklove/modules/configure.cc +186 -0
- package/deps/librdkafka/mklove/modules/configure.cxx +8 -0
- package/deps/librdkafka/mklove/modules/configure.fileversion +65 -0
- package/deps/librdkafka/mklove/modules/configure.gitversion +29 -0
- package/deps/librdkafka/mklove/modules/configure.good_cflags +18 -0
- package/deps/librdkafka/mklove/modules/configure.host +132 -0
- package/deps/librdkafka/mklove/modules/configure.lib +49 -0
- package/deps/librdkafka/mklove/modules/configure.libcurl +99 -0
- package/deps/librdkafka/mklove/modules/configure.libsasl2 +36 -0
- package/deps/librdkafka/mklove/modules/configure.libssl +147 -0
- package/deps/librdkafka/mklove/modules/configure.libzstd +58 -0
- package/deps/librdkafka/mklove/modules/configure.parseversion +95 -0
- package/deps/librdkafka/mklove/modules/configure.pic +16 -0
- package/deps/librdkafka/mklove/modules/configure.socket +20 -0
- package/deps/librdkafka/mklove/modules/configure.zlib +61 -0
- package/deps/librdkafka/mklove/modules/patches/README.md +8 -0
- package/deps/librdkafka/mklove/modules/patches/libcurl.0000-no-runtime-linking-check.patch +11 -0
- package/deps/librdkafka/mklove/modules/patches/libssl.0000-osx-rand-include-fix-OpenSSL-PR16409.patch +56 -0
- package/deps/librdkafka/packaging/RELEASE.md +319 -0
- package/deps/librdkafka/packaging/alpine/build-alpine.sh +38 -0
- package/deps/librdkafka/packaging/archlinux/PKGBUILD +30 -0
- package/deps/librdkafka/packaging/cmake/Config.cmake.in +37 -0
- package/deps/librdkafka/packaging/cmake/Modules/FindLZ4.cmake +38 -0
- package/deps/librdkafka/packaging/cmake/Modules/FindZSTD.cmake +27 -0
- package/deps/librdkafka/packaging/cmake/Modules/LICENSE.FindZstd +178 -0
- package/deps/librdkafka/packaging/cmake/README.md +38 -0
- package/deps/librdkafka/packaging/cmake/config.h.in +52 -0
- package/deps/librdkafka/packaging/cmake/parseversion.cmake +60 -0
- package/deps/librdkafka/packaging/cmake/rdkafka.pc.in +12 -0
- package/deps/librdkafka/packaging/cmake/try_compile/atomic_32_test.c +8 -0
- package/deps/librdkafka/packaging/cmake/try_compile/atomic_64_test.c +8 -0
- package/deps/librdkafka/packaging/cmake/try_compile/c11threads_test.c +14 -0
- package/deps/librdkafka/packaging/cmake/try_compile/crc32c_hw_test.c +27 -0
- package/deps/librdkafka/packaging/cmake/try_compile/dlopen_test.c +11 -0
- package/deps/librdkafka/packaging/cmake/try_compile/libsasl2_test.c +7 -0
- package/deps/librdkafka/packaging/cmake/try_compile/pthread_setname_darwin_test.c +6 -0
- package/deps/librdkafka/packaging/cmake/try_compile/pthread_setname_freebsd_test.c +7 -0
- package/deps/librdkafka/packaging/cmake/try_compile/pthread_setname_gnu_test.c +5 -0
- package/deps/librdkafka/packaging/cmake/try_compile/rand_r_test.c +7 -0
- package/deps/librdkafka/packaging/cmake/try_compile/rdkafka_setup.cmake +122 -0
- package/deps/librdkafka/packaging/cmake/try_compile/regex_test.c +10 -0
- package/deps/librdkafka/packaging/cmake/try_compile/strndup_test.c +5 -0
- package/deps/librdkafka/packaging/cmake/try_compile/sync_32_test.c +8 -0
- package/deps/librdkafka/packaging/cmake/try_compile/sync_64_test.c +8 -0
- package/deps/librdkafka/packaging/cp/README.md +16 -0
- package/deps/librdkafka/packaging/cp/check_features.c +72 -0
- package/deps/librdkafka/packaging/cp/verify-deb.sh +33 -0
- package/deps/librdkafka/packaging/cp/verify-packages.sh +69 -0
- package/deps/librdkafka/packaging/cp/verify-rpm.sh +32 -0
- package/deps/librdkafka/packaging/debian/changelog +66 -0
- package/deps/librdkafka/packaging/debian/compat +1 -0
- package/deps/librdkafka/packaging/debian/control +49 -0
- package/deps/librdkafka/packaging/debian/copyright +84 -0
- package/deps/librdkafka/packaging/debian/docs +5 -0
- package/deps/librdkafka/packaging/debian/gbp.conf +9 -0
- package/deps/librdkafka/packaging/debian/librdkafka-dev.dirs +2 -0
- package/deps/librdkafka/packaging/debian/librdkafka-dev.examples +2 -0
- package/deps/librdkafka/packaging/debian/librdkafka-dev.install +6 -0
- package/deps/librdkafka/packaging/debian/librdkafka-dev.substvars +1 -0
- package/deps/librdkafka/packaging/debian/librdkafka.dsc +16 -0
- package/deps/librdkafka/packaging/debian/librdkafka1-dbg.substvars +1 -0
- package/deps/librdkafka/packaging/debian/librdkafka1.dirs +1 -0
- package/deps/librdkafka/packaging/debian/librdkafka1.install +2 -0
- package/deps/librdkafka/packaging/debian/librdkafka1.postinst.debhelper +5 -0
- package/deps/librdkafka/packaging/debian/librdkafka1.postrm.debhelper +5 -0
- package/deps/librdkafka/packaging/debian/librdkafka1.symbols +64 -0
- package/deps/librdkafka/packaging/debian/rules +19 -0
- package/deps/librdkafka/packaging/debian/source/format +1 -0
- package/deps/librdkafka/packaging/debian/watch +2 -0
- package/deps/librdkafka/packaging/get_version.py +21 -0
- package/deps/librdkafka/packaging/homebrew/README.md +15 -0
- package/deps/librdkafka/packaging/homebrew/brew-update-pr.sh +31 -0
- package/deps/librdkafka/packaging/mingw-w64/configure-build-msys2-mingw-static.sh +52 -0
- package/deps/librdkafka/packaging/mingw-w64/configure-build-msys2-mingw.sh +21 -0
- package/deps/librdkafka/packaging/mingw-w64/export-variables.sh +13 -0
- package/deps/librdkafka/packaging/mingw-w64/run-tests.sh +6 -0
- package/deps/librdkafka/packaging/mingw-w64/semaphoreci-build.sh +38 -0
- package/deps/librdkafka/packaging/nuget/README.md +84 -0
- package/deps/librdkafka/packaging/nuget/artifact.py +177 -0
- package/deps/librdkafka/packaging/nuget/cleanup-s3.py +143 -0
- package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-win32__bldtype-Release/msvcr120.zip +0 -0
- package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-win32__bldtype-Release/msvcr140.zip +0 -0
- package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-x64__bldtype-Release/msvcr120.zip +0 -0
- package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-x64__bldtype-Release/msvcr140.zip +0 -0
- package/deps/librdkafka/packaging/nuget/nuget.sh +21 -0
- package/deps/librdkafka/packaging/nuget/nugetpackage.py +278 -0
- package/deps/librdkafka/packaging/nuget/packaging.py +448 -0
- package/deps/librdkafka/packaging/nuget/push-to-nuget.sh +21 -0
- package/deps/librdkafka/packaging/nuget/release.py +167 -0
- package/deps/librdkafka/packaging/nuget/requirements.txt +3 -0
- package/deps/librdkafka/packaging/nuget/staticpackage.py +178 -0
- package/deps/librdkafka/packaging/nuget/templates/librdkafka.redist.nuspec +21 -0
- package/deps/librdkafka/packaging/nuget/templates/librdkafka.redist.props +18 -0
- package/deps/librdkafka/packaging/nuget/templates/librdkafka.redist.targets +19 -0
- package/deps/librdkafka/packaging/nuget/zfile/__init__.py +0 -0
- package/deps/librdkafka/packaging/nuget/zfile/zfile.py +98 -0
- package/deps/librdkafka/packaging/rpm/Makefile +92 -0
- package/deps/librdkafka/packaging/rpm/README.md +23 -0
- package/deps/librdkafka/packaging/rpm/el7-x86_64.cfg +40 -0
- package/deps/librdkafka/packaging/rpm/librdkafka.spec +118 -0
- package/deps/librdkafka/packaging/rpm/mock-on-docker.sh +96 -0
- package/deps/librdkafka/packaging/rpm/tests/Makefile +25 -0
- package/deps/librdkafka/packaging/rpm/tests/README.md +8 -0
- package/deps/librdkafka/packaging/rpm/tests/run-test.sh +42 -0
- package/deps/librdkafka/packaging/rpm/tests/test-on-docker.sh +56 -0
- package/deps/librdkafka/packaging/rpm/tests/test.c +77 -0
- package/deps/librdkafka/packaging/rpm/tests/test.cpp +34 -0
- package/deps/librdkafka/packaging/tools/Dockerfile +31 -0
- package/deps/librdkafka/packaging/tools/build-configurations-checks.sh +12 -0
- package/deps/librdkafka/packaging/tools/build-deb-package.sh +64 -0
- package/deps/librdkafka/packaging/tools/build-debian.sh +65 -0
- package/deps/librdkafka/packaging/tools/build-manylinux.sh +68 -0
- package/deps/librdkafka/packaging/tools/build-release-artifacts.sh +139 -0
- package/deps/librdkafka/packaging/tools/distro-build.sh +38 -0
- package/deps/librdkafka/packaging/tools/gh-release-checksums.py +39 -0
- package/deps/librdkafka/packaging/tools/rdutcoverage.sh +25 -0
- package/deps/librdkafka/packaging/tools/requirements.txt +2 -0
- package/deps/librdkafka/packaging/tools/run-in-docker.sh +28 -0
- package/deps/librdkafka/packaging/tools/run-integration-tests.sh +31 -0
- package/deps/librdkafka/packaging/tools/run-style-check.sh +4 -0
- package/deps/librdkafka/packaging/tools/style-format.sh +149 -0
- package/deps/librdkafka/packaging/tools/update_rpcs_max_versions.py +100 -0
- package/deps/librdkafka/service.yml +172 -0
- package/deps/librdkafka/src/CMakeLists.txt +374 -0
- package/deps/librdkafka/src/Makefile +103 -0
- package/deps/librdkafka/src/README.lz4.md +30 -0
- package/deps/librdkafka/src/cJSON.c +2834 -0
- package/deps/librdkafka/src/cJSON.h +398 -0
- package/deps/librdkafka/src/crc32c.c +430 -0
- package/deps/librdkafka/src/crc32c.h +38 -0
- package/deps/librdkafka/src/generate_proto.sh +66 -0
- package/deps/librdkafka/src/librdkafka_cgrp_synch.png +0 -0
- package/deps/librdkafka/src/lz4.c +2727 -0
- package/deps/librdkafka/src/lz4.h +842 -0
- package/deps/librdkafka/src/lz4frame.c +2078 -0
- package/deps/librdkafka/src/lz4frame.h +692 -0
- package/deps/librdkafka/src/lz4frame_static.h +47 -0
- package/deps/librdkafka/src/lz4hc.c +1631 -0
- package/deps/librdkafka/src/lz4hc.h +413 -0
- package/deps/librdkafka/src/nanopb/pb.h +917 -0
- package/deps/librdkafka/src/nanopb/pb_common.c +388 -0
- package/deps/librdkafka/src/nanopb/pb_common.h +49 -0
- package/deps/librdkafka/src/nanopb/pb_decode.c +1727 -0
- package/deps/librdkafka/src/nanopb/pb_decode.h +193 -0
- package/deps/librdkafka/src/nanopb/pb_encode.c +1000 -0
- package/deps/librdkafka/src/nanopb/pb_encode.h +185 -0
- package/deps/librdkafka/src/opentelemetry/common.pb.c +32 -0
- package/deps/librdkafka/src/opentelemetry/common.pb.h +170 -0
- package/deps/librdkafka/src/opentelemetry/metrics.options +2 -0
- package/deps/librdkafka/src/opentelemetry/metrics.pb.c +67 -0
- package/deps/librdkafka/src/opentelemetry/metrics.pb.h +966 -0
- package/deps/librdkafka/src/opentelemetry/resource.pb.c +12 -0
- package/deps/librdkafka/src/opentelemetry/resource.pb.h +58 -0
- package/deps/librdkafka/src/queue.h +850 -0
- package/deps/librdkafka/src/rd.h +584 -0
- package/deps/librdkafka/src/rdaddr.c +255 -0
- package/deps/librdkafka/src/rdaddr.h +202 -0
- package/deps/librdkafka/src/rdatomic.h +230 -0
- package/deps/librdkafka/src/rdavg.h +260 -0
- package/deps/librdkafka/src/rdavl.c +210 -0
- package/deps/librdkafka/src/rdavl.h +250 -0
- package/deps/librdkafka/src/rdbase64.c +200 -0
- package/deps/librdkafka/src/rdbase64.h +43 -0
- package/deps/librdkafka/src/rdbuf.c +1884 -0
- package/deps/librdkafka/src/rdbuf.h +375 -0
- package/deps/librdkafka/src/rdcrc32.c +114 -0
- package/deps/librdkafka/src/rdcrc32.h +170 -0
- package/deps/librdkafka/src/rddl.c +179 -0
- package/deps/librdkafka/src/rddl.h +43 -0
- package/deps/librdkafka/src/rdendian.h +175 -0
- package/deps/librdkafka/src/rdfloat.h +67 -0
- package/deps/librdkafka/src/rdfnv1a.c +113 -0
- package/deps/librdkafka/src/rdfnv1a.h +35 -0
- package/deps/librdkafka/src/rdgz.c +120 -0
- package/deps/librdkafka/src/rdgz.h +46 -0
- package/deps/librdkafka/src/rdhdrhistogram.c +721 -0
- package/deps/librdkafka/src/rdhdrhistogram.h +87 -0
- package/deps/librdkafka/src/rdhttp.c +830 -0
- package/deps/librdkafka/src/rdhttp.h +101 -0
- package/deps/librdkafka/src/rdinterval.h +177 -0
- package/deps/librdkafka/src/rdkafka.c +5505 -0
- package/deps/librdkafka/src/rdkafka.h +10686 -0
- package/deps/librdkafka/src/rdkafka_admin.c +9794 -0
- package/deps/librdkafka/src/rdkafka_admin.h +661 -0
- package/deps/librdkafka/src/rdkafka_assignment.c +1010 -0
- package/deps/librdkafka/src/rdkafka_assignment.h +73 -0
- package/deps/librdkafka/src/rdkafka_assignor.c +1786 -0
- package/deps/librdkafka/src/rdkafka_assignor.h +402 -0
- package/deps/librdkafka/src/rdkafka_aux.c +409 -0
- package/deps/librdkafka/src/rdkafka_aux.h +174 -0
- package/deps/librdkafka/src/rdkafka_background.c +221 -0
- package/deps/librdkafka/src/rdkafka_broker.c +6337 -0
- package/deps/librdkafka/src/rdkafka_broker.h +744 -0
- package/deps/librdkafka/src/rdkafka_buf.c +543 -0
- package/deps/librdkafka/src/rdkafka_buf.h +1525 -0
- package/deps/librdkafka/src/rdkafka_cert.c +576 -0
- package/deps/librdkafka/src/rdkafka_cert.h +62 -0
- package/deps/librdkafka/src/rdkafka_cgrp.c +7587 -0
- package/deps/librdkafka/src/rdkafka_cgrp.h +477 -0
- package/deps/librdkafka/src/rdkafka_conf.c +4880 -0
- package/deps/librdkafka/src/rdkafka_conf.h +732 -0
- package/deps/librdkafka/src/rdkafka_confval.h +97 -0
- package/deps/librdkafka/src/rdkafka_coord.c +623 -0
- package/deps/librdkafka/src/rdkafka_coord.h +132 -0
- package/deps/librdkafka/src/rdkafka_error.c +228 -0
- package/deps/librdkafka/src/rdkafka_error.h +80 -0
- package/deps/librdkafka/src/rdkafka_event.c +502 -0
- package/deps/librdkafka/src/rdkafka_event.h +126 -0
- package/deps/librdkafka/src/rdkafka_feature.c +898 -0
- package/deps/librdkafka/src/rdkafka_feature.h +104 -0
- package/deps/librdkafka/src/rdkafka_fetcher.c +1422 -0
- package/deps/librdkafka/src/rdkafka_fetcher.h +44 -0
- package/deps/librdkafka/src/rdkafka_header.c +220 -0
- package/deps/librdkafka/src/rdkafka_header.h +76 -0
- package/deps/librdkafka/src/rdkafka_idempotence.c +807 -0
- package/deps/librdkafka/src/rdkafka_idempotence.h +144 -0
- package/deps/librdkafka/src/rdkafka_int.h +1260 -0
- package/deps/librdkafka/src/rdkafka_interceptor.c +819 -0
- package/deps/librdkafka/src/rdkafka_interceptor.h +104 -0
- package/deps/librdkafka/src/rdkafka_lz4.c +450 -0
- package/deps/librdkafka/src/rdkafka_lz4.h +49 -0
- package/deps/librdkafka/src/rdkafka_metadata.c +2209 -0
- package/deps/librdkafka/src/rdkafka_metadata.h +345 -0
- package/deps/librdkafka/src/rdkafka_metadata_cache.c +1183 -0
- package/deps/librdkafka/src/rdkafka_mock.c +3661 -0
- package/deps/librdkafka/src/rdkafka_mock.h +610 -0
- package/deps/librdkafka/src/rdkafka_mock_cgrp.c +1876 -0
- package/deps/librdkafka/src/rdkafka_mock_handlers.c +3113 -0
- package/deps/librdkafka/src/rdkafka_mock_int.h +710 -0
- package/deps/librdkafka/src/rdkafka_msg.c +2589 -0
- package/deps/librdkafka/src/rdkafka_msg.h +614 -0
- package/deps/librdkafka/src/rdkafka_msgbatch.h +62 -0
- package/deps/librdkafka/src/rdkafka_msgset.h +98 -0
- package/deps/librdkafka/src/rdkafka_msgset_reader.c +1806 -0
- package/deps/librdkafka/src/rdkafka_msgset_writer.c +1474 -0
- package/deps/librdkafka/src/rdkafka_offset.c +1565 -0
- package/deps/librdkafka/src/rdkafka_offset.h +150 -0
- package/deps/librdkafka/src/rdkafka_op.c +997 -0
- package/deps/librdkafka/src/rdkafka_op.h +858 -0
- package/deps/librdkafka/src/rdkafka_partition.c +4896 -0
- package/deps/librdkafka/src/rdkafka_partition.h +1182 -0
- package/deps/librdkafka/src/rdkafka_pattern.c +228 -0
- package/deps/librdkafka/src/rdkafka_pattern.h +70 -0
- package/deps/librdkafka/src/rdkafka_plugin.c +213 -0
- package/deps/librdkafka/src/rdkafka_plugin.h +41 -0
- package/deps/librdkafka/src/rdkafka_proto.h +736 -0
- package/deps/librdkafka/src/rdkafka_protocol.h +128 -0
- package/deps/librdkafka/src/rdkafka_queue.c +1230 -0
- package/deps/librdkafka/src/rdkafka_queue.h +1220 -0
- package/deps/librdkafka/src/rdkafka_range_assignor.c +1748 -0
- package/deps/librdkafka/src/rdkafka_request.c +7089 -0
- package/deps/librdkafka/src/rdkafka_request.h +732 -0
- package/deps/librdkafka/src/rdkafka_roundrobin_assignor.c +123 -0
- package/deps/librdkafka/src/rdkafka_sasl.c +530 -0
- package/deps/librdkafka/src/rdkafka_sasl.h +63 -0
- package/deps/librdkafka/src/rdkafka_sasl_cyrus.c +722 -0
- package/deps/librdkafka/src/rdkafka_sasl_int.h +89 -0
- package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.c +1833 -0
- package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.h +52 -0
- package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.c +1666 -0
- package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.h +47 -0
- package/deps/librdkafka/src/rdkafka_sasl_plain.c +142 -0
- package/deps/librdkafka/src/rdkafka_sasl_scram.c +858 -0
- package/deps/librdkafka/src/rdkafka_sasl_win32.c +550 -0
- package/deps/librdkafka/src/rdkafka_ssl.c +2129 -0
- package/deps/librdkafka/src/rdkafka_ssl.h +86 -0
- package/deps/librdkafka/src/rdkafka_sticky_assignor.c +4785 -0
- package/deps/librdkafka/src/rdkafka_subscription.c +278 -0
- package/deps/librdkafka/src/rdkafka_telemetry.c +760 -0
- package/deps/librdkafka/src/rdkafka_telemetry.h +52 -0
- package/deps/librdkafka/src/rdkafka_telemetry_decode.c +1053 -0
- package/deps/librdkafka/src/rdkafka_telemetry_decode.h +59 -0
- package/deps/librdkafka/src/rdkafka_telemetry_encode.c +997 -0
- package/deps/librdkafka/src/rdkafka_telemetry_encode.h +301 -0
- package/deps/librdkafka/src/rdkafka_timer.c +402 -0
- package/deps/librdkafka/src/rdkafka_timer.h +117 -0
- package/deps/librdkafka/src/rdkafka_topic.c +2161 -0
- package/deps/librdkafka/src/rdkafka_topic.h +334 -0
- package/deps/librdkafka/src/rdkafka_transport.c +1309 -0
- package/deps/librdkafka/src/rdkafka_transport.h +99 -0
- package/deps/librdkafka/src/rdkafka_transport_int.h +100 -0
- package/deps/librdkafka/src/rdkafka_txnmgr.c +3256 -0
- package/deps/librdkafka/src/rdkafka_txnmgr.h +171 -0
- package/deps/librdkafka/src/rdkafka_zstd.c +226 -0
- package/deps/librdkafka/src/rdkafka_zstd.h +57 -0
- package/deps/librdkafka/src/rdlist.c +576 -0
- package/deps/librdkafka/src/rdlist.h +434 -0
- package/deps/librdkafka/src/rdlog.c +89 -0
- package/deps/librdkafka/src/rdlog.h +41 -0
- package/deps/librdkafka/src/rdmap.c +508 -0
- package/deps/librdkafka/src/rdmap.h +492 -0
- package/deps/librdkafka/src/rdmurmur2.c +167 -0
- package/deps/librdkafka/src/rdmurmur2.h +35 -0
- package/deps/librdkafka/src/rdports.c +61 -0
- package/deps/librdkafka/src/rdports.h +38 -0
- package/deps/librdkafka/src/rdposix.h +250 -0
- package/deps/librdkafka/src/rdrand.c +80 -0
- package/deps/librdkafka/src/rdrand.h +43 -0
- package/deps/librdkafka/src/rdregex.c +156 -0
- package/deps/librdkafka/src/rdregex.h +43 -0
- package/deps/librdkafka/src/rdsignal.h +57 -0
- package/deps/librdkafka/src/rdstring.c +645 -0
- package/deps/librdkafka/src/rdstring.h +98 -0
- package/deps/librdkafka/src/rdsysqueue.h +404 -0
- package/deps/librdkafka/src/rdtime.h +356 -0
- package/deps/librdkafka/src/rdtypes.h +86 -0
- package/deps/librdkafka/src/rdunittest.c +549 -0
- package/deps/librdkafka/src/rdunittest.h +232 -0
- package/deps/librdkafka/src/rdvarint.c +134 -0
- package/deps/librdkafka/src/rdvarint.h +165 -0
- package/deps/librdkafka/src/rdwin32.h +382 -0
- package/deps/librdkafka/src/rdxxhash.c +1030 -0
- package/deps/librdkafka/src/rdxxhash.h +328 -0
- package/deps/librdkafka/src/regexp.c +1352 -0
- package/deps/librdkafka/src/regexp.h +41 -0
- package/deps/librdkafka/src/snappy.c +1866 -0
- package/deps/librdkafka/src/snappy.h +62 -0
- package/deps/librdkafka/src/snappy_compat.h +138 -0
- package/deps/librdkafka/src/statistics_schema.json +444 -0
- package/deps/librdkafka/src/tinycthread.c +932 -0
- package/deps/librdkafka/src/tinycthread.h +503 -0
- package/deps/librdkafka/src/tinycthread_extra.c +199 -0
- package/deps/librdkafka/src/tinycthread_extra.h +212 -0
- package/deps/librdkafka/src/win32_config.h +58 -0
- package/deps/librdkafka/src-cpp/CMakeLists.txt +90 -0
- package/deps/librdkafka/src-cpp/ConfImpl.cpp +84 -0
- package/deps/librdkafka/src-cpp/ConsumerImpl.cpp +244 -0
- package/deps/librdkafka/src-cpp/HandleImpl.cpp +436 -0
- package/deps/librdkafka/src-cpp/HeadersImpl.cpp +48 -0
- package/deps/librdkafka/src-cpp/KafkaConsumerImpl.cpp +296 -0
- package/deps/librdkafka/src-cpp/Makefile +55 -0
- package/deps/librdkafka/src-cpp/MessageImpl.cpp +38 -0
- package/deps/librdkafka/src-cpp/MetadataImpl.cpp +170 -0
- package/deps/librdkafka/src-cpp/ProducerImpl.cpp +197 -0
- package/deps/librdkafka/src-cpp/QueueImpl.cpp +70 -0
- package/deps/librdkafka/src-cpp/README.md +16 -0
- package/deps/librdkafka/src-cpp/RdKafka.cpp +59 -0
- package/deps/librdkafka/src-cpp/TopicImpl.cpp +124 -0
- package/deps/librdkafka/src-cpp/TopicPartitionImpl.cpp +57 -0
- package/deps/librdkafka/src-cpp/rdkafkacpp.h +3797 -0
- package/deps/librdkafka/src-cpp/rdkafkacpp_int.h +1641 -0
- package/deps/librdkafka/tests/0000-unittests.c +72 -0
- package/deps/librdkafka/tests/0001-multiobj.c +102 -0
- package/deps/librdkafka/tests/0002-unkpart.c +244 -0
- package/deps/librdkafka/tests/0003-msgmaxsize.c +173 -0
- package/deps/librdkafka/tests/0004-conf.c +934 -0
- package/deps/librdkafka/tests/0005-order.c +133 -0
- package/deps/librdkafka/tests/0006-symbols.c +163 -0
- package/deps/librdkafka/tests/0007-autotopic.c +136 -0
- package/deps/librdkafka/tests/0008-reqacks.c +179 -0
- package/deps/librdkafka/tests/0009-mock_cluster.c +97 -0
- package/deps/librdkafka/tests/0011-produce_batch.c +753 -0
- package/deps/librdkafka/tests/0012-produce_consume.c +537 -0
- package/deps/librdkafka/tests/0013-null-msgs.c +473 -0
- package/deps/librdkafka/tests/0014-reconsume-191.c +512 -0
- package/deps/librdkafka/tests/0015-offset_seeks.c +172 -0
- package/deps/librdkafka/tests/0016-client_swname.c +181 -0
- package/deps/librdkafka/tests/0017-compression.c +140 -0
- package/deps/librdkafka/tests/0018-cgrp_term.c +338 -0
- package/deps/librdkafka/tests/0019-list_groups.c +289 -0
- package/deps/librdkafka/tests/0020-destroy_hang.c +162 -0
- package/deps/librdkafka/tests/0021-rkt_destroy.c +72 -0
- package/deps/librdkafka/tests/0022-consume_batch.c +279 -0
- package/deps/librdkafka/tests/0025-timers.c +147 -0
- package/deps/librdkafka/tests/0026-consume_pause.c +547 -0
- package/deps/librdkafka/tests/0028-long_topicnames.c +79 -0
- package/deps/librdkafka/tests/0029-assign_offset.c +202 -0
- package/deps/librdkafka/tests/0030-offset_commit.c +589 -0
- package/deps/librdkafka/tests/0031-get_offsets.c +235 -0
- package/deps/librdkafka/tests/0033-regex_subscribe.c +536 -0
- package/deps/librdkafka/tests/0034-offset_reset.c +398 -0
- package/deps/librdkafka/tests/0035-api_version.c +73 -0
- package/deps/librdkafka/tests/0036-partial_fetch.c +87 -0
- package/deps/librdkafka/tests/0037-destroy_hang_local.c +85 -0
- package/deps/librdkafka/tests/0038-performance.c +121 -0
- package/deps/librdkafka/tests/0039-event.c +284 -0
- package/deps/librdkafka/tests/0040-io_event.c +257 -0
- package/deps/librdkafka/tests/0041-fetch_max_bytes.c +97 -0
- package/deps/librdkafka/tests/0042-many_topics.c +252 -0
- package/deps/librdkafka/tests/0043-no_connection.c +77 -0
- package/deps/librdkafka/tests/0044-partition_cnt.c +94 -0
- package/deps/librdkafka/tests/0045-subscribe_update.c +1010 -0
- package/deps/librdkafka/tests/0046-rkt_cache.c +65 -0
- package/deps/librdkafka/tests/0047-partial_buf_tmout.c +98 -0
- package/deps/librdkafka/tests/0048-partitioner.c +283 -0
- package/deps/librdkafka/tests/0049-consume_conn_close.c +162 -0
- package/deps/librdkafka/tests/0050-subscribe_adds.c +145 -0
- package/deps/librdkafka/tests/0051-assign_adds.c +126 -0
- package/deps/librdkafka/tests/0052-msg_timestamps.c +238 -0
- package/deps/librdkafka/tests/0053-stats_cb.cpp +527 -0
- package/deps/librdkafka/tests/0054-offset_time.cpp +236 -0
- package/deps/librdkafka/tests/0055-producer_latency.c +539 -0
- package/deps/librdkafka/tests/0056-balanced_group_mt.c +315 -0
- package/deps/librdkafka/tests/0057-invalid_topic.cpp +112 -0
- package/deps/librdkafka/tests/0058-log.cpp +123 -0
- package/deps/librdkafka/tests/0059-bsearch.cpp +241 -0
- package/deps/librdkafka/tests/0060-op_prio.cpp +163 -0
- package/deps/librdkafka/tests/0061-consumer_lag.cpp +295 -0
- package/deps/librdkafka/tests/0062-stats_event.c +126 -0
- package/deps/librdkafka/tests/0063-clusterid.cpp +180 -0
- package/deps/librdkafka/tests/0064-interceptors.c +481 -0
- package/deps/librdkafka/tests/0065-yield.cpp +140 -0
- package/deps/librdkafka/tests/0066-plugins.cpp +129 -0
- package/deps/librdkafka/tests/0067-empty_topic.cpp +151 -0
- package/deps/librdkafka/tests/0068-produce_timeout.c +136 -0
- package/deps/librdkafka/tests/0069-consumer_add_parts.c +119 -0
- package/deps/librdkafka/tests/0070-null_empty.cpp +197 -0
- package/deps/librdkafka/tests/0072-headers_ut.c +448 -0
- package/deps/librdkafka/tests/0073-headers.c +381 -0
- package/deps/librdkafka/tests/0074-producev.c +87 -0
- package/deps/librdkafka/tests/0075-retry.c +290 -0
- package/deps/librdkafka/tests/0076-produce_retry.c +452 -0
- package/deps/librdkafka/tests/0077-compaction.c +363 -0
- package/deps/librdkafka/tests/0078-c_from_cpp.cpp +96 -0
- package/deps/librdkafka/tests/0079-fork.c +93 -0
- package/deps/librdkafka/tests/0080-admin_ut.c +3095 -0
- package/deps/librdkafka/tests/0081-admin.c +5633 -0
- package/deps/librdkafka/tests/0082-fetch_max_bytes.cpp +137 -0
- package/deps/librdkafka/tests/0083-cb_event.c +233 -0
- package/deps/librdkafka/tests/0084-destroy_flags.c +208 -0
- package/deps/librdkafka/tests/0085-headers.cpp +392 -0
- package/deps/librdkafka/tests/0086-purge.c +368 -0
- package/deps/librdkafka/tests/0088-produce_metadata_timeout.c +162 -0
- package/deps/librdkafka/tests/0089-max_poll_interval.c +511 -0
- package/deps/librdkafka/tests/0090-idempotence.c +171 -0
- package/deps/librdkafka/tests/0091-max_poll_interval_timeout.c +295 -0
- package/deps/librdkafka/tests/0092-mixed_msgver.c +103 -0
- package/deps/librdkafka/tests/0093-holb.c +200 -0
- package/deps/librdkafka/tests/0094-idempotence_msg_timeout.c +231 -0
- package/deps/librdkafka/tests/0095-all_brokers_down.cpp +122 -0
- package/deps/librdkafka/tests/0097-ssl_verify.cpp +658 -0
- package/deps/librdkafka/tests/0098-consumer-txn.cpp +1218 -0
- package/deps/librdkafka/tests/0099-commit_metadata.c +194 -0
- package/deps/librdkafka/tests/0100-thread_interceptors.cpp +195 -0
- package/deps/librdkafka/tests/0101-fetch-from-follower.cpp +446 -0
- package/deps/librdkafka/tests/0102-static_group_rebalance.c +836 -0
- package/deps/librdkafka/tests/0103-transactions.c +1383 -0
- package/deps/librdkafka/tests/0104-fetch_from_follower_mock.c +625 -0
- package/deps/librdkafka/tests/0105-transactions_mock.c +3930 -0
- package/deps/librdkafka/tests/0106-cgrp_sess_timeout.c +318 -0
- package/deps/librdkafka/tests/0107-topic_recreate.c +259 -0
- package/deps/librdkafka/tests/0109-auto_create_topics.cpp +278 -0
- package/deps/librdkafka/tests/0110-batch_size.cpp +182 -0
- package/deps/librdkafka/tests/0111-delay_create_topics.cpp +127 -0
- package/deps/librdkafka/tests/0112-assign_unknown_part.c +87 -0
- package/deps/librdkafka/tests/0113-cooperative_rebalance.cpp +3473 -0
- package/deps/librdkafka/tests/0114-sticky_partitioning.cpp +176 -0
- package/deps/librdkafka/tests/0115-producer_auth.cpp +182 -0
- package/deps/librdkafka/tests/0116-kafkaconsumer_close.cpp +216 -0
- package/deps/librdkafka/tests/0117-mock_errors.c +331 -0
- package/deps/librdkafka/tests/0118-commit_rebalance.c +154 -0
- package/deps/librdkafka/tests/0119-consumer_auth.cpp +167 -0
- package/deps/librdkafka/tests/0120-asymmetric_subscription.c +185 -0
- package/deps/librdkafka/tests/0121-clusterid.c +115 -0
- package/deps/librdkafka/tests/0122-buffer_cleaning_after_rebalance.c +227 -0
- package/deps/librdkafka/tests/0123-connections_max_idle.c +98 -0
- package/deps/librdkafka/tests/0124-openssl_invalid_engine.c +69 -0
- package/deps/librdkafka/tests/0125-immediate_flush.c +144 -0
- package/deps/librdkafka/tests/0126-oauthbearer_oidc.c +528 -0
- package/deps/librdkafka/tests/0127-fetch_queue_backoff.cpp +165 -0
- package/deps/librdkafka/tests/0128-sasl_callback_queue.cpp +125 -0
- package/deps/librdkafka/tests/0129-fetch_aborted_msgs.c +79 -0
- package/deps/librdkafka/tests/0130-store_offsets.c +178 -0
- package/deps/librdkafka/tests/0131-connect_timeout.c +81 -0
- package/deps/librdkafka/tests/0132-strategy_ordering.c +179 -0
- package/deps/librdkafka/tests/0133-ssl_keys.c +150 -0
- package/deps/librdkafka/tests/0134-ssl_provider.c +92 -0
- package/deps/librdkafka/tests/0135-sasl_credentials.cpp +143 -0
- package/deps/librdkafka/tests/0136-resolve_cb.c +181 -0
- package/deps/librdkafka/tests/0137-barrier_batch_consume.c +619 -0
- package/deps/librdkafka/tests/0138-admin_mock.c +281 -0
- package/deps/librdkafka/tests/0139-offset_validation_mock.c +950 -0
- package/deps/librdkafka/tests/0140-commit_metadata.cpp +108 -0
- package/deps/librdkafka/tests/0142-reauthentication.c +515 -0
- package/deps/librdkafka/tests/0143-exponential_backoff_mock.c +552 -0
- package/deps/librdkafka/tests/0144-idempotence_mock.c +373 -0
- package/deps/librdkafka/tests/0145-pause_resume_mock.c +119 -0
- package/deps/librdkafka/tests/0146-metadata_mock.c +505 -0
- package/deps/librdkafka/tests/0147-consumer_group_consumer_mock.c +952 -0
- package/deps/librdkafka/tests/0148-offset_fetch_commit_error_mock.c +563 -0
- package/deps/librdkafka/tests/0149-broker-same-host-port.c +140 -0
- package/deps/librdkafka/tests/0150-telemetry_mock.c +651 -0
- package/deps/librdkafka/tests/0151-purge-brokers.c +566 -0
- package/deps/librdkafka/tests/0152-rebootstrap.c +59 -0
- package/deps/librdkafka/tests/0153-memberid.c +128 -0
- package/deps/librdkafka/tests/1000-unktopic.c +164 -0
- package/deps/librdkafka/tests/8000-idle.cpp +60 -0
- package/deps/librdkafka/tests/8001-fetch_from_follower_mock_manual.c +113 -0
- package/deps/librdkafka/tests/CMakeLists.txt +170 -0
- package/deps/librdkafka/tests/LibrdkafkaTestApp.py +291 -0
- package/deps/librdkafka/tests/Makefile +182 -0
- package/deps/librdkafka/tests/README.md +509 -0
- package/deps/librdkafka/tests/autotest.sh +33 -0
- package/deps/librdkafka/tests/backtrace.gdb +30 -0
- package/deps/librdkafka/tests/broker_version_tests.py +315 -0
- package/deps/librdkafka/tests/buildbox.sh +17 -0
- package/deps/librdkafka/tests/cleanup-checker-tests.sh +20 -0
- package/deps/librdkafka/tests/cluster_testing.py +191 -0
- package/deps/librdkafka/tests/delete-test-topics.sh +56 -0
- package/deps/librdkafka/tests/fixtures/oauthbearer/jwt_assertion_template.json +10 -0
- package/deps/librdkafka/tests/fixtures/ssl/Makefile +8 -0
- package/deps/librdkafka/tests/fixtures/ssl/README.md +13 -0
- package/deps/librdkafka/tests/fixtures/ssl/client.keystore.intermediate.p12 +0 -0
- package/deps/librdkafka/tests/fixtures/ssl/client.keystore.p12 +0 -0
- package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.intermediate.pem +72 -0
- package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.pem +50 -0
- package/deps/librdkafka/tests/fixtures/ssl/client2.intermediate.key +46 -0
- package/deps/librdkafka/tests/fixtures/ssl/client2.key +46 -0
- package/deps/librdkafka/tests/fixtures/ssl/create_keys.sh +168 -0
- package/deps/librdkafka/tests/fuzzers/Makefile +12 -0
- package/deps/librdkafka/tests/fuzzers/README.md +31 -0
- package/deps/librdkafka/tests/fuzzers/fuzz_regex.c +74 -0
- package/deps/librdkafka/tests/fuzzers/helpers.h +90 -0
- package/deps/librdkafka/tests/gen-ssl-certs.sh +165 -0
- package/deps/librdkafka/tests/interactive_broker_version.py +170 -0
- package/deps/librdkafka/tests/interceptor_test/CMakeLists.txt +16 -0
- package/deps/librdkafka/tests/interceptor_test/Makefile +22 -0
- package/deps/librdkafka/tests/interceptor_test/interceptor_test.c +314 -0
- package/deps/librdkafka/tests/interceptor_test/interceptor_test.h +54 -0
- package/deps/librdkafka/tests/java/IncrementalRebalanceCli.java +97 -0
- package/deps/librdkafka/tests/java/Makefile +13 -0
- package/deps/librdkafka/tests/java/Murmur2Cli.java +46 -0
- package/deps/librdkafka/tests/java/README.md +14 -0
- package/deps/librdkafka/tests/java/TransactionProducerCli.java +162 -0
- package/deps/librdkafka/tests/java/run-class.sh +11 -0
- package/deps/librdkafka/tests/librdkafka.suppressions +483 -0
- package/deps/librdkafka/tests/lz4_manual_test.sh +59 -0
- package/deps/librdkafka/tests/multi-broker-version-test.sh +50 -0
- package/deps/librdkafka/tests/parse-refcnt.sh +43 -0
- package/deps/librdkafka/tests/performance_plot.py +115 -0
- package/deps/librdkafka/tests/plugin_test/Makefile +19 -0
- package/deps/librdkafka/tests/plugin_test/plugin_test.c +58 -0
- package/deps/librdkafka/tests/requirements.txt +2 -0
- package/deps/librdkafka/tests/run-all-tests.sh +79 -0
- package/deps/librdkafka/tests/run-consumer-tests.sh +16 -0
- package/deps/librdkafka/tests/run-producer-tests.sh +16 -0
- package/deps/librdkafka/tests/run-test-batches.py +157 -0
- package/deps/librdkafka/tests/run-test.sh +140 -0
- package/deps/librdkafka/tests/rusage.c +249 -0
- package/deps/librdkafka/tests/sasl_test.py +289 -0
- package/deps/librdkafka/tests/scenarios/README.md +6 -0
- package/deps/librdkafka/tests/scenarios/ak23.json +6 -0
- package/deps/librdkafka/tests/scenarios/default.json +5 -0
- package/deps/librdkafka/tests/scenarios/noautocreate.json +5 -0
- package/deps/librdkafka/tests/sockem.c +801 -0
- package/deps/librdkafka/tests/sockem.h +85 -0
- package/deps/librdkafka/tests/sockem_ctrl.c +145 -0
- package/deps/librdkafka/tests/sockem_ctrl.h +61 -0
- package/deps/librdkafka/tests/test.c +7778 -0
- package/deps/librdkafka/tests/test.conf.example +27 -0
- package/deps/librdkafka/tests/test.h +1028 -0
- package/deps/librdkafka/tests/testcpp.cpp +131 -0
- package/deps/librdkafka/tests/testcpp.h +388 -0
- package/deps/librdkafka/tests/testshared.h +416 -0
- package/deps/librdkafka/tests/tools/README.md +4 -0
- package/deps/librdkafka/tests/tools/stats/README.md +21 -0
- package/deps/librdkafka/tests/tools/stats/filter.jq +42 -0
- package/deps/librdkafka/tests/tools/stats/graph.py +150 -0
- package/deps/librdkafka/tests/tools/stats/requirements.txt +3 -0
- package/deps/librdkafka/tests/tools/stats/to_csv.py +124 -0
- package/deps/librdkafka/tests/trivup/trivup-0.14.0.tar.gz +0 -0
- package/deps/librdkafka/tests/until-fail.sh +87 -0
- package/deps/librdkafka/tests/xxxx-assign_partition.c +122 -0
- package/deps/librdkafka/tests/xxxx-metadata.cpp +159 -0
- package/deps/librdkafka/vcpkg.json +23 -0
- package/deps/librdkafka/win32/README.md +5 -0
- package/deps/librdkafka/win32/build-package.bat +3 -0
- package/deps/librdkafka/win32/build.bat +19 -0
- package/deps/librdkafka/win32/common.vcxproj +84 -0
- package/deps/librdkafka/win32/interceptor_test/interceptor_test.vcxproj +87 -0
- package/deps/librdkafka/win32/librdkafka.autopkg.template +54 -0
- package/deps/librdkafka/win32/librdkafka.master.testing.targets +13 -0
- package/deps/librdkafka/win32/librdkafka.sln +226 -0
- package/deps/librdkafka/win32/librdkafka.vcxproj +276 -0
- package/deps/librdkafka/win32/librdkafkacpp/librdkafkacpp.vcxproj +104 -0
- package/deps/librdkafka/win32/msbuild.ps1 +15 -0
- package/deps/librdkafka/win32/openssl_engine_example/openssl_engine_example.vcxproj +132 -0
- package/deps/librdkafka/win32/package-zip.ps1 +46 -0
- package/deps/librdkafka/win32/packages/repositories.config +4 -0
- package/deps/librdkafka/win32/push-package.bat +4 -0
- package/deps/librdkafka/win32/rdkafka_complex_consumer_example_cpp/rdkafka_complex_consumer_example_cpp.vcxproj +67 -0
- package/deps/librdkafka/win32/rdkafka_example/rdkafka_example.vcxproj +97 -0
- package/deps/librdkafka/win32/rdkafka_performance/rdkafka_performance.vcxproj +97 -0
- package/deps/librdkafka/win32/setup-msys2.ps1 +47 -0
- package/deps/librdkafka/win32/setup-vcpkg.ps1 +34 -0
- package/deps/librdkafka/win32/tests/test.conf.example +25 -0
- package/deps/librdkafka/win32/tests/tests.vcxproj +253 -0
- package/deps/librdkafka/win32/win_ssl_cert_store/win_ssl_cert_store.vcxproj +132 -0
- package/deps/librdkafka/win32/wingetopt.c +564 -0
- package/deps/librdkafka/win32/wingetopt.h +101 -0
- package/deps/librdkafka/win32/wintime.h +33 -0
- package/deps/librdkafka.gyp +62 -0
- package/lib/admin.js +233 -0
- package/lib/client.js +573 -0
- package/lib/error.js +500 -0
- package/lib/index.js +34 -0
- package/lib/kafka-consumer-stream.js +397 -0
- package/lib/kafka-consumer.js +698 -0
- package/lib/producer/high-level-producer.js +323 -0
- package/lib/producer-stream.js +307 -0
- package/lib/producer.js +375 -0
- package/lib/tools/ref-counter.js +52 -0
- package/lib/topic-partition.js +88 -0
- package/lib/topic.js +42 -0
- package/lib/util.js +29 -0
- package/package.json +61 -0
- package/prebuilds/darwin-arm64/@point3+node-rdkafka.node +0 -0
- package/prebuilds/linux-x64/@point3+node-rdkafka.node +0 -0
- package/util/configure.js +30 -0
- package/util/get-env.js +6 -0
- package/util/test-compile.js +11 -0
- package/util/test-producer-delivery.js +100 -0
|
@@ -0,0 +1,1422 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* librdkafka - The Apache Kafka C/C++ library
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2022, Magnus Edenhill
|
|
5
|
+
* 2023, Confluent Inc.
|
|
6
|
+
* All rights reserved.
|
|
7
|
+
*
|
|
8
|
+
* Redistribution and use in source and binary forms, with or without
|
|
9
|
+
* modification, are permitted provided that the following conditions are met:
|
|
10
|
+
*
|
|
11
|
+
* 1. Redistributions of source code must retain the above copyright notice,
|
|
12
|
+
* this list of conditions and the following disclaimer.
|
|
13
|
+
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
14
|
+
* this list of conditions and the following disclaimer in the documentation
|
|
15
|
+
* and/or other materials provided with the distribution.
|
|
16
|
+
*
|
|
17
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
18
|
+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
19
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
20
|
+
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
21
|
+
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
22
|
+
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
23
|
+
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
24
|
+
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
25
|
+
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
26
|
+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
27
|
+
* POSSIBILITY OF SUCH DAMAGE.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @name Fetcher
|
|
33
|
+
*
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
#include "rdkafka_int.h"
|
|
37
|
+
#include "rdkafka_offset.h"
|
|
38
|
+
#include "rdkafka_msgset.h"
|
|
39
|
+
#include "rdkafka_fetcher.h"
|
|
40
|
+
#include "rdkafka_request.h"
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Backoff the next Fetch request (due to error).
|
|
45
|
+
*/
|
|
46
|
+
static void rd_kafka_broker_fetch_backoff(rd_kafka_broker_t *rkb,
|
|
47
|
+
rd_kafka_resp_err_t err) {
|
|
48
|
+
int backoff_ms = rkb->rkb_rk->rk_conf.fetch_error_backoff_ms;
|
|
49
|
+
rkb->rkb_ts_fetch_backoff = rd_clock() + (backoff_ms * 1000);
|
|
50
|
+
rd_rkb_dbg(rkb, FETCH, "BACKOFF", "Fetch backoff for %dms: %s",
|
|
51
|
+
backoff_ms, rd_kafka_err2str(err));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* @brief Backoff the next Fetch for specific partition
|
|
56
|
+
*
|
|
57
|
+
* @returns the absolute backoff time (the current time for no backoff).
|
|
58
|
+
*/
|
|
59
|
+
static rd_ts_t rd_kafka_toppar_fetch_backoff(rd_kafka_broker_t *rkb,
|
|
60
|
+
rd_kafka_toppar_t *rktp,
|
|
61
|
+
rd_kafka_resp_err_t err) {
|
|
62
|
+
int backoff_ms;
|
|
63
|
+
|
|
64
|
+
/* Don't back off on reaching end of partition */
|
|
65
|
+
if (err == RD_KAFKA_RESP_ERR__PARTITION_EOF) {
|
|
66
|
+
rktp->rktp_ts_fetch_backoff = 0;
|
|
67
|
+
return rd_clock(); /* Immediate: No practical backoff */
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (err == RD_KAFKA_RESP_ERR__QUEUE_FULL)
|
|
71
|
+
backoff_ms = rkb->rkb_rk->rk_conf.fetch_queue_backoff_ms;
|
|
72
|
+
else
|
|
73
|
+
backoff_ms = rkb->rkb_rk->rk_conf.fetch_error_backoff_ms;
|
|
74
|
+
|
|
75
|
+
if (unlikely(!backoff_ms)) {
|
|
76
|
+
rktp->rktp_ts_fetch_backoff = 0;
|
|
77
|
+
return rd_clock(); /* Immediate: No practical backoff */
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/* Certain errors that may require manual intervention should have
|
|
81
|
+
* a longer backoff time. */
|
|
82
|
+
if (err == RD_KAFKA_RESP_ERR_TOPIC_AUTHORIZATION_FAILED)
|
|
83
|
+
backoff_ms = RD_MAX(1000, backoff_ms * 10);
|
|
84
|
+
|
|
85
|
+
rktp->rktp_ts_fetch_backoff = rd_clock() + (backoff_ms * 1000);
|
|
86
|
+
|
|
87
|
+
rd_rkb_dbg(rkb, FETCH, "BACKOFF",
|
|
88
|
+
"%s [%" PRId32 "]: Fetch backoff for %dms%s%s",
|
|
89
|
+
rktp->rktp_rkt->rkt_topic->str, rktp->rktp_partition,
|
|
90
|
+
backoff_ms, err ? ": " : "",
|
|
91
|
+
err ? rd_kafka_err2str(err) : "");
|
|
92
|
+
|
|
93
|
+
return rktp->rktp_ts_fetch_backoff;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* @brief Handle preferred replica in fetch response.
|
|
98
|
+
*
|
|
99
|
+
* @locks rd_kafka_toppar_lock(rktp) and
|
|
100
|
+
* rd_kafka_rdlock(rk) must NOT be held.
|
|
101
|
+
*
|
|
102
|
+
* @locality broker thread
|
|
103
|
+
*/
|
|
104
|
+
static void rd_kafka_fetch_preferred_replica_handle(rd_kafka_toppar_t *rktp,
|
|
105
|
+
rd_kafka_buf_t *rkbuf,
|
|
106
|
+
rd_kafka_broker_t *rkb,
|
|
107
|
+
int32_t preferred_id) {
|
|
108
|
+
const rd_ts_t one_minute = 60 * 1000 * 1000;
|
|
109
|
+
const rd_ts_t five_seconds = 5 * 1000 * 1000;
|
|
110
|
+
rd_kafka_broker_t *preferred_rkb;
|
|
111
|
+
rd_kafka_t *rk = rktp->rktp_rkt->rkt_rk;
|
|
112
|
+
rd_ts_t new_intvl =
|
|
113
|
+
rd_interval_immediate(&rktp->rktp_new_lease_intvl, one_minute, 0);
|
|
114
|
+
|
|
115
|
+
if (new_intvl < 0) {
|
|
116
|
+
/* In lieu of KIP-320, the toppar is delegated back to
|
|
117
|
+
* the leader in the event of an offset out-of-range
|
|
118
|
+
* error (KIP-392 error case #4) because this scenario
|
|
119
|
+
* implies the preferred replica is out-of-sync.
|
|
120
|
+
*
|
|
121
|
+
* If program execution reaches here, the leader has
|
|
122
|
+
* relatively quickly instructed the client back to
|
|
123
|
+
* a preferred replica, quite possibly the same one
|
|
124
|
+
* as before (possibly resulting from stale metadata),
|
|
125
|
+
* so we back off the toppar to slow down potential
|
|
126
|
+
* back-and-forth.
|
|
127
|
+
*/
|
|
128
|
+
|
|
129
|
+
if (rd_interval_immediate(&rktp->rktp_new_lease_log_intvl,
|
|
130
|
+
one_minute, 0) > 0)
|
|
131
|
+
rd_rkb_log(rkb, LOG_NOTICE, "FETCH",
|
|
132
|
+
"%.*s [%" PRId32
|
|
133
|
+
"]: preferred replica "
|
|
134
|
+
"(%" PRId32
|
|
135
|
+
") lease changing too quickly "
|
|
136
|
+
"(%" PRId64
|
|
137
|
+
"s < 60s): possibly due to "
|
|
138
|
+
"unavailable replica or stale cluster "
|
|
139
|
+
"state: backing off next fetch",
|
|
140
|
+
RD_KAFKAP_STR_PR(rktp->rktp_rkt->rkt_topic),
|
|
141
|
+
rktp->rktp_partition, preferred_id,
|
|
142
|
+
(one_minute - -new_intvl) / (1000 * 1000));
|
|
143
|
+
|
|
144
|
+
rd_kafka_toppar_fetch_backoff(rkb, rktp,
|
|
145
|
+
RD_KAFKA_RESP_ERR_NO_ERROR);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
rd_kafka_rdlock(rk);
|
|
149
|
+
preferred_rkb = rd_kafka_broker_find_by_nodeid(rk, preferred_id);
|
|
150
|
+
rd_kafka_rdunlock(rk);
|
|
151
|
+
|
|
152
|
+
if (preferred_rkb) {
|
|
153
|
+
rd_interval_reset_to_now(&rktp->rktp_lease_intvl, 0);
|
|
154
|
+
rd_kafka_toppar_lock(rktp);
|
|
155
|
+
rd_kafka_toppar_broker_update(rktp, preferred_id, preferred_rkb,
|
|
156
|
+
"preferred replica updated");
|
|
157
|
+
rd_kafka_toppar_unlock(rktp);
|
|
158
|
+
rd_kafka_broker_destroy(preferred_rkb);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
if (rd_interval_immediate(&rktp->rktp_metadata_intvl, five_seconds, 0) >
|
|
163
|
+
0) {
|
|
164
|
+
rd_rkb_log(rkb, LOG_NOTICE, "FETCH",
|
|
165
|
+
"%.*s [%" PRId32 "]: preferred replica (%" PRId32
|
|
166
|
+
") "
|
|
167
|
+
"is unknown: refreshing metadata",
|
|
168
|
+
RD_KAFKAP_STR_PR(rktp->rktp_rkt->rkt_topic),
|
|
169
|
+
rktp->rktp_partition, preferred_id);
|
|
170
|
+
|
|
171
|
+
rd_kafka_metadata_refresh_brokers(
|
|
172
|
+
rktp->rktp_rkt->rkt_rk, NULL,
|
|
173
|
+
"preferred replica unavailable");
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
rd_kafka_toppar_fetch_backoff(rkb, rktp,
|
|
177
|
+
RD_KAFKA_RESP_ERR_REPLICA_NOT_AVAILABLE);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* @brief Handle partition-specific Fetch error.
|
|
183
|
+
*/
|
|
184
|
+
static void rd_kafka_fetch_reply_handle_partition_error(
|
|
185
|
+
rd_kafka_broker_t *rkb,
|
|
186
|
+
rd_kafka_toppar_t *rktp,
|
|
187
|
+
const struct rd_kafka_toppar_ver *tver,
|
|
188
|
+
rd_kafka_resp_err_t err,
|
|
189
|
+
int64_t HighwaterMarkOffset) {
|
|
190
|
+
|
|
191
|
+
rd_rkb_dbg(rkb, FETCH, "FETCHERR",
|
|
192
|
+
"%.*s [%" PRId32 "]: Fetch failed at %s: %s",
|
|
193
|
+
RD_KAFKAP_STR_PR(rktp->rktp_rkt->rkt_topic),
|
|
194
|
+
rktp->rktp_partition,
|
|
195
|
+
rd_kafka_fetch_pos2str(rktp->rktp_offsets.fetch_pos),
|
|
196
|
+
rd_kafka_err2name(err));
|
|
197
|
+
|
|
198
|
+
/* Some errors should be passed to the
|
|
199
|
+
* application while some handled by rdkafka */
|
|
200
|
+
switch (err) {
|
|
201
|
+
/* Errors handled by rdkafka */
|
|
202
|
+
case RD_KAFKA_RESP_ERR_OFFSET_NOT_AVAILABLE:
|
|
203
|
+
case RD_KAFKA_RESP_ERR_UNKNOWN_TOPIC_OR_PART:
|
|
204
|
+
case RD_KAFKA_RESP_ERR_LEADER_NOT_AVAILABLE:
|
|
205
|
+
case RD_KAFKA_RESP_ERR_NOT_LEADER_OR_FOLLOWER:
|
|
206
|
+
case RD_KAFKA_RESP_ERR_BROKER_NOT_AVAILABLE:
|
|
207
|
+
case RD_KAFKA_RESP_ERR_REPLICA_NOT_AVAILABLE:
|
|
208
|
+
case RD_KAFKA_RESP_ERR_KAFKA_STORAGE_ERROR:
|
|
209
|
+
case RD_KAFKA_RESP_ERR_UNKNOWN_LEADER_EPOCH:
|
|
210
|
+
case RD_KAFKA_RESP_ERR_FENCED_LEADER_EPOCH:
|
|
211
|
+
case RD_KAFKA_RESP_ERR_UNKNOWN_TOPIC_ID:
|
|
212
|
+
if (err == RD_KAFKA_RESP_ERR_OFFSET_NOT_AVAILABLE) {
|
|
213
|
+
/* Occurs when:
|
|
214
|
+
* - Msg exists on broker but
|
|
215
|
+
* offset > HWM, or:
|
|
216
|
+
* - HWM is >= offset, but msg not
|
|
217
|
+
* yet available at that offset
|
|
218
|
+
* (replica is out of sync).
|
|
219
|
+
* - partition leader is out of sync.
|
|
220
|
+
*
|
|
221
|
+
* Handle by requesting metadata update, changing back
|
|
222
|
+
* to the leader, and then retrying FETCH
|
|
223
|
+
* (with backoff).
|
|
224
|
+
*/
|
|
225
|
+
rd_rkb_dbg(rkb, MSG, "FETCH",
|
|
226
|
+
"Topic %s [%" PRId32
|
|
227
|
+
"]: %s not "
|
|
228
|
+
"available on broker %" PRId32
|
|
229
|
+
" (leader %" PRId32
|
|
230
|
+
"): updating metadata and retrying",
|
|
231
|
+
rktp->rktp_rkt->rkt_topic->str,
|
|
232
|
+
rktp->rktp_partition,
|
|
233
|
+
rd_kafka_fetch_pos2str(
|
|
234
|
+
rktp->rktp_offsets.fetch_pos),
|
|
235
|
+
rktp->rktp_broker_id, rktp->rktp_leader_id);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
if (err == RD_KAFKA_RESP_ERR_UNKNOWN_LEADER_EPOCH) {
|
|
239
|
+
rd_rkb_dbg(rkb, MSG | RD_KAFKA_DBG_CONSUMER, "FETCH",
|
|
240
|
+
"Topic %s [%" PRId32
|
|
241
|
+
"]: Fetch failed at %s: %s: broker %" PRId32
|
|
242
|
+
"has not yet caught up on latest metadata: "
|
|
243
|
+
"retrying",
|
|
244
|
+
rktp->rktp_rkt->rkt_topic->str,
|
|
245
|
+
rktp->rktp_partition,
|
|
246
|
+
rd_kafka_fetch_pos2str(
|
|
247
|
+
rktp->rktp_offsets.fetch_pos),
|
|
248
|
+
rd_kafka_err2str(err), rktp->rktp_broker_id);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
if (rktp->rktp_broker_id != rktp->rktp_leader_id) {
|
|
252
|
+
rd_kafka_toppar_delegate_to_leader(rktp);
|
|
253
|
+
}
|
|
254
|
+
/* Request metadata information update*/
|
|
255
|
+
rd_kafka_toppar_leader_unavailable(rktp, "fetch", err);
|
|
256
|
+
break;
|
|
257
|
+
|
|
258
|
+
case RD_KAFKA_RESP_ERR_OFFSET_OUT_OF_RANGE: {
|
|
259
|
+
rd_kafka_fetch_pos_t err_pos;
|
|
260
|
+
|
|
261
|
+
if (rktp->rktp_broker_id != rktp->rktp_leader_id &&
|
|
262
|
+
rktp->rktp_offsets.fetch_pos.offset > HighwaterMarkOffset) {
|
|
263
|
+
rd_kafka_log(rkb->rkb_rk, LOG_WARNING, "FETCH",
|
|
264
|
+
"Topic %s [%" PRId32
|
|
265
|
+
"]: %s "
|
|
266
|
+
" out of range (HighwaterMark %" PRId64
|
|
267
|
+
" fetching from "
|
|
268
|
+
"broker %" PRId32 " (leader %" PRId32
|
|
269
|
+
"): reverting to leader",
|
|
270
|
+
rktp->rktp_rkt->rkt_topic->str,
|
|
271
|
+
rktp->rktp_partition,
|
|
272
|
+
rd_kafka_fetch_pos2str(
|
|
273
|
+
rktp->rktp_offsets.fetch_pos),
|
|
274
|
+
HighwaterMarkOffset, rktp->rktp_broker_id,
|
|
275
|
+
rktp->rktp_leader_id);
|
|
276
|
+
|
|
277
|
+
/* Out of range error cannot be taken as definitive
|
|
278
|
+
* when fetching from follower.
|
|
279
|
+
* Revert back to the leader in lieu of KIP-320.
|
|
280
|
+
*/
|
|
281
|
+
rd_kafka_toppar_delegate_to_leader(rktp);
|
|
282
|
+
break;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/* Application error */
|
|
286
|
+
err_pos = rktp->rktp_offsets.fetch_pos;
|
|
287
|
+
rktp->rktp_offsets.fetch_pos.offset = RD_KAFKA_OFFSET_INVALID;
|
|
288
|
+
rktp->rktp_offsets.fetch_pos.leader_epoch = -1;
|
|
289
|
+
rd_kafka_offset_reset(rktp, rd_kafka_broker_id(rkb), err_pos,
|
|
290
|
+
err,
|
|
291
|
+
"fetch failed due to requested offset "
|
|
292
|
+
"not available on the broker");
|
|
293
|
+
} break;
|
|
294
|
+
|
|
295
|
+
case RD_KAFKA_RESP_ERR_TOPIC_AUTHORIZATION_FAILED:
|
|
296
|
+
/* If we're not authorized to access the
|
|
297
|
+
* topic mark it as errored to deny
|
|
298
|
+
* further Fetch requests. */
|
|
299
|
+
if (rktp->rktp_last_error != err) {
|
|
300
|
+
rd_kafka_consumer_err(
|
|
301
|
+
rktp->rktp_fetchq, rd_kafka_broker_id(rkb), err,
|
|
302
|
+
tver->version, NULL, rktp,
|
|
303
|
+
rktp->rktp_offsets.fetch_pos.offset,
|
|
304
|
+
"Fetch from broker %" PRId32 " failed: %s",
|
|
305
|
+
rd_kafka_broker_id(rkb), rd_kafka_err2str(err));
|
|
306
|
+
rktp->rktp_last_error = err;
|
|
307
|
+
}
|
|
308
|
+
break;
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
/* Application errors */
|
|
312
|
+
case RD_KAFKA_RESP_ERR__PARTITION_EOF:
|
|
313
|
+
if (rkb->rkb_rk->rk_conf.enable_partition_eof)
|
|
314
|
+
rd_kafka_consumer_err(
|
|
315
|
+
rktp->rktp_fetchq, rd_kafka_broker_id(rkb), err,
|
|
316
|
+
tver->version, NULL, rktp,
|
|
317
|
+
rktp->rktp_offsets.fetch_pos.offset,
|
|
318
|
+
"Fetch from broker %" PRId32
|
|
319
|
+
" reached end of "
|
|
320
|
+
"partition at offset %" PRId64
|
|
321
|
+
" (HighwaterMark %" PRId64 ")",
|
|
322
|
+
rd_kafka_broker_id(rkb),
|
|
323
|
+
rktp->rktp_offsets.fetch_pos.offset,
|
|
324
|
+
HighwaterMarkOffset);
|
|
325
|
+
break;
|
|
326
|
+
|
|
327
|
+
case RD_KAFKA_RESP_ERR_MSG_SIZE_TOO_LARGE:
|
|
328
|
+
default: /* and all other errors */
|
|
329
|
+
rd_dassert(tver->version > 0);
|
|
330
|
+
rd_kafka_consumer_err(
|
|
331
|
+
rktp->rktp_fetchq, rd_kafka_broker_id(rkb), err,
|
|
332
|
+
tver->version, NULL, rktp,
|
|
333
|
+
rktp->rktp_offsets.fetch_pos.offset,
|
|
334
|
+
"Fetch from broker %" PRId32 " failed at %s: %s",
|
|
335
|
+
rd_kafka_broker_id(rkb),
|
|
336
|
+
rd_kafka_fetch_pos2str(rktp->rktp_offsets.fetch_pos),
|
|
337
|
+
rd_kafka_err2str(err));
|
|
338
|
+
break;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/* Back off the next fetch for this partition */
|
|
342
|
+
rd_kafka_toppar_fetch_backoff(rkb, rktp, err);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
static void rd_kafkap_Fetch_reply_tags_set_topic_cnt(
|
|
346
|
+
rd_kafkap_Fetch_reply_tags_t *reply_tags,
|
|
347
|
+
int32_t TopicCnt) {
|
|
348
|
+
reply_tags->TopicCnt = TopicCnt;
|
|
349
|
+
rd_dassert(!reply_tags->Topics);
|
|
350
|
+
reply_tags->Topics = rd_calloc(TopicCnt, sizeof(*reply_tags->Topics));
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
static void
|
|
354
|
+
rd_kafkap_Fetch_reply_tags_set_topic(rd_kafkap_Fetch_reply_tags_t *reply_tags,
|
|
355
|
+
int TopicIdx,
|
|
356
|
+
rd_kafka_Uuid_t TopicId,
|
|
357
|
+
int32_t PartitionCnt) {
|
|
358
|
+
reply_tags->Topics[TopicIdx].TopicId = TopicId;
|
|
359
|
+
reply_tags->Topics[TopicIdx].PartitionCnt = PartitionCnt;
|
|
360
|
+
rd_dassert(!reply_tags->Topics[TopicIdx].Partitions);
|
|
361
|
+
reply_tags->Topics[TopicIdx].Partitions = rd_calloc(
|
|
362
|
+
PartitionCnt, sizeof(*reply_tags->Topics[TopicIdx].Partitions));
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
static void
|
|
367
|
+
rd_kafkap_Fetch_reply_tags_destroy(rd_kafkap_Fetch_reply_tags_t *reply_tags) {
|
|
368
|
+
int i;
|
|
369
|
+
for (i = 0; i < reply_tags->TopicCnt; i++) {
|
|
370
|
+
RD_IF_FREE(reply_tags->Topics[i].Partitions, rd_free);
|
|
371
|
+
}
|
|
372
|
+
RD_IF_FREE(reply_tags->Topics, rd_free);
|
|
373
|
+
RD_IF_FREE(reply_tags->NodeEndpoints.NodeEndpoints, rd_free);
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
static int rd_kafkap_Fetch_reply_tags_partition_parse(
|
|
377
|
+
rd_kafka_buf_t *rkbuf,
|
|
378
|
+
uint64_t tagtype,
|
|
379
|
+
uint64_t taglen,
|
|
380
|
+
rd_kafkap_Fetch_reply_tags_Topic_t *TopicTags,
|
|
381
|
+
rd_kafkap_Fetch_reply_tags_Partition_t *PartitionTags) {
|
|
382
|
+
switch (tagtype) {
|
|
383
|
+
case 1: /* CurrentLeader */
|
|
384
|
+
if (rd_kafka_buf_read_CurrentLeader(
|
|
385
|
+
rkbuf, &PartitionTags->CurrentLeader) == -1)
|
|
386
|
+
goto err_parse;
|
|
387
|
+
TopicTags->partitions_with_leader_change_cnt++;
|
|
388
|
+
return 1;
|
|
389
|
+
default:
|
|
390
|
+
return 0;
|
|
391
|
+
}
|
|
392
|
+
err_parse:
|
|
393
|
+
return -1;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
static int
|
|
397
|
+
rd_kafkap_Fetch_reply_tags_parse(rd_kafka_buf_t *rkbuf,
|
|
398
|
+
uint64_t tagtype,
|
|
399
|
+
uint64_t taglen,
|
|
400
|
+
rd_kafkap_Fetch_reply_tags_t *tags) {
|
|
401
|
+
switch (tagtype) {
|
|
402
|
+
case 0: /* NodeEndpoints */
|
|
403
|
+
if (rd_kafka_buf_read_NodeEndpoints(rkbuf,
|
|
404
|
+
&tags->NodeEndpoints) == -1)
|
|
405
|
+
goto err_parse;
|
|
406
|
+
return 1;
|
|
407
|
+
default:
|
|
408
|
+
return 0;
|
|
409
|
+
}
|
|
410
|
+
err_parse:
|
|
411
|
+
return -1;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
static void
|
|
415
|
+
rd_kafka_handle_Fetch_metadata_update(rd_kafka_broker_t *rkb,
|
|
416
|
+
rd_kafkap_Fetch_reply_tags_t *FetchTags) {
|
|
417
|
+
if (FetchTags->topics_with_leader_change_cnt &&
|
|
418
|
+
FetchTags->NodeEndpoints.NodeEndpoints) {
|
|
419
|
+
rd_kafka_metadata_t *md = NULL;
|
|
420
|
+
rd_kafka_metadata_internal_t *mdi = NULL;
|
|
421
|
+
rd_tmpabuf_t tbuf;
|
|
422
|
+
int32_t nodeid;
|
|
423
|
+
rd_kafka_op_t *rko;
|
|
424
|
+
int i, changed_topic, changed_partition;
|
|
425
|
+
|
|
426
|
+
rd_kafka_broker_lock(rkb);
|
|
427
|
+
nodeid = rkb->rkb_nodeid;
|
|
428
|
+
rd_kafka_broker_unlock(rkb);
|
|
429
|
+
|
|
430
|
+
rd_tmpabuf_new(&tbuf, 0, rd_true /*assert on fail*/);
|
|
431
|
+
rd_tmpabuf_add_alloc(&tbuf, sizeof(*mdi));
|
|
432
|
+
rd_kafkap_leader_discovery_tmpabuf_add_alloc_brokers(
|
|
433
|
+
&tbuf, &FetchTags->NodeEndpoints);
|
|
434
|
+
rd_kafkap_leader_discovery_tmpabuf_add_alloc_topics(
|
|
435
|
+
&tbuf, FetchTags->topics_with_leader_change_cnt);
|
|
436
|
+
for (i = 0; i < FetchTags->TopicCnt; i++) {
|
|
437
|
+
if (!FetchTags->Topics[i]
|
|
438
|
+
.partitions_with_leader_change_cnt)
|
|
439
|
+
continue;
|
|
440
|
+
rd_kafkap_leader_discovery_tmpabuf_add_alloc_topic(
|
|
441
|
+
&tbuf, NULL,
|
|
442
|
+
FetchTags->Topics[i]
|
|
443
|
+
.partitions_with_leader_change_cnt);
|
|
444
|
+
}
|
|
445
|
+
rd_tmpabuf_finalize(&tbuf);
|
|
446
|
+
|
|
447
|
+
mdi = rd_tmpabuf_alloc(&tbuf, sizeof(*mdi));
|
|
448
|
+
md = &mdi->metadata;
|
|
449
|
+
|
|
450
|
+
rd_kafkap_leader_discovery_metadata_init(mdi, nodeid);
|
|
451
|
+
|
|
452
|
+
rd_kafkap_leader_discovery_set_brokers(
|
|
453
|
+
&tbuf, mdi, &FetchTags->NodeEndpoints);
|
|
454
|
+
|
|
455
|
+
rd_kafkap_leader_discovery_set_topic_cnt(
|
|
456
|
+
&tbuf, mdi, FetchTags->topics_with_leader_change_cnt);
|
|
457
|
+
|
|
458
|
+
changed_topic = 0;
|
|
459
|
+
for (i = 0; i < FetchTags->TopicCnt; i++) {
|
|
460
|
+
int j;
|
|
461
|
+
if (!FetchTags->Topics[i]
|
|
462
|
+
.partitions_with_leader_change_cnt)
|
|
463
|
+
continue;
|
|
464
|
+
|
|
465
|
+
rd_kafkap_leader_discovery_set_topic(
|
|
466
|
+
&tbuf, mdi, changed_topic,
|
|
467
|
+
FetchTags->Topics[i].TopicId, NULL,
|
|
468
|
+
FetchTags->Topics[i]
|
|
469
|
+
.partitions_with_leader_change_cnt);
|
|
470
|
+
|
|
471
|
+
changed_partition = 0;
|
|
472
|
+
for (j = 0; j < FetchTags->Topics[i].PartitionCnt;
|
|
473
|
+
j++) {
|
|
474
|
+
if (FetchTags->Topics[i]
|
|
475
|
+
.Partitions[j]
|
|
476
|
+
.CurrentLeader.LeaderId < 0)
|
|
477
|
+
continue;
|
|
478
|
+
|
|
479
|
+
rd_kafkap_Fetch_reply_tags_Partition_t
|
|
480
|
+
*Partition =
|
|
481
|
+
&FetchTags->Topics[i].Partitions[j];
|
|
482
|
+
rd_kafkap_leader_discovery_set_CurrentLeader(
|
|
483
|
+
&tbuf, mdi, changed_topic,
|
|
484
|
+
changed_partition, Partition->Partition,
|
|
485
|
+
&Partition->CurrentLeader);
|
|
486
|
+
changed_partition++;
|
|
487
|
+
}
|
|
488
|
+
changed_topic++;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
rko = rd_kafka_op_new(RD_KAFKA_OP_METADATA_UPDATE);
|
|
492
|
+
rko->rko_u.metadata.md = md;
|
|
493
|
+
rko->rko_u.metadata.mdi = mdi;
|
|
494
|
+
rd_kafka_q_enq(rkb->rkb_rk->rk_ops, rko);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
/**
|
|
499
|
+
* @brief Per-partition FetchResponse parsing and handling.
|
|
500
|
+
*
|
|
501
|
+
* @returns an error on buffer parse failure, else RD_KAFKA_RESP_ERR_NO_ERROR.
|
|
502
|
+
*/
|
|
503
|
+
static rd_kafka_resp_err_t rd_kafka_fetch_reply_handle_partition(
|
|
504
|
+
rd_kafka_broker_t *rkb,
|
|
505
|
+
const rd_kafkap_str_t *topic,
|
|
506
|
+
rd_kafka_topic_t *rkt /*possibly NULL*/,
|
|
507
|
+
rd_kafka_buf_t *rkbuf,
|
|
508
|
+
rd_kafka_buf_t *request,
|
|
509
|
+
int16_t ErrorCode,
|
|
510
|
+
rd_kafkap_Fetch_reply_tags_Topic_t *TopicTags,
|
|
511
|
+
rd_kafkap_Fetch_reply_tags_Partition_t *PartitionTags) {
|
|
512
|
+
const int log_decode_errors = LOG_ERR;
|
|
513
|
+
struct rd_kafka_toppar_ver *tver, tver_skel;
|
|
514
|
+
rd_kafka_toppar_t *rktp = NULL;
|
|
515
|
+
rd_kafka_aborted_txns_t *aborted_txns = NULL;
|
|
516
|
+
rd_slice_t save_slice;
|
|
517
|
+
int32_t fetch_version;
|
|
518
|
+
struct {
|
|
519
|
+
int32_t Partition;
|
|
520
|
+
int16_t ErrorCode;
|
|
521
|
+
int64_t HighwaterMarkOffset;
|
|
522
|
+
int64_t LastStableOffset; /* v4 */
|
|
523
|
+
int64_t LogStartOffset; /* v5 */
|
|
524
|
+
int32_t MessageSetSize;
|
|
525
|
+
int32_t PreferredReadReplica; /* v11 */
|
|
526
|
+
} hdr;
|
|
527
|
+
rd_kafka_resp_err_t err;
|
|
528
|
+
int64_t end_offset;
|
|
529
|
+
|
|
530
|
+
rd_kafka_buf_read_i32(rkbuf, &hdr.Partition);
|
|
531
|
+
rd_kafka_buf_read_i16(rkbuf, &hdr.ErrorCode);
|
|
532
|
+
if (PartitionTags)
|
|
533
|
+
PartitionTags->Partition = hdr.Partition;
|
|
534
|
+
if (ErrorCode)
|
|
535
|
+
hdr.ErrorCode = ErrorCode;
|
|
536
|
+
rd_kafka_buf_read_i64(rkbuf, &hdr.HighwaterMarkOffset);
|
|
537
|
+
|
|
538
|
+
end_offset = hdr.HighwaterMarkOffset;
|
|
539
|
+
|
|
540
|
+
hdr.LastStableOffset = RD_KAFKA_OFFSET_INVALID;
|
|
541
|
+
hdr.LogStartOffset = RD_KAFKA_OFFSET_INVALID;
|
|
542
|
+
if (rd_kafka_buf_ApiVersion(request) >= 4) {
|
|
543
|
+
int32_t AbortedTxnCnt;
|
|
544
|
+
int k;
|
|
545
|
+
rd_kafka_buf_read_i64(rkbuf, &hdr.LastStableOffset);
|
|
546
|
+
if (rd_kafka_buf_ApiVersion(request) >= 5)
|
|
547
|
+
rd_kafka_buf_read_i64(rkbuf, &hdr.LogStartOffset);
|
|
548
|
+
|
|
549
|
+
rd_kafka_buf_read_arraycnt(rkbuf, &AbortedTxnCnt,
|
|
550
|
+
RD_KAFKAP_ABORTED_TRANSACTIONS_MAX);
|
|
551
|
+
|
|
552
|
+
if (rkb->rkb_rk->rk_conf.isolation_level ==
|
|
553
|
+
RD_KAFKA_READ_UNCOMMITTED) {
|
|
554
|
+
|
|
555
|
+
if (unlikely(AbortedTxnCnt > 0)) {
|
|
556
|
+
rd_rkb_log(rkb, LOG_ERR, "FETCH",
|
|
557
|
+
"%.*s [%" PRId32
|
|
558
|
+
"]: "
|
|
559
|
+
"%" PRId32
|
|
560
|
+
" aborted transaction(s) "
|
|
561
|
+
"encountered in READ_UNCOMMITTED "
|
|
562
|
+
"fetch response: ignoring.",
|
|
563
|
+
RD_KAFKAP_STR_PR(topic),
|
|
564
|
+
hdr.Partition, AbortedTxnCnt);
|
|
565
|
+
for (k = 0; k < AbortedTxnCnt; k++) {
|
|
566
|
+
rd_kafka_buf_skip(rkbuf, (8 + 8));
|
|
567
|
+
/* AbortedTransaction tags */
|
|
568
|
+
rd_kafka_buf_skip_tags(rkbuf);
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
} else {
|
|
572
|
+
/* Older brokers may return LSO -1,
|
|
573
|
+
* in which case we use the HWM. */
|
|
574
|
+
if (hdr.LastStableOffset >= 0)
|
|
575
|
+
end_offset = hdr.LastStableOffset;
|
|
576
|
+
|
|
577
|
+
if (AbortedTxnCnt > 0) {
|
|
578
|
+
aborted_txns =
|
|
579
|
+
rd_kafka_aborted_txns_new(AbortedTxnCnt);
|
|
580
|
+
for (k = 0; k < AbortedTxnCnt; k++) {
|
|
581
|
+
int64_t PID;
|
|
582
|
+
int64_t FirstOffset;
|
|
583
|
+
rd_kafka_buf_read_i64(rkbuf, &PID);
|
|
584
|
+
rd_kafka_buf_read_i64(rkbuf,
|
|
585
|
+
&FirstOffset);
|
|
586
|
+
/* AbortedTransaction tags */
|
|
587
|
+
rd_kafka_buf_skip_tags(rkbuf);
|
|
588
|
+
rd_kafka_aborted_txns_add(
|
|
589
|
+
aborted_txns, PID, FirstOffset);
|
|
590
|
+
}
|
|
591
|
+
rd_kafka_aborted_txns_sort(aborted_txns);
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
if (rd_kafka_buf_ApiVersion(request) >= 11)
|
|
597
|
+
rd_kafka_buf_read_i32(rkbuf, &hdr.PreferredReadReplica);
|
|
598
|
+
else
|
|
599
|
+
hdr.PreferredReadReplica = -1;
|
|
600
|
+
/* Compact Records Array */
|
|
601
|
+
rd_kafka_buf_read_arraycnt(rkbuf, &hdr.MessageSetSize, -1);
|
|
602
|
+
|
|
603
|
+
if (unlikely(hdr.MessageSetSize < 0))
|
|
604
|
+
rd_kafka_buf_parse_fail(
|
|
605
|
+
rkbuf,
|
|
606
|
+
"%.*s [%" PRId32 "]: invalid MessageSetSize %" PRId32,
|
|
607
|
+
RD_KAFKAP_STR_PR(topic), hdr.Partition, hdr.MessageSetSize);
|
|
608
|
+
|
|
609
|
+
/* Look up topic+partition */
|
|
610
|
+
if (likely(rkt != NULL)) {
|
|
611
|
+
rd_kafka_topic_rdlock(rkt);
|
|
612
|
+
rktp = rd_kafka_toppar_get(rkt, hdr.Partition,
|
|
613
|
+
0 /*no ua-on-miss*/);
|
|
614
|
+
rd_kafka_topic_rdunlock(rkt);
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
if (unlikely(!rkt || !rktp)) {
|
|
618
|
+
rd_rkb_dbg(rkb, TOPIC, "UNKTOPIC",
|
|
619
|
+
"Received Fetch response (error %hu) for unknown "
|
|
620
|
+
"topic %.*s [%" PRId32 "]: ignoring",
|
|
621
|
+
hdr.ErrorCode, RD_KAFKAP_STR_PR(topic),
|
|
622
|
+
hdr.Partition);
|
|
623
|
+
rd_kafka_buf_skip(rkbuf, hdr.MessageSetSize);
|
|
624
|
+
goto done;
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
rd_kafka_toppar_lock(rktp);
|
|
628
|
+
rktp->rktp_lo_offset = hdr.LogStartOffset;
|
|
629
|
+
rktp->rktp_hi_offset = hdr.HighwaterMarkOffset;
|
|
630
|
+
/* Let the LastStable offset be the effective
|
|
631
|
+
* end_offset based on protocol version, that is:
|
|
632
|
+
* if connected to a broker that does not support
|
|
633
|
+
* LastStableOffset we use the HighwaterMarkOffset. */
|
|
634
|
+
rktp->rktp_ls_offset = end_offset;
|
|
635
|
+
rd_kafka_toppar_unlock(rktp);
|
|
636
|
+
|
|
637
|
+
if (hdr.PreferredReadReplica != -1) {
|
|
638
|
+
|
|
639
|
+
rd_kafka_fetch_preferred_replica_handle(
|
|
640
|
+
rktp, rkbuf, rkb, hdr.PreferredReadReplica);
|
|
641
|
+
|
|
642
|
+
if (unlikely(hdr.MessageSetSize != 0)) {
|
|
643
|
+
rd_rkb_log(rkb, LOG_WARNING, "FETCH",
|
|
644
|
+
"%.*s [%" PRId32
|
|
645
|
+
"]: Fetch response has both preferred read "
|
|
646
|
+
"replica and non-zero message set size: "
|
|
647
|
+
"%" PRId32 ": skipping messages",
|
|
648
|
+
RD_KAFKAP_STR_PR(rktp->rktp_rkt->rkt_topic),
|
|
649
|
+
rktp->rktp_partition, hdr.MessageSetSize);
|
|
650
|
+
rd_kafka_buf_skip(rkbuf, hdr.MessageSetSize);
|
|
651
|
+
}
|
|
652
|
+
goto done;
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
rd_kafka_toppar_lock(rktp);
|
|
656
|
+
|
|
657
|
+
/* Make sure toppar hasn't moved to another broker
|
|
658
|
+
* during the lifetime of the request. */
|
|
659
|
+
if (unlikely(rktp->rktp_broker != rkb)) {
|
|
660
|
+
rd_kafka_toppar_unlock(rktp);
|
|
661
|
+
rd_rkb_dbg(rkb, MSG, "FETCH",
|
|
662
|
+
"%.*s [%" PRId32
|
|
663
|
+
"]: partition broker has changed: "
|
|
664
|
+
"discarding fetch response",
|
|
665
|
+
RD_KAFKAP_STR_PR(topic), hdr.Partition);
|
|
666
|
+
rd_kafka_buf_skip(rkbuf, hdr.MessageSetSize);
|
|
667
|
+
goto done;
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
fetch_version = rktp->rktp_fetch_version;
|
|
671
|
+
rd_kafka_toppar_unlock(rktp);
|
|
672
|
+
|
|
673
|
+
/* Check if this Fetch is for an outdated fetch version,
|
|
674
|
+
* or the original rktp was removed and a new one
|
|
675
|
+
* created (due to partition count decreasing and
|
|
676
|
+
* then increasing again, which can happen in
|
|
677
|
+
* desynchronized clusters): if so ignore it. */
|
|
678
|
+
tver_skel.rktp = rktp;
|
|
679
|
+
tver = rd_list_find(request->rkbuf_rktp_vers, &tver_skel,
|
|
680
|
+
rd_kafka_toppar_ver_cmp);
|
|
681
|
+
rd_kafka_assert(NULL, tver);
|
|
682
|
+
if (tver->rktp != rktp || tver->version < fetch_version) {
|
|
683
|
+
rd_rkb_dbg(rkb, MSG, "DROP",
|
|
684
|
+
"%s [%" PRId32
|
|
685
|
+
"]: dropping outdated fetch response "
|
|
686
|
+
"(v%d < %d or old rktp)",
|
|
687
|
+
rktp->rktp_rkt->rkt_topic->str, rktp->rktp_partition,
|
|
688
|
+
tver->version, fetch_version);
|
|
689
|
+
rd_atomic64_add(&rktp->rktp_c.rx_ver_drops, 1);
|
|
690
|
+
rd_kafka_buf_skip(rkbuf, hdr.MessageSetSize);
|
|
691
|
+
goto done;
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
rd_rkb_dbg(rkb, MSG, "FETCH",
|
|
695
|
+
"Topic %.*s [%" PRId32 "] MessageSet size %" PRId32
|
|
696
|
+
", error \"%s\", MaxOffset %" PRId64 ", LSO %" PRId64
|
|
697
|
+
", Ver %" PRId32 "/%" PRId32,
|
|
698
|
+
RD_KAFKAP_STR_PR(topic), hdr.Partition, hdr.MessageSetSize,
|
|
699
|
+
rd_kafka_err2str(hdr.ErrorCode), hdr.HighwaterMarkOffset,
|
|
700
|
+
hdr.LastStableOffset, tver->version, fetch_version);
|
|
701
|
+
|
|
702
|
+
/* If this is the last message of the queue,
|
|
703
|
+
* signal EOF back to the application. */
|
|
704
|
+
if (end_offset == rktp->rktp_offsets.fetch_pos.offset &&
|
|
705
|
+
rktp->rktp_offsets.eof_offset != end_offset) {
|
|
706
|
+
hdr.ErrorCode = RD_KAFKA_RESP_ERR__PARTITION_EOF;
|
|
707
|
+
rktp->rktp_offsets.eof_offset = end_offset;
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
if (unlikely(hdr.ErrorCode != RD_KAFKA_RESP_ERR_NO_ERROR)) {
|
|
711
|
+
/* Handle partition-level errors. */
|
|
712
|
+
rd_kafka_fetch_reply_handle_partition_error(
|
|
713
|
+
rkb, rktp, tver, hdr.ErrorCode, hdr.HighwaterMarkOffset);
|
|
714
|
+
|
|
715
|
+
rd_kafka_buf_skip(rkbuf, hdr.MessageSetSize);
|
|
716
|
+
goto done;
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
/* No error, clear any previous fetch error. */
|
|
720
|
+
rktp->rktp_last_error = RD_KAFKA_RESP_ERR_NO_ERROR;
|
|
721
|
+
|
|
722
|
+
if (unlikely(hdr.MessageSetSize <= 0))
|
|
723
|
+
goto done;
|
|
724
|
+
|
|
725
|
+
/**
|
|
726
|
+
* Parse MessageSet
|
|
727
|
+
*/
|
|
728
|
+
if (!rd_slice_narrow_relative(&rkbuf->rkbuf_reader, &save_slice,
|
|
729
|
+
(size_t)hdr.MessageSetSize))
|
|
730
|
+
rd_kafka_buf_check_len(rkbuf, hdr.MessageSetSize);
|
|
731
|
+
|
|
732
|
+
/* Parse messages */
|
|
733
|
+
err = rd_kafka_msgset_parse(rkbuf, request, rktp, aborted_txns, tver);
|
|
734
|
+
|
|
735
|
+
|
|
736
|
+
rd_slice_widen(&rkbuf->rkbuf_reader, &save_slice);
|
|
737
|
+
/* Continue with next partition regardless of
|
|
738
|
+
* parse errors (which are partition-specific) */
|
|
739
|
+
|
|
740
|
+
/* On error: back off the fetcher for this partition */
|
|
741
|
+
if (unlikely(err))
|
|
742
|
+
rd_kafka_toppar_fetch_backoff(rkb, rktp, err);
|
|
743
|
+
|
|
744
|
+
goto done;
|
|
745
|
+
|
|
746
|
+
err_parse:
|
|
747
|
+
if (aborted_txns)
|
|
748
|
+
rd_kafka_aborted_txns_destroy(aborted_txns);
|
|
749
|
+
if (rktp)
|
|
750
|
+
rd_kafka_toppar_destroy(rktp); /*from get()*/
|
|
751
|
+
return rkbuf->rkbuf_err;
|
|
752
|
+
|
|
753
|
+
done:
|
|
754
|
+
if (aborted_txns)
|
|
755
|
+
rd_kafka_aborted_txns_destroy(aborted_txns);
|
|
756
|
+
if (likely(rktp != NULL))
|
|
757
|
+
rd_kafka_toppar_destroy(rktp); /*from get()*/
|
|
758
|
+
|
|
759
|
+
if (PartitionTags) {
|
|
760
|
+
/* Set default LeaderId and LeaderEpoch */
|
|
761
|
+
PartitionTags->CurrentLeader.LeaderId = -1;
|
|
762
|
+
PartitionTags->CurrentLeader.LeaderEpoch = -1;
|
|
763
|
+
}
|
|
764
|
+
rd_kafka_buf_read_tags(rkbuf,
|
|
765
|
+
rd_kafkap_Fetch_reply_tags_partition_parse,
|
|
766
|
+
TopicTags, PartitionTags);
|
|
767
|
+
|
|
768
|
+
return RD_KAFKA_RESP_ERR_NO_ERROR;
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
/**
|
|
772
|
+
* Parses and handles a Fetch reply.
|
|
773
|
+
* Returns 0 on success or an error code on failure.
|
|
774
|
+
*/
|
|
775
|
+
static rd_kafka_resp_err_t
|
|
776
|
+
rd_kafka_fetch_reply_handle(rd_kafka_broker_t *rkb,
|
|
777
|
+
rd_kafka_buf_t *rkbuf,
|
|
778
|
+
rd_kafka_buf_t *request) {
|
|
779
|
+
int32_t TopicArrayCnt;
|
|
780
|
+
int i;
|
|
781
|
+
const int log_decode_errors = LOG_ERR;
|
|
782
|
+
rd_kafka_topic_t *rkt = NULL;
|
|
783
|
+
int16_t ErrorCode = RD_KAFKA_RESP_ERR_NO_ERROR;
|
|
784
|
+
rd_kafkap_Fetch_reply_tags_t FetchTags = RD_ZERO_INIT;
|
|
785
|
+
rd_bool_t has_fetch_tags = rd_false;
|
|
786
|
+
|
|
787
|
+
if (rd_kafka_buf_ApiVersion(request) >= 1) {
|
|
788
|
+
int32_t Throttle_Time;
|
|
789
|
+
rd_kafka_buf_read_i32(rkbuf, &Throttle_Time);
|
|
790
|
+
|
|
791
|
+
rd_kafka_op_throttle_time(rkb, rkb->rkb_rk->rk_rep,
|
|
792
|
+
Throttle_Time);
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
if (rd_kafka_buf_ApiVersion(request) >= 7) {
|
|
796
|
+
int32_t SessionId;
|
|
797
|
+
rd_kafka_buf_read_i16(rkbuf, &ErrorCode);
|
|
798
|
+
rd_kafka_buf_read_i32(rkbuf, &SessionId);
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
rd_kafka_buf_read_arraycnt(rkbuf, &TopicArrayCnt, RD_KAFKAP_TOPICS_MAX);
|
|
802
|
+
/* Verify that TopicArrayCnt seems to be in line with remaining size */
|
|
803
|
+
rd_kafka_buf_check_len(rkbuf,
|
|
804
|
+
TopicArrayCnt * (3 /*topic min size*/ +
|
|
805
|
+
4 /*PartitionArrayCnt*/ + 4 +
|
|
806
|
+
2 + 8 + 4 /*inner header*/));
|
|
807
|
+
|
|
808
|
+
if (rd_kafka_buf_ApiVersion(request) >= 12) {
|
|
809
|
+
has_fetch_tags = rd_true;
|
|
810
|
+
rd_kafkap_Fetch_reply_tags_set_topic_cnt(&FetchTags,
|
|
811
|
+
TopicArrayCnt);
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
for (i = 0; i < TopicArrayCnt; i++) {
|
|
815
|
+
rd_kafkap_str_t topic = RD_ZERO_INIT;
|
|
816
|
+
rd_kafka_Uuid_t topic_id = RD_KAFKA_UUID_ZERO;
|
|
817
|
+
int32_t PartitionArrayCnt;
|
|
818
|
+
int j;
|
|
819
|
+
|
|
820
|
+
if (rd_kafka_buf_ApiVersion(request) > 12) {
|
|
821
|
+
rd_kafka_buf_read_uuid(rkbuf, &topic_id);
|
|
822
|
+
rkt = rd_kafka_topic_find_by_topic_id(rkb->rkb_rk,
|
|
823
|
+
topic_id);
|
|
824
|
+
if (rkt)
|
|
825
|
+
topic = *rkt->rkt_topic;
|
|
826
|
+
} else {
|
|
827
|
+
rd_kafka_buf_read_str(rkbuf, &topic);
|
|
828
|
+
rkt = rd_kafka_topic_find0(rkb->rkb_rk, &topic);
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
rd_kafka_buf_read_arraycnt(rkbuf, &PartitionArrayCnt,
|
|
832
|
+
RD_KAFKAP_PARTITIONS_MAX);
|
|
833
|
+
if (rd_kafka_buf_ApiVersion(request) >= 12) {
|
|
834
|
+
rd_kafkap_Fetch_reply_tags_set_topic(
|
|
835
|
+
&FetchTags, i, topic_id, PartitionArrayCnt);
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
for (j = 0; j < PartitionArrayCnt; j++) {
|
|
839
|
+
if (rd_kafka_fetch_reply_handle_partition(
|
|
840
|
+
rkb, &topic, rkt, rkbuf, request, ErrorCode,
|
|
841
|
+
has_fetch_tags ? &FetchTags.Topics[i] : NULL,
|
|
842
|
+
has_fetch_tags
|
|
843
|
+
? &FetchTags.Topics[i].Partitions[j]
|
|
844
|
+
: NULL))
|
|
845
|
+
goto err_parse;
|
|
846
|
+
}
|
|
847
|
+
if (has_fetch_tags &&
|
|
848
|
+
FetchTags.Topics[i].partitions_with_leader_change_cnt) {
|
|
849
|
+
FetchTags.topics_with_leader_change_cnt++;
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
if (rkt) {
|
|
853
|
+
rd_kafka_topic_destroy0(rkt);
|
|
854
|
+
rkt = NULL;
|
|
855
|
+
}
|
|
856
|
+
/* Topic Tags */
|
|
857
|
+
rd_kafka_buf_skip_tags(rkbuf);
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
/* Top level tags */
|
|
861
|
+
rd_kafka_buf_read_tags(rkbuf, rd_kafkap_Fetch_reply_tags_parse,
|
|
862
|
+
&FetchTags);
|
|
863
|
+
|
|
864
|
+
if (rd_kafka_buf_read_remain(rkbuf) != 0) {
|
|
865
|
+
rd_kafka_buf_parse_fail(rkbuf,
|
|
866
|
+
"Remaining data after message set "
|
|
867
|
+
"parse: %" PRIusz " bytes",
|
|
868
|
+
rd_kafka_buf_read_remain(rkbuf));
|
|
869
|
+
RD_NOTREACHED();
|
|
870
|
+
}
|
|
871
|
+
rd_kafka_handle_Fetch_metadata_update(rkb, &FetchTags);
|
|
872
|
+
rd_kafkap_Fetch_reply_tags_destroy(&FetchTags);
|
|
873
|
+
|
|
874
|
+
return 0;
|
|
875
|
+
|
|
876
|
+
err_parse:
|
|
877
|
+
if (rkt)
|
|
878
|
+
rd_kafka_topic_destroy0(rkt);
|
|
879
|
+
rd_kafkap_Fetch_reply_tags_destroy(&FetchTags);
|
|
880
|
+
rd_rkb_dbg(rkb, MSG, "BADMSG",
|
|
881
|
+
"Bad message (Fetch v%d): "
|
|
882
|
+
"is broker.version.fallback incorrectly set?",
|
|
883
|
+
(int)request->rkbuf_reqhdr.ApiVersion);
|
|
884
|
+
return rkbuf->rkbuf_err;
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
|
|
888
|
+
|
|
889
|
+
/**
|
|
890
|
+
* @broker FetchResponse handling.
|
|
891
|
+
*
|
|
892
|
+
* @locality broker thread (or any thread if err == __DESTROY).
|
|
893
|
+
*/
|
|
894
|
+
static void rd_kafka_broker_fetch_reply(rd_kafka_t *rk,
|
|
895
|
+
rd_kafka_broker_t *rkb,
|
|
896
|
+
rd_kafka_resp_err_t err,
|
|
897
|
+
rd_kafka_buf_t *reply,
|
|
898
|
+
rd_kafka_buf_t *request,
|
|
899
|
+
void *opaque) {
|
|
900
|
+
|
|
901
|
+
if (err == RD_KAFKA_RESP_ERR__DESTROY)
|
|
902
|
+
return; /* Terminating */
|
|
903
|
+
|
|
904
|
+
rd_kafka_assert(rkb->rkb_rk, rkb->rkb_fetching > 0);
|
|
905
|
+
rkb->rkb_fetching = 0;
|
|
906
|
+
|
|
907
|
+
/* Parse and handle the messages (unless the request errored) */
|
|
908
|
+
if (!err && reply)
|
|
909
|
+
err = rd_kafka_fetch_reply_handle(rkb, reply, request);
|
|
910
|
+
|
|
911
|
+
if (unlikely(err)) {
|
|
912
|
+
char tmp[128];
|
|
913
|
+
|
|
914
|
+
rd_rkb_dbg(rkb, MSG, "FETCH", "Fetch reply: %s",
|
|
915
|
+
rd_kafka_err2str(err));
|
|
916
|
+
switch (err) {
|
|
917
|
+
case RD_KAFKA_RESP_ERR_UNKNOWN_TOPIC_OR_PART:
|
|
918
|
+
case RD_KAFKA_RESP_ERR_LEADER_NOT_AVAILABLE:
|
|
919
|
+
case RD_KAFKA_RESP_ERR_NOT_LEADER_FOR_PARTITION:
|
|
920
|
+
case RD_KAFKA_RESP_ERR_BROKER_NOT_AVAILABLE:
|
|
921
|
+
case RD_KAFKA_RESP_ERR_REPLICA_NOT_AVAILABLE:
|
|
922
|
+
case RD_KAFKA_RESP_ERR_UNKNOWN_TOPIC_ID:
|
|
923
|
+
/* Request metadata information update */
|
|
924
|
+
rd_snprintf(tmp, sizeof(tmp), "FetchRequest failed: %s",
|
|
925
|
+
rd_kafka_err2str(err));
|
|
926
|
+
rd_kafka_metadata_refresh_known_topics(
|
|
927
|
+
rkb->rkb_rk, NULL, rd_true /*force*/, tmp);
|
|
928
|
+
/* FALLTHRU */
|
|
929
|
+
|
|
930
|
+
case RD_KAFKA_RESP_ERR__TRANSPORT:
|
|
931
|
+
case RD_KAFKA_RESP_ERR_REQUEST_TIMED_OUT:
|
|
932
|
+
case RD_KAFKA_RESP_ERR__MSG_TIMED_OUT:
|
|
933
|
+
/* The fetch is already intervalled from
|
|
934
|
+
* consumer_serve() so dont retry. */
|
|
935
|
+
break;
|
|
936
|
+
|
|
937
|
+
default:
|
|
938
|
+
break;
|
|
939
|
+
}
|
|
940
|
+
|
|
941
|
+
rd_kafka_broker_fetch_backoff(rkb, err);
|
|
942
|
+
/* FALLTHRU */
|
|
943
|
+
}
|
|
944
|
+
}
|
|
945
|
+
|
|
946
|
+
/**
|
|
947
|
+
* @brief Check if any toppars have a zero topic id.
|
|
948
|
+
*
|
|
949
|
+
*/
|
|
950
|
+
static rd_bool_t can_use_topic_ids(rd_kafka_broker_t *rkb) {
|
|
951
|
+
rd_kafka_toppar_t *rktp = rkb->rkb_active_toppar_next;
|
|
952
|
+
do {
|
|
953
|
+
if (RD_KAFKA_UUID_IS_ZERO(rktp->rktp_rkt->rkt_topic_id))
|
|
954
|
+
return rd_false;
|
|
955
|
+
} while ((rktp = CIRCLEQ_LOOP_NEXT(&rkb->rkb_active_toppars, rktp,
|
|
956
|
+
rktp_activelink)) !=
|
|
957
|
+
rkb->rkb_active_toppar_next);
|
|
958
|
+
|
|
959
|
+
return rd_true;
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
/**
|
|
963
|
+
* @brief Build and send a Fetch request message for all underflowed toppars
|
|
964
|
+
* for a specific broker.
|
|
965
|
+
*
|
|
966
|
+
* @returns the number of partitions included in the FetchRequest, if any.
|
|
967
|
+
*
|
|
968
|
+
* @locality broker thread
|
|
969
|
+
*/
|
|
970
|
+
int rd_kafka_broker_fetch_toppars(rd_kafka_broker_t *rkb, rd_ts_t now) {
|
|
971
|
+
rd_kafka_toppar_t *rktp;
|
|
972
|
+
rd_kafka_buf_t *rkbuf;
|
|
973
|
+
int cnt = 0;
|
|
974
|
+
size_t of_TopicArrayCnt = 0;
|
|
975
|
+
int TopicArrayCnt = 0;
|
|
976
|
+
size_t of_PartitionArrayCnt = 0;
|
|
977
|
+
int PartitionArrayCnt = 0;
|
|
978
|
+
rd_kafka_topic_t *rkt_last = NULL;
|
|
979
|
+
int16_t ApiVersion = 0;
|
|
980
|
+
|
|
981
|
+
/* Create buffer and segments:
|
|
982
|
+
* 1 x ReplicaId MaxWaitTime MinBytes TopicArrayCnt
|
|
983
|
+
* N x topic name
|
|
984
|
+
* N x PartitionArrayCnt Partition FetchOffset MaxBytes
|
|
985
|
+
* where N = number of toppars.
|
|
986
|
+
* Since we dont keep track of the number of topics served by
|
|
987
|
+
* this broker, only the partition count, we do a worst-case calc
|
|
988
|
+
* when allocating and assume each partition is on its own topic
|
|
989
|
+
*/
|
|
990
|
+
|
|
991
|
+
if (unlikely(rkb->rkb_active_toppar_cnt == 0))
|
|
992
|
+
return 0;
|
|
993
|
+
|
|
994
|
+
ApiVersion = rd_kafka_broker_ApiVersion_supported(rkb, RD_KAFKAP_Fetch,
|
|
995
|
+
0, 16, NULL);
|
|
996
|
+
|
|
997
|
+
/* Fallback to version 12 if topic id is null which can happen if
|
|
998
|
+
* inter.broker.protocol.version is < 2.8 */
|
|
999
|
+
if (ApiVersion > 12 && !can_use_topic_ids(rkb))
|
|
1000
|
+
ApiVersion = 12;
|
|
1001
|
+
|
|
1002
|
+
rkbuf = rd_kafka_buf_new_flexver_request(
|
|
1003
|
+
rkb, RD_KAFKAP_Fetch, 1,
|
|
1004
|
+
/* MaxWaitTime+MinBytes+MaxBytes+IsolationLevel+
|
|
1005
|
+
* SessionId+Epoch+TopicCnt */
|
|
1006
|
+
4 + 4 + 4 + 1 + 4 + 4 + 4 +
|
|
1007
|
+
/* N x PartCnt+Partition+CurrentLeaderEpoch+FetchOffset+
|
|
1008
|
+
* LastFetchedEpoch+LogStartOffset+MaxBytes+?TopicNameLen?*/
|
|
1009
|
+
(rkb->rkb_active_toppar_cnt *
|
|
1010
|
+
(4 + 4 + 4 + 8 + 4 + 8 + 4 + 40)) +
|
|
1011
|
+
/* ForgottenTopicsCnt */
|
|
1012
|
+
4 +
|
|
1013
|
+
/* N x ForgottenTopicsData */
|
|
1014
|
+
0,
|
|
1015
|
+
ApiVersion >= 12);
|
|
1016
|
+
|
|
1017
|
+
if (rkb->rkb_features & RD_KAFKA_FEATURE_MSGVER2)
|
|
1018
|
+
rd_kafka_buf_ApiVersion_set(rkbuf, ApiVersion,
|
|
1019
|
+
RD_KAFKA_FEATURE_MSGVER2);
|
|
1020
|
+
else if (rkb->rkb_features & RD_KAFKA_FEATURE_MSGVER1)
|
|
1021
|
+
rd_kafka_buf_ApiVersion_set(rkbuf, ApiVersion,
|
|
1022
|
+
RD_KAFKA_FEATURE_MSGVER1);
|
|
1023
|
+
else if (rkb->rkb_features & RD_KAFKA_FEATURE_THROTTLETIME)
|
|
1024
|
+
rd_kafka_buf_ApiVersion_set(rkbuf, ApiVersion,
|
|
1025
|
+
RD_KAFKA_FEATURE_THROTTLETIME);
|
|
1026
|
+
|
|
1027
|
+
|
|
1028
|
+
/* FetchRequest header */
|
|
1029
|
+
if (rd_kafka_buf_ApiVersion(rkbuf) <= 14)
|
|
1030
|
+
/* ReplicaId */
|
|
1031
|
+
rd_kafka_buf_write_i32(rkbuf, -1);
|
|
1032
|
+
|
|
1033
|
+
/* MaxWaitTime */
|
|
1034
|
+
rd_kafka_buf_write_i32(rkbuf, rkb->rkb_rk->rk_conf.fetch_wait_max_ms);
|
|
1035
|
+
/* MinBytes */
|
|
1036
|
+
rd_kafka_buf_write_i32(rkbuf, rkb->rkb_rk->rk_conf.fetch_min_bytes);
|
|
1037
|
+
|
|
1038
|
+
if (rd_kafka_buf_ApiVersion(rkbuf) >= 3)
|
|
1039
|
+
/* MaxBytes */
|
|
1040
|
+
rd_kafka_buf_write_i32(rkbuf,
|
|
1041
|
+
rkb->rkb_rk->rk_conf.fetch_max_bytes);
|
|
1042
|
+
|
|
1043
|
+
if (rd_kafka_buf_ApiVersion(rkbuf) >= 4)
|
|
1044
|
+
/* IsolationLevel */
|
|
1045
|
+
rd_kafka_buf_write_i8(rkbuf,
|
|
1046
|
+
rkb->rkb_rk->rk_conf.isolation_level);
|
|
1047
|
+
|
|
1048
|
+
if (rd_kafka_buf_ApiVersion(rkbuf) >= 7) {
|
|
1049
|
+
/* SessionId */
|
|
1050
|
+
rd_kafka_buf_write_i32(rkbuf, 0);
|
|
1051
|
+
/* Epoch */
|
|
1052
|
+
rd_kafka_buf_write_i32(rkbuf, -1);
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
/* Write zero TopicArrayCnt but store pointer for later update */
|
|
1056
|
+
of_TopicArrayCnt = rd_kafka_buf_write_arraycnt_pos(rkbuf);
|
|
1057
|
+
|
|
1058
|
+
/* Prepare map for storing the fetch version for each partition,
|
|
1059
|
+
* this will later be checked in Fetch response to purge outdated
|
|
1060
|
+
* responses (e.g., after a seek). */
|
|
1061
|
+
rkbuf->rkbuf_rktp_vers =
|
|
1062
|
+
rd_list_new(0, (void *)rd_kafka_toppar_ver_destroy);
|
|
1063
|
+
rd_list_prealloc_elems(rkbuf->rkbuf_rktp_vers,
|
|
1064
|
+
sizeof(struct rd_kafka_toppar_ver),
|
|
1065
|
+
rkb->rkb_active_toppar_cnt, 0);
|
|
1066
|
+
|
|
1067
|
+
/* Round-robin start of the list. */
|
|
1068
|
+
rktp = rkb->rkb_active_toppar_next;
|
|
1069
|
+
do {
|
|
1070
|
+
struct rd_kafka_toppar_ver *tver;
|
|
1071
|
+
|
|
1072
|
+
if (rkt_last != rktp->rktp_rkt) {
|
|
1073
|
+
if (rkt_last != NULL) {
|
|
1074
|
+
/* Update PartitionArrayCnt */
|
|
1075
|
+
rd_kafka_buf_finalize_arraycnt(
|
|
1076
|
+
rkbuf, of_PartitionArrayCnt,
|
|
1077
|
+
PartitionArrayCnt);
|
|
1078
|
+
/* Topic tags */
|
|
1079
|
+
rd_kafka_buf_write_tags_empty(rkbuf);
|
|
1080
|
+
}
|
|
1081
|
+
if (rd_kafka_buf_ApiVersion(rkbuf) > 12) {
|
|
1082
|
+
/* Topic id must be non-zero here */
|
|
1083
|
+
rd_dassert(!RD_KAFKA_UUID_IS_ZERO(
|
|
1084
|
+
rktp->rktp_rkt->rkt_topic_id));
|
|
1085
|
+
/* Topic ID */
|
|
1086
|
+
rd_kafka_buf_write_uuid(
|
|
1087
|
+
rkbuf, &rktp->rktp_rkt->rkt_topic_id);
|
|
1088
|
+
} else {
|
|
1089
|
+
/* Topic name */
|
|
1090
|
+
rd_kafka_buf_write_kstr(
|
|
1091
|
+
rkbuf, rktp->rktp_rkt->rkt_topic);
|
|
1092
|
+
}
|
|
1093
|
+
|
|
1094
|
+
TopicArrayCnt++;
|
|
1095
|
+
rkt_last = rktp->rktp_rkt;
|
|
1096
|
+
/* Partition count */
|
|
1097
|
+
of_PartitionArrayCnt =
|
|
1098
|
+
rd_kafka_buf_write_arraycnt_pos(rkbuf);
|
|
1099
|
+
PartitionArrayCnt = 0;
|
|
1100
|
+
}
|
|
1101
|
+
|
|
1102
|
+
PartitionArrayCnt++;
|
|
1103
|
+
|
|
1104
|
+
/* Partition */
|
|
1105
|
+
rd_kafka_buf_write_i32(rkbuf, rktp->rktp_partition);
|
|
1106
|
+
|
|
1107
|
+
if (rd_kafka_buf_ApiVersion(rkbuf) >= 9) {
|
|
1108
|
+
/* CurrentLeaderEpoch */
|
|
1109
|
+
if (rktp->rktp_leader_epoch < 0 &&
|
|
1110
|
+
rd_kafka_has_reliable_leader_epochs(rkb)) {
|
|
1111
|
+
/* If current leader epoch is set to -1 and
|
|
1112
|
+
* the broker has reliable leader epochs,
|
|
1113
|
+
* send 0 instead, so that epoch is checked
|
|
1114
|
+
* and optionally metadata is refreshed.
|
|
1115
|
+
* This can happen if metadata is read initially
|
|
1116
|
+
* without an existing topic (see
|
|
1117
|
+
* rd_kafka_topic_metadata_update2).
|
|
1118
|
+
*/
|
|
1119
|
+
rd_kafka_buf_write_i32(rkbuf, 0);
|
|
1120
|
+
} else {
|
|
1121
|
+
rd_kafka_buf_write_i32(rkbuf,
|
|
1122
|
+
rktp->rktp_leader_epoch);
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1125
|
+
/* FetchOffset */
|
|
1126
|
+
rd_kafka_buf_write_i64(rkbuf,
|
|
1127
|
+
rktp->rktp_offsets.fetch_pos.offset);
|
|
1128
|
+
if (rd_kafka_buf_ApiVersion(rkbuf) >= 12)
|
|
1129
|
+
/* LastFetchedEpoch - only used by follower replica */
|
|
1130
|
+
rd_kafka_buf_write_i32(rkbuf, -1);
|
|
1131
|
+
if (rd_kafka_buf_ApiVersion(rkbuf) >= 5)
|
|
1132
|
+
/* LogStartOffset - only used by follower replica */
|
|
1133
|
+
rd_kafka_buf_write_i64(rkbuf, -1);
|
|
1134
|
+
|
|
1135
|
+
/* MaxBytes */
|
|
1136
|
+
rd_kafka_buf_write_i32(rkbuf, rktp->rktp_fetch_msg_max_bytes);
|
|
1137
|
+
|
|
1138
|
+
/* Partition tags */
|
|
1139
|
+
rd_kafka_buf_write_tags_empty(rkbuf);
|
|
1140
|
+
|
|
1141
|
+
rd_rkb_dbg(rkb, FETCH, "FETCH",
|
|
1142
|
+
"Fetch topic %.*s [%" PRId32 "] at offset %" PRId64
|
|
1143
|
+
" (leader epoch %" PRId32
|
|
1144
|
+
", current leader epoch %" PRId32 ", v%d)",
|
|
1145
|
+
RD_KAFKAP_STR_PR(rktp->rktp_rkt->rkt_topic),
|
|
1146
|
+
rktp->rktp_partition,
|
|
1147
|
+
rktp->rktp_offsets.fetch_pos.offset,
|
|
1148
|
+
rktp->rktp_offsets.fetch_pos.leader_epoch,
|
|
1149
|
+
rktp->rktp_leader_epoch, rktp->rktp_fetch_version);
|
|
1150
|
+
|
|
1151
|
+
/* We must have a valid fetch offset when we get here */
|
|
1152
|
+
rd_dassert(rktp->rktp_offsets.fetch_pos.offset >= 0);
|
|
1153
|
+
|
|
1154
|
+
/* Add toppar + op version mapping. */
|
|
1155
|
+
tver = rd_list_add(rkbuf->rkbuf_rktp_vers, NULL);
|
|
1156
|
+
tver->rktp = rd_kafka_toppar_keep(rktp);
|
|
1157
|
+
tver->version = rktp->rktp_fetch_version;
|
|
1158
|
+
|
|
1159
|
+
cnt++;
|
|
1160
|
+
} while ((rktp = CIRCLEQ_LOOP_NEXT(&rkb->rkb_active_toppars, rktp,
|
|
1161
|
+
rktp_activelink)) !=
|
|
1162
|
+
rkb->rkb_active_toppar_next);
|
|
1163
|
+
|
|
1164
|
+
/* Update next toppar to fetch in round-robin list. */
|
|
1165
|
+
rd_kafka_broker_active_toppar_next(
|
|
1166
|
+
rkb, rktp ? CIRCLEQ_LOOP_NEXT(&rkb->rkb_active_toppars, rktp,
|
|
1167
|
+
rktp_activelink)
|
|
1168
|
+
: NULL);
|
|
1169
|
+
|
|
1170
|
+
rd_rkb_dbg(rkb, FETCH, "FETCH", "Fetch %i/%i/%i toppar(s)", cnt,
|
|
1171
|
+
rkb->rkb_active_toppar_cnt, rkb->rkb_toppar_cnt);
|
|
1172
|
+
if (!cnt) {
|
|
1173
|
+
rd_kafka_buf_destroy(rkbuf);
|
|
1174
|
+
return cnt;
|
|
1175
|
+
}
|
|
1176
|
+
|
|
1177
|
+
if (rkt_last != NULL) {
|
|
1178
|
+
/* Update last topic's PartitionArrayCnt */
|
|
1179
|
+
rd_kafka_buf_finalize_arraycnt(rkbuf, of_PartitionArrayCnt,
|
|
1180
|
+
PartitionArrayCnt);
|
|
1181
|
+
/* Topic tags */
|
|
1182
|
+
rd_kafka_buf_write_tags_empty(rkbuf);
|
|
1183
|
+
}
|
|
1184
|
+
|
|
1185
|
+
/* Update TopicArrayCnt */
|
|
1186
|
+
rd_kafka_buf_finalize_arraycnt(rkbuf, of_TopicArrayCnt, TopicArrayCnt);
|
|
1187
|
+
|
|
1188
|
+
|
|
1189
|
+
if (rd_kafka_buf_ApiVersion(rkbuf) >= 7)
|
|
1190
|
+
/* Length of the ForgottenTopics list (KIP-227). Broker
|
|
1191
|
+
* use only - not used by the consumer. */
|
|
1192
|
+
rd_kafka_buf_write_arraycnt(rkbuf, 0);
|
|
1193
|
+
|
|
1194
|
+
if (rd_kafka_buf_ApiVersion(rkbuf) >= 11)
|
|
1195
|
+
/* RackId */
|
|
1196
|
+
rd_kafka_buf_write_kstr(rkbuf,
|
|
1197
|
+
rkb->rkb_rk->rk_conf.client_rack);
|
|
1198
|
+
|
|
1199
|
+
/* Consider Fetch requests blocking if fetch.wait.max.ms >= 1s */
|
|
1200
|
+
if (rkb->rkb_rk->rk_conf.fetch_wait_max_ms >= 1000)
|
|
1201
|
+
rkbuf->rkbuf_flags |= RD_KAFKA_OP_F_BLOCKING;
|
|
1202
|
+
|
|
1203
|
+
/* Use configured timeout */
|
|
1204
|
+
rd_kafka_buf_set_timeout(rkbuf,
|
|
1205
|
+
rkb->rkb_rk->rk_conf.socket_timeout_ms +
|
|
1206
|
+
rkb->rkb_rk->rk_conf.fetch_wait_max_ms,
|
|
1207
|
+
now);
|
|
1208
|
+
|
|
1209
|
+
/* Sort toppar versions for quicker lookups in Fetch response. */
|
|
1210
|
+
rd_list_sort(rkbuf->rkbuf_rktp_vers, rd_kafka_toppar_ver_cmp);
|
|
1211
|
+
|
|
1212
|
+
rkb->rkb_fetching = 1;
|
|
1213
|
+
rd_kafka_broker_buf_enq1(rkb, rkbuf, rd_kafka_broker_fetch_reply, NULL);
|
|
1214
|
+
|
|
1215
|
+
return cnt;
|
|
1216
|
+
}
|
|
1217
|
+
|
|
1218
|
+
/**
|
|
1219
|
+
* @brief Decide whether it should start fetching from next fetch start
|
|
1220
|
+
* or continue with current fetch pos.
|
|
1221
|
+
*
|
|
1222
|
+
* @param rktp the toppar
|
|
1223
|
+
*
|
|
1224
|
+
* @returns rd_true if it should start fetching from next fetch start,
|
|
1225
|
+
* rd_false otherwise.
|
|
1226
|
+
*
|
|
1227
|
+
* @locality any
|
|
1228
|
+
* @locks toppar_lock() MUST be held
|
|
1229
|
+
*/
|
|
1230
|
+
static rd_bool_t rd_kafka_toppar_fetch_decide_start_from_next_fetch_start(
|
|
1231
|
+
rd_kafka_toppar_t *rktp) {
|
|
1232
|
+
return rktp->rktp_op_version > rktp->rktp_fetch_version ||
|
|
1233
|
+
rd_kafka_fetch_pos_cmp(&rktp->rktp_next_fetch_start,
|
|
1234
|
+
&rktp->rktp_last_next_fetch_start) ||
|
|
1235
|
+
rktp->rktp_offsets.fetch_pos.offset == RD_KAFKA_OFFSET_INVALID;
|
|
1236
|
+
}
|
|
1237
|
+
|
|
1238
|
+
/**
|
|
1239
|
+
* @brief Return next fetch start position:
|
|
1240
|
+
* if it should start fetching from next fetch start
|
|
1241
|
+
* or continue with current fetch pos.
|
|
1242
|
+
*
|
|
1243
|
+
* @param rktp The toppar
|
|
1244
|
+
*
|
|
1245
|
+
* @returns Next fetch start position
|
|
1246
|
+
*
|
|
1247
|
+
* @locality any
|
|
1248
|
+
* @locks toppar_lock() MUST be held
|
|
1249
|
+
*/
|
|
1250
|
+
rd_kafka_fetch_pos_t
|
|
1251
|
+
rd_kafka_toppar_fetch_decide_next_fetch_start_pos(rd_kafka_toppar_t *rktp) {
|
|
1252
|
+
if (rd_kafka_toppar_fetch_decide_start_from_next_fetch_start(rktp))
|
|
1253
|
+
return rktp->rktp_next_fetch_start;
|
|
1254
|
+
else
|
|
1255
|
+
return rktp->rktp_offsets.fetch_pos;
|
|
1256
|
+
}
|
|
1257
|
+
|
|
1258
|
+
/**
|
|
1259
|
+
* @brief Decide whether this toppar should be on the fetch list or not.
|
|
1260
|
+
*
|
|
1261
|
+
* Also:
|
|
1262
|
+
* - update toppar's op version (for broker thread's copy)
|
|
1263
|
+
* - finalize statistics (move rktp_offsets to rktp_offsets_fin)
|
|
1264
|
+
*
|
|
1265
|
+
* @returns the partition's Fetch backoff timestamp, or 0 if no backoff.
|
|
1266
|
+
*
|
|
1267
|
+
* @locality broker thread
|
|
1268
|
+
* @locks none
|
|
1269
|
+
*/
|
|
1270
|
+
rd_ts_t rd_kafka_toppar_fetch_decide(rd_kafka_toppar_t *rktp,
|
|
1271
|
+
rd_kafka_broker_t *rkb,
|
|
1272
|
+
int force_remove) {
|
|
1273
|
+
int should_fetch = 1;
|
|
1274
|
+
const char *reason = "";
|
|
1275
|
+
int32_t version;
|
|
1276
|
+
rd_ts_t ts_backoff = 0;
|
|
1277
|
+
rd_bool_t lease_expired = rd_false;
|
|
1278
|
+
|
|
1279
|
+
rd_kafka_toppar_lock(rktp);
|
|
1280
|
+
|
|
1281
|
+
/* Check for preferred replica lease expiry */
|
|
1282
|
+
lease_expired = rktp->rktp_leader_id != rktp->rktp_broker_id &&
|
|
1283
|
+
rd_interval(&rktp->rktp_lease_intvl,
|
|
1284
|
+
5 * 60 * 1000 * 1000 /*5 minutes*/, 0) > 0;
|
|
1285
|
+
if (lease_expired) {
|
|
1286
|
+
/* delegate_to_leader() requires no locks to be held */
|
|
1287
|
+
rd_kafka_toppar_unlock(rktp);
|
|
1288
|
+
rd_kafka_toppar_delegate_to_leader(rktp);
|
|
1289
|
+
rd_kafka_toppar_lock(rktp);
|
|
1290
|
+
|
|
1291
|
+
reason = "preferred replica lease expired";
|
|
1292
|
+
should_fetch = 0;
|
|
1293
|
+
goto done;
|
|
1294
|
+
}
|
|
1295
|
+
|
|
1296
|
+
/* Forced removal from fetch list */
|
|
1297
|
+
if (unlikely(force_remove)) {
|
|
1298
|
+
reason = "forced removal";
|
|
1299
|
+
should_fetch = 0;
|
|
1300
|
+
goto done;
|
|
1301
|
+
}
|
|
1302
|
+
|
|
1303
|
+
if (unlikely((rktp->rktp_flags & RD_KAFKA_TOPPAR_F_REMOVE) != 0)) {
|
|
1304
|
+
reason = "partition removed";
|
|
1305
|
+
should_fetch = 0;
|
|
1306
|
+
goto done;
|
|
1307
|
+
}
|
|
1308
|
+
|
|
1309
|
+
/* Skip toppars not in active fetch state */
|
|
1310
|
+
if (rktp->rktp_fetch_state != RD_KAFKA_TOPPAR_FETCH_ACTIVE) {
|
|
1311
|
+
reason = "not in active fetch state";
|
|
1312
|
+
should_fetch = 0;
|
|
1313
|
+
goto done;
|
|
1314
|
+
}
|
|
1315
|
+
|
|
1316
|
+
/* Update broker thread's fetch op version */
|
|
1317
|
+
version = rktp->rktp_op_version;
|
|
1318
|
+
if (rd_kafka_toppar_fetch_decide_start_from_next_fetch_start(rktp)) {
|
|
1319
|
+
/* New version barrier, something was modified from the
|
|
1320
|
+
* control plane. Reset and start over.
|
|
1321
|
+
* Alternatively only the next_offset changed but not the
|
|
1322
|
+
* barrier, which is the case when automatically triggering
|
|
1323
|
+
* offset.reset (such as on PARTITION_EOF or
|
|
1324
|
+
* OFFSET_OUT_OF_RANGE). */
|
|
1325
|
+
|
|
1326
|
+
rd_kafka_dbg(
|
|
1327
|
+
rktp->rktp_rkt->rkt_rk, TOPIC, "FETCHDEC",
|
|
1328
|
+
"Topic %s [%" PRId32
|
|
1329
|
+
"]: fetch decide: "
|
|
1330
|
+
"updating to version %d (was %d) at %s "
|
|
1331
|
+
"(was %s)",
|
|
1332
|
+
rktp->rktp_rkt->rkt_topic->str, rktp->rktp_partition,
|
|
1333
|
+
version, rktp->rktp_fetch_version,
|
|
1334
|
+
rd_kafka_fetch_pos2str(rktp->rktp_next_fetch_start),
|
|
1335
|
+
rd_kafka_fetch_pos2str(rktp->rktp_offsets.fetch_pos));
|
|
1336
|
+
|
|
1337
|
+
rd_kafka_offset_stats_reset(&rktp->rktp_offsets);
|
|
1338
|
+
|
|
1339
|
+
/* New start offset */
|
|
1340
|
+
rktp->rktp_offsets.fetch_pos = rktp->rktp_next_fetch_start;
|
|
1341
|
+
rktp->rktp_last_next_fetch_start = rktp->rktp_next_fetch_start;
|
|
1342
|
+
|
|
1343
|
+
rktp->rktp_fetch_version = version;
|
|
1344
|
+
|
|
1345
|
+
/* Clear last error to propagate new fetch
|
|
1346
|
+
* errors if encountered. */
|
|
1347
|
+
rktp->rktp_last_error = RD_KAFKA_RESP_ERR_NO_ERROR;
|
|
1348
|
+
|
|
1349
|
+
rd_kafka_q_purge_toppar_version(rktp->rktp_fetchq, rktp,
|
|
1350
|
+
version);
|
|
1351
|
+
}
|
|
1352
|
+
|
|
1353
|
+
|
|
1354
|
+
if (RD_KAFKA_TOPPAR_IS_PAUSED(rktp)) {
|
|
1355
|
+
should_fetch = 0;
|
|
1356
|
+
reason = "paused";
|
|
1357
|
+
|
|
1358
|
+
} else if (RD_KAFKA_OFFSET_IS_LOGICAL(
|
|
1359
|
+
rktp->rktp_next_fetch_start.offset)) {
|
|
1360
|
+
should_fetch = 0;
|
|
1361
|
+
reason = "no concrete offset";
|
|
1362
|
+
} else if (rktp->rktp_ts_fetch_backoff > rd_clock()) {
|
|
1363
|
+
reason = "fetch backed off";
|
|
1364
|
+
ts_backoff = rktp->rktp_ts_fetch_backoff;
|
|
1365
|
+
should_fetch = 0;
|
|
1366
|
+
} else if (rd_kafka_q_len(rktp->rktp_fetchq) >=
|
|
1367
|
+
rkb->rkb_rk->rk_conf.queued_min_msgs) {
|
|
1368
|
+
/* Skip toppars who's local message queue is already above
|
|
1369
|
+
* the lower threshold. */
|
|
1370
|
+
reason = "queued.min.messages exceeded";
|
|
1371
|
+
ts_backoff = rd_kafka_toppar_fetch_backoff(
|
|
1372
|
+
rkb, rktp, RD_KAFKA_RESP_ERR__QUEUE_FULL);
|
|
1373
|
+
should_fetch = 0;
|
|
1374
|
+
|
|
1375
|
+
} else if ((int64_t)rd_kafka_q_size(rktp->rktp_fetchq) >=
|
|
1376
|
+
rkb->rkb_rk->rk_conf.queued_max_msg_bytes) {
|
|
1377
|
+
reason = "queued.max.messages.kbytes exceeded";
|
|
1378
|
+
ts_backoff = rd_kafka_toppar_fetch_backoff(
|
|
1379
|
+
rkb, rktp, RD_KAFKA_RESP_ERR__QUEUE_FULL);
|
|
1380
|
+
should_fetch = 0;
|
|
1381
|
+
}
|
|
1382
|
+
|
|
1383
|
+
done:
|
|
1384
|
+
/* Copy offset stats to finalized place holder. */
|
|
1385
|
+
rktp->rktp_offsets_fin = rktp->rktp_offsets;
|
|
1386
|
+
|
|
1387
|
+
if (rktp->rktp_fetch != should_fetch) {
|
|
1388
|
+
rd_rkb_dbg(
|
|
1389
|
+
rkb, FETCH, "FETCH",
|
|
1390
|
+
"Topic %s [%" PRId32
|
|
1391
|
+
"] in state %s at %s "
|
|
1392
|
+
"(%d/%d msgs, %" PRId64
|
|
1393
|
+
"/%d kb queued, "
|
|
1394
|
+
"opv %" PRId32 ") is %s%s",
|
|
1395
|
+
rktp->rktp_rkt->rkt_topic->str, rktp->rktp_partition,
|
|
1396
|
+
rd_kafka_fetch_states[rktp->rktp_fetch_state],
|
|
1397
|
+
rd_kafka_fetch_pos2str(rktp->rktp_next_fetch_start),
|
|
1398
|
+
rd_kafka_q_len(rktp->rktp_fetchq),
|
|
1399
|
+
rkb->rkb_rk->rk_conf.queued_min_msgs,
|
|
1400
|
+
rd_kafka_q_size(rktp->rktp_fetchq) / 1024,
|
|
1401
|
+
rkb->rkb_rk->rk_conf.queued_max_msg_kbytes,
|
|
1402
|
+
rktp->rktp_fetch_version,
|
|
1403
|
+
should_fetch ? "fetchable" : "not fetchable: ", reason);
|
|
1404
|
+
|
|
1405
|
+
if (should_fetch) {
|
|
1406
|
+
rd_dassert(rktp->rktp_fetch_version > 0);
|
|
1407
|
+
rd_kafka_broker_active_toppar_add(
|
|
1408
|
+
rkb, rktp, *reason ? reason : "fetchable");
|
|
1409
|
+
} else {
|
|
1410
|
+
rd_kafka_broker_active_toppar_del(rkb, rktp, reason);
|
|
1411
|
+
}
|
|
1412
|
+
}
|
|
1413
|
+
|
|
1414
|
+
rd_kafka_toppar_unlock(rktp);
|
|
1415
|
+
|
|
1416
|
+
/* Non-fetching partitions will have an
|
|
1417
|
+
* indefinate backoff, unless explicitly specified. */
|
|
1418
|
+
if (!should_fetch && !ts_backoff)
|
|
1419
|
+
ts_backoff = RD_TS_MAX;
|
|
1420
|
+
|
|
1421
|
+
return ts_backoff;
|
|
1422
|
+
}
|