@platformatic/rdkafka 4.0.0
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/.editorconfig +5 -0
- package/.jshintignore +1 -0
- package/.jshintrc +23 -0
- package/CONTRIBUTING.md +237 -0
- package/LICENSE.txt +21 -0
- package/Makefile +94 -0
- package/README.md +630 -0
- package/bench/consumer-raw-rdkafka.js +76 -0
- package/bench/consumer-subscribe.js +77 -0
- package/bench/kafka-consumer-stream.js +100 -0
- package/bench/producer-raw-rdkafka.js +125 -0
- package/bench/producer-rdkafka.js +117 -0
- package/bench/seed.sh +38 -0
- package/binding.gyp +155 -0
- package/ci/checks/librdkafka-correct-version.js +67 -0
- package/ci/checks/librdkafka-exists.js +13 -0
- package/ci/librdkafka-defs-generator.js +193 -0
- package/ci/prepublish.js +3 -0
- package/config.d.ts +1132 -0
- package/configure +15 -0
- package/cpplint.py +6325 -0
- package/deploy.enc +0 -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/.semaphore/project.yml +43 -0
- package/deps/librdkafka/.semaphore/project_public.yml +20 -0
- package/deps/librdkafka/.semaphore/semaphore.yml +355 -0
- package/deps/librdkafka/CHANGELOG.md +1738 -0
- package/deps/librdkafka/CMakeLists.txt +291 -0
- package/deps/librdkafka/CODE_OF_CONDUCT.md +46 -0
- package/deps/librdkafka/CONFIGURATION.md +189 -0
- package/deps/librdkafka/CONTRIBUTING.md +431 -0
- package/deps/librdkafka/Doxyfile +2375 -0
- package/deps/librdkafka/INTRODUCTION.md +2173 -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 +124 -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 +261 -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 +436 -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 +348 -0
- package/deps/librdkafka/examples/kafkatest_verifiable_client.cpp +961 -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 +249 -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 +492 -0
- package/deps/librdkafka/examples/win_ssl_cert_store.cpp +395 -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 +311 -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 +13 -0
- package/deps/librdkafka/packaging/cp/check_features.c +64 -0
- package/deps/librdkafka/packaging/cp/verify-deb.sh +33 -0
- package/deps/librdkafka/packaging/cp/verify-packages.sh +48 -0
- package/deps/librdkafka/packaging/cp/verify-rpm.sh +39 -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/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/run-tests.sh +6 -0
- package/deps/librdkafka/packaging/mingw-w64/semaphoreci-build.sh +38 -0
- package/deps/librdkafka/packaging/mingw-w64/travis-before-install.sh +20 -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/build-configurations-checks.sh +10 -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/style-format.sh +148 -0
- package/deps/librdkafka/service.yml +18 -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 +441 -0
- package/deps/librdkafka/src/rdaddr.c +255 -0
- package/deps/librdkafka/src/rdaddr.h +203 -0
- package/deps/librdkafka/src/rdatomic.h +226 -0
- package/deps/librdkafka/src/rdavg.h +259 -0
- package/deps/librdkafka/src/rdavl.c +210 -0
- package/deps/librdkafka/src/rdavl.h +250 -0
- package/deps/librdkafka/src/rdbase64.c +169 -0
- package/deps/librdkafka/src/rdbase64.h +41 -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 +174 -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 +512 -0
- package/deps/librdkafka/src/rdhttp.h +83 -0
- package/deps/librdkafka/src/rdinterval.h +177 -0
- package/deps/librdkafka/src/rdkafka.c +5351 -0
- package/deps/librdkafka/src/rdkafka.h +10603 -0
- package/deps/librdkafka/src/rdkafka_admin.c +9417 -0
- package/deps/librdkafka/src/rdkafka_admin.h +619 -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 +6186 -0
- package/deps/librdkafka/src/rdkafka_broker.h +686 -0
- package/deps/librdkafka/src/rdkafka_buf.c +540 -0
- package/deps/librdkafka/src/rdkafka_buf.h +1524 -0
- package/deps/librdkafka/src/rdkafka_cert.c +552 -0
- package/deps/librdkafka/src/rdkafka_cert.h +61 -0
- package/deps/librdkafka/src/rdkafka_cgrp.c +7262 -0
- package/deps/librdkafka/src/rdkafka_cgrp.h +443 -0
- package/deps/librdkafka/src/rdkafka_conf.c +4456 -0
- package/deps/librdkafka/src/rdkafka_conf.h +668 -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 +461 -0
- package/deps/librdkafka/src/rdkafka_feature.h +102 -0
- package/deps/librdkafka/src/rdkafka_fetcher.c +1402 -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 +1222 -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 +2124 -0
- package/deps/librdkafka/src/rdkafka_metadata.h +341 -0
- package/deps/librdkafka/src/rdkafka_metadata_cache.c +977 -0
- package/deps/librdkafka/src/rdkafka_mock.c +2885 -0
- package/deps/librdkafka/src/rdkafka_mock.h +491 -0
- package/deps/librdkafka/src/rdkafka_mock_cgrp.c +710 -0
- package/deps/librdkafka/src/rdkafka_mock_handlers.c +2817 -0
- package/deps/librdkafka/src/rdkafka_mock_int.h +591 -0
- package/deps/librdkafka/src/rdkafka_msg.c +2573 -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 +1470 -0
- package/deps/librdkafka/src/rdkafka_offset.c +1537 -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 +834 -0
- package/deps/librdkafka/src/rdkafka_partition.c +4801 -0
- package/deps/librdkafka/src/rdkafka_partition.h +1173 -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 +733 -0
- package/deps/librdkafka/src/rdkafka_protocol.h +127 -0
- package/deps/librdkafka/src/rdkafka_queue.c +1153 -0
- package/deps/librdkafka/src/rdkafka_queue.h +1201 -0
- package/deps/librdkafka/src/rdkafka_range_assignor.c +1748 -0
- package/deps/librdkafka/src/rdkafka_request.c +6817 -0
- package/deps/librdkafka/src/rdkafka_request.h +709 -0
- package/deps/librdkafka/src/rdkafka_roundrobin_assignor.c +123 -0
- package/deps/librdkafka/src/rdkafka_sasl.c +528 -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 +1829 -0
- package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.h +52 -0
- package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.c +589 -0
- package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.h +37 -0
- package/deps/librdkafka/src/rdkafka_sasl_plain.c +142 -0
- package/deps/librdkafka/src/rdkafka_sasl_scram.c +857 -0
- package/deps/librdkafka/src/rdkafka_sasl_win32.c +550 -0
- package/deps/librdkafka/src/rdkafka_ssl.c +1904 -0
- package/deps/librdkafka/src/rdkafka_ssl.h +64 -0
- package/deps/librdkafka/src/rdkafka_sticky_assignor.c +4781 -0
- package/deps/librdkafka/src/rdkafka_subscription.c +278 -0
- package/deps/librdkafka/src/rdkafka_telemetry.c +703 -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 +993 -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 +2078 -0
- package/deps/librdkafka/src/rdkafka_topic.h +328 -0
- package/deps/librdkafka/src/rdkafka_transport.c +1297 -0
- package/deps/librdkafka/src/rdkafka_transport.h +94 -0
- package/deps/librdkafka/src/rdkafka_transport_int.h +100 -0
- package/deps/librdkafka/src/rdkafka_txnmgr.c +3251 -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 +503 -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 +70 -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 +325 -0
- package/deps/librdkafka/src/rdtypes.h +86 -0
- package/deps/librdkafka/src/rdunittest.c +532 -0
- package/deps/librdkafka/src/rdunittest.h +230 -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 +1347 -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 +175 -0
- package/deps/librdkafka/src/tinycthread_extra.h +208 -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 +3771 -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 +98 -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 +867 -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 +96 -0
- package/deps/librdkafka/tests/0011-produce_batch.c +752 -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 +166 -0
- package/deps/librdkafka/tests/0017-compression.c +142 -0
- package/deps/librdkafka/tests/0018-cgrp_term.c +333 -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 +71 -0
- package/deps/librdkafka/tests/0022-consume_batch.c +276 -0
- package/deps/librdkafka/tests/0025-timers.c +147 -0
- package/deps/librdkafka/tests/0026-consume_pause.c +549 -0
- package/deps/librdkafka/tests/0028-long_topicnames.c +79 -0
- package/deps/librdkafka/tests/0029-assign_offset.c +204 -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 +520 -0
- package/deps/librdkafka/tests/0034-offset_reset.c +377 -0
- package/deps/librdkafka/tests/0035-api_version.c +73 -0
- package/deps/librdkafka/tests/0036-partial_fetch.c +86 -0
- package/deps/librdkafka/tests/0037-destroy_hang_local.c +85 -0
- package/deps/librdkafka/tests/0038-performance.c +120 -0
- package/deps/librdkafka/tests/0039-event.c +284 -0
- package/deps/librdkafka/tests/0040-io_event.c +251 -0
- package/deps/librdkafka/tests/0041-fetch_max_bytes.c +96 -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 +93 -0
- package/deps/librdkafka/tests/0045-subscribe_update.c +746 -0
- package/deps/librdkafka/tests/0046-rkt_cache.c +65 -0
- package/deps/librdkafka/tests/0047-partial_buf_tmout.c +97 -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 +144 -0
- package/deps/librdkafka/tests/0051-assign_adds.c +125 -0
- package/deps/librdkafka/tests/0052-msg_timestamps.c +220 -0
- package/deps/librdkafka/tests/0053-stats_cb.cpp +535 -0
- package/deps/librdkafka/tests/0054-offset_time.cpp +236 -0
- package/deps/librdkafka/tests/0055-producer_latency.c +366 -0
- package/deps/librdkafka/tests/0056-balanced_group_mt.c +311 -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 +237 -0
- package/deps/librdkafka/tests/0060-op_prio.cpp +163 -0
- package/deps/librdkafka/tests/0061-consumer_lag.cpp +275 -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 +148 -0
- package/deps/librdkafka/tests/0068-produce_timeout.c +138 -0
- package/deps/librdkafka/tests/0069-consumer_add_parts.c +123 -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 +253 -0
- package/deps/librdkafka/tests/0076-produce_retry.c +450 -0
- package/deps/librdkafka/tests/0077-compaction.c +357 -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 +3065 -0
- package/deps/librdkafka/tests/0081-admin.c +5333 -0
- package/deps/librdkafka/tests/0082-fetch_max_bytes.cpp +133 -0
- package/deps/librdkafka/tests/0083-cb_event.c +228 -0
- package/deps/librdkafka/tests/0084-destroy_flags.c +212 -0
- package/deps/librdkafka/tests/0085-headers.cpp +388 -0
- package/deps/librdkafka/tests/0086-purge.c +335 -0
- package/deps/librdkafka/tests/0088-produce_metadata_timeout.c +162 -0
- package/deps/librdkafka/tests/0089-max_poll_interval.c +506 -0
- package/deps/librdkafka/tests/0090-idempotence.c +172 -0
- package/deps/librdkafka/tests/0091-max_poll_interval_timeout.c +297 -0
- package/deps/librdkafka/tests/0092-mixed_msgver.c +97 -0
- package/deps/librdkafka/tests/0093-holb.c +197 -0
- package/deps/librdkafka/tests/0094-idempotence_msg_timeout.c +230 -0
- package/deps/librdkafka/tests/0095-all_brokers_down.cpp +122 -0
- package/deps/librdkafka/tests/0097-ssl_verify.cpp +466 -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 +535 -0
- package/deps/librdkafka/tests/0103-transactions.c +1383 -0
- package/deps/librdkafka/tests/0104-fetch_from_follower_mock.c +624 -0
- package/deps/librdkafka/tests/0105-transactions_mock.c +3923 -0
- package/deps/librdkafka/tests/0106-cgrp_sess_timeout.c +297 -0
- package/deps/librdkafka/tests/0107-topic_recreate.c +259 -0
- package/deps/librdkafka/tests/0109-auto_create_topics.cpp +218 -0
- package/deps/librdkafka/tests/0110-batch_size.cpp +183 -0
- package/deps/librdkafka/tests/0111-delay_create_topics.cpp +127 -0
- package/deps/librdkafka/tests/0112-assign_unknown_part.c +98 -0
- package/deps/librdkafka/tests/0113-cooperative_rebalance.cpp +3329 -0
- package/deps/librdkafka/tests/0114-sticky_partitioning.cpp +176 -0
- package/deps/librdkafka/tests/0115-producer_auth.cpp +179 -0
- package/deps/librdkafka/tests/0116-kafkaconsumer_close.cpp +214 -0
- package/deps/librdkafka/tests/0117-mock_errors.c +321 -0
- package/deps/librdkafka/tests/0118-commit_rebalance.c +121 -0
- package/deps/librdkafka/tests/0119-consumer_auth.cpp +148 -0
- package/deps/librdkafka/tests/0120-asymmetric_subscription.c +180 -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 +213 -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 +78 -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 +171 -0
- package/deps/librdkafka/tests/0133-ssl_keys.c +128 -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 +609 -0
- package/deps/librdkafka/tests/0138-admin_mock.c +281 -0
- package/deps/librdkafka/tests/0139-offset_validation_mock.c +442 -0
- package/deps/librdkafka/tests/0140-commit_metadata.cpp +108 -0
- package/deps/librdkafka/tests/0142-reauthentication.c +495 -0
- package/deps/librdkafka/tests/0143-exponential_backoff_mock.c +553 -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 +444 -0
- package/deps/librdkafka/tests/0150-telemetry_mock.c +648 -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 +164 -0
- package/deps/librdkafka/tests/LibrdkafkaTestApp.py +266 -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/ssl/Makefile +8 -0
- package/deps/librdkafka/tests/fixtures/ssl/README.md +13 -0
- package/deps/librdkafka/tests/fixtures/ssl/client.keystore.p12 +0 -0
- package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.pem +109 -0
- package/deps/librdkafka/tests/fixtures/ssl/client2.key +34 -0
- package/deps/librdkafka/tests/fixtures/ssl/create_keys.sh +93 -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 +12 -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-consumer-tests.sh +16 -0
- package/deps/librdkafka/tests/run-producer-tests.sh +16 -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 +7318 -0
- package/deps/librdkafka/tests/test.conf.example +27 -0
- package/deps/librdkafka/tests/test.h +979 -0
- package/deps/librdkafka/tests/testcpp.cpp +126 -0
- package/deps/librdkafka/tests/testcpp.h +360 -0
- package/deps/librdkafka/tests/testshared.h +402 -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/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/install-openssl.ps1 +33 -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 +31 -0
- package/deps/librdkafka/win32/setup-vcpkg.ps1 +12 -0
- package/deps/librdkafka/win32/tests/test.conf.example +25 -0
- package/deps/librdkafka/win32/tests/tests.vcxproj +247 -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 +100 -0
- package/deps/librdkafka/win32/wintime.h +33 -0
- package/deps/librdkafka.gyp +62 -0
- package/deps/windows-install.py +73 -0
- package/docker-compose.yml +23 -0
- package/e2e/admin.spec.js +187 -0
- package/e2e/both.spec.js +726 -0
- package/e2e/consumer.spec.js +386 -0
- package/e2e/groups.spec.js +132 -0
- package/e2e/listener.js +51 -0
- package/e2e/producer-transaction.spec.js +333 -0
- package/e2e/producer.spec.js +283 -0
- package/errors.d.ts +347 -0
- package/examples/consumer-flow.md +76 -0
- package/examples/consumer.md +45 -0
- package/examples/docker-alpine.md +30 -0
- package/examples/high-level-producer.md +32 -0
- package/examples/metadata.md +27 -0
- package/examples/oauthbearer-default-flow.md +80 -0
- package/examples/producer-cluster.md +103 -0
- package/examples/producer.md +73 -0
- package/index.d.ts +357 -0
- package/lib/admin.js +233 -0
- package/lib/client.js +578 -0
- package/lib/error.js +472 -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/librdkafka.js +12 -0
- package/make_docs.sh +59 -0
- package/package.json +53 -0
- package/renovate.json +30 -0
- package/run_docker.sh +42 -0
- package/src/admin.cc +624 -0
- package/src/admin.h +78 -0
- package/src/binding.cc +73 -0
- package/src/binding.h +25 -0
- package/src/callbacks.cc +614 -0
- package/src/callbacks.h +265 -0
- package/src/common.cc +582 -0
- package/src/common.h +134 -0
- package/src/config.cc +167 -0
- package/src/config.h +45 -0
- package/src/connection.cc +482 -0
- package/src/connection.h +108 -0
- package/src/errors.cc +96 -0
- package/src/errors.h +53 -0
- package/src/kafka-consumer.cc +1457 -0
- package/src/kafka-consumer.h +136 -0
- package/src/per-isolate-data.cc +57 -0
- package/src/per-isolate-data.h +39 -0
- package/src/producer.cc +873 -0
- package/src/producer.h +125 -0
- package/src/topic.cc +180 -0
- package/src/topic.h +56 -0
- package/src/workers.cc +1245 -0
- package/src/workers.h +511 -0
- package/test/binding.spec.js +66 -0
- package/test/consumer.spec.js +91 -0
- package/test/error.spec.js +8 -0
- package/test/index.spec.js +8 -0
- package/test/kafka-consumer-stream.spec.js +298 -0
- package/test/kafka-consumer-worker.js +51 -0
- package/test/kafka-consumer.spec.js +86 -0
- package/test/mocha.opts +1 -0
- package/test/mock.js +55 -0
- package/test/producer/high-level-producer.spec.js +496 -0
- package/test/producer-stream.spec.js +723 -0
- package/test/producer-worker.js +53 -0
- package/test/producer.spec.js +120 -0
- package/test/tools/ref-counter.spec.js +53 -0
- package/test/topic-partition.spec.js +104 -0
- package/test/util.spec.js +46 -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
- package/win_install.ps1 +2 -0
|
@@ -0,0 +1,977 @@
|
|
|
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
|
+
/**
|
|
257
|
+
* @brief Add (and replace) cache entry for topic.
|
|
258
|
+
*
|
|
259
|
+
* This makes a copy of \p topic
|
|
260
|
+
*
|
|
261
|
+
* @locks_required rd_kafka_wrlock()
|
|
262
|
+
*/
|
|
263
|
+
static struct rd_kafka_metadata_cache_entry *rd_kafka_metadata_cache_insert(
|
|
264
|
+
rd_kafka_t *rk,
|
|
265
|
+
const rd_kafka_metadata_topic_t *mtopic,
|
|
266
|
+
const rd_kafka_metadata_topic_internal_t *metadata_internal_topic,
|
|
267
|
+
rd_ts_t now,
|
|
268
|
+
rd_ts_t ts_expires,
|
|
269
|
+
rd_bool_t include_racks,
|
|
270
|
+
rd_kafka_metadata_broker_internal_t *brokers_internal,
|
|
271
|
+
size_t broker_cnt) {
|
|
272
|
+
struct rd_kafka_metadata_cache_entry *rkmce, *old, *old_by_id = NULL;
|
|
273
|
+
rd_tmpabuf_t tbuf;
|
|
274
|
+
int i;
|
|
275
|
+
|
|
276
|
+
/* Metadata is stored in one contigious buffer where structs and
|
|
277
|
+
* and pointed-to fields are layed out in a memory aligned fashion.
|
|
278
|
+
* rd_tmpabuf_t provides the infrastructure to do this.
|
|
279
|
+
* Because of this we copy all the structs verbatim but
|
|
280
|
+
* any pointer fields needs to be copied explicitly to update
|
|
281
|
+
* the pointer address.
|
|
282
|
+
* See also rd_kafka_metadata_cache_delete which frees this. */
|
|
283
|
+
rd_tmpabuf_new(&tbuf, 0, rd_true /*assert on fail*/);
|
|
284
|
+
|
|
285
|
+
rd_tmpabuf_add_alloc(&tbuf, sizeof(*rkmce));
|
|
286
|
+
rd_tmpabuf_add_alloc(&tbuf, strlen(mtopic->topic) + 1);
|
|
287
|
+
rd_tmpabuf_add_alloc(&tbuf, mtopic->partition_cnt *
|
|
288
|
+
sizeof(*mtopic->partitions));
|
|
289
|
+
rd_tmpabuf_add_alloc(&tbuf,
|
|
290
|
+
mtopic->partition_cnt *
|
|
291
|
+
sizeof(*metadata_internal_topic->partitions));
|
|
292
|
+
|
|
293
|
+
for (i = 0; include_racks && i < mtopic->partition_cnt; i++) {
|
|
294
|
+
size_t j;
|
|
295
|
+
rd_tmpabuf_add_alloc(
|
|
296
|
+
&tbuf, metadata_internal_topic->partitions[i].racks_cnt *
|
|
297
|
+
sizeof(char *));
|
|
298
|
+
for (j = 0;
|
|
299
|
+
j < metadata_internal_topic->partitions[i].racks_cnt;
|
|
300
|
+
j++) {
|
|
301
|
+
rd_tmpabuf_add_alloc(
|
|
302
|
+
&tbuf, strlen(metadata_internal_topic->partitions[i]
|
|
303
|
+
.racks[j]) +
|
|
304
|
+
1);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
rd_tmpabuf_finalize(&tbuf);
|
|
309
|
+
|
|
310
|
+
rkmce = rd_tmpabuf_alloc(&tbuf, sizeof(*rkmce));
|
|
311
|
+
|
|
312
|
+
rkmce->rkmce_mtopic = *mtopic;
|
|
313
|
+
|
|
314
|
+
rkmce->rkmce_metadata_internal_topic = *metadata_internal_topic;
|
|
315
|
+
|
|
316
|
+
/* Copy topic name and update pointer */
|
|
317
|
+
rkmce->rkmce_mtopic.topic = rd_tmpabuf_write_str(&tbuf, mtopic->topic);
|
|
318
|
+
|
|
319
|
+
/* Copy partition array and update pointer */
|
|
320
|
+
rkmce->rkmce_mtopic.partitions = rd_tmpabuf_write(
|
|
321
|
+
&tbuf, mtopic->partitions,
|
|
322
|
+
mtopic->partition_cnt * sizeof(*mtopic->partitions));
|
|
323
|
+
|
|
324
|
+
/* Copy partition array (internal) and update pointer */
|
|
325
|
+
rkmce->rkmce_metadata_internal_topic.partitions =
|
|
326
|
+
rd_tmpabuf_write(&tbuf, metadata_internal_topic->partitions,
|
|
327
|
+
mtopic->partition_cnt *
|
|
328
|
+
sizeof(*metadata_internal_topic->partitions));
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
/* Sort partitions for future bsearch() lookups. */
|
|
332
|
+
qsort(rkmce->rkmce_mtopic.partitions, rkmce->rkmce_mtopic.partition_cnt,
|
|
333
|
+
sizeof(*rkmce->rkmce_mtopic.partitions),
|
|
334
|
+
rd_kafka_metadata_partition_id_cmp);
|
|
335
|
+
|
|
336
|
+
/* partitions (internal) are already sorted. */
|
|
337
|
+
|
|
338
|
+
if (include_racks) {
|
|
339
|
+
for (i = 0; i < rkmce->rkmce_mtopic.partition_cnt; i++) {
|
|
340
|
+
size_t j;
|
|
341
|
+
rd_kafka_metadata_partition_t *mdp =
|
|
342
|
+
&rkmce->rkmce_mtopic.partitions[i];
|
|
343
|
+
rd_kafka_metadata_partition_internal_t *mdpi =
|
|
344
|
+
&rkmce->rkmce_metadata_internal_topic.partitions[i];
|
|
345
|
+
rd_kafka_metadata_partition_internal_t *mdpi_orig =
|
|
346
|
+
&metadata_internal_topic->partitions[i];
|
|
347
|
+
|
|
348
|
+
if (mdp->replica_cnt == 0 || mdpi->racks_cnt == 0)
|
|
349
|
+
continue;
|
|
350
|
+
|
|
351
|
+
mdpi->racks = rd_tmpabuf_alloc(
|
|
352
|
+
&tbuf, sizeof(char *) * mdpi->racks_cnt);
|
|
353
|
+
for (j = 0; j < mdpi_orig->racks_cnt; j++)
|
|
354
|
+
mdpi->racks[j] = rd_tmpabuf_write_str(
|
|
355
|
+
&tbuf, mdpi_orig->racks[j]);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/* Clear uncached fields. */
|
|
360
|
+
for (i = 0; i < mtopic->partition_cnt; i++) {
|
|
361
|
+
rkmce->rkmce_mtopic.partitions[i].replicas = NULL;
|
|
362
|
+
rkmce->rkmce_mtopic.partitions[i].replica_cnt = 0;
|
|
363
|
+
rkmce->rkmce_mtopic.partitions[i].isrs = NULL;
|
|
364
|
+
rkmce->rkmce_mtopic.partitions[i].isr_cnt = 0;
|
|
365
|
+
}
|
|
366
|
+
TAILQ_INSERT_TAIL(&rk->rk_metadata_cache.rkmc_expiry, rkmce,
|
|
367
|
+
rkmce_link);
|
|
368
|
+
rk->rk_metadata_cache.rkmc_cnt++;
|
|
369
|
+
rkmce->rkmce_ts_expires = ts_expires;
|
|
370
|
+
rkmce->rkmce_ts_insert = now;
|
|
371
|
+
|
|
372
|
+
/* Insert (and replace existing) entry. */
|
|
373
|
+
old = RD_AVL_INSERT(&rk->rk_metadata_cache.rkmc_avl, rkmce,
|
|
374
|
+
rkmce_avlnode);
|
|
375
|
+
/* Insert (and replace existing) entry into the AVL tree sorted
|
|
376
|
+
* by topic id. */
|
|
377
|
+
if (!RD_KAFKA_UUID_IS_ZERO(
|
|
378
|
+
rkmce->rkmce_metadata_internal_topic.topic_id)) {
|
|
379
|
+
/* If topic id isn't zero insert cache entry into this tree */
|
|
380
|
+
old_by_id = RD_AVL_INSERT(&rk->rk_metadata_cache.rkmc_avl_by_id,
|
|
381
|
+
rkmce, rkmce_avlnode_by_id);
|
|
382
|
+
} else if (old && !RD_KAFKA_UUID_IS_ZERO(
|
|
383
|
+
old->rkmce_metadata_internal_topic.topic_id)) {
|
|
384
|
+
/* If it had a topic id, remove it from the tree */
|
|
385
|
+
RD_AVL_REMOVE_ELM(&rk->rk_metadata_cache.rkmc_avl_by_id, old);
|
|
386
|
+
}
|
|
387
|
+
if (old) {
|
|
388
|
+
/* Delete and free old cache entry */
|
|
389
|
+
rd_kafka_metadata_cache_delete(rk, old, 0);
|
|
390
|
+
}
|
|
391
|
+
if (old_by_id && old_by_id != old) {
|
|
392
|
+
/* If there was a different cache entry in this tree,
|
|
393
|
+
* remove and free it. */
|
|
394
|
+
RD_AVL_REMOVE_ELM(&rk->rk_metadata_cache.rkmc_avl, old_by_id);
|
|
395
|
+
rd_kafka_metadata_cache_delete(rk, old_by_id, 0);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/* Explicitly not freeing the tmpabuf since rkmce points to its
|
|
399
|
+
* memory. */
|
|
400
|
+
return rkmce;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* @brief Purge the metadata cache
|
|
406
|
+
*
|
|
407
|
+
* @locks_required rd_kafka_wrlock()
|
|
408
|
+
*/
|
|
409
|
+
void rd_kafka_metadata_cache_purge(rd_kafka_t *rk, rd_bool_t purge_observers) {
|
|
410
|
+
struct rd_kafka_metadata_cache_entry *rkmce;
|
|
411
|
+
int was_empty = TAILQ_EMPTY(&rk->rk_metadata_cache.rkmc_expiry);
|
|
412
|
+
|
|
413
|
+
while ((rkmce = TAILQ_FIRST(&rk->rk_metadata_cache.rkmc_expiry)))
|
|
414
|
+
rd_kafka_metadata_cache_delete(rk, rkmce, 1);
|
|
415
|
+
|
|
416
|
+
rd_kafka_timer_stop(&rk->rk_timers,
|
|
417
|
+
&rk->rk_metadata_cache.rkmc_expiry_tmr, 1);
|
|
418
|
+
|
|
419
|
+
if (!was_empty)
|
|
420
|
+
rd_kafka_metadata_cache_propagate_changes(rk);
|
|
421
|
+
|
|
422
|
+
if (purge_observers)
|
|
423
|
+
rd_list_clear(&rk->rk_metadata_cache.rkmc_observers);
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
|
|
427
|
+
/**
|
|
428
|
+
* @brief Start or update the cache expiry timer.
|
|
429
|
+
* Typically done after a series of cache_topic_update()
|
|
430
|
+
*
|
|
431
|
+
* @locks rd_kafka_wrlock()
|
|
432
|
+
*/
|
|
433
|
+
void rd_kafka_metadata_cache_expiry_start(rd_kafka_t *rk) {
|
|
434
|
+
struct rd_kafka_metadata_cache_entry *rkmce;
|
|
435
|
+
|
|
436
|
+
if ((rkmce = TAILQ_FIRST(&rk->rk_metadata_cache.rkmc_expiry)))
|
|
437
|
+
rd_kafka_timer_start(&rk->rk_timers,
|
|
438
|
+
&rk->rk_metadata_cache.rkmc_expiry_tmr,
|
|
439
|
+
rkmce->rkmce_ts_expires - rd_clock(),
|
|
440
|
+
rd_kafka_metadata_cache_evict_tmr_cb, rk);
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
/**
|
|
444
|
+
* @brief Update the metadata cache for a single topic
|
|
445
|
+
* with the provided metadata.
|
|
446
|
+
*
|
|
447
|
+
* If the topic has a temporary error the existing entry is removed
|
|
448
|
+
* and no new entry is added, which avoids the topic to be
|
|
449
|
+
* suppressed in upcoming metadata requests because being in the cache.
|
|
450
|
+
* In other words: we want to re-query errored topics.
|
|
451
|
+
* If the broker reports ERR_UNKNOWN_TOPIC_OR_PART we add a negative cache
|
|
452
|
+
* entry with an low expiry time, this is so that client code (cgrp) knows
|
|
453
|
+
* the topic has been queried but did not exist, otherwise it would wait
|
|
454
|
+
* forever for the unknown topic to surface.
|
|
455
|
+
*
|
|
456
|
+
* For permanent errors (authorization failures), we keep
|
|
457
|
+
* the entry cached for metadata.max.age.ms.
|
|
458
|
+
*
|
|
459
|
+
* @param only_existing Update only existing metadata cache entries,
|
|
460
|
+
* either valid or hinted.
|
|
461
|
+
*
|
|
462
|
+
* @return 1 on metadata change, 0 when no change was applied
|
|
463
|
+
*
|
|
464
|
+
* @remark The cache expiry timer will not be updated/started,
|
|
465
|
+
* call rd_kafka_metadata_cache_expiry_start() instead.
|
|
466
|
+
*
|
|
467
|
+
* @locks rd_kafka_wrlock()
|
|
468
|
+
*/
|
|
469
|
+
int rd_kafka_metadata_cache_topic_update(
|
|
470
|
+
rd_kafka_t *rk,
|
|
471
|
+
const rd_kafka_metadata_topic_t *mdt,
|
|
472
|
+
const rd_kafka_metadata_topic_internal_t *mdit,
|
|
473
|
+
rd_bool_t propagate,
|
|
474
|
+
rd_bool_t include_racks,
|
|
475
|
+
rd_kafka_metadata_broker_internal_t *brokers,
|
|
476
|
+
size_t broker_cnt,
|
|
477
|
+
rd_bool_t only_existing) {
|
|
478
|
+
struct rd_kafka_metadata_cache_entry *rkmce = NULL;
|
|
479
|
+
rd_ts_t now = rd_clock();
|
|
480
|
+
rd_ts_t ts_expires = now + (rk->rk_conf.metadata_max_age_ms * 1000);
|
|
481
|
+
int changed = 1;
|
|
482
|
+
if (only_existing) {
|
|
483
|
+
if (likely(mdt->topic != NULL)) {
|
|
484
|
+
rkmce = rd_kafka_metadata_cache_find(rk, mdt->topic, 0);
|
|
485
|
+
} else {
|
|
486
|
+
rkmce = rd_kafka_metadata_cache_find_by_id(
|
|
487
|
+
rk, mdit->topic_id, 1);
|
|
488
|
+
}
|
|
489
|
+
if (!rkmce)
|
|
490
|
+
return 0;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
if (likely(mdt->topic != NULL)) {
|
|
494
|
+
/* Cache unknown topics for a short while (100ms) to allow the
|
|
495
|
+
* cgrp logic to find negative cache hits. */
|
|
496
|
+
if (mdt->err == RD_KAFKA_RESP_ERR_UNKNOWN_TOPIC_OR_PART)
|
|
497
|
+
ts_expires = RD_MIN(ts_expires, now + (100 * 1000));
|
|
498
|
+
|
|
499
|
+
if (!mdt->err ||
|
|
500
|
+
mdt->err == RD_KAFKA_RESP_ERR_TOPIC_AUTHORIZATION_FAILED ||
|
|
501
|
+
mdt->err == RD_KAFKA_RESP_ERR_UNKNOWN_TOPIC_OR_PART)
|
|
502
|
+
rd_kafka_metadata_cache_insert(
|
|
503
|
+
rk, mdt, mdit, now, ts_expires, include_racks,
|
|
504
|
+
brokers, broker_cnt);
|
|
505
|
+
else
|
|
506
|
+
changed = rd_kafka_metadata_cache_delete_by_name(
|
|
507
|
+
rk, mdt->topic);
|
|
508
|
+
} else {
|
|
509
|
+
/* Cache entry found but no topic name:
|
|
510
|
+
* delete it. */
|
|
511
|
+
changed = rd_kafka_metadata_cache_delete_by_topic_id(
|
|
512
|
+
rk, mdit->topic_id);
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
if (changed && propagate)
|
|
516
|
+
rd_kafka_metadata_cache_propagate_changes(rk);
|
|
517
|
+
|
|
518
|
+
return changed;
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
|
|
522
|
+
/**
|
|
523
|
+
* @brief Remove cache hints for topics in \p topics
|
|
524
|
+
* This is done when the Metadata response has been parsed and
|
|
525
|
+
* replaced hints with existing topic information, thus this will
|
|
526
|
+
* only remove unmatched topics from the cache.
|
|
527
|
+
*
|
|
528
|
+
* @locks rd_kafka_wrlock()
|
|
529
|
+
*/
|
|
530
|
+
void rd_kafka_metadata_cache_purge_hints(rd_kafka_t *rk,
|
|
531
|
+
const rd_list_t *topics) {
|
|
532
|
+
const char *topic;
|
|
533
|
+
int i;
|
|
534
|
+
int cnt = 0;
|
|
535
|
+
|
|
536
|
+
RD_LIST_FOREACH(topic, topics, i) {
|
|
537
|
+
struct rd_kafka_metadata_cache_entry *rkmce;
|
|
538
|
+
|
|
539
|
+
if (!(rkmce =
|
|
540
|
+
rd_kafka_metadata_cache_find(rk, topic, 0 /*any*/)) ||
|
|
541
|
+
RD_KAFKA_METADATA_CACHE_VALID(rkmce))
|
|
542
|
+
continue;
|
|
543
|
+
|
|
544
|
+
rd_kafka_metadata_cache_delete(rk, rkmce, 1 /*unlink avl*/);
|
|
545
|
+
cnt++;
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
if (cnt > 0) {
|
|
549
|
+
rd_kafka_dbg(rk, METADATA, "METADATA",
|
|
550
|
+
"Purged %d/%d cached topic hint(s)", cnt,
|
|
551
|
+
rd_list_cnt(topics));
|
|
552
|
+
rd_kafka_metadata_cache_propagate_changes(rk);
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
/**
|
|
557
|
+
* @brief Remove cache hints for topic ids in \p topic_ids
|
|
558
|
+
* This is done when the Metadata response has been parsed and
|
|
559
|
+
* replaced hints with existing topic information, thus this will
|
|
560
|
+
* only remove unmatched topics from the cache.
|
|
561
|
+
*
|
|
562
|
+
* @locks rd_kafka_wrlock()
|
|
563
|
+
*/
|
|
564
|
+
void rd_kafka_metadata_cache_purge_hints_by_id(rd_kafka_t *rk,
|
|
565
|
+
const rd_list_t *topic_ids) {
|
|
566
|
+
const rd_kafka_Uuid_t *topic_id;
|
|
567
|
+
int i;
|
|
568
|
+
int cnt = 0;
|
|
569
|
+
|
|
570
|
+
RD_LIST_FOREACH(topic_id, topic_ids, i) {
|
|
571
|
+
struct rd_kafka_metadata_cache_entry *rkmce;
|
|
572
|
+
|
|
573
|
+
if (!(rkmce = rd_kafka_metadata_cache_find_by_id(rk, *topic_id,
|
|
574
|
+
0 /*any*/)) ||
|
|
575
|
+
RD_KAFKA_METADATA_CACHE_VALID(rkmce))
|
|
576
|
+
continue;
|
|
577
|
+
|
|
578
|
+
rd_kafka_metadata_cache_delete(rk, rkmce, 1 /*unlink avl*/);
|
|
579
|
+
cnt++;
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
if (cnt > 0) {
|
|
583
|
+
rd_kafka_dbg(rk, METADATA, "METADATA",
|
|
584
|
+
"Purged %d/%d cached topic hint(s)", cnt,
|
|
585
|
+
rd_list_cnt(topic_ids));
|
|
586
|
+
rd_kafka_metadata_cache_propagate_changes(rk);
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
|
|
591
|
+
/**
|
|
592
|
+
* @brief Inserts a non-valid entry for topics in \p topics indicating
|
|
593
|
+
* that a MetadataRequest is in progress.
|
|
594
|
+
* This avoids sending multiple MetadataRequests for the same topics
|
|
595
|
+
* if there are already outstanding requests, see
|
|
596
|
+
* \c rd_kafka_metadata_refresh_topics().
|
|
597
|
+
*
|
|
598
|
+
* @remark These non-valid cache entries' expire time is set to the
|
|
599
|
+
* MetadataRequest timeout.
|
|
600
|
+
*
|
|
601
|
+
* @param dst rd_list_t(char *topicname): if not NULL: populated with
|
|
602
|
+
* topics that were added as hints to cache, e.q., topics to query.
|
|
603
|
+
* @param dst rd_list_t(char *topicname)
|
|
604
|
+
* @param err is the error to set on hint cache entries,
|
|
605
|
+
* typically ERR__WAIT_CACHE.
|
|
606
|
+
* @param replace replace existing valid entries
|
|
607
|
+
*
|
|
608
|
+
* @returns the number of topic hints inserted.
|
|
609
|
+
*
|
|
610
|
+
* @locks_required rd_kafka_wrlock()
|
|
611
|
+
*/
|
|
612
|
+
int rd_kafka_metadata_cache_hint(rd_kafka_t *rk,
|
|
613
|
+
const rd_list_t *topics,
|
|
614
|
+
rd_list_t *dst,
|
|
615
|
+
rd_kafka_resp_err_t err,
|
|
616
|
+
rd_bool_t replace) {
|
|
617
|
+
const char *topic;
|
|
618
|
+
rd_ts_t now = rd_clock();
|
|
619
|
+
rd_ts_t ts_expires = now + (rk->rk_conf.socket_timeout_ms * 1000);
|
|
620
|
+
int i;
|
|
621
|
+
int cnt = 0;
|
|
622
|
+
|
|
623
|
+
RD_LIST_FOREACH(topic, topics, i) {
|
|
624
|
+
rd_kafka_metadata_topic_t mtopic = {.topic = (char *)topic,
|
|
625
|
+
.err = err};
|
|
626
|
+
rd_kafka_metadata_topic_internal_t metadata_internal_topic =
|
|
627
|
+
RD_ZERO_INIT;
|
|
628
|
+
/*const*/ struct rd_kafka_metadata_cache_entry *rkmce;
|
|
629
|
+
|
|
630
|
+
/* !replace: Dont overwrite valid entries */
|
|
631
|
+
if (!replace && (rkmce = rd_kafka_metadata_cache_find(
|
|
632
|
+
rk, topic, 0 /*any*/))) {
|
|
633
|
+
if (RD_KAFKA_METADATA_CACHE_VALID(rkmce) ||
|
|
634
|
+
(dst && rkmce->rkmce_mtopic.err !=
|
|
635
|
+
RD_KAFKA_RESP_ERR__NOENT))
|
|
636
|
+
continue;
|
|
637
|
+
rkmce->rkmce_mtopic.err = err;
|
|
638
|
+
/* FALLTHRU */
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
rd_kafka_metadata_cache_insert(rk, &mtopic,
|
|
642
|
+
&metadata_internal_topic, now,
|
|
643
|
+
ts_expires, rd_false, NULL, 0);
|
|
644
|
+
cnt++;
|
|
645
|
+
|
|
646
|
+
if (dst)
|
|
647
|
+
rd_list_add(dst, rd_strdup(topic));
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
if (cnt > 0)
|
|
651
|
+
rd_kafka_dbg(rk, METADATA, "METADATA",
|
|
652
|
+
"Hinted cache of %d/%d topic(s) being queried",
|
|
653
|
+
cnt, rd_list_cnt(topics));
|
|
654
|
+
|
|
655
|
+
return cnt;
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
|
|
659
|
+
/**
|
|
660
|
+
* @brief Same as rd_kafka_metadata_cache_hint() but takes
|
|
661
|
+
* a topic+partition list as input instead.
|
|
662
|
+
*
|
|
663
|
+
* @locks_acquired rd_kafka_wrlock()
|
|
664
|
+
*/
|
|
665
|
+
int rd_kafka_metadata_cache_hint_rktparlist(
|
|
666
|
+
rd_kafka_t *rk,
|
|
667
|
+
const rd_kafka_topic_partition_list_t *rktparlist,
|
|
668
|
+
rd_list_t *dst,
|
|
669
|
+
int replace) {
|
|
670
|
+
rd_list_t topics;
|
|
671
|
+
int r;
|
|
672
|
+
|
|
673
|
+
rd_list_init(&topics, rktparlist->cnt, rd_free);
|
|
674
|
+
rd_kafka_topic_partition_list_get_topic_names(rktparlist, &topics,
|
|
675
|
+
0 /*dont include regex*/);
|
|
676
|
+
rd_kafka_wrlock(rk);
|
|
677
|
+
r = rd_kafka_metadata_cache_hint(
|
|
678
|
+
rk, &topics, dst, RD_KAFKA_RESP_ERR__WAIT_CACHE, replace);
|
|
679
|
+
rd_kafka_wrunlock(rk);
|
|
680
|
+
|
|
681
|
+
rd_list_destroy(&topics);
|
|
682
|
+
return r;
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
|
|
686
|
+
/**
|
|
687
|
+
* @brief Cache entry comparator (on topic name)
|
|
688
|
+
*/
|
|
689
|
+
static int rd_kafka_metadata_cache_entry_cmp(const void *_a, const void *_b) {
|
|
690
|
+
const struct rd_kafka_metadata_cache_entry *a = _a, *b = _b;
|
|
691
|
+
return strcmp(a->rkmce_mtopic.topic, b->rkmce_mtopic.topic);
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
/**
|
|
695
|
+
* @brief Cache entry comparator (on topic id)
|
|
696
|
+
*/
|
|
697
|
+
static int rd_kafka_metadata_cache_entry_by_id_cmp(const void *_a,
|
|
698
|
+
const void *_b) {
|
|
699
|
+
const struct rd_kafka_metadata_cache_entry *a = _a, *b = _b;
|
|
700
|
+
return rd_kafka_Uuid_cmp(a->rkmce_metadata_internal_topic.topic_id,
|
|
701
|
+
b->rkmce_metadata_internal_topic.topic_id);
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
|
|
705
|
+
/**
|
|
706
|
+
* @brief Initialize the metadata cache
|
|
707
|
+
*
|
|
708
|
+
* @locks rd_kafka_wrlock()
|
|
709
|
+
*/
|
|
710
|
+
void rd_kafka_metadata_cache_init(rd_kafka_t *rk) {
|
|
711
|
+
rd_avl_init(&rk->rk_metadata_cache.rkmc_avl,
|
|
712
|
+
rd_kafka_metadata_cache_entry_cmp, 0);
|
|
713
|
+
rd_avl_init(&rk->rk_metadata_cache.rkmc_avl_by_id,
|
|
714
|
+
rd_kafka_metadata_cache_entry_by_id_cmp, 0);
|
|
715
|
+
TAILQ_INIT(&rk->rk_metadata_cache.rkmc_expiry);
|
|
716
|
+
mtx_init(&rk->rk_metadata_cache.rkmc_full_lock, mtx_plain);
|
|
717
|
+
mtx_init(&rk->rk_metadata_cache.rkmc_cnd_lock, mtx_plain);
|
|
718
|
+
cnd_init(&rk->rk_metadata_cache.rkmc_cnd);
|
|
719
|
+
rd_list_init(&rk->rk_metadata_cache.rkmc_observers, 8,
|
|
720
|
+
rd_kafka_enq_once_trigger_destroy);
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
/**
|
|
724
|
+
* @brief Purge and destroy metadata cache.
|
|
725
|
+
*
|
|
726
|
+
* @locks_required rd_kafka_wrlock()
|
|
727
|
+
*/
|
|
728
|
+
void rd_kafka_metadata_cache_destroy(rd_kafka_t *rk) {
|
|
729
|
+
rd_list_destroy(&rk->rk_metadata_cache.rkmc_observers);
|
|
730
|
+
rd_kafka_timer_stop(&rk->rk_timers,
|
|
731
|
+
&rk->rk_metadata_cache.rkmc_query_tmr, 1 /*lock*/);
|
|
732
|
+
rd_kafka_metadata_cache_purge(rk, rd_true /*observers too*/);
|
|
733
|
+
mtx_destroy(&rk->rk_metadata_cache.rkmc_full_lock);
|
|
734
|
+
mtx_destroy(&rk->rk_metadata_cache.rkmc_cnd_lock);
|
|
735
|
+
cnd_destroy(&rk->rk_metadata_cache.rkmc_cnd);
|
|
736
|
+
rd_avl_destroy(&rk->rk_metadata_cache.rkmc_avl);
|
|
737
|
+
rd_avl_destroy(&rk->rk_metadata_cache.rkmc_avl_by_id);
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
|
|
741
|
+
|
|
742
|
+
/**
|
|
743
|
+
* @brief Add eonce to list of async cache observers.
|
|
744
|
+
*
|
|
745
|
+
* @locks_required rd_kafka_wrlock()
|
|
746
|
+
*/
|
|
747
|
+
void rd_kafka_metadata_cache_wait_state_change_async(
|
|
748
|
+
rd_kafka_t *rk,
|
|
749
|
+
rd_kafka_enq_once_t *eonce) {
|
|
750
|
+
rd_kafka_enq_once_add_source(eonce, "wait metadata cache change");
|
|
751
|
+
rd_list_add(&rk->rk_metadata_cache.rkmc_observers, eonce);
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
|
|
755
|
+
/**
|
|
756
|
+
* @brief Wait for cache update, or timeout.
|
|
757
|
+
*
|
|
758
|
+
* @returns 1 on cache update or 0 on timeout.
|
|
759
|
+
* @locks none
|
|
760
|
+
* @locality any
|
|
761
|
+
*/
|
|
762
|
+
int rd_kafka_metadata_cache_wait_change(rd_kafka_t *rk, int timeout_ms) {
|
|
763
|
+
int r;
|
|
764
|
+
#if ENABLE_DEVEL
|
|
765
|
+
rd_ts_t ts_start = rd_clock();
|
|
766
|
+
#endif
|
|
767
|
+
mtx_lock(&rk->rk_metadata_cache.rkmc_cnd_lock);
|
|
768
|
+
r = cnd_timedwait_ms(&rk->rk_metadata_cache.rkmc_cnd,
|
|
769
|
+
&rk->rk_metadata_cache.rkmc_cnd_lock, timeout_ms);
|
|
770
|
+
mtx_unlock(&rk->rk_metadata_cache.rkmc_cnd_lock);
|
|
771
|
+
|
|
772
|
+
#if ENABLE_DEVEL
|
|
773
|
+
rd_kafka_dbg(rk, METADATA, "CACHEWAIT", "%s wait took %dms: %s",
|
|
774
|
+
__FUNCTION__, (int)((rd_clock() - ts_start) / 1000),
|
|
775
|
+
r == thrd_success ? "succeeded" : "timed out");
|
|
776
|
+
#endif
|
|
777
|
+
return r == thrd_success;
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
|
|
781
|
+
/**
|
|
782
|
+
* @brief eonce trigger callback for rd_list_apply() call in
|
|
783
|
+
* rd_kafka_metadata_cache_propagate_changes()
|
|
784
|
+
*/
|
|
785
|
+
static int
|
|
786
|
+
rd_kafka_metadata_cache_propagate_changes_trigger_eonce(void *elem,
|
|
787
|
+
void *opaque) {
|
|
788
|
+
rd_kafka_enq_once_t *eonce = elem;
|
|
789
|
+
rd_kafka_enq_once_trigger(eonce, RD_KAFKA_RESP_ERR_NO_ERROR,
|
|
790
|
+
"wait metadata cache change");
|
|
791
|
+
return 0; /* remove eonce from list */
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
|
|
795
|
+
/**
|
|
796
|
+
* @brief Propagate that the cache changed (but not what changed) to
|
|
797
|
+
* any cnd listeners and eonce observers.
|
|
798
|
+
* @locks_required rd_kafka_wrlock(rk)
|
|
799
|
+
* @locks_acquired rkmc_cnd_lock
|
|
800
|
+
* @locality any
|
|
801
|
+
*/
|
|
802
|
+
void rd_kafka_metadata_cache_propagate_changes(rd_kafka_t *rk) {
|
|
803
|
+
mtx_lock(&rk->rk_metadata_cache.rkmc_cnd_lock);
|
|
804
|
+
cnd_broadcast(&rk->rk_metadata_cache.rkmc_cnd);
|
|
805
|
+
mtx_unlock(&rk->rk_metadata_cache.rkmc_cnd_lock);
|
|
806
|
+
|
|
807
|
+
/* Trigger observers */
|
|
808
|
+
rd_list_apply(&rk->rk_metadata_cache.rkmc_observers,
|
|
809
|
+
rd_kafka_metadata_cache_propagate_changes_trigger_eonce,
|
|
810
|
+
NULL);
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
/**
|
|
814
|
+
* @returns the shared metadata for a topic, or NULL if not found in
|
|
815
|
+
* cache.
|
|
816
|
+
*
|
|
817
|
+
* @locks rd_kafka_*lock()
|
|
818
|
+
*/
|
|
819
|
+
const rd_kafka_metadata_topic_t *
|
|
820
|
+
rd_kafka_metadata_cache_topic_get(rd_kafka_t *rk,
|
|
821
|
+
const char *topic,
|
|
822
|
+
int valid) {
|
|
823
|
+
struct rd_kafka_metadata_cache_entry *rkmce;
|
|
824
|
+
|
|
825
|
+
if (!(rkmce = rd_kafka_metadata_cache_find(rk, topic, valid)))
|
|
826
|
+
return NULL;
|
|
827
|
+
|
|
828
|
+
return &rkmce->rkmce_mtopic;
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
|
|
832
|
+
|
|
833
|
+
/**
|
|
834
|
+
* @brief Looks up the shared metadata for a partition along with its topic.
|
|
835
|
+
*
|
|
836
|
+
* Cache entries with errors (such as auth errors) will not be returned unless
|
|
837
|
+
* \p valid is set to false.
|
|
838
|
+
*
|
|
839
|
+
* @param mtopicp: pointer to topic metadata
|
|
840
|
+
* @param mpartp: pointer to partition metadata
|
|
841
|
+
* @param valid: only return valid entries (no hints)
|
|
842
|
+
*
|
|
843
|
+
* @returns -1 if topic was not found in cache, 0 if topic was found
|
|
844
|
+
* but not the partition, 1 if both topic and partition was found.
|
|
845
|
+
*
|
|
846
|
+
* @locks rd_kafka_*lock()
|
|
847
|
+
*/
|
|
848
|
+
int rd_kafka_metadata_cache_topic_partition_get(
|
|
849
|
+
rd_kafka_t *rk,
|
|
850
|
+
const rd_kafka_metadata_topic_t **mtopicp,
|
|
851
|
+
const rd_kafka_metadata_partition_t **mpartp,
|
|
852
|
+
const char *topic,
|
|
853
|
+
int32_t partition,
|
|
854
|
+
int valid) {
|
|
855
|
+
|
|
856
|
+
const rd_kafka_metadata_topic_t *mtopic;
|
|
857
|
+
const rd_kafka_metadata_partition_t *mpart;
|
|
858
|
+
rd_kafka_metadata_partition_t skel = {.id = partition};
|
|
859
|
+
|
|
860
|
+
*mtopicp = NULL;
|
|
861
|
+
*mpartp = NULL;
|
|
862
|
+
|
|
863
|
+
if (!(mtopic = rd_kafka_metadata_cache_topic_get(rk, topic, valid)))
|
|
864
|
+
return -1;
|
|
865
|
+
|
|
866
|
+
*mtopicp = mtopic;
|
|
867
|
+
|
|
868
|
+
if (mtopic->err)
|
|
869
|
+
return -1;
|
|
870
|
+
|
|
871
|
+
/* Partitions array may be sparse so use bsearch lookup. */
|
|
872
|
+
mpart = bsearch(&skel, mtopic->partitions, mtopic->partition_cnt,
|
|
873
|
+
sizeof(*mtopic->partitions),
|
|
874
|
+
rd_kafka_metadata_partition_id_cmp);
|
|
875
|
+
|
|
876
|
+
if (!mpart)
|
|
877
|
+
return 0;
|
|
878
|
+
|
|
879
|
+
*mpartp = mpart;
|
|
880
|
+
|
|
881
|
+
return 1;
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
|
|
885
|
+
/**
|
|
886
|
+
* @returns the number of topics in \p topics that are in the cache.
|
|
887
|
+
*
|
|
888
|
+
* @param topics rd_list(const char *): topic names
|
|
889
|
+
* @param metadata_agep: age of oldest entry will be returned.
|
|
890
|
+
*
|
|
891
|
+
* @locks rd_kafka_*lock()
|
|
892
|
+
*/
|
|
893
|
+
int rd_kafka_metadata_cache_topics_count_exists(rd_kafka_t *rk,
|
|
894
|
+
const rd_list_t *topics,
|
|
895
|
+
int *metadata_agep) {
|
|
896
|
+
const char *topic;
|
|
897
|
+
int i;
|
|
898
|
+
int cnt = 0;
|
|
899
|
+
int max_age = -1;
|
|
900
|
+
|
|
901
|
+
RD_LIST_FOREACH(topic, topics, i) {
|
|
902
|
+
const struct rd_kafka_metadata_cache_entry *rkmce;
|
|
903
|
+
int age;
|
|
904
|
+
|
|
905
|
+
if (!(rkmce = rd_kafka_metadata_cache_find(rk, topic,
|
|
906
|
+
1 /*valid only*/)))
|
|
907
|
+
continue;
|
|
908
|
+
|
|
909
|
+
age = (int)((rd_clock() - rkmce->rkmce_ts_insert) / 1000);
|
|
910
|
+
if (age > max_age)
|
|
911
|
+
max_age = age;
|
|
912
|
+
cnt++;
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
*metadata_agep = max_age;
|
|
916
|
+
|
|
917
|
+
return cnt;
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
|
|
921
|
+
/**
|
|
922
|
+
* @brief Add all topics in the metadata cache to \p topics, avoid duplicates.
|
|
923
|
+
*
|
|
924
|
+
* Element type is (char *topic_name).
|
|
925
|
+
*
|
|
926
|
+
* @returns the number of elements added to \p topics
|
|
927
|
+
*
|
|
928
|
+
* @locks_required rd_kafka_*lock()
|
|
929
|
+
*/
|
|
930
|
+
int rd_kafka_metadata_cache_topics_to_list(rd_kafka_t *rk, rd_list_t *topics) {
|
|
931
|
+
const struct rd_kafka_metadata_cache_entry *rkmce;
|
|
932
|
+
int precnt = rd_list_cnt(topics);
|
|
933
|
+
|
|
934
|
+
TAILQ_FOREACH(rkmce, &rk->rk_metadata_cache.rkmc_expiry, rkmce_link) {
|
|
935
|
+
/* Ignore topics that have up to date metadata info */
|
|
936
|
+
if (RD_KAFKA_METADATA_CACHE_VALID(rkmce))
|
|
937
|
+
continue;
|
|
938
|
+
|
|
939
|
+
if (rd_list_find(topics, rkmce->rkmce_mtopic.topic,
|
|
940
|
+
rd_list_cmp_str))
|
|
941
|
+
continue;
|
|
942
|
+
|
|
943
|
+
rd_list_add(topics, rd_strdup(rkmce->rkmce_mtopic.topic));
|
|
944
|
+
}
|
|
945
|
+
|
|
946
|
+
return rd_list_cnt(topics) - precnt;
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
|
|
950
|
+
/**
|
|
951
|
+
* @brief Dump cache to \p fp
|
|
952
|
+
*
|
|
953
|
+
* @locks rd_kafka_*lock()
|
|
954
|
+
*/
|
|
955
|
+
void rd_kafka_metadata_cache_dump(FILE *fp, rd_kafka_t *rk) {
|
|
956
|
+
const struct rd_kafka_metadata_cache *rkmc = &rk->rk_metadata_cache;
|
|
957
|
+
const struct rd_kafka_metadata_cache_entry *rkmce;
|
|
958
|
+
rd_ts_t now = rd_clock();
|
|
959
|
+
|
|
960
|
+
fprintf(fp, "Metadata cache with %d entries:\n", rkmc->rkmc_cnt);
|
|
961
|
+
TAILQ_FOREACH(rkmce, &rkmc->rkmc_expiry, rkmce_link) {
|
|
962
|
+
fprintf(fp,
|
|
963
|
+
" %s (inserted %dms ago, expires in %dms, "
|
|
964
|
+
"%d partition(s), %s)%s%s\n",
|
|
965
|
+
rkmce->rkmce_mtopic.topic,
|
|
966
|
+
(int)((now - rkmce->rkmce_ts_insert) / 1000),
|
|
967
|
+
(int)((rkmce->rkmce_ts_expires - now) / 1000),
|
|
968
|
+
rkmce->rkmce_mtopic.partition_cnt,
|
|
969
|
+
RD_KAFKA_METADATA_CACHE_VALID(rkmce) ? "valid" : "hint",
|
|
970
|
+
rkmce->rkmce_mtopic.err ? " error: " : "",
|
|
971
|
+
rkmce->rkmce_mtopic.err
|
|
972
|
+
? rd_kafka_err2str(rkmce->rkmce_mtopic.err)
|
|
973
|
+
: "");
|
|
974
|
+
}
|
|
975
|
+
}
|
|
976
|
+
|
|
977
|
+
/**@}*/
|