@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,1183 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* librdkafka - Apache Kafka C library
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2012-2022, Magnus Edenhill
|
|
5
|
+
* 2023, Confluent Inc.
|
|
6
|
+
* All rights reserved.
|
|
7
|
+
*
|
|
8
|
+
* Redistribution and use in source and binary forms, with or without
|
|
9
|
+
* modification, are permitted provided that the following conditions are met:
|
|
10
|
+
*
|
|
11
|
+
* 1. Redistributions of source code must retain the above copyright notice,
|
|
12
|
+
* this list of conditions and the following disclaimer.
|
|
13
|
+
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
14
|
+
* this list of conditions and the following disclaimer in the documentation
|
|
15
|
+
* and/or other materials provided with the distribution.
|
|
16
|
+
*
|
|
17
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
18
|
+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
19
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
20
|
+
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
21
|
+
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
22
|
+
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
23
|
+
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
24
|
+
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
25
|
+
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
26
|
+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
27
|
+
* POSSIBILITY OF SUCH DAMAGE.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
#include "rd.h"
|
|
32
|
+
#include "rdkafka_int.h"
|
|
33
|
+
#include "rdkafka_topic.h"
|
|
34
|
+
#include "rdkafka_broker.h"
|
|
35
|
+
#include "rdkafka_request.h"
|
|
36
|
+
#include "rdkafka_metadata.h"
|
|
37
|
+
|
|
38
|
+
#include <string.h>
|
|
39
|
+
/**
|
|
40
|
+
* @{
|
|
41
|
+
*
|
|
42
|
+
* @brief Metadata cache
|
|
43
|
+
*
|
|
44
|
+
* The metadata cache consists of cached topic metadata as
|
|
45
|
+
* retrieved from the cluster using MetadataRequest.
|
|
46
|
+
*
|
|
47
|
+
* The topic cache entries are made up \c struct rd_kafka_metadata_cache_entry
|
|
48
|
+
* each containing the topic name, a copy of the topic's metadata
|
|
49
|
+
* and a cache expiry time.
|
|
50
|
+
*
|
|
51
|
+
* On update any previous entry for the topic are removed and replaced
|
|
52
|
+
* with a new entry.
|
|
53
|
+
*
|
|
54
|
+
* The cache is also populated when the topic metadata is being requested
|
|
55
|
+
* for specific topics, this will not interfere with existing cache entries
|
|
56
|
+
* for topics, but for any topics not currently in the cache a new
|
|
57
|
+
* entry will be added with a flag (RD_KAFKA_METADATA_CACHE_VALID(rkmce))
|
|
58
|
+
* indicating that the entry is waiting to be populated by the MetadataResponse.
|
|
59
|
+
* Two special error codes are used for this purpose:
|
|
60
|
+
* RD_KAFKA_RESP_ERR__NOENT - to indicate that a topic needs to be queried,
|
|
61
|
+
* RD_KAFKA_RESP_ERR__WAIT_CACHE - to indicate that a topic is being queried
|
|
62
|
+
* and there is no need to re-query it prior
|
|
63
|
+
* to the current query finishing.
|
|
64
|
+
*
|
|
65
|
+
* The cache is locked in its entirety with rd_kafka_wr/rdlock() by the caller
|
|
66
|
+
* and the returned cache entry must only be accessed during the duration
|
|
67
|
+
* of the lock.
|
|
68
|
+
*
|
|
69
|
+
*/
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* @brief Remove and free cache entry.
|
|
75
|
+
*
|
|
76
|
+
* @remark The expiry timer is not updated, for simplicity.
|
|
77
|
+
* @locks rd_kafka_wrlock()
|
|
78
|
+
*/
|
|
79
|
+
static RD_INLINE void
|
|
80
|
+
rd_kafka_metadata_cache_delete(rd_kafka_t *rk,
|
|
81
|
+
struct rd_kafka_metadata_cache_entry *rkmce,
|
|
82
|
+
int unlink_avl) {
|
|
83
|
+
if (unlink_avl) {
|
|
84
|
+
RD_AVL_REMOVE_ELM(&rk->rk_metadata_cache.rkmc_avl, rkmce);
|
|
85
|
+
if (!RD_KAFKA_UUID_IS_ZERO(
|
|
86
|
+
rkmce->rkmce_metadata_internal_topic.topic_id)) {
|
|
87
|
+
RD_AVL_REMOVE_ELM(&rk->rk_metadata_cache.rkmc_avl_by_id,
|
|
88
|
+
rkmce);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
TAILQ_REMOVE(&rk->rk_metadata_cache.rkmc_expiry, rkmce, rkmce_link);
|
|
92
|
+
rd_kafka_assert(NULL, rk->rk_metadata_cache.rkmc_cnt > 0);
|
|
93
|
+
rk->rk_metadata_cache.rkmc_cnt--;
|
|
94
|
+
|
|
95
|
+
rd_free(rkmce);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* @brief Delete cache entry by topic name
|
|
100
|
+
* @locks rd_kafka_wrlock()
|
|
101
|
+
* @returns 1 if entry was found and removed, else 0.
|
|
102
|
+
*/
|
|
103
|
+
int rd_kafka_metadata_cache_delete_by_name(rd_kafka_t *rk, const char *topic) {
|
|
104
|
+
struct rd_kafka_metadata_cache_entry *rkmce;
|
|
105
|
+
|
|
106
|
+
rkmce = rd_kafka_metadata_cache_find(rk, topic, 1);
|
|
107
|
+
if (rkmce)
|
|
108
|
+
rd_kafka_metadata_cache_delete(rk, rkmce, 1);
|
|
109
|
+
return rkmce ? 1 : 0;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* @brief Delete cache entry by topic id
|
|
114
|
+
* @locks rd_kafka_wrlock()
|
|
115
|
+
* @returns 1 if entry was found and removed, else 0.
|
|
116
|
+
*/
|
|
117
|
+
int rd_kafka_metadata_cache_delete_by_topic_id(rd_kafka_t *rk,
|
|
118
|
+
const rd_kafka_Uuid_t topic_id) {
|
|
119
|
+
struct rd_kafka_metadata_cache_entry *rkmce;
|
|
120
|
+
|
|
121
|
+
rkmce = rd_kafka_metadata_cache_find_by_id(rk, topic_id, 1);
|
|
122
|
+
if (rkmce)
|
|
123
|
+
rd_kafka_metadata_cache_delete(rk, rkmce, 1);
|
|
124
|
+
return rkmce ? 1 : 0;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
static int rd_kafka_metadata_cache_evict(rd_kafka_t *rk);
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* @brief Cache eviction timer callback.
|
|
131
|
+
* @locality rdkafka main thread
|
|
132
|
+
* @locks NOT rd_kafka_*lock()
|
|
133
|
+
*/
|
|
134
|
+
static void rd_kafka_metadata_cache_evict_tmr_cb(rd_kafka_timers_t *rkts,
|
|
135
|
+
void *arg) {
|
|
136
|
+
rd_kafka_t *rk = arg;
|
|
137
|
+
|
|
138
|
+
rd_kafka_wrlock(rk);
|
|
139
|
+
rd_kafka_metadata_cache_evict(rk);
|
|
140
|
+
rd_kafka_wrunlock(rk);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* @brief Evict timed out entries from cache and rearm timer for
|
|
146
|
+
* next expiry.
|
|
147
|
+
*
|
|
148
|
+
* @returns the number of entries evicted.
|
|
149
|
+
*
|
|
150
|
+
* @locks_required rd_kafka_wrlock()
|
|
151
|
+
*/
|
|
152
|
+
static int rd_kafka_metadata_cache_evict(rd_kafka_t *rk) {
|
|
153
|
+
int cnt = 0;
|
|
154
|
+
rd_ts_t now = rd_clock();
|
|
155
|
+
struct rd_kafka_metadata_cache_entry *rkmce;
|
|
156
|
+
|
|
157
|
+
while ((rkmce = TAILQ_FIRST(&rk->rk_metadata_cache.rkmc_expiry)) &&
|
|
158
|
+
rkmce->rkmce_ts_expires <= now) {
|
|
159
|
+
rd_kafka_metadata_cache_delete(rk, rkmce, 1);
|
|
160
|
+
cnt++;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if (rkmce)
|
|
164
|
+
rd_kafka_timer_start(&rk->rk_timers,
|
|
165
|
+
&rk->rk_metadata_cache.rkmc_expiry_tmr,
|
|
166
|
+
rkmce->rkmce_ts_expires - now,
|
|
167
|
+
rd_kafka_metadata_cache_evict_tmr_cb, rk);
|
|
168
|
+
else
|
|
169
|
+
rd_kafka_timer_stop(&rk->rk_timers,
|
|
170
|
+
&rk->rk_metadata_cache.rkmc_expiry_tmr, 1);
|
|
171
|
+
|
|
172
|
+
rd_kafka_dbg(rk, METADATA, "METADATA",
|
|
173
|
+
"Expired %d entries from metadata cache "
|
|
174
|
+
"(%d entries remain)",
|
|
175
|
+
cnt, rk->rk_metadata_cache.rkmc_cnt);
|
|
176
|
+
|
|
177
|
+
if (cnt)
|
|
178
|
+
rd_kafka_metadata_cache_propagate_changes(rk);
|
|
179
|
+
|
|
180
|
+
return cnt;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* @brief Remove all cache hints,.
|
|
186
|
+
* This is done when the Metadata response has been parsed and
|
|
187
|
+
* replaced hints with existing topic information, thus this will
|
|
188
|
+
* only remove unmatched topics from the cache.
|
|
189
|
+
*
|
|
190
|
+
* @returns the number of purged hints
|
|
191
|
+
*
|
|
192
|
+
* @locks_required rd_kafka_wrlock()
|
|
193
|
+
*/
|
|
194
|
+
int rd_kafka_metadata_cache_purge_all_hints(rd_kafka_t *rk) {
|
|
195
|
+
int cnt = 0;
|
|
196
|
+
struct rd_kafka_metadata_cache_entry *rkmce, *tmp;
|
|
197
|
+
|
|
198
|
+
TAILQ_FOREACH_SAFE(rkmce, &rk->rk_metadata_cache.rkmc_expiry,
|
|
199
|
+
rkmce_link, tmp) {
|
|
200
|
+
if (!RD_KAFKA_METADATA_CACHE_VALID(rkmce)) {
|
|
201
|
+
rd_kafka_metadata_cache_delete(rk, rkmce, 1);
|
|
202
|
+
cnt++;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
return cnt;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* @brief Find cache entry by topic name
|
|
212
|
+
*
|
|
213
|
+
* @param valid: entry must be valid (not hint)
|
|
214
|
+
*
|
|
215
|
+
* @locks rd_kafka_*lock()
|
|
216
|
+
*/
|
|
217
|
+
struct rd_kafka_metadata_cache_entry *
|
|
218
|
+
rd_kafka_metadata_cache_find(rd_kafka_t *rk, const char *topic, int valid) {
|
|
219
|
+
struct rd_kafka_metadata_cache_entry skel, *rkmce;
|
|
220
|
+
skel.rkmce_mtopic.topic = (char *)topic;
|
|
221
|
+
rkmce = RD_AVL_FIND(&rk->rk_metadata_cache.rkmc_avl, &skel);
|
|
222
|
+
if (rkmce && (!valid || RD_KAFKA_METADATA_CACHE_VALID(rkmce)))
|
|
223
|
+
return rkmce;
|
|
224
|
+
return NULL;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* @brief Find cache entry by topic id
|
|
229
|
+
*
|
|
230
|
+
* @param valid: entry must be valid (not hint)
|
|
231
|
+
*
|
|
232
|
+
* @locks rd_kafka_*lock()
|
|
233
|
+
*/
|
|
234
|
+
struct rd_kafka_metadata_cache_entry *
|
|
235
|
+
rd_kafka_metadata_cache_find_by_id(rd_kafka_t *rk,
|
|
236
|
+
const rd_kafka_Uuid_t topic_id,
|
|
237
|
+
int valid) {
|
|
238
|
+
struct rd_kafka_metadata_cache_entry skel, *rkmce;
|
|
239
|
+
skel.rkmce_metadata_internal_topic.topic_id = topic_id;
|
|
240
|
+
rkmce = RD_AVL_FIND(&rk->rk_metadata_cache.rkmc_avl_by_id, &skel);
|
|
241
|
+
if (rkmce && (!valid || RD_KAFKA_METADATA_CACHE_VALID(rkmce)))
|
|
242
|
+
return rkmce;
|
|
243
|
+
return NULL;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* @brief Partition (id) comparator
|
|
249
|
+
*/
|
|
250
|
+
int rd_kafka_metadata_partition_id_cmp(const void *_a, const void *_b) {
|
|
251
|
+
const rd_kafka_metadata_partition_t *a = _a, *b = _b;
|
|
252
|
+
return RD_CMP(a->id, b->id);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* @brief Creates a new metadata cache entry.
|
|
257
|
+
*
|
|
258
|
+
* @param mdt Topic to insert in the cache entry.
|
|
259
|
+
* @param mdti Topic to insert in the cache entry (internal structure).
|
|
260
|
+
* @param include_racks Include partition racks.
|
|
261
|
+
*
|
|
262
|
+
* @return The new metadata cache entry, to free with `rd_free`.
|
|
263
|
+
*/
|
|
264
|
+
static struct rd_kafka_metadata_cache_entry *rd_kafka_metadata_cache_entry_new(
|
|
265
|
+
const rd_kafka_metadata_topic_t *mtopic,
|
|
266
|
+
const rd_kafka_metadata_topic_internal_t *metadata_internal_topic,
|
|
267
|
+
rd_bool_t include_racks) {
|
|
268
|
+
struct rd_kafka_metadata_cache_entry *rkmce;
|
|
269
|
+
rd_tmpabuf_t tbuf;
|
|
270
|
+
int i;
|
|
271
|
+
|
|
272
|
+
/* Metadata is stored in one contigious buffer where structs and
|
|
273
|
+
* and pointed-to fields are layed out in a memory aligned fashion.
|
|
274
|
+
* rd_tmpabuf_t provides the infrastructure to do this.
|
|
275
|
+
* Because of this we copy all the structs verbatim but
|
|
276
|
+
* any pointer fields needs to be copied explicitly to update
|
|
277
|
+
* the pointer address.
|
|
278
|
+
* See also rd_kafka_metadata_cache_delete which frees this. */
|
|
279
|
+
rd_tmpabuf_new(&tbuf, 0, rd_true /*assert on fail*/);
|
|
280
|
+
|
|
281
|
+
rd_tmpabuf_add_alloc(&tbuf, sizeof(*rkmce));
|
|
282
|
+
rd_tmpabuf_add_alloc(&tbuf, strlen(mtopic->topic) + 1);
|
|
283
|
+
rd_tmpabuf_add_alloc(&tbuf, mtopic->partition_cnt *
|
|
284
|
+
sizeof(*mtopic->partitions));
|
|
285
|
+
rd_tmpabuf_add_alloc(&tbuf,
|
|
286
|
+
mtopic->partition_cnt *
|
|
287
|
+
sizeof(*metadata_internal_topic->partitions));
|
|
288
|
+
|
|
289
|
+
for (i = 0; include_racks && i < mtopic->partition_cnt; i++) {
|
|
290
|
+
size_t j;
|
|
291
|
+
rd_tmpabuf_add_alloc(
|
|
292
|
+
&tbuf, metadata_internal_topic->partitions[i].racks_cnt *
|
|
293
|
+
sizeof(char *));
|
|
294
|
+
for (j = 0;
|
|
295
|
+
j < metadata_internal_topic->partitions[i].racks_cnt;
|
|
296
|
+
j++) {
|
|
297
|
+
rd_tmpabuf_add_alloc(
|
|
298
|
+
&tbuf, strlen(metadata_internal_topic->partitions[i]
|
|
299
|
+
.racks[j]) +
|
|
300
|
+
1);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
rd_tmpabuf_finalize(&tbuf);
|
|
305
|
+
|
|
306
|
+
rkmce = rd_tmpabuf_alloc(&tbuf, sizeof(*rkmce));
|
|
307
|
+
|
|
308
|
+
rkmce->rkmce_mtopic = *mtopic;
|
|
309
|
+
|
|
310
|
+
rkmce->rkmce_metadata_internal_topic = *metadata_internal_topic;
|
|
311
|
+
|
|
312
|
+
/* Copy topic name and update pointer */
|
|
313
|
+
rkmce->rkmce_mtopic.topic = rd_tmpabuf_write_str(&tbuf, mtopic->topic);
|
|
314
|
+
|
|
315
|
+
/* Copy partition array and update pointer */
|
|
316
|
+
rkmce->rkmce_mtopic.partitions = rd_tmpabuf_write(
|
|
317
|
+
&tbuf, mtopic->partitions,
|
|
318
|
+
mtopic->partition_cnt * sizeof(*mtopic->partitions));
|
|
319
|
+
|
|
320
|
+
/* Copy partition array (internal) and update pointer */
|
|
321
|
+
rkmce->rkmce_metadata_internal_topic.partitions =
|
|
322
|
+
rd_tmpabuf_write(&tbuf, metadata_internal_topic->partitions,
|
|
323
|
+
mtopic->partition_cnt *
|
|
324
|
+
sizeof(*metadata_internal_topic->partitions));
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
/* Sort partitions for future bsearch() lookups. */
|
|
328
|
+
qsort(rkmce->rkmce_mtopic.partitions, rkmce->rkmce_mtopic.partition_cnt,
|
|
329
|
+
sizeof(*rkmce->rkmce_mtopic.partitions),
|
|
330
|
+
rd_kafka_metadata_partition_id_cmp);
|
|
331
|
+
|
|
332
|
+
/* partitions (internal) are already sorted. */
|
|
333
|
+
|
|
334
|
+
if (include_racks) {
|
|
335
|
+
for (i = 0; i < rkmce->rkmce_mtopic.partition_cnt; i++) {
|
|
336
|
+
size_t j;
|
|
337
|
+
rd_kafka_metadata_partition_t *mdp =
|
|
338
|
+
&rkmce->rkmce_mtopic.partitions[i];
|
|
339
|
+
rd_kafka_metadata_partition_internal_t *mdpi =
|
|
340
|
+
&rkmce->rkmce_metadata_internal_topic.partitions[i];
|
|
341
|
+
rd_kafka_metadata_partition_internal_t *mdpi_orig =
|
|
342
|
+
&metadata_internal_topic->partitions[i];
|
|
343
|
+
|
|
344
|
+
if (mdp->replica_cnt == 0 || mdpi->racks_cnt == 0)
|
|
345
|
+
continue;
|
|
346
|
+
|
|
347
|
+
mdpi->racks = rd_tmpabuf_alloc(
|
|
348
|
+
&tbuf, sizeof(char *) * mdpi->racks_cnt);
|
|
349
|
+
for (j = 0; j < mdpi_orig->racks_cnt; j++)
|
|
350
|
+
mdpi->racks[j] = rd_tmpabuf_write_str(
|
|
351
|
+
&tbuf, mdpi_orig->racks[j]);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/* Clear uncached fields. */
|
|
356
|
+
for (i = 0; i < mtopic->partition_cnt; i++) {
|
|
357
|
+
rkmce->rkmce_mtopic.partitions[i].replicas = NULL;
|
|
358
|
+
rkmce->rkmce_mtopic.partitions[i].replica_cnt = 0;
|
|
359
|
+
rkmce->rkmce_mtopic.partitions[i].isrs = NULL;
|
|
360
|
+
rkmce->rkmce_mtopic.partitions[i].isr_cnt = 0;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
return rkmce;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/**
|
|
367
|
+
* @brief Add (and replace) cache entry for topic.
|
|
368
|
+
*
|
|
369
|
+
* @locks_required rd_kafka_wrlock()
|
|
370
|
+
*/
|
|
371
|
+
static struct rd_kafka_metadata_cache_entry *
|
|
372
|
+
rd_kafka_metadata_cache_insert(rd_kafka_t *rk,
|
|
373
|
+
struct rd_kafka_metadata_cache_entry *rkmce,
|
|
374
|
+
rd_ts_t now,
|
|
375
|
+
rd_ts_t ts_expires) {
|
|
376
|
+
struct rd_kafka_metadata_cache_entry *old, *old_by_id = NULL;
|
|
377
|
+
TAILQ_INSERT_TAIL(&rk->rk_metadata_cache.rkmc_expiry, rkmce,
|
|
378
|
+
rkmce_link);
|
|
379
|
+
rk->rk_metadata_cache.rkmc_cnt++;
|
|
380
|
+
rkmce->rkmce_ts_expires = ts_expires;
|
|
381
|
+
rkmce->rkmce_ts_insert = now;
|
|
382
|
+
|
|
383
|
+
/* Insert (and replace existing) entry. */
|
|
384
|
+
old = RD_AVL_INSERT(&rk->rk_metadata_cache.rkmc_avl, rkmce,
|
|
385
|
+
rkmce_avlnode);
|
|
386
|
+
/* Insert (and replace existing) entry into the AVL tree sorted
|
|
387
|
+
* by topic id. */
|
|
388
|
+
if (!RD_KAFKA_UUID_IS_ZERO(
|
|
389
|
+
rkmce->rkmce_metadata_internal_topic.topic_id)) {
|
|
390
|
+
/* If topic id isn't zero insert cache entry into this tree */
|
|
391
|
+
old_by_id = RD_AVL_INSERT(&rk->rk_metadata_cache.rkmc_avl_by_id,
|
|
392
|
+
rkmce, rkmce_avlnode_by_id);
|
|
393
|
+
}
|
|
394
|
+
if (old &&
|
|
395
|
+
!RD_KAFKA_UUID_IS_ZERO(
|
|
396
|
+
old->rkmce_metadata_internal_topic.topic_id) &&
|
|
397
|
+
rd_kafka_Uuid_cmp(rkmce->rkmce_metadata_internal_topic.topic_id,
|
|
398
|
+
old->rkmce_metadata_internal_topic.topic_id) !=
|
|
399
|
+
0) {
|
|
400
|
+
/* If it had a different topic id, remove it from the tree */
|
|
401
|
+
RD_AVL_REMOVE_ELM(&rk->rk_metadata_cache.rkmc_avl_by_id, old);
|
|
402
|
+
}
|
|
403
|
+
if (old) {
|
|
404
|
+
/* Delete and free old cache entry */
|
|
405
|
+
rd_kafka_metadata_cache_delete(rk, old, 0);
|
|
406
|
+
}
|
|
407
|
+
if (old_by_id && old_by_id != old) {
|
|
408
|
+
rd_dassert(
|
|
409
|
+
!*"Different cache entries for topic name and topic id");
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/* Explicitly not freeing the tmpabuf since rkmce points to its
|
|
413
|
+
* memory. */
|
|
414
|
+
return rkmce;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
/**
|
|
418
|
+
* @brief Add (and replace) cache entry for topic.
|
|
419
|
+
*
|
|
420
|
+
* This makes a copy of \p mtopic and \p metadata_internal_topic ,
|
|
421
|
+
*
|
|
422
|
+
* @locks_required rd_kafka_wrlock()
|
|
423
|
+
*/
|
|
424
|
+
static struct rd_kafka_metadata_cache_entry *rd_kafka_metadata_cache_insert_new(
|
|
425
|
+
rd_kafka_t *rk,
|
|
426
|
+
const rd_kafka_metadata_topic_t *mtopic,
|
|
427
|
+
const rd_kafka_metadata_topic_internal_t *metadata_internal_topic,
|
|
428
|
+
rd_ts_t now,
|
|
429
|
+
rd_ts_t ts_expires,
|
|
430
|
+
rd_bool_t include_racks) {
|
|
431
|
+
/* Create entry */
|
|
432
|
+
struct rd_kafka_metadata_cache_entry *rkmce =
|
|
433
|
+
rd_kafka_metadata_cache_entry_new(mtopic, metadata_internal_topic,
|
|
434
|
+
include_racks);
|
|
435
|
+
/* Insert/replace entry */
|
|
436
|
+
return rd_kafka_metadata_cache_insert(rk, rkmce, now, ts_expires);
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
/**
|
|
440
|
+
* @brief Purge the metadata cache
|
|
441
|
+
*
|
|
442
|
+
* @locks_required rd_kafka_wrlock()
|
|
443
|
+
*/
|
|
444
|
+
void rd_kafka_metadata_cache_purge(rd_kafka_t *rk, rd_bool_t purge_observers) {
|
|
445
|
+
struct rd_kafka_metadata_cache_entry *rkmce;
|
|
446
|
+
int was_empty = TAILQ_EMPTY(&rk->rk_metadata_cache.rkmc_expiry);
|
|
447
|
+
|
|
448
|
+
while ((rkmce = TAILQ_FIRST(&rk->rk_metadata_cache.rkmc_expiry)))
|
|
449
|
+
rd_kafka_metadata_cache_delete(rk, rkmce, 1);
|
|
450
|
+
|
|
451
|
+
rd_kafka_timer_stop(&rk->rk_timers,
|
|
452
|
+
&rk->rk_metadata_cache.rkmc_expiry_tmr, 1);
|
|
453
|
+
|
|
454
|
+
if (!was_empty)
|
|
455
|
+
rd_kafka_metadata_cache_propagate_changes(rk);
|
|
456
|
+
|
|
457
|
+
if (purge_observers)
|
|
458
|
+
rd_list_clear(&rk->rk_metadata_cache.rkmc_observers);
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
/**
|
|
463
|
+
* @brief Start or update the cache expiry timer.
|
|
464
|
+
* Typically done after a series of cache_topic_update()
|
|
465
|
+
*
|
|
466
|
+
* @locks rd_kafka_wrlock()
|
|
467
|
+
*/
|
|
468
|
+
void rd_kafka_metadata_cache_expiry_start(rd_kafka_t *rk) {
|
|
469
|
+
struct rd_kafka_metadata_cache_entry *rkmce;
|
|
470
|
+
|
|
471
|
+
if ((rkmce = TAILQ_FIRST(&rk->rk_metadata_cache.rkmc_expiry)))
|
|
472
|
+
rd_kafka_timer_start(&rk->rk_timers,
|
|
473
|
+
&rk->rk_metadata_cache.rkmc_expiry_tmr,
|
|
474
|
+
rkmce->rkmce_ts_expires - rd_clock(),
|
|
475
|
+
rd_kafka_metadata_cache_evict_tmr_cb, rk);
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
#define rd_kafka_metadata_cache_topic_update_replace_partition( \
|
|
479
|
+
current_partition, new_partition, current_partition_cnt, \
|
|
480
|
+
new_partition_cnt, partition) \
|
|
481
|
+
((partition) < (current_partition_cnt) && \
|
|
482
|
+
(partition) >= (new_partition_cnt) \
|
|
483
|
+
? rd_false \
|
|
484
|
+
: (partition) < (new_partition_cnt) && \
|
|
485
|
+
(partition) >= (current_partition_cnt) \
|
|
486
|
+
? rd_true \
|
|
487
|
+
: (new_partition).leader_epoch == -1 || \
|
|
488
|
+
(new_partition).leader_epoch >= \
|
|
489
|
+
(current_partition.leader_epoch));
|
|
490
|
+
|
|
491
|
+
|
|
492
|
+
static struct rd_kafka_metadata_cache_entry *
|
|
493
|
+
rd_kafka_metadata_cache_topic_update_merge_partitions(
|
|
494
|
+
rd_kafka_t *rk,
|
|
495
|
+
struct rd_kafka_metadata_cache_entry *rkmce_current,
|
|
496
|
+
const rd_kafka_metadata_topic_t *mdt,
|
|
497
|
+
const rd_kafka_metadata_topic_internal_t *mdti,
|
|
498
|
+
rd_bool_t include_racks,
|
|
499
|
+
rd_bool_t has_reliable_epochs) {
|
|
500
|
+
rd_tmpabuf_t tbuf;
|
|
501
|
+
struct rd_kafka_metadata_cache_entry *rkmce;
|
|
502
|
+
size_t i, current_partition_cnt, new_partition_cnt, partition_cnt;
|
|
503
|
+
|
|
504
|
+
if (!has_reliable_epochs || !rkmce_current ||
|
|
505
|
+
/* Different topic ids */
|
|
506
|
+
rd_kafka_Uuid_cmp(
|
|
507
|
+
mdti->topic_id,
|
|
508
|
+
rkmce_current->rkmce_metadata_internal_topic.topic_id) != 0) {
|
|
509
|
+
return rd_kafka_metadata_cache_entry_new(mdt, mdti,
|
|
510
|
+
include_racks);
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
current_partition_cnt = rkmce_current->rkmce_mtopic.partition_cnt;
|
|
514
|
+
new_partition_cnt = mdt->partition_cnt;
|
|
515
|
+
partition_cnt = RD_MAX(current_partition_cnt, new_partition_cnt);
|
|
516
|
+
|
|
517
|
+
rd_tmpabuf_new(&tbuf, sizeof(*rkmce), rd_true /*assert on fail*/);
|
|
518
|
+
rd_tmpabuf_add_alloc(&tbuf, sizeof(*rkmce));
|
|
519
|
+
rd_tmpabuf_add_alloc(&tbuf, strlen(mdt->topic) + 1);
|
|
520
|
+
rd_tmpabuf_add_alloc(&tbuf, partition_cnt * sizeof(*mdt->partitions));
|
|
521
|
+
rd_tmpabuf_add_alloc(&tbuf, partition_cnt * sizeof(*mdti->partitions));
|
|
522
|
+
|
|
523
|
+
for (i = 0; include_racks && i < partition_cnt; i++) {
|
|
524
|
+
size_t j;
|
|
525
|
+
rd_kafka_metadata_partition_internal_t *partition_internal;
|
|
526
|
+
rd_bool_t replace_partition =
|
|
527
|
+
rd_kafka_metadata_cache_topic_update_replace_partition(
|
|
528
|
+
rkmce_current->rkmce_metadata_internal_topic
|
|
529
|
+
.partitions[i],
|
|
530
|
+
mdti->partitions[i], current_partition_cnt,
|
|
531
|
+
new_partition_cnt, i);
|
|
532
|
+
|
|
533
|
+
partition_internal =
|
|
534
|
+
replace_partition
|
|
535
|
+
? &mdti->partitions[i]
|
|
536
|
+
: &rkmce_current->rkmce_metadata_internal_topic
|
|
537
|
+
.partitions[i];
|
|
538
|
+
rd_tmpabuf_add_alloc(&tbuf, partition_internal->racks_cnt *
|
|
539
|
+
sizeof(char *));
|
|
540
|
+
for (j = 0; j < partition_internal->racks_cnt; j++) {
|
|
541
|
+
rd_tmpabuf_add_alloc(
|
|
542
|
+
&tbuf, strlen(partition_internal->racks[j]) + 1);
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
rd_tmpabuf_finalize(&tbuf);
|
|
547
|
+
|
|
548
|
+
rkmce = rd_tmpabuf_alloc(&tbuf, sizeof(*rkmce));
|
|
549
|
+
|
|
550
|
+
rkmce->rkmce_mtopic = *mdt;
|
|
551
|
+
|
|
552
|
+
rkmce->rkmce_metadata_internal_topic = *mdti;
|
|
553
|
+
|
|
554
|
+
/* Copy topic name */
|
|
555
|
+
rkmce->rkmce_mtopic.topic = rd_tmpabuf_write_str(&tbuf, mdt->topic);
|
|
556
|
+
|
|
557
|
+
/* Allocate partition array */
|
|
558
|
+
rkmce->rkmce_mtopic.partitions =
|
|
559
|
+
rd_tmpabuf_alloc(&tbuf, partition_cnt * sizeof(*mdt->partitions));
|
|
560
|
+
|
|
561
|
+
/* Allocate partition array (internal) */
|
|
562
|
+
rkmce->rkmce_metadata_internal_topic.partitions =
|
|
563
|
+
rd_tmpabuf_alloc(&tbuf, partition_cnt * sizeof(*mdti->partitions));
|
|
564
|
+
|
|
565
|
+
for (i = 0; i < partition_cnt; i++) {
|
|
566
|
+
struct rd_kafka_metadata_partition *partition;
|
|
567
|
+
rd_kafka_metadata_partition_internal_t *partition_internal;
|
|
568
|
+
|
|
569
|
+
rd_bool_t replace_partition =
|
|
570
|
+
rd_kafka_metadata_cache_topic_update_replace_partition(
|
|
571
|
+
rkmce_current->rkmce_metadata_internal_topic
|
|
572
|
+
.partitions[i],
|
|
573
|
+
mdti->partitions[i], current_partition_cnt,
|
|
574
|
+
new_partition_cnt, i);
|
|
575
|
+
|
|
576
|
+
if (replace_partition) {
|
|
577
|
+
partition = &mdt->partitions[i];
|
|
578
|
+
partition_internal = &mdti->partitions[i];
|
|
579
|
+
} else {
|
|
580
|
+
partition = &rkmce_current->rkmce_mtopic.partitions[i];
|
|
581
|
+
partition_internal =
|
|
582
|
+
&rkmce_current->rkmce_metadata_internal_topic
|
|
583
|
+
.partitions[i];
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
rkmce->rkmce_mtopic.partitions[i] = *partition;
|
|
587
|
+
rkmce->rkmce_metadata_internal_topic.partitions[i] =
|
|
588
|
+
*partition_internal;
|
|
589
|
+
|
|
590
|
+
if (include_racks) {
|
|
591
|
+
size_t j;
|
|
592
|
+
rkmce->rkmce_metadata_internal_topic.partitions[i]
|
|
593
|
+
.racks = rd_tmpabuf_alloc(
|
|
594
|
+
&tbuf,
|
|
595
|
+
partition_internal->racks_cnt * sizeof(char *));
|
|
596
|
+
rkmce->rkmce_metadata_internal_topic.partitions[i]
|
|
597
|
+
.racks_cnt = partition_internal->racks_cnt;
|
|
598
|
+
for (j = 0; j < partition_internal->racks_cnt; j++) {
|
|
599
|
+
rkmce->rkmce_metadata_internal_topic
|
|
600
|
+
.partitions[i]
|
|
601
|
+
.racks[j] = rd_tmpabuf_write_str(
|
|
602
|
+
&tbuf, partition_internal->racks[j]);
|
|
603
|
+
}
|
|
604
|
+
} else {
|
|
605
|
+
rkmce->rkmce_metadata_internal_topic.partitions[i]
|
|
606
|
+
.racks = NULL;
|
|
607
|
+
rkmce->rkmce_metadata_internal_topic.partitions[i]
|
|
608
|
+
.racks_cnt = 0;
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
return rkmce;
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
/**
|
|
615
|
+
* @brief Update the metadata cache for a single topic
|
|
616
|
+
* with the provided metadata.
|
|
617
|
+
*
|
|
618
|
+
* If the topic has a temporary error the existing entry is removed
|
|
619
|
+
* and no new entry is added, which avoids the topic to be
|
|
620
|
+
* suppressed in upcoming metadata requests because being in the cache.
|
|
621
|
+
* In other words: we want to re-query errored topics.
|
|
622
|
+
* If the broker reports ERR_UNKNOWN_TOPIC_OR_PART we add a negative cache
|
|
623
|
+
* entry with an low expiry time, this is so that client code (cgrp) knows
|
|
624
|
+
* the topic has been queried but did not exist, otherwise it would wait
|
|
625
|
+
* forever for the unknown topic to surface.
|
|
626
|
+
*
|
|
627
|
+
* For permanent errors (authorization failures), we keep
|
|
628
|
+
* the entry cached for metadata.max.age.ms.
|
|
629
|
+
*
|
|
630
|
+
* @param mdt Topic to insert in the cache entry.
|
|
631
|
+
* @param mdti Topic to insert in the cache entry (internal structure).
|
|
632
|
+
* @param propagate Propagate metadata cache changes now.
|
|
633
|
+
* @param include_racks Include partition racks.
|
|
634
|
+
* @param has_reliable_leader_epochs Comes from a broker with reliable leader
|
|
635
|
+
* epochs.
|
|
636
|
+
*
|
|
637
|
+
* @return 1 on metadata change, 0 when no change was applied
|
|
638
|
+
*
|
|
639
|
+
* @remark The cache expiry timer will not be updated/started,
|
|
640
|
+
* call rd_kafka_metadata_cache_expiry_start() instead.
|
|
641
|
+
*
|
|
642
|
+
* @locks rd_kafka_wrlock()
|
|
643
|
+
*/
|
|
644
|
+
int rd_kafka_metadata_cache_topic_update(
|
|
645
|
+
rd_kafka_t *rk,
|
|
646
|
+
const rd_kafka_metadata_topic_t *mdt,
|
|
647
|
+
const rd_kafka_metadata_topic_internal_t *mdti,
|
|
648
|
+
rd_bool_t propagate,
|
|
649
|
+
rd_bool_t include_racks,
|
|
650
|
+
rd_bool_t has_reliable_leader_epochs) {
|
|
651
|
+
rd_ts_t now = rd_clock();
|
|
652
|
+
rd_ts_t ts_expires = now + (rk->rk_conf.metadata_max_age_ms * 1000);
|
|
653
|
+
int changed = 0;
|
|
654
|
+
|
|
655
|
+
if (likely(mdt->topic != NULL)) {
|
|
656
|
+
struct rd_kafka_metadata_cache_entry *rkmce,
|
|
657
|
+
*rkmce_current = NULL;
|
|
658
|
+
rd_kafka_metadata_topic_internal_t mdti_copy = *mdti;
|
|
659
|
+
switch (mdt->err) {
|
|
660
|
+
case RD_KAFKA_RESP_ERR_UNKNOWN_TOPIC_OR_PART:
|
|
661
|
+
/* Cache unknown topics for metadata.propagation.max.ms
|
|
662
|
+
* to allow the cgrp logic to find negative cache hits.
|
|
663
|
+
* and to avoid false reappearances of the topic
|
|
664
|
+
* after deletion. */
|
|
665
|
+
ts_expires = RD_MIN(ts_expires, now + (100 * 1000));
|
|
666
|
+
|
|
667
|
+
/* Continue */
|
|
668
|
+
case RD_KAFKA_RESP_ERR_NO_ERROR:
|
|
669
|
+
rkmce_current =
|
|
670
|
+
rd_kafka_metadata_cache_find(rk, mdt->topic, 1);
|
|
671
|
+
if (mdt->err ==
|
|
672
|
+
RD_KAFKA_RESP_ERR_UNKNOWN_TOPIC_OR_PART &&
|
|
673
|
+
rkmce_current &&
|
|
674
|
+
RD_KAFKA_UUID_IS_ZERO(mdti->topic_id) &&
|
|
675
|
+
!RD_KAFKA_UUID_IS_ZERO(
|
|
676
|
+
rkmce_current->rkmce_metadata_internal_topic
|
|
677
|
+
.topic_id)) {
|
|
678
|
+
/* Keep the existing topic id to detect
|
|
679
|
+
* if the same id is received again
|
|
680
|
+
* as existing */
|
|
681
|
+
mdti_copy.topic_id =
|
|
682
|
+
rkmce_current->rkmce_metadata_internal_topic
|
|
683
|
+
.topic_id;
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
/* Continue */
|
|
687
|
+
case RD_KAFKA_RESP_ERR_TOPIC_AUTHORIZATION_FAILED:
|
|
688
|
+
rkmce =
|
|
689
|
+
rd_kafka_metadata_cache_topic_update_merge_partitions(
|
|
690
|
+
rk, rkmce_current, mdt, &mdti_copy,
|
|
691
|
+
include_racks, has_reliable_leader_epochs);
|
|
692
|
+
/* Insert/replace entry */
|
|
693
|
+
rd_kafka_metadata_cache_insert(rk, rkmce, now,
|
|
694
|
+
ts_expires);
|
|
695
|
+
changed = 1;
|
|
696
|
+
break;
|
|
697
|
+
default:
|
|
698
|
+
break;
|
|
699
|
+
}
|
|
700
|
+
} else {
|
|
701
|
+
/* Cache entry found but no topic name:
|
|
702
|
+
* delete it. */
|
|
703
|
+
changed = rd_kafka_metadata_cache_delete_by_topic_id(
|
|
704
|
+
rk, mdti->topic_id);
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
if (changed && propagate)
|
|
708
|
+
rd_kafka_metadata_cache_propagate_changes(rk);
|
|
709
|
+
|
|
710
|
+
return changed;
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
|
|
714
|
+
/**
|
|
715
|
+
* @brief Remove cache hints for topics in \p topics
|
|
716
|
+
* This is done when the Metadata response has been parsed and
|
|
717
|
+
* replaced hints with existing topic information, thus this will
|
|
718
|
+
* only remove unmatched topics from the cache.
|
|
719
|
+
*
|
|
720
|
+
* @locks rd_kafka_wrlock()
|
|
721
|
+
*/
|
|
722
|
+
void rd_kafka_metadata_cache_purge_hints(rd_kafka_t *rk,
|
|
723
|
+
const rd_list_t *topics) {
|
|
724
|
+
const char *topic;
|
|
725
|
+
int i;
|
|
726
|
+
int cnt = 0;
|
|
727
|
+
|
|
728
|
+
RD_LIST_FOREACH(topic, topics, i) {
|
|
729
|
+
struct rd_kafka_metadata_cache_entry *rkmce;
|
|
730
|
+
|
|
731
|
+
if (!(rkmce =
|
|
732
|
+
rd_kafka_metadata_cache_find(rk, topic, 0 /*any*/)) ||
|
|
733
|
+
RD_KAFKA_METADATA_CACHE_VALID(rkmce))
|
|
734
|
+
continue;
|
|
735
|
+
|
|
736
|
+
rd_kafka_metadata_cache_delete(rk, rkmce, 1 /*unlink avl*/);
|
|
737
|
+
cnt++;
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
if (cnt > 0) {
|
|
741
|
+
rd_kafka_dbg(rk, METADATA, "METADATA",
|
|
742
|
+
"Purged %d/%d cached topic hint(s)", cnt,
|
|
743
|
+
rd_list_cnt(topics));
|
|
744
|
+
rd_kafka_metadata_cache_propagate_changes(rk);
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
/**
|
|
749
|
+
* @brief Remove cache hints for topic ids in \p topic_ids
|
|
750
|
+
* This is done when the Metadata response has been parsed and
|
|
751
|
+
* replaced hints with existing topic information, thus this will
|
|
752
|
+
* only remove unmatched topics from the cache.
|
|
753
|
+
*
|
|
754
|
+
* @locks rd_kafka_wrlock()
|
|
755
|
+
*/
|
|
756
|
+
void rd_kafka_metadata_cache_purge_hints_by_id(rd_kafka_t *rk,
|
|
757
|
+
const rd_list_t *topic_ids) {
|
|
758
|
+
const rd_kafka_Uuid_t *topic_id;
|
|
759
|
+
int i;
|
|
760
|
+
int cnt = 0;
|
|
761
|
+
|
|
762
|
+
RD_LIST_FOREACH(topic_id, topic_ids, i) {
|
|
763
|
+
struct rd_kafka_metadata_cache_entry *rkmce;
|
|
764
|
+
|
|
765
|
+
if (!(rkmce = rd_kafka_metadata_cache_find_by_id(rk, *topic_id,
|
|
766
|
+
0 /*any*/)) ||
|
|
767
|
+
RD_KAFKA_METADATA_CACHE_VALID(rkmce))
|
|
768
|
+
continue;
|
|
769
|
+
|
|
770
|
+
rd_kafka_metadata_cache_delete(rk, rkmce, 1 /*unlink avl*/);
|
|
771
|
+
cnt++;
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
if (cnt > 0) {
|
|
775
|
+
rd_kafka_dbg(rk, METADATA, "METADATA",
|
|
776
|
+
"Purged %d/%d cached topic hint(s)", cnt,
|
|
777
|
+
rd_list_cnt(topic_ids));
|
|
778
|
+
rd_kafka_metadata_cache_propagate_changes(rk);
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
|
|
783
|
+
/**
|
|
784
|
+
* @brief Inserts a non-valid entry for topics in \p topics indicating
|
|
785
|
+
* that a MetadataRequest is in progress.
|
|
786
|
+
* This avoids sending multiple MetadataRequests for the same topics
|
|
787
|
+
* if there are already outstanding requests, see
|
|
788
|
+
* \c rd_kafka_metadata_refresh_topics().
|
|
789
|
+
*
|
|
790
|
+
* @remark These non-valid cache entries' expire time is set to the
|
|
791
|
+
* MetadataRequest timeout.
|
|
792
|
+
*
|
|
793
|
+
* @param dst rd_list_t(char *topicname): if not NULL: populated with
|
|
794
|
+
* topics that were added as hints to cache, e.q., topics to query.
|
|
795
|
+
* @param dst rd_list_t(char *topicname)
|
|
796
|
+
* @param err is the error to set on hint cache entries,
|
|
797
|
+
* typically ERR__WAIT_CACHE.
|
|
798
|
+
*
|
|
799
|
+
* @returns the number of topic hints inserted.
|
|
800
|
+
*
|
|
801
|
+
* @locks_required rd_kafka_wrlock()
|
|
802
|
+
*/
|
|
803
|
+
int rd_kafka_metadata_cache_hint(rd_kafka_t *rk,
|
|
804
|
+
const rd_list_t *topics,
|
|
805
|
+
rd_list_t *dst,
|
|
806
|
+
rd_kafka_resp_err_t err) {
|
|
807
|
+
const char *topic;
|
|
808
|
+
rd_ts_t now = rd_clock();
|
|
809
|
+
rd_ts_t ts_expires = now + (rk->rk_conf.socket_timeout_ms * 1000);
|
|
810
|
+
int i;
|
|
811
|
+
int cnt = 0;
|
|
812
|
+
|
|
813
|
+
RD_LIST_FOREACH(topic, topics, i) {
|
|
814
|
+
rd_kafka_metadata_topic_t mtopic = {.topic = (char *)topic,
|
|
815
|
+
.err = err};
|
|
816
|
+
rd_kafka_metadata_topic_internal_t metadata_internal_topic =
|
|
817
|
+
RD_ZERO_INIT;
|
|
818
|
+
/*const*/ struct rd_kafka_metadata_cache_entry *rkmce;
|
|
819
|
+
|
|
820
|
+
if ((rkmce =
|
|
821
|
+
rd_kafka_metadata_cache_find(rk, topic, 0 /*any*/))) {
|
|
822
|
+
if (RD_KAFKA_METADATA_CACHE_VALID(rkmce) ||
|
|
823
|
+
(dst && rkmce->rkmce_mtopic.err !=
|
|
824
|
+
RD_KAFKA_RESP_ERR__NOENT))
|
|
825
|
+
continue;
|
|
826
|
+
rkmce->rkmce_mtopic.err = err;
|
|
827
|
+
/* FALLTHRU */
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
rd_kafka_metadata_cache_insert_new(rk, &mtopic,
|
|
831
|
+
&metadata_internal_topic,
|
|
832
|
+
now, ts_expires, rd_false);
|
|
833
|
+
cnt++;
|
|
834
|
+
|
|
835
|
+
if (dst)
|
|
836
|
+
rd_list_add(dst, rd_strdup(topic));
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
if (cnt > 0)
|
|
840
|
+
rd_kafka_dbg(rk, METADATA, "METADATA",
|
|
841
|
+
"Hinted cache of %d/%d topic(s) being queried",
|
|
842
|
+
cnt, rd_list_cnt(topics));
|
|
843
|
+
|
|
844
|
+
return cnt;
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
|
|
848
|
+
/**
|
|
849
|
+
* @brief Same as rd_kafka_metadata_cache_hint() but takes
|
|
850
|
+
* a topic+partition list as input instead.
|
|
851
|
+
*
|
|
852
|
+
* @locks_acquired rd_kafka_wrlock()
|
|
853
|
+
*/
|
|
854
|
+
int rd_kafka_metadata_cache_hint_rktparlist(
|
|
855
|
+
rd_kafka_t *rk,
|
|
856
|
+
const rd_kafka_topic_partition_list_t *rktparlist,
|
|
857
|
+
rd_list_t *dst) {
|
|
858
|
+
rd_list_t topics;
|
|
859
|
+
int r;
|
|
860
|
+
|
|
861
|
+
rd_list_init(&topics, rktparlist->cnt, rd_free);
|
|
862
|
+
rd_kafka_topic_partition_list_get_topic_names(rktparlist, &topics,
|
|
863
|
+
0 /*dont include regex*/);
|
|
864
|
+
rd_kafka_wrlock(rk);
|
|
865
|
+
r = rd_kafka_metadata_cache_hint(rk, &topics, dst,
|
|
866
|
+
RD_KAFKA_RESP_ERR__WAIT_CACHE);
|
|
867
|
+
rd_kafka_wrunlock(rk);
|
|
868
|
+
|
|
869
|
+
rd_list_destroy(&topics);
|
|
870
|
+
return r;
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
|
|
874
|
+
/**
|
|
875
|
+
* @brief Cache entry comparator (on topic name)
|
|
876
|
+
*/
|
|
877
|
+
static int rd_kafka_metadata_cache_entry_cmp(const void *_a, const void *_b) {
|
|
878
|
+
const struct rd_kafka_metadata_cache_entry *a = _a, *b = _b;
|
|
879
|
+
return strcmp(a->rkmce_mtopic.topic, b->rkmce_mtopic.topic);
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
/**
|
|
883
|
+
* @brief Cache entry comparator (on topic id)
|
|
884
|
+
*/
|
|
885
|
+
static int rd_kafka_metadata_cache_entry_by_id_cmp(const void *_a,
|
|
886
|
+
const void *_b) {
|
|
887
|
+
const struct rd_kafka_metadata_cache_entry *a = _a, *b = _b;
|
|
888
|
+
return rd_kafka_Uuid_cmp(a->rkmce_metadata_internal_topic.topic_id,
|
|
889
|
+
b->rkmce_metadata_internal_topic.topic_id);
|
|
890
|
+
}
|
|
891
|
+
|
|
892
|
+
|
|
893
|
+
/**
|
|
894
|
+
* @brief Initialize the metadata cache
|
|
895
|
+
*
|
|
896
|
+
* @locks rd_kafka_wrlock()
|
|
897
|
+
*/
|
|
898
|
+
void rd_kafka_metadata_cache_init(rd_kafka_t *rk) {
|
|
899
|
+
rd_avl_init(&rk->rk_metadata_cache.rkmc_avl,
|
|
900
|
+
rd_kafka_metadata_cache_entry_cmp, 0);
|
|
901
|
+
rd_avl_init(&rk->rk_metadata_cache.rkmc_avl_by_id,
|
|
902
|
+
rd_kafka_metadata_cache_entry_by_id_cmp, 0);
|
|
903
|
+
TAILQ_INIT(&rk->rk_metadata_cache.rkmc_expiry);
|
|
904
|
+
mtx_init(&rk->rk_metadata_cache.rkmc_full_lock, mtx_plain);
|
|
905
|
+
mtx_init(&rk->rk_metadata_cache.rkmc_cnd_lock, mtx_plain);
|
|
906
|
+
cnd_init(&rk->rk_metadata_cache.rkmc_cnd);
|
|
907
|
+
rd_list_init(&rk->rk_metadata_cache.rkmc_observers, 8,
|
|
908
|
+
rd_kafka_enq_once_trigger_destroy);
|
|
909
|
+
}
|
|
910
|
+
|
|
911
|
+
/**
|
|
912
|
+
* @brief Purge and destroy metadata cache.
|
|
913
|
+
*
|
|
914
|
+
* @locks_required rd_kafka_wrlock()
|
|
915
|
+
*/
|
|
916
|
+
void rd_kafka_metadata_cache_destroy(rd_kafka_t *rk) {
|
|
917
|
+
rd_list_destroy(&rk->rk_metadata_cache.rkmc_observers);
|
|
918
|
+
rd_kafka_timer_stop(&rk->rk_timers,
|
|
919
|
+
&rk->rk_metadata_cache.rkmc_query_tmr, 1 /*lock*/);
|
|
920
|
+
rd_kafka_metadata_cache_purge(rk, rd_true /*observers too*/);
|
|
921
|
+
mtx_destroy(&rk->rk_metadata_cache.rkmc_full_lock);
|
|
922
|
+
mtx_destroy(&rk->rk_metadata_cache.rkmc_cnd_lock);
|
|
923
|
+
cnd_destroy(&rk->rk_metadata_cache.rkmc_cnd);
|
|
924
|
+
rd_avl_destroy(&rk->rk_metadata_cache.rkmc_avl);
|
|
925
|
+
rd_avl_destroy(&rk->rk_metadata_cache.rkmc_avl_by_id);
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
|
|
929
|
+
|
|
930
|
+
/**
|
|
931
|
+
* @brief Add eonce to list of async cache observers.
|
|
932
|
+
*
|
|
933
|
+
* @locks_required rd_kafka_wrlock()
|
|
934
|
+
*/
|
|
935
|
+
void rd_kafka_metadata_cache_wait_state_change_async(
|
|
936
|
+
rd_kafka_t *rk,
|
|
937
|
+
rd_kafka_enq_once_t *eonce) {
|
|
938
|
+
rd_kafka_enq_once_add_source(eonce, "wait metadata cache change");
|
|
939
|
+
rd_list_add(&rk->rk_metadata_cache.rkmc_observers, eonce);
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
|
|
943
|
+
/**
|
|
944
|
+
* @brief Wait for cache update, or timeout.
|
|
945
|
+
*
|
|
946
|
+
* @returns 1 on cache update or 0 on timeout.
|
|
947
|
+
* @locks none
|
|
948
|
+
* @locality any
|
|
949
|
+
*/
|
|
950
|
+
int rd_kafka_metadata_cache_wait_change(rd_kafka_t *rk, int timeout_ms) {
|
|
951
|
+
int r;
|
|
952
|
+
#if ENABLE_DEVEL
|
|
953
|
+
rd_ts_t ts_start = rd_clock();
|
|
954
|
+
#endif
|
|
955
|
+
mtx_lock(&rk->rk_metadata_cache.rkmc_cnd_lock);
|
|
956
|
+
r = cnd_timedwait_ms(&rk->rk_metadata_cache.rkmc_cnd,
|
|
957
|
+
&rk->rk_metadata_cache.rkmc_cnd_lock, timeout_ms);
|
|
958
|
+
mtx_unlock(&rk->rk_metadata_cache.rkmc_cnd_lock);
|
|
959
|
+
|
|
960
|
+
#if ENABLE_DEVEL
|
|
961
|
+
rd_kafka_dbg(rk, METADATA, "CACHEWAIT", "%s wait took %dms: %s",
|
|
962
|
+
__FUNCTION__, (int)((rd_clock() - ts_start) / 1000),
|
|
963
|
+
r == thrd_success ? "succeeded" : "timed out");
|
|
964
|
+
#endif
|
|
965
|
+
return r == thrd_success;
|
|
966
|
+
}
|
|
967
|
+
|
|
968
|
+
|
|
969
|
+
/**
|
|
970
|
+
* @brief eonce trigger callback for rd_list_apply() call in
|
|
971
|
+
* rd_kafka_metadata_cache_propagate_changes()
|
|
972
|
+
*/
|
|
973
|
+
static int
|
|
974
|
+
rd_kafka_metadata_cache_propagate_changes_trigger_eonce(void *elem,
|
|
975
|
+
void *opaque) {
|
|
976
|
+
rd_kafka_enq_once_t *eonce = elem;
|
|
977
|
+
rd_kafka_enq_once_trigger(eonce, RD_KAFKA_RESP_ERR_NO_ERROR,
|
|
978
|
+
"wait metadata cache change");
|
|
979
|
+
return 0; /* remove eonce from list */
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
|
|
983
|
+
/**
|
|
984
|
+
* @brief Propagate that the cache changed (but not what changed) to
|
|
985
|
+
* any cnd listeners and eonce observers.
|
|
986
|
+
* @locks_required rd_kafka_wrlock(rk)
|
|
987
|
+
* @locks_acquired rkmc_cnd_lock
|
|
988
|
+
* @locality any
|
|
989
|
+
*/
|
|
990
|
+
void rd_kafka_metadata_cache_propagate_changes(rd_kafka_t *rk) {
|
|
991
|
+
mtx_lock(&rk->rk_metadata_cache.rkmc_cnd_lock);
|
|
992
|
+
cnd_broadcast(&rk->rk_metadata_cache.rkmc_cnd);
|
|
993
|
+
mtx_unlock(&rk->rk_metadata_cache.rkmc_cnd_lock);
|
|
994
|
+
|
|
995
|
+
/* Trigger observers */
|
|
996
|
+
rd_list_apply(&rk->rk_metadata_cache.rkmc_observers,
|
|
997
|
+
rd_kafka_metadata_cache_propagate_changes_trigger_eonce,
|
|
998
|
+
NULL);
|
|
999
|
+
}
|
|
1000
|
+
|
|
1001
|
+
/**
|
|
1002
|
+
* @param mdtip If non NULL, it's set to a pointer to internal topic metadata,
|
|
1003
|
+
* or to NULL if not found in cache.
|
|
1004
|
+
* @returns the shared metadata for a topic, or NULL if not found in
|
|
1005
|
+
* cache.
|
|
1006
|
+
*
|
|
1007
|
+
* @locks rd_kafka_*lock()
|
|
1008
|
+
*/
|
|
1009
|
+
const rd_kafka_metadata_topic_t *rd_kafka_metadata_cache_topic_get(
|
|
1010
|
+
rd_kafka_t *rk,
|
|
1011
|
+
const char *topic,
|
|
1012
|
+
const rd_kafka_metadata_topic_internal_t **mdtip,
|
|
1013
|
+
int valid) {
|
|
1014
|
+
struct rd_kafka_metadata_cache_entry *rkmce;
|
|
1015
|
+
|
|
1016
|
+
if (!(rkmce = rd_kafka_metadata_cache_find(rk, topic, valid))) {
|
|
1017
|
+
if (mdtip)
|
|
1018
|
+
*mdtip = NULL;
|
|
1019
|
+
return NULL;
|
|
1020
|
+
}
|
|
1021
|
+
if (mdtip)
|
|
1022
|
+
*mdtip = &rkmce->rkmce_metadata_internal_topic;
|
|
1023
|
+
return &rkmce->rkmce_mtopic;
|
|
1024
|
+
}
|
|
1025
|
+
|
|
1026
|
+
|
|
1027
|
+
|
|
1028
|
+
/**
|
|
1029
|
+
* @brief Looks up the shared metadata for a partition along with its topic.
|
|
1030
|
+
*
|
|
1031
|
+
* Cache entries with errors (such as auth errors) will not be returned unless
|
|
1032
|
+
* \p valid is set to false.
|
|
1033
|
+
*
|
|
1034
|
+
* @param mtopicp: pointer to topic metadata
|
|
1035
|
+
* @param mpartp: pointer to partition metadata
|
|
1036
|
+
* @param mdpip: pointer to internal partition metadata
|
|
1037
|
+
* @param valid: only return valid entries (no hints)
|
|
1038
|
+
*
|
|
1039
|
+
* @returns -1 if topic was not found in cache, 0 if topic was found
|
|
1040
|
+
* but not the partition, 1 if both topic and partition was found.
|
|
1041
|
+
*
|
|
1042
|
+
* @locks rd_kafka_*lock()
|
|
1043
|
+
*/
|
|
1044
|
+
int rd_kafka_metadata_cache_topic_partition_get(
|
|
1045
|
+
rd_kafka_t *rk,
|
|
1046
|
+
const rd_kafka_metadata_topic_t **mtopicp,
|
|
1047
|
+
const rd_kafka_metadata_partition_t **mpartp,
|
|
1048
|
+
const rd_kafka_metadata_partition_internal_t **mdpip,
|
|
1049
|
+
const char *topic,
|
|
1050
|
+
int32_t partition,
|
|
1051
|
+
int valid) {
|
|
1052
|
+
|
|
1053
|
+
const rd_kafka_metadata_topic_t *mtopic;
|
|
1054
|
+
const rd_kafka_metadata_topic_internal_t *mdti;
|
|
1055
|
+
const rd_kafka_metadata_partition_t *mpart;
|
|
1056
|
+
rd_kafka_metadata_partition_t skel = {.id = partition};
|
|
1057
|
+
|
|
1058
|
+
*mtopicp = NULL;
|
|
1059
|
+
*mpartp = NULL;
|
|
1060
|
+
*mdpip = NULL;
|
|
1061
|
+
|
|
1062
|
+
if (!(mtopic =
|
|
1063
|
+
rd_kafka_metadata_cache_topic_get(rk, topic, &mdti, valid)))
|
|
1064
|
+
return -1;
|
|
1065
|
+
|
|
1066
|
+
*mtopicp = mtopic;
|
|
1067
|
+
|
|
1068
|
+
if (mtopic->err)
|
|
1069
|
+
return -1;
|
|
1070
|
+
|
|
1071
|
+
/* Partitions array may be sparse so use bsearch lookup. */
|
|
1072
|
+
mpart = bsearch(&skel, mtopic->partitions, mtopic->partition_cnt,
|
|
1073
|
+
sizeof(*mtopic->partitions),
|
|
1074
|
+
rd_kafka_metadata_partition_id_cmp);
|
|
1075
|
+
|
|
1076
|
+
if (!mpart)
|
|
1077
|
+
return 0;
|
|
1078
|
+
|
|
1079
|
+
*mpartp = mpart;
|
|
1080
|
+
if (mdpip)
|
|
1081
|
+
*mdpip = &mdti->partitions[mpart->id];
|
|
1082
|
+
|
|
1083
|
+
return 1;
|
|
1084
|
+
}
|
|
1085
|
+
|
|
1086
|
+
|
|
1087
|
+
/**
|
|
1088
|
+
* @returns the number of topics in \p topics that are in the cache.
|
|
1089
|
+
*
|
|
1090
|
+
* @param topics rd_list(const char *): topic names
|
|
1091
|
+
* @param metadata_agep: age of oldest entry will be returned.
|
|
1092
|
+
*
|
|
1093
|
+
* @locks rd_kafka_*lock()
|
|
1094
|
+
*/
|
|
1095
|
+
int rd_kafka_metadata_cache_topics_count_exists(rd_kafka_t *rk,
|
|
1096
|
+
const rd_list_t *topics,
|
|
1097
|
+
int *metadata_agep) {
|
|
1098
|
+
const char *topic;
|
|
1099
|
+
int i;
|
|
1100
|
+
int cnt = 0;
|
|
1101
|
+
int max_age = -1;
|
|
1102
|
+
|
|
1103
|
+
RD_LIST_FOREACH(topic, topics, i) {
|
|
1104
|
+
const struct rd_kafka_metadata_cache_entry *rkmce;
|
|
1105
|
+
int age;
|
|
1106
|
+
|
|
1107
|
+
if (!(rkmce = rd_kafka_metadata_cache_find(rk, topic,
|
|
1108
|
+
1 /*valid only*/)))
|
|
1109
|
+
continue;
|
|
1110
|
+
|
|
1111
|
+
age = (int)((rd_clock() - rkmce->rkmce_ts_insert) / 1000);
|
|
1112
|
+
if (age > max_age)
|
|
1113
|
+
max_age = age;
|
|
1114
|
+
cnt++;
|
|
1115
|
+
}
|
|
1116
|
+
|
|
1117
|
+
*metadata_agep = max_age;
|
|
1118
|
+
|
|
1119
|
+
return cnt;
|
|
1120
|
+
}
|
|
1121
|
+
|
|
1122
|
+
|
|
1123
|
+
/**
|
|
1124
|
+
* @brief Add all topics in the metadata cache to \p topics, avoid duplicates.
|
|
1125
|
+
*
|
|
1126
|
+
* Element type is (char *topic_name).
|
|
1127
|
+
*
|
|
1128
|
+
* @param exclude_valid Exclude topics that have up to date metadata info.
|
|
1129
|
+
*
|
|
1130
|
+
* @returns the number of elements added to \p topics
|
|
1131
|
+
*
|
|
1132
|
+
* @locks_required rd_kafka_*lock()
|
|
1133
|
+
*/
|
|
1134
|
+
int rd_kafka_metadata_cache_topics_to_list(rd_kafka_t *rk,
|
|
1135
|
+
rd_list_t *topics,
|
|
1136
|
+
rd_bool_t exclude_valid) {
|
|
1137
|
+
const struct rd_kafka_metadata_cache_entry *rkmce;
|
|
1138
|
+
int precnt = rd_list_cnt(topics);
|
|
1139
|
+
|
|
1140
|
+
TAILQ_FOREACH(rkmce, &rk->rk_metadata_cache.rkmc_expiry, rkmce_link) {
|
|
1141
|
+
/* Ignore topics that have up to date metadata info */
|
|
1142
|
+
if (exclude_valid && RD_KAFKA_METADATA_CACHE_VALID(rkmce))
|
|
1143
|
+
continue;
|
|
1144
|
+
|
|
1145
|
+
if (rd_list_find(topics, rkmce->rkmce_mtopic.topic,
|
|
1146
|
+
rd_list_cmp_str))
|
|
1147
|
+
continue;
|
|
1148
|
+
|
|
1149
|
+
rd_list_add(topics, rd_strdup(rkmce->rkmce_mtopic.topic));
|
|
1150
|
+
}
|
|
1151
|
+
|
|
1152
|
+
return rd_list_cnt(topics) - precnt;
|
|
1153
|
+
}
|
|
1154
|
+
|
|
1155
|
+
|
|
1156
|
+
/**
|
|
1157
|
+
* @brief Dump cache to \p fp
|
|
1158
|
+
*
|
|
1159
|
+
* @locks rd_kafka_*lock()
|
|
1160
|
+
*/
|
|
1161
|
+
void rd_kafka_metadata_cache_dump(FILE *fp, rd_kafka_t *rk) {
|
|
1162
|
+
const struct rd_kafka_metadata_cache *rkmc = &rk->rk_metadata_cache;
|
|
1163
|
+
const struct rd_kafka_metadata_cache_entry *rkmce;
|
|
1164
|
+
rd_ts_t now = rd_clock();
|
|
1165
|
+
|
|
1166
|
+
fprintf(fp, "Metadata cache with %d entries:\n", rkmc->rkmc_cnt);
|
|
1167
|
+
TAILQ_FOREACH(rkmce, &rkmc->rkmc_expiry, rkmce_link) {
|
|
1168
|
+
fprintf(fp,
|
|
1169
|
+
" %s (inserted %dms ago, expires in %dms, "
|
|
1170
|
+
"%d partition(s), %s)%s%s\n",
|
|
1171
|
+
rkmce->rkmce_mtopic.topic,
|
|
1172
|
+
(int)((now - rkmce->rkmce_ts_insert) / 1000),
|
|
1173
|
+
(int)((rkmce->rkmce_ts_expires - now) / 1000),
|
|
1174
|
+
rkmce->rkmce_mtopic.partition_cnt,
|
|
1175
|
+
RD_KAFKA_METADATA_CACHE_VALID(rkmce) ? "valid" : "hint",
|
|
1176
|
+
rkmce->rkmce_mtopic.err ? " error: " : "",
|
|
1177
|
+
rkmce->rkmce_mtopic.err
|
|
1178
|
+
? rd_kafka_err2str(rkmce->rkmce_mtopic.err)
|
|
1179
|
+
: "");
|
|
1180
|
+
}
|
|
1181
|
+
}
|
|
1182
|
+
|
|
1183
|
+
/**@}*/
|