@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,1220 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* librdkafka - The Apache Kafka C/C++ library
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2016-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
|
+
#ifndef _RDKAFKA_QUEUE_H_
|
|
31
|
+
#define _RDKAFKA_QUEUE_H_
|
|
32
|
+
|
|
33
|
+
#include "rdkafka_op.h"
|
|
34
|
+
#include "rdkafka_int.h"
|
|
35
|
+
|
|
36
|
+
#ifdef _WIN32
|
|
37
|
+
#include <io.h> /* for _write() */
|
|
38
|
+
#endif
|
|
39
|
+
|
|
40
|
+
/** @brief Queueing strategy */
|
|
41
|
+
#define RD_KAFKA_QUEUE_FIFO 0
|
|
42
|
+
#define RD_KAFKA_QUEUE_LIFO 1
|
|
43
|
+
|
|
44
|
+
TAILQ_HEAD(rd_kafka_op_tailq, rd_kafka_op_s);
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* @struct Queue for rd_kafka_op_t*.
|
|
48
|
+
*
|
|
49
|
+
* @remark All readers of the queue must call rd_kafka_q_mark_served()
|
|
50
|
+
* after reading the queue (while still holding the queue lock) to
|
|
51
|
+
* clear the wakeup-sent flag.
|
|
52
|
+
*/
|
|
53
|
+
struct rd_kafka_q_s {
|
|
54
|
+
mtx_t rkq_lock;
|
|
55
|
+
cnd_t rkq_cond;
|
|
56
|
+
struct rd_kafka_q_s *rkq_fwdq; /* Forwarded/Routed queue.
|
|
57
|
+
* Used in place of this queue
|
|
58
|
+
* for all operations. */
|
|
59
|
+
|
|
60
|
+
struct rd_kafka_op_tailq rkq_q; /* TAILQ_HEAD(, rd_kafka_op_s) */
|
|
61
|
+
int rkq_qlen; /* Number of entries in queue */
|
|
62
|
+
int64_t rkq_qsize; /* Size of all entries in queue */
|
|
63
|
+
int rkq_refcnt;
|
|
64
|
+
int rkq_flags;
|
|
65
|
+
#define RD_KAFKA_Q_F_ALLOCATED 0x1 /* Allocated: rd_free on destroy */
|
|
66
|
+
#define RD_KAFKA_Q_F_READY \
|
|
67
|
+
0x2 /* Queue is ready to be used. \
|
|
68
|
+
* Flag is cleared on destroy */
|
|
69
|
+
#define RD_KAFKA_Q_F_FWD_APP \
|
|
70
|
+
0x4 /* Queue is being forwarded by a call \
|
|
71
|
+
* to rd_kafka_queue_forward. */
|
|
72
|
+
#define RD_KAFKA_Q_F_YIELD \
|
|
73
|
+
0x8 /* Have waiters return even if \
|
|
74
|
+
* no rko was enqueued. \
|
|
75
|
+
* This is used to wake up a waiter \
|
|
76
|
+
* by triggering the cond-var \
|
|
77
|
+
* but without having to enqueue \
|
|
78
|
+
* an op. */
|
|
79
|
+
#define RD_KAFKA_Q_F_CONSUMER \
|
|
80
|
+
0x10 /* If this flag is set, this queue might contain fetched messages \
|
|
81
|
+
from partitions. Polling this queue will reset the \
|
|
82
|
+
max.poll.interval.ms timer. Once set, this flag is never \
|
|
83
|
+
reset. */
|
|
84
|
+
|
|
85
|
+
rd_kafka_t *rkq_rk;
|
|
86
|
+
struct rd_kafka_q_io *rkq_qio; /* FD-based application signalling */
|
|
87
|
+
|
|
88
|
+
/* Op serve callback (optional).
|
|
89
|
+
* Mainly used for forwarded queues to use the original queue's
|
|
90
|
+
* serve function from the forwarded position.
|
|
91
|
+
* Shall return 1 if op was handled, else 0. */
|
|
92
|
+
rd_kafka_q_serve_cb_t *rkq_serve;
|
|
93
|
+
void *rkq_opaque;
|
|
94
|
+
rd_ts_t rkq_ts_last_poll_start; /**< Timestamp of last queue
|
|
95
|
+
* poll() call start
|
|
96
|
+
* Only relevant for a consumer. */
|
|
97
|
+
rd_ts_t rkq_ts_last_poll_end; /**< Timestamp of last queue
|
|
98
|
+
* poll() call end
|
|
99
|
+
* Only relevant for a consumer. */
|
|
100
|
+
|
|
101
|
+
#if ENABLE_DEVEL
|
|
102
|
+
char rkq_name[64]; /* Debugging: queue name (FUNC:LINE) */
|
|
103
|
+
#else
|
|
104
|
+
const char *rkq_name; /* Debugging: queue name (FUNC) */
|
|
105
|
+
#endif
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
/* Application signalling state holder. */
|
|
110
|
+
struct rd_kafka_q_io {
|
|
111
|
+
/* For FD-based signalling */
|
|
112
|
+
rd_socket_t fd;
|
|
113
|
+
void *payload;
|
|
114
|
+
size_t size;
|
|
115
|
+
rd_bool_t sent; /**< Wake-up has been sent.
|
|
116
|
+
* This field is reset to false by the queue
|
|
117
|
+
* reader, allowing a new wake-up to be sent by a
|
|
118
|
+
* subsequent writer. */
|
|
119
|
+
/* For callback-based signalling */
|
|
120
|
+
void (*event_cb)(rd_kafka_t *rk, void *opaque);
|
|
121
|
+
void *event_cb_opaque;
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* @return true if queue is ready/enabled, else false.
|
|
128
|
+
* @remark queue luck must be held by caller (if applicable)
|
|
129
|
+
*/
|
|
130
|
+
static RD_INLINE RD_UNUSED int rd_kafka_q_ready(rd_kafka_q_t *rkq) {
|
|
131
|
+
return rkq->rkq_flags & RD_KAFKA_Q_F_READY;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
void rd_kafka_q_init0(rd_kafka_q_t *rkq,
|
|
137
|
+
rd_kafka_t *rk,
|
|
138
|
+
rd_bool_t for_consume,
|
|
139
|
+
const char *func,
|
|
140
|
+
int line);
|
|
141
|
+
#define rd_kafka_q_init(rkq, rk) \
|
|
142
|
+
rd_kafka_q_init0(rkq, rk, rd_false, __FUNCTION__, __LINE__)
|
|
143
|
+
#define rd_kafka_consume_q_init(rkq, rk) \
|
|
144
|
+
rd_kafka_q_init0(rkq, rk, rd_true, __FUNCTION__, __LINE__)
|
|
145
|
+
rd_kafka_q_t *rd_kafka_q_new0(rd_kafka_t *rk,
|
|
146
|
+
rd_bool_t for_consume,
|
|
147
|
+
const char *func,
|
|
148
|
+
int line);
|
|
149
|
+
#define rd_kafka_q_new(rk) rd_kafka_q_new0(rk, rd_false, __FUNCTION__, __LINE__)
|
|
150
|
+
#define rd_kafka_consume_q_new(rk) \
|
|
151
|
+
rd_kafka_q_new0(rk, rd_true, __FUNCTION__, __LINE__)
|
|
152
|
+
void rd_kafka_q_destroy_final(rd_kafka_q_t *rkq);
|
|
153
|
+
|
|
154
|
+
#define rd_kafka_q_lock(rkqu) mtx_lock(&(rkqu)->rkq_lock)
|
|
155
|
+
#define rd_kafka_q_unlock(rkqu) mtx_unlock(&(rkqu)->rkq_lock)
|
|
156
|
+
|
|
157
|
+
static RD_INLINE RD_UNUSED rd_kafka_q_t *rd_kafka_q_keep(rd_kafka_q_t *rkq) {
|
|
158
|
+
mtx_lock(&rkq->rkq_lock);
|
|
159
|
+
rkq->rkq_refcnt++;
|
|
160
|
+
mtx_unlock(&rkq->rkq_lock);
|
|
161
|
+
return rkq;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
static RD_INLINE RD_UNUSED rd_kafka_q_t *
|
|
165
|
+
rd_kafka_q_keep_nolock(rd_kafka_q_t *rkq) {
|
|
166
|
+
rkq->rkq_refcnt++;
|
|
167
|
+
return rkq;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* @returns the queue's name (used for debugging)
|
|
173
|
+
*/
|
|
174
|
+
static RD_INLINE RD_UNUSED const char *rd_kafka_q_name(rd_kafka_q_t *rkq) {
|
|
175
|
+
return rkq->rkq_name;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* @returns the final destination queue name (after forwarding)
|
|
180
|
+
* @remark rkq MUST NOT be locked
|
|
181
|
+
*/
|
|
182
|
+
static RD_INLINE RD_UNUSED const char *rd_kafka_q_dest_name(rd_kafka_q_t *rkq) {
|
|
183
|
+
const char *ret;
|
|
184
|
+
mtx_lock(&rkq->rkq_lock);
|
|
185
|
+
if (rkq->rkq_fwdq)
|
|
186
|
+
ret = rd_kafka_q_dest_name(rkq->rkq_fwdq);
|
|
187
|
+
else
|
|
188
|
+
ret = rd_kafka_q_name(rkq);
|
|
189
|
+
mtx_unlock(&rkq->rkq_lock);
|
|
190
|
+
return ret;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* @brief Disable a queue.
|
|
195
|
+
* Attempting to enqueue ops to the queue will destroy the ops.
|
|
196
|
+
*/
|
|
197
|
+
static RD_INLINE RD_UNUSED void rd_kafka_q_disable0(rd_kafka_q_t *rkq,
|
|
198
|
+
int do_lock) {
|
|
199
|
+
if (do_lock)
|
|
200
|
+
mtx_lock(&rkq->rkq_lock);
|
|
201
|
+
rkq->rkq_flags &= ~RD_KAFKA_Q_F_READY;
|
|
202
|
+
if (do_lock)
|
|
203
|
+
mtx_unlock(&rkq->rkq_lock);
|
|
204
|
+
}
|
|
205
|
+
#define rd_kafka_q_disable(rkq) rd_kafka_q_disable0(rkq, 1 /*lock*/)
|
|
206
|
+
|
|
207
|
+
int rd_kafka_q_purge0(rd_kafka_q_t *rkq, int do_lock);
|
|
208
|
+
#define rd_kafka_q_purge(rkq) rd_kafka_q_purge0(rkq, 1 /*lock*/)
|
|
209
|
+
void rd_kafka_q_purge_toppar_version(rd_kafka_q_t *rkq,
|
|
210
|
+
rd_kafka_toppar_t *rktp,
|
|
211
|
+
int version);
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* @brief Loose reference to queue, when refcount reaches 0 the queue
|
|
215
|
+
* will be destroyed.
|
|
216
|
+
*
|
|
217
|
+
* @param disable Also disable the queue, to be used by owner of the queue.
|
|
218
|
+
*/
|
|
219
|
+
static RD_INLINE RD_UNUSED void rd_kafka_q_destroy0(rd_kafka_q_t *rkq,
|
|
220
|
+
int disable) {
|
|
221
|
+
int do_delete = 0;
|
|
222
|
+
|
|
223
|
+
if (disable) {
|
|
224
|
+
/* To avoid recursive locking (from ops being purged
|
|
225
|
+
* that reference this queue somehow),
|
|
226
|
+
* we disable the queue and purge it with individual
|
|
227
|
+
* locking. */
|
|
228
|
+
rd_kafka_q_disable0(rkq, 1 /*lock*/);
|
|
229
|
+
rd_kafka_q_purge0(rkq, 1 /*lock*/);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
mtx_lock(&rkq->rkq_lock);
|
|
233
|
+
rd_kafka_assert(NULL, rkq->rkq_refcnt > 0);
|
|
234
|
+
do_delete = !--rkq->rkq_refcnt;
|
|
235
|
+
mtx_unlock(&rkq->rkq_lock);
|
|
236
|
+
|
|
237
|
+
if (unlikely(do_delete))
|
|
238
|
+
rd_kafka_q_destroy_final(rkq);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
#define rd_kafka_q_destroy(rkq) rd_kafka_q_destroy0(rkq, 0 /*dont-disable*/)
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* @brief Queue destroy method to be used by the owner (poller) of
|
|
245
|
+
* the queue. The only difference to q_destroy() is that this
|
|
246
|
+
* method also disables the queue so that any q_enq() operations
|
|
247
|
+
* will fail.
|
|
248
|
+
* Failure to disable a queue on the poller when it destroys its
|
|
249
|
+
* queue reference results in ops being enqueued on the queue
|
|
250
|
+
* but there is noone left to poll it, possibly resulting in a
|
|
251
|
+
* hang on termination due to refcounts held by the op.
|
|
252
|
+
*/
|
|
253
|
+
static RD_INLINE RD_UNUSED void rd_kafka_q_destroy_owner(rd_kafka_q_t *rkq) {
|
|
254
|
+
rd_kafka_q_destroy0(rkq, 1 /*disable*/);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Reset a queue.
|
|
260
|
+
* WARNING: All messages will be lost and leaked.
|
|
261
|
+
* NOTE: No locking is performed.
|
|
262
|
+
*/
|
|
263
|
+
static RD_INLINE RD_UNUSED void rd_kafka_q_reset(rd_kafka_q_t *rkq) {
|
|
264
|
+
TAILQ_INIT(&rkq->rkq_q);
|
|
265
|
+
rd_dassert(TAILQ_EMPTY(&rkq->rkq_q));
|
|
266
|
+
rkq->rkq_qlen = 0;
|
|
267
|
+
rkq->rkq_qsize = 0;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Forward 'srcq' to 'destq'
|
|
274
|
+
*/
|
|
275
|
+
void rd_kafka_q_fwd_set0(rd_kafka_q_t *srcq,
|
|
276
|
+
rd_kafka_q_t *destq,
|
|
277
|
+
int do_lock,
|
|
278
|
+
int fwd_app);
|
|
279
|
+
#define rd_kafka_q_fwd_set(S, D) \
|
|
280
|
+
rd_kafka_q_fwd_set0(S, D, 1 /*lock*/, 0 /*no fwd_app*/)
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* @returns the forward queue (if any) with its refcount increased.
|
|
284
|
+
* @locks rd_kafka_q_lock(rkq) == !do_lock
|
|
285
|
+
*/
|
|
286
|
+
static RD_INLINE RD_UNUSED rd_kafka_q_t *rd_kafka_q_fwd_get(rd_kafka_q_t *rkq,
|
|
287
|
+
int do_lock) {
|
|
288
|
+
rd_kafka_q_t *fwdq;
|
|
289
|
+
if (do_lock)
|
|
290
|
+
mtx_lock(&rkq->rkq_lock);
|
|
291
|
+
|
|
292
|
+
if ((fwdq = rkq->rkq_fwdq))
|
|
293
|
+
rd_kafka_q_keep(fwdq);
|
|
294
|
+
|
|
295
|
+
if (do_lock)
|
|
296
|
+
mtx_unlock(&rkq->rkq_lock);
|
|
297
|
+
|
|
298
|
+
return fwdq;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* @returns true if queue is forwarded, else false.
|
|
304
|
+
*
|
|
305
|
+
* @remark Thread-safe.
|
|
306
|
+
*/
|
|
307
|
+
static RD_INLINE RD_UNUSED int rd_kafka_q_is_fwded(rd_kafka_q_t *rkq) {
|
|
308
|
+
int r;
|
|
309
|
+
mtx_lock(&rkq->rkq_lock);
|
|
310
|
+
r = rkq->rkq_fwdq ? 1 : 0;
|
|
311
|
+
mtx_unlock(&rkq->rkq_lock);
|
|
312
|
+
return r;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* @brief Trigger an IO event for this queue.
|
|
319
|
+
*
|
|
320
|
+
* @remark Queue MUST be locked
|
|
321
|
+
*/
|
|
322
|
+
static RD_INLINE RD_UNUSED void rd_kafka_q_io_event(rd_kafka_q_t *rkq) {
|
|
323
|
+
|
|
324
|
+
if (likely(!rkq->rkq_qio))
|
|
325
|
+
return;
|
|
326
|
+
|
|
327
|
+
if (rkq->rkq_qio->event_cb) {
|
|
328
|
+
rkq->rkq_qio->event_cb(rkq->rkq_rk,
|
|
329
|
+
rkq->rkq_qio->event_cb_opaque);
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
/* Only one wake-up event should be sent per non-polling period.
|
|
335
|
+
* As the queue reader calls poll/reads the channel it calls to
|
|
336
|
+
* rd_kafka_q_mark_served() to reset the wakeup sent flag, allowing
|
|
337
|
+
* further wakeups in the next non-polling period. */
|
|
338
|
+
if (rkq->rkq_qio->sent)
|
|
339
|
+
return; /* Wake-up event already written */
|
|
340
|
+
|
|
341
|
+
rkq->rkq_qio->sent = rd_true;
|
|
342
|
+
|
|
343
|
+
/* Write wake-up event to socket.
|
|
344
|
+
* Ignore errors, not much to do anyway. */
|
|
345
|
+
if (rd_socket_write(rkq->rkq_qio->fd, rkq->rkq_qio->payload,
|
|
346
|
+
(int)rkq->rkq_qio->size) == -1)
|
|
347
|
+
;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* @brief rko->rko_prio comparator
|
|
353
|
+
* @remark: descending order: higher priority takes preceedence.
|
|
354
|
+
*/
|
|
355
|
+
static RD_INLINE RD_UNUSED int rd_kafka_op_cmp_prio(const void *_a,
|
|
356
|
+
const void *_b) {
|
|
357
|
+
const rd_kafka_op_t *a = _a, *b = _b;
|
|
358
|
+
|
|
359
|
+
return RD_CMP(b->rko_prio, a->rko_prio);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* @brief Wake up waiters without enqueuing an op.
|
|
365
|
+
*/
|
|
366
|
+
static RD_INLINE RD_UNUSED void rd_kafka_q_yield(rd_kafka_q_t *rkq) {
|
|
367
|
+
rd_kafka_q_t *fwdq;
|
|
368
|
+
|
|
369
|
+
mtx_lock(&rkq->rkq_lock);
|
|
370
|
+
|
|
371
|
+
rd_dassert(rkq->rkq_refcnt > 0);
|
|
372
|
+
|
|
373
|
+
if (unlikely(!(rkq->rkq_flags & RD_KAFKA_Q_F_READY))) {
|
|
374
|
+
/* Queue has been disabled */
|
|
375
|
+
mtx_unlock(&rkq->rkq_lock);
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
if (!(fwdq = rd_kafka_q_fwd_get(rkq, 0))) {
|
|
380
|
+
rkq->rkq_flags |= RD_KAFKA_Q_F_YIELD;
|
|
381
|
+
cnd_broadcast(&rkq->rkq_cond);
|
|
382
|
+
if (rkq->rkq_qlen == 0)
|
|
383
|
+
rd_kafka_q_io_event(rkq);
|
|
384
|
+
|
|
385
|
+
mtx_unlock(&rkq->rkq_lock);
|
|
386
|
+
} else {
|
|
387
|
+
mtx_unlock(&rkq->rkq_lock);
|
|
388
|
+
rd_kafka_q_yield(fwdq);
|
|
389
|
+
rd_kafka_q_destroy(fwdq);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
/**
|
|
394
|
+
* @brief Low-level unprotected enqueue that only performs
|
|
395
|
+
* the actual queue enqueue and counter updates.
|
|
396
|
+
* @remark Will not perform locking, signaling, fwdq, READY checking, etc.
|
|
397
|
+
*/
|
|
398
|
+
static RD_INLINE RD_UNUSED void
|
|
399
|
+
rd_kafka_q_enq0(rd_kafka_q_t *rkq, rd_kafka_op_t *rko, int at_head) {
|
|
400
|
+
if (likely(!rko->rko_prio))
|
|
401
|
+
TAILQ_INSERT_TAIL(&rkq->rkq_q, rko, rko_link);
|
|
402
|
+
else if (at_head)
|
|
403
|
+
TAILQ_INSERT_HEAD(&rkq->rkq_q, rko, rko_link);
|
|
404
|
+
else
|
|
405
|
+
TAILQ_INSERT_SORTED(&rkq->rkq_q, rko, rd_kafka_op_t *, rko_link,
|
|
406
|
+
rd_kafka_op_cmp_prio);
|
|
407
|
+
rkq->rkq_qlen++;
|
|
408
|
+
rkq->rkq_qsize += rko->rko_len;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* @brief Enqueue \p rko either at head or tail of \p rkq.
|
|
414
|
+
*
|
|
415
|
+
* The provided \p rko is either enqueued or destroyed.
|
|
416
|
+
*
|
|
417
|
+
* \p orig_destq is the original (outermost) dest queue for which
|
|
418
|
+
* this op was enqueued, before any queue forwarding has kicked in.
|
|
419
|
+
* The rko_serve callback from the orig_destq will be set on the rko
|
|
420
|
+
* if there is no rko_serve callback already set, and the \p rko isn't
|
|
421
|
+
* failed because the final queue is disabled.
|
|
422
|
+
*
|
|
423
|
+
* @returns 1 if op was enqueued or 0 if queue is disabled and
|
|
424
|
+
* there was no replyq to enqueue on in which case the rko is destroyed.
|
|
425
|
+
*
|
|
426
|
+
* @locality any thread.
|
|
427
|
+
*/
|
|
428
|
+
static RD_INLINE RD_UNUSED int rd_kafka_q_enq1(rd_kafka_q_t *rkq,
|
|
429
|
+
rd_kafka_op_t *rko,
|
|
430
|
+
rd_kafka_q_t *orig_destq,
|
|
431
|
+
int at_head,
|
|
432
|
+
int do_lock) {
|
|
433
|
+
rd_kafka_q_t *fwdq;
|
|
434
|
+
|
|
435
|
+
if (do_lock)
|
|
436
|
+
mtx_lock(&rkq->rkq_lock);
|
|
437
|
+
|
|
438
|
+
rd_dassert(rkq->rkq_refcnt > 0);
|
|
439
|
+
|
|
440
|
+
if (unlikely(!(rkq->rkq_flags & RD_KAFKA_Q_F_READY))) {
|
|
441
|
+
/* Queue has been disabled, reply to and fail the rko. */
|
|
442
|
+
if (do_lock)
|
|
443
|
+
mtx_unlock(&rkq->rkq_lock);
|
|
444
|
+
|
|
445
|
+
return rd_kafka_op_reply(rko, RD_KAFKA_RESP_ERR__DESTROY);
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
if (!(fwdq = rd_kafka_q_fwd_get(rkq, 0))) {
|
|
449
|
+
if (!rko->rko_serve && orig_destq->rkq_serve) {
|
|
450
|
+
/* Store original queue's serve callback and opaque
|
|
451
|
+
* prior to forwarding. */
|
|
452
|
+
rko->rko_serve = orig_destq->rkq_serve;
|
|
453
|
+
rko->rko_serve_opaque = orig_destq->rkq_opaque;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
rd_kafka_q_enq0(rkq, rko, at_head);
|
|
457
|
+
cnd_signal(&rkq->rkq_cond);
|
|
458
|
+
if (rkq->rkq_qlen == 1)
|
|
459
|
+
rd_kafka_q_io_event(rkq);
|
|
460
|
+
|
|
461
|
+
if (do_lock)
|
|
462
|
+
mtx_unlock(&rkq->rkq_lock);
|
|
463
|
+
} else {
|
|
464
|
+
if (do_lock)
|
|
465
|
+
mtx_unlock(&rkq->rkq_lock);
|
|
466
|
+
rd_kafka_q_enq1(fwdq, rko, orig_destq, at_head, 1 /*do lock*/);
|
|
467
|
+
rd_kafka_q_destroy(fwdq);
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
return 1;
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
/**
|
|
474
|
+
* @brief Enqueue the 'rko' op at the tail of the queue 'rkq'.
|
|
475
|
+
*
|
|
476
|
+
* The provided 'rko' is either enqueued or destroyed.
|
|
477
|
+
*
|
|
478
|
+
* @returns 1 if op was enqueued or 0 if queue is disabled and
|
|
479
|
+
* there was no replyq to enqueue on in which case the rko is destroyed.
|
|
480
|
+
*
|
|
481
|
+
* @locality any thread.
|
|
482
|
+
* @locks rkq MUST NOT be locked
|
|
483
|
+
*/
|
|
484
|
+
static RD_INLINE RD_UNUSED int rd_kafka_q_enq(rd_kafka_q_t *rkq,
|
|
485
|
+
rd_kafka_op_t *rko) {
|
|
486
|
+
return rd_kafka_q_enq1(rkq, rko, rkq, 0 /*at tail*/, 1 /*do lock*/);
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
|
|
490
|
+
/**
|
|
491
|
+
* @brief Re-enqueue rko at head of rkq.
|
|
492
|
+
*
|
|
493
|
+
* The provided 'rko' is either enqueued or destroyed.
|
|
494
|
+
*
|
|
495
|
+
* @returns 1 if op was enqueued or 0 if queue is disabled and
|
|
496
|
+
* there was no replyq to enqueue on in which case the rko is destroyed.
|
|
497
|
+
*
|
|
498
|
+
* @locality any thread
|
|
499
|
+
* @locks rkq MUST BE locked
|
|
500
|
+
*/
|
|
501
|
+
static RD_INLINE RD_UNUSED int rd_kafka_q_reenq(rd_kafka_q_t *rkq,
|
|
502
|
+
rd_kafka_op_t *rko) {
|
|
503
|
+
return rd_kafka_q_enq1(rkq, rko, rkq, 1 /*at head*/, 0 /*don't lock*/);
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
|
|
507
|
+
/**
|
|
508
|
+
* Dequeue 'rko' from queue 'rkq'.
|
|
509
|
+
*
|
|
510
|
+
* NOTE: rkq_lock MUST be held
|
|
511
|
+
* Locality: any thread
|
|
512
|
+
*/
|
|
513
|
+
static RD_INLINE RD_UNUSED void rd_kafka_q_deq0(rd_kafka_q_t *rkq,
|
|
514
|
+
rd_kafka_op_t *rko) {
|
|
515
|
+
rd_dassert(rkq->rkq_qlen > 0 &&
|
|
516
|
+
rkq->rkq_qsize >= (int64_t)rko->rko_len);
|
|
517
|
+
|
|
518
|
+
TAILQ_REMOVE(&rkq->rkq_q, rko, rko_link);
|
|
519
|
+
rkq->rkq_qlen--;
|
|
520
|
+
rkq->rkq_qsize -= rko->rko_len;
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
|
|
524
|
+
/**
|
|
525
|
+
* @brief Mark queue as served / read.
|
|
526
|
+
*
|
|
527
|
+
* This is currently used by the queue reader side to reset the io-event
|
|
528
|
+
* wakeup flag.
|
|
529
|
+
*
|
|
530
|
+
* Should be called by all queue readers.
|
|
531
|
+
*
|
|
532
|
+
* @locks_required rkq must be locked.
|
|
533
|
+
*/
|
|
534
|
+
static RD_INLINE RD_UNUSED void rd_kafka_q_mark_served(rd_kafka_q_t *rkq) {
|
|
535
|
+
if (rkq->rkq_qio)
|
|
536
|
+
rkq->rkq_qio->sent = rd_false;
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
|
|
540
|
+
/**
|
|
541
|
+
* Concat all elements of 'srcq' onto tail of 'rkq'.
|
|
542
|
+
* 'rkq' will be be locked (if 'do_lock'==1), but 'srcq' will not.
|
|
543
|
+
* NOTE: 'srcq' will be reset.
|
|
544
|
+
*
|
|
545
|
+
* Locality: any thread.
|
|
546
|
+
*
|
|
547
|
+
* @returns 0 if operation was performed or -1 if rkq is disabled.
|
|
548
|
+
*/
|
|
549
|
+
static RD_INLINE RD_UNUSED int
|
|
550
|
+
rd_kafka_q_concat0(rd_kafka_q_t *rkq, rd_kafka_q_t *srcq, int do_lock) {
|
|
551
|
+
int r = 0;
|
|
552
|
+
|
|
553
|
+
while (srcq->rkq_fwdq) /* Resolve source queue */
|
|
554
|
+
srcq = srcq->rkq_fwdq;
|
|
555
|
+
if (unlikely(srcq->rkq_qlen == 0))
|
|
556
|
+
return 0; /* Don't do anything if source queue is empty */
|
|
557
|
+
|
|
558
|
+
if (do_lock)
|
|
559
|
+
mtx_lock(&rkq->rkq_lock);
|
|
560
|
+
if (!rkq->rkq_fwdq) {
|
|
561
|
+
rd_kafka_op_t *rko;
|
|
562
|
+
|
|
563
|
+
rd_dassert(TAILQ_EMPTY(&srcq->rkq_q) || srcq->rkq_qlen > 0);
|
|
564
|
+
if (unlikely(!(rkq->rkq_flags & RD_KAFKA_Q_F_READY))) {
|
|
565
|
+
if (do_lock)
|
|
566
|
+
mtx_unlock(&rkq->rkq_lock);
|
|
567
|
+
return -1;
|
|
568
|
+
}
|
|
569
|
+
/* First insert any prioritized ops from srcq
|
|
570
|
+
* in the right position in rkq. */
|
|
571
|
+
while ((rko = TAILQ_FIRST(&srcq->rkq_q)) && rko->rko_prio > 0) {
|
|
572
|
+
TAILQ_REMOVE(&srcq->rkq_q, rko, rko_link);
|
|
573
|
+
TAILQ_INSERT_SORTED(&rkq->rkq_q, rko, rd_kafka_op_t *,
|
|
574
|
+
rko_link, rd_kafka_op_cmp_prio);
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
TAILQ_CONCAT(&rkq->rkq_q, &srcq->rkq_q, rko_link);
|
|
578
|
+
if (rkq->rkq_qlen == 0)
|
|
579
|
+
rd_kafka_q_io_event(rkq);
|
|
580
|
+
rkq->rkq_qlen += srcq->rkq_qlen;
|
|
581
|
+
rkq->rkq_qsize += srcq->rkq_qsize;
|
|
582
|
+
cnd_signal(&rkq->rkq_cond);
|
|
583
|
+
|
|
584
|
+
rd_kafka_q_mark_served(srcq);
|
|
585
|
+
rd_kafka_q_reset(srcq);
|
|
586
|
+
} else
|
|
587
|
+
r = rd_kafka_q_concat0(rkq->rkq_fwdq ? rkq->rkq_fwdq : rkq,
|
|
588
|
+
srcq, rkq->rkq_fwdq ? do_lock : 0);
|
|
589
|
+
if (do_lock)
|
|
590
|
+
mtx_unlock(&rkq->rkq_lock);
|
|
591
|
+
|
|
592
|
+
return r;
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
#define rd_kafka_q_concat(dstq, srcq) rd_kafka_q_concat0(dstq, srcq, 1 /*lock*/)
|
|
596
|
+
|
|
597
|
+
|
|
598
|
+
/**
|
|
599
|
+
* @brief Prepend all elements of 'srcq' onto head of 'rkq'.
|
|
600
|
+
* 'rkq' will be be locked (if 'do_lock'==1), but 'srcq' will not.
|
|
601
|
+
* 'srcq' will be reset.
|
|
602
|
+
*
|
|
603
|
+
* @remark Will not respect priority of ops, srcq will be prepended in its
|
|
604
|
+
* original form to rkq.
|
|
605
|
+
*
|
|
606
|
+
* @locality any thread.
|
|
607
|
+
*/
|
|
608
|
+
static RD_INLINE RD_UNUSED void
|
|
609
|
+
rd_kafka_q_prepend0(rd_kafka_q_t *rkq, rd_kafka_q_t *srcq, int do_lock) {
|
|
610
|
+
if (do_lock)
|
|
611
|
+
mtx_lock(&rkq->rkq_lock);
|
|
612
|
+
if (!rkq->rkq_fwdq && !srcq->rkq_fwdq) {
|
|
613
|
+
/* FIXME: prio-aware */
|
|
614
|
+
/* Concat rkq on srcq */
|
|
615
|
+
TAILQ_CONCAT(&srcq->rkq_q, &rkq->rkq_q, rko_link);
|
|
616
|
+
/* Move srcq to rkq */
|
|
617
|
+
TAILQ_MOVE(&rkq->rkq_q, &srcq->rkq_q, rko_link);
|
|
618
|
+
if (rkq->rkq_qlen == 0 && srcq->rkq_qlen > 0)
|
|
619
|
+
rd_kafka_q_io_event(rkq);
|
|
620
|
+
rkq->rkq_qlen += srcq->rkq_qlen;
|
|
621
|
+
rkq->rkq_qsize += srcq->rkq_qsize;
|
|
622
|
+
|
|
623
|
+
rd_kafka_q_mark_served(srcq);
|
|
624
|
+
rd_kafka_q_reset(srcq);
|
|
625
|
+
} else
|
|
626
|
+
rd_kafka_q_prepend0(rkq->rkq_fwdq ? rkq->rkq_fwdq : rkq,
|
|
627
|
+
srcq->rkq_fwdq ? srcq->rkq_fwdq : srcq,
|
|
628
|
+
rkq->rkq_fwdq ? do_lock : 0);
|
|
629
|
+
if (do_lock)
|
|
630
|
+
mtx_unlock(&rkq->rkq_lock);
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
#define rd_kafka_q_prepend(dstq, srcq) \
|
|
634
|
+
rd_kafka_q_prepend0(dstq, srcq, 1 /*lock*/)
|
|
635
|
+
|
|
636
|
+
|
|
637
|
+
/* Returns the number of elements in the queue */
|
|
638
|
+
static RD_INLINE RD_UNUSED int rd_kafka_q_len(rd_kafka_q_t *rkq) {
|
|
639
|
+
int qlen;
|
|
640
|
+
rd_kafka_q_t *fwdq;
|
|
641
|
+
mtx_lock(&rkq->rkq_lock);
|
|
642
|
+
if (!(fwdq = rd_kafka_q_fwd_get(rkq, 0))) {
|
|
643
|
+
qlen = rkq->rkq_qlen;
|
|
644
|
+
mtx_unlock(&rkq->rkq_lock);
|
|
645
|
+
} else {
|
|
646
|
+
mtx_unlock(&rkq->rkq_lock);
|
|
647
|
+
qlen = rd_kafka_q_len(fwdq);
|
|
648
|
+
rd_kafka_q_destroy(fwdq);
|
|
649
|
+
}
|
|
650
|
+
return qlen;
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
/* Returns the total size of elements in the queue */
|
|
654
|
+
static RD_INLINE RD_UNUSED uint64_t rd_kafka_q_size(rd_kafka_q_t *rkq) {
|
|
655
|
+
uint64_t sz;
|
|
656
|
+
rd_kafka_q_t *fwdq;
|
|
657
|
+
mtx_lock(&rkq->rkq_lock);
|
|
658
|
+
if (!(fwdq = rd_kafka_q_fwd_get(rkq, 0))) {
|
|
659
|
+
sz = rkq->rkq_qsize;
|
|
660
|
+
mtx_unlock(&rkq->rkq_lock);
|
|
661
|
+
} else {
|
|
662
|
+
mtx_unlock(&rkq->rkq_lock);
|
|
663
|
+
sz = rd_kafka_q_size(fwdq);
|
|
664
|
+
rd_kafka_q_destroy(fwdq);
|
|
665
|
+
}
|
|
666
|
+
return sz;
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
/**
|
|
670
|
+
* @brief Construct a temporary on-stack replyq with increased
|
|
671
|
+
* \p rkq refcount (unless NULL), version, and debug id.
|
|
672
|
+
*/
|
|
673
|
+
static RD_INLINE RD_UNUSED rd_kafka_replyq_t
|
|
674
|
+
rd_kafka_replyq_make(rd_kafka_q_t *rkq, int version, const char *id) {
|
|
675
|
+
rd_kafka_replyq_t replyq = RD_ZERO_INIT;
|
|
676
|
+
|
|
677
|
+
if (rkq) {
|
|
678
|
+
replyq.q = rd_kafka_q_keep(rkq);
|
|
679
|
+
replyq.version = version;
|
|
680
|
+
#if ENABLE_DEVEL
|
|
681
|
+
replyq._id = rd_strdup(id);
|
|
682
|
+
#endif
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
return replyq;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
/* Construct temporary on-stack replyq with increased Q refcount and
|
|
689
|
+
* optional VERSION. */
|
|
690
|
+
#define RD_KAFKA_REPLYQ(Q, VERSION) \
|
|
691
|
+
rd_kafka_replyq_make(Q, VERSION, __FUNCTION__)
|
|
692
|
+
|
|
693
|
+
/* Construct temporary on-stack replyq for indicating no replyq. */
|
|
694
|
+
#if ENABLE_DEVEL
|
|
695
|
+
#define RD_KAFKA_NO_REPLYQ \
|
|
696
|
+
(rd_kafka_replyq_t) { \
|
|
697
|
+
NULL, 0, NULL \
|
|
698
|
+
}
|
|
699
|
+
#else
|
|
700
|
+
#define RD_KAFKA_NO_REPLYQ \
|
|
701
|
+
(rd_kafka_replyq_t) { \
|
|
702
|
+
NULL, 0 \
|
|
703
|
+
}
|
|
704
|
+
#endif
|
|
705
|
+
|
|
706
|
+
|
|
707
|
+
/**
|
|
708
|
+
* @returns true if the replyq is valid, else false.
|
|
709
|
+
*/
|
|
710
|
+
static RD_INLINE RD_UNUSED rd_bool_t
|
|
711
|
+
rd_kafka_replyq_is_valid(rd_kafka_replyq_t *replyq) {
|
|
712
|
+
rd_bool_t valid = rd_true;
|
|
713
|
+
|
|
714
|
+
if (!replyq->q)
|
|
715
|
+
return rd_false;
|
|
716
|
+
|
|
717
|
+
rd_kafka_q_lock(replyq->q);
|
|
718
|
+
valid = rd_kafka_q_ready(replyq->q);
|
|
719
|
+
rd_kafka_q_unlock(replyq->q);
|
|
720
|
+
|
|
721
|
+
return valid;
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
|
|
725
|
+
|
|
726
|
+
/**
|
|
727
|
+
* Set up replyq.
|
|
728
|
+
* Q refcnt is increased.
|
|
729
|
+
*/
|
|
730
|
+
static RD_INLINE RD_UNUSED void rd_kafka_set_replyq(rd_kafka_replyq_t *replyq,
|
|
731
|
+
rd_kafka_q_t *rkq,
|
|
732
|
+
int32_t version) {
|
|
733
|
+
replyq->q = rkq ? rd_kafka_q_keep(rkq) : NULL;
|
|
734
|
+
replyq->version = version;
|
|
735
|
+
#if ENABLE_DEVEL
|
|
736
|
+
replyq->_id = rd_strdup(__FUNCTION__);
|
|
737
|
+
#endif
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
/**
|
|
741
|
+
* Set rko's replyq with an optional version (versionptr != NULL).
|
|
742
|
+
* Q refcnt is increased.
|
|
743
|
+
*/
|
|
744
|
+
static RD_INLINE RD_UNUSED void
|
|
745
|
+
rd_kafka_op_set_replyq(rd_kafka_op_t *rko,
|
|
746
|
+
rd_kafka_q_t *rkq,
|
|
747
|
+
rd_atomic32_t *versionptr) {
|
|
748
|
+
rd_kafka_set_replyq(&rko->rko_replyq, rkq,
|
|
749
|
+
versionptr ? rd_atomic32_get(versionptr) : 0);
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
/* Set reply rko's version from replyq's version */
|
|
753
|
+
#define rd_kafka_op_get_reply_version(REPLY_RKO, ORIG_RKO) \
|
|
754
|
+
do { \
|
|
755
|
+
(REPLY_RKO)->rko_version = (ORIG_RKO)->rko_replyq.version; \
|
|
756
|
+
} while (0)
|
|
757
|
+
|
|
758
|
+
|
|
759
|
+
/* Clear replyq holder without decreasing any .q references. */
|
|
760
|
+
static RD_INLINE RD_UNUSED void
|
|
761
|
+
rd_kafka_replyq_clear(rd_kafka_replyq_t *replyq) {
|
|
762
|
+
memset(replyq, 0, sizeof(*replyq));
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
/**
|
|
766
|
+
* @brief Make a copy of \p src in \p dst, with its own queue reference
|
|
767
|
+
*/
|
|
768
|
+
static RD_INLINE RD_UNUSED void rd_kafka_replyq_copy(rd_kafka_replyq_t *dst,
|
|
769
|
+
rd_kafka_replyq_t *src) {
|
|
770
|
+
dst->version = src->version;
|
|
771
|
+
dst->q = src->q;
|
|
772
|
+
if (dst->q)
|
|
773
|
+
rd_kafka_q_keep(dst->q);
|
|
774
|
+
#if ENABLE_DEVEL
|
|
775
|
+
if (src->_id)
|
|
776
|
+
dst->_id = rd_strdup(src->_id);
|
|
777
|
+
else
|
|
778
|
+
dst->_id = NULL;
|
|
779
|
+
#endif
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
|
|
783
|
+
/**
|
|
784
|
+
* Clear replyq holder and destroy any .q references.
|
|
785
|
+
*/
|
|
786
|
+
static RD_INLINE RD_UNUSED void
|
|
787
|
+
rd_kafka_replyq_destroy(rd_kafka_replyq_t *replyq) {
|
|
788
|
+
if (replyq->q)
|
|
789
|
+
rd_kafka_q_destroy(replyq->q);
|
|
790
|
+
#if ENABLE_DEVEL
|
|
791
|
+
if (replyq->_id) {
|
|
792
|
+
rd_free(replyq->_id);
|
|
793
|
+
replyq->_id = NULL;
|
|
794
|
+
}
|
|
795
|
+
#endif
|
|
796
|
+
rd_kafka_replyq_clear(replyq);
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
|
|
800
|
+
/**
|
|
801
|
+
* @brief Wrapper for rd_kafka_q_enq() that takes a replyq,
|
|
802
|
+
* steals its queue reference, enqueues the op with the replyq version,
|
|
803
|
+
* and then destroys the queue reference.
|
|
804
|
+
*
|
|
805
|
+
* If \p version is non-zero it will be updated, else replyq->version.
|
|
806
|
+
*
|
|
807
|
+
* @returns Same as rd_kafka_q_enq()
|
|
808
|
+
*/
|
|
809
|
+
static RD_INLINE RD_UNUSED int rd_kafka_replyq_enq(rd_kafka_replyq_t *replyq,
|
|
810
|
+
rd_kafka_op_t *rko,
|
|
811
|
+
int version) {
|
|
812
|
+
rd_kafka_q_t *rkq = replyq->q;
|
|
813
|
+
int r;
|
|
814
|
+
|
|
815
|
+
if (version)
|
|
816
|
+
rko->rko_version = version;
|
|
817
|
+
else
|
|
818
|
+
rko->rko_version = replyq->version;
|
|
819
|
+
|
|
820
|
+
/* The replyq queue reference is done after we've enqueued the rko
|
|
821
|
+
* so clear it here. */
|
|
822
|
+
replyq->q = NULL; /* destroyed separately below */
|
|
823
|
+
|
|
824
|
+
#if ENABLE_DEVEL
|
|
825
|
+
if (replyq->_id) {
|
|
826
|
+
rd_free(replyq->_id);
|
|
827
|
+
replyq->_id = NULL;
|
|
828
|
+
}
|
|
829
|
+
#endif
|
|
830
|
+
|
|
831
|
+
/* Retain replyq->version since it is used by buf_callback
|
|
832
|
+
* when dispatching the callback. */
|
|
833
|
+
|
|
834
|
+
r = rd_kafka_q_enq(rkq, rko);
|
|
835
|
+
|
|
836
|
+
rd_kafka_q_destroy(rkq);
|
|
837
|
+
|
|
838
|
+
return r;
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
|
|
842
|
+
|
|
843
|
+
rd_kafka_op_t *rd_kafka_q_pop_serve(rd_kafka_q_t *rkq,
|
|
844
|
+
rd_ts_t timeout_us,
|
|
845
|
+
int32_t version,
|
|
846
|
+
rd_kafka_q_cb_type_t cb_type,
|
|
847
|
+
rd_kafka_q_serve_cb_t *callback,
|
|
848
|
+
void *opaque);
|
|
849
|
+
rd_kafka_op_t *
|
|
850
|
+
rd_kafka_q_pop_serve_maybe_consume(rd_kafka_q_t *rkq,
|
|
851
|
+
rd_ts_t timeout_us,
|
|
852
|
+
int32_t version,
|
|
853
|
+
rd_kafka_q_cb_type_t cb_type,
|
|
854
|
+
rd_kafka_q_serve_cb_t *callback,
|
|
855
|
+
void *opaque);
|
|
856
|
+
rd_kafka_op_t *
|
|
857
|
+
rd_kafka_q_pop(rd_kafka_q_t *rkq, rd_ts_t timeout_us, int32_t version);
|
|
858
|
+
int rd_kafka_q_serve(rd_kafka_q_t *rkq,
|
|
859
|
+
int timeout_ms,
|
|
860
|
+
int max_cnt,
|
|
861
|
+
rd_kafka_q_cb_type_t cb_type,
|
|
862
|
+
rd_kafka_q_serve_cb_t *callback,
|
|
863
|
+
void *opaque);
|
|
864
|
+
int rd_kafka_q_serve_maybe_consume(rd_kafka_q_t *rkq,
|
|
865
|
+
int timeout_ms,
|
|
866
|
+
int max_cnt,
|
|
867
|
+
rd_kafka_q_cb_type_t cb_type,
|
|
868
|
+
rd_kafka_q_serve_cb_t *callback,
|
|
869
|
+
void *opaque);
|
|
870
|
+
|
|
871
|
+
|
|
872
|
+
int rd_kafka_q_move_cnt(rd_kafka_q_t *dstq,
|
|
873
|
+
rd_kafka_q_t *srcq,
|
|
874
|
+
int cnt,
|
|
875
|
+
int do_locks);
|
|
876
|
+
|
|
877
|
+
int rd_kafka_q_serve_rkmessages(rd_kafka_q_t *rkq,
|
|
878
|
+
int timeout_ms,
|
|
879
|
+
rd_kafka_message_t **rkmessages,
|
|
880
|
+
size_t rkmessages_size);
|
|
881
|
+
rd_kafka_resp_err_t rd_kafka_q_wait_result(rd_kafka_q_t *rkq, int timeout_ms);
|
|
882
|
+
|
|
883
|
+
int rd_kafka_q_apply(rd_kafka_q_t *rkq,
|
|
884
|
+
int (*callback)(rd_kafka_q_t *rkq,
|
|
885
|
+
rd_kafka_op_t *rko,
|
|
886
|
+
void *opaque),
|
|
887
|
+
void *opaque);
|
|
888
|
+
|
|
889
|
+
void rd_kafka_q_fix_offsets(rd_kafka_q_t *rkq,
|
|
890
|
+
int64_t min_offset,
|
|
891
|
+
int64_t base_offset);
|
|
892
|
+
|
|
893
|
+
/**
|
|
894
|
+
* @returns the last op in the queue matching \p op_type and \p allow_err (bool)
|
|
895
|
+
* @remark The \p rkq must be properly locked before this call, the returned rko
|
|
896
|
+
* is not removed from the queue and may thus not be held for longer
|
|
897
|
+
* than the lock is held.
|
|
898
|
+
*/
|
|
899
|
+
static RD_INLINE RD_UNUSED rd_kafka_op_t *
|
|
900
|
+
rd_kafka_q_last(rd_kafka_q_t *rkq, rd_kafka_op_type_t op_type, int allow_err) {
|
|
901
|
+
rd_kafka_op_t *rko;
|
|
902
|
+
TAILQ_FOREACH_REVERSE(rko, &rkq->rkq_q, rd_kafka_op_tailq, rko_link) {
|
|
903
|
+
if (rko->rko_type == op_type && (allow_err || !rko->rko_err))
|
|
904
|
+
return rko;
|
|
905
|
+
}
|
|
906
|
+
|
|
907
|
+
return NULL;
|
|
908
|
+
}
|
|
909
|
+
|
|
910
|
+
void rd_kafka_q_io_event_enable(rd_kafka_q_t *rkq,
|
|
911
|
+
rd_socket_t fd,
|
|
912
|
+
const void *payload,
|
|
913
|
+
size_t size);
|
|
914
|
+
|
|
915
|
+
/* Public interface */
|
|
916
|
+
struct rd_kafka_queue_s {
|
|
917
|
+
rd_kafka_q_t *rkqu_q;
|
|
918
|
+
rd_kafka_t *rkqu_rk;
|
|
919
|
+
int rkqu_is_owner; /**< Is owner/creator of rkqu_q */
|
|
920
|
+
};
|
|
921
|
+
|
|
922
|
+
|
|
923
|
+
rd_kafka_queue_t *rd_kafka_queue_new0(rd_kafka_t *rk, rd_kafka_q_t *rkq);
|
|
924
|
+
|
|
925
|
+
void rd_kafka_q_dump(FILE *fp, rd_kafka_q_t *rkq);
|
|
926
|
+
|
|
927
|
+
extern int RD_TLS rd_kafka_yield_thread;
|
|
928
|
+
|
|
929
|
+
|
|
930
|
+
|
|
931
|
+
/**
|
|
932
|
+
* @name Enqueue op once
|
|
933
|
+
* @{
|
|
934
|
+
*/
|
|
935
|
+
|
|
936
|
+
/**
|
|
937
|
+
* @brief Minimal rd_kafka_op_t wrapper that ensures that
|
|
938
|
+
* the op is only enqueued on the provided queue once.
|
|
939
|
+
*
|
|
940
|
+
* Typical use-case is for an op to be triggered from multiple sources,
|
|
941
|
+
* but at most once, such as from a timer and some other source.
|
|
942
|
+
*/
|
|
943
|
+
typedef struct rd_kafka_enq_once_s {
|
|
944
|
+
mtx_t lock;
|
|
945
|
+
int refcnt;
|
|
946
|
+
rd_kafka_op_t *rko;
|
|
947
|
+
rd_kafka_replyq_t replyq;
|
|
948
|
+
} rd_kafka_enq_once_t;
|
|
949
|
+
|
|
950
|
+
|
|
951
|
+
/**
|
|
952
|
+
* @brief Allocate and set up a new eonce and set the initial refcount to 1.
|
|
953
|
+
* @remark This is to be called by the owner of the rko.
|
|
954
|
+
*/
|
|
955
|
+
static RD_INLINE RD_UNUSED rd_kafka_enq_once_t *
|
|
956
|
+
rd_kafka_enq_once_new(rd_kafka_op_t *rko, rd_kafka_replyq_t replyq) {
|
|
957
|
+
rd_kafka_enq_once_t *eonce = rd_calloc(1, sizeof(*eonce));
|
|
958
|
+
mtx_init(&eonce->lock, mtx_plain);
|
|
959
|
+
eonce->rko = rko;
|
|
960
|
+
eonce->replyq = replyq; /* struct copy */
|
|
961
|
+
eonce->refcnt = 1;
|
|
962
|
+
return eonce;
|
|
963
|
+
}
|
|
964
|
+
|
|
965
|
+
/**
|
|
966
|
+
* @brief Re-enable triggering of a eonce even after it has been triggered
|
|
967
|
+
* once.
|
|
968
|
+
*
|
|
969
|
+
* @remark This is to be called by the owner.
|
|
970
|
+
*/
|
|
971
|
+
static RD_INLINE RD_UNUSED void
|
|
972
|
+
rd_kafka_enq_once_reenable(rd_kafka_enq_once_t *eonce,
|
|
973
|
+
rd_kafka_op_t *rko,
|
|
974
|
+
rd_kafka_replyq_t replyq) {
|
|
975
|
+
mtx_lock(&eonce->lock);
|
|
976
|
+
eonce->rko = rko;
|
|
977
|
+
rd_kafka_replyq_destroy(&eonce->replyq);
|
|
978
|
+
eonce->replyq = replyq; /* struct copy */
|
|
979
|
+
mtx_unlock(&eonce->lock);
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
|
|
983
|
+
/**
|
|
984
|
+
* @brief Free eonce and its resources. Must only be called with refcnt==0
|
|
985
|
+
* and eonce->lock NOT held.
|
|
986
|
+
*/
|
|
987
|
+
static RD_INLINE RD_UNUSED void
|
|
988
|
+
rd_kafka_enq_once_destroy0(rd_kafka_enq_once_t *eonce) {
|
|
989
|
+
/* This must not be called with the rko or replyq still set, which would
|
|
990
|
+
* indicate that no enqueueing was performed and that the owner
|
|
991
|
+
* did not clean up, which is a bug. */
|
|
992
|
+
rd_assert(!eonce->rko);
|
|
993
|
+
rd_assert(!eonce->replyq.q);
|
|
994
|
+
#if ENABLE_DEVEL
|
|
995
|
+
rd_assert(!eonce->replyq._id);
|
|
996
|
+
#endif
|
|
997
|
+
rd_assert(eonce->refcnt == 0);
|
|
998
|
+
|
|
999
|
+
mtx_destroy(&eonce->lock);
|
|
1000
|
+
rd_free(eonce);
|
|
1001
|
+
}
|
|
1002
|
+
|
|
1003
|
+
|
|
1004
|
+
/**
|
|
1005
|
+
* @brief Increment refcount for source (non-owner), such as a timer.
|
|
1006
|
+
*
|
|
1007
|
+
* @param srcdesc a human-readable descriptive string of the source.
|
|
1008
|
+
* May be used for future debugging.
|
|
1009
|
+
*/
|
|
1010
|
+
static RD_INLINE RD_UNUSED void
|
|
1011
|
+
rd_kafka_enq_once_add_source(rd_kafka_enq_once_t *eonce, const char *srcdesc) {
|
|
1012
|
+
mtx_lock(&eonce->lock);
|
|
1013
|
+
eonce->refcnt++;
|
|
1014
|
+
mtx_unlock(&eonce->lock);
|
|
1015
|
+
}
|
|
1016
|
+
|
|
1017
|
+
|
|
1018
|
+
/**
|
|
1019
|
+
* @brief Decrement refcount for source (non-owner), such as a timer.
|
|
1020
|
+
*
|
|
1021
|
+
* @param srcdesc a human-readable descriptive string of the source.
|
|
1022
|
+
* May be used for future debugging.
|
|
1023
|
+
*
|
|
1024
|
+
* @remark Must only be called from the owner with the owner
|
|
1025
|
+
* still holding its own refcount.
|
|
1026
|
+
* This API is used to undo an add_source() from the
|
|
1027
|
+
* same code.
|
|
1028
|
+
*/
|
|
1029
|
+
static RD_INLINE RD_UNUSED void
|
|
1030
|
+
rd_kafka_enq_once_del_source(rd_kafka_enq_once_t *eonce, const char *srcdesc) {
|
|
1031
|
+
int do_destroy;
|
|
1032
|
+
|
|
1033
|
+
mtx_lock(&eonce->lock);
|
|
1034
|
+
rd_assert(eonce->refcnt > 0);
|
|
1035
|
+
eonce->refcnt--;
|
|
1036
|
+
do_destroy = eonce->refcnt == 0;
|
|
1037
|
+
mtx_unlock(&eonce->lock);
|
|
1038
|
+
|
|
1039
|
+
if (do_destroy) {
|
|
1040
|
+
/* We're the last refcount holder, clean up eonce. */
|
|
1041
|
+
rd_kafka_enq_once_destroy0(eonce);
|
|
1042
|
+
}
|
|
1043
|
+
}
|
|
1044
|
+
|
|
1045
|
+
/**
|
|
1046
|
+
* @brief Trigger a source's reference where the eonce resides on
|
|
1047
|
+
* an rd_list_t. This is typically used as a free_cb for
|
|
1048
|
+
* rd_list_destroy() and the trigger error code is
|
|
1049
|
+
* always RD_KAFKA_RESP_ERR__DESTROY.
|
|
1050
|
+
*/
|
|
1051
|
+
void rd_kafka_enq_once_trigger_destroy(void *ptr);
|
|
1052
|
+
|
|
1053
|
+
|
|
1054
|
+
/**
|
|
1055
|
+
* @brief Decrement refcount for source (non-owner) and return the rko
|
|
1056
|
+
* if still set.
|
|
1057
|
+
*
|
|
1058
|
+
* @remark Must only be called by sources (non-owner) but only on the
|
|
1059
|
+
* the owner's thread to make sure the rko is not freed.
|
|
1060
|
+
*
|
|
1061
|
+
* @remark The rko remains set on the eonce.
|
|
1062
|
+
*/
|
|
1063
|
+
static RD_INLINE RD_UNUSED rd_kafka_op_t *
|
|
1064
|
+
rd_kafka_enq_once_del_source_return(rd_kafka_enq_once_t *eonce,
|
|
1065
|
+
const char *srcdesc) {
|
|
1066
|
+
rd_bool_t do_destroy;
|
|
1067
|
+
rd_kafka_op_t *rko;
|
|
1068
|
+
|
|
1069
|
+
mtx_lock(&eonce->lock);
|
|
1070
|
+
|
|
1071
|
+
rd_assert(eonce->refcnt > 0);
|
|
1072
|
+
/* Owner must still hold a eonce reference, or the eonce must
|
|
1073
|
+
* have been disabled by the owner (no rko) */
|
|
1074
|
+
rd_assert(eonce->refcnt > 1 || !eonce->rko);
|
|
1075
|
+
eonce->refcnt--;
|
|
1076
|
+
do_destroy = eonce->refcnt == 0;
|
|
1077
|
+
|
|
1078
|
+
rko = eonce->rko;
|
|
1079
|
+
mtx_unlock(&eonce->lock);
|
|
1080
|
+
|
|
1081
|
+
if (do_destroy) {
|
|
1082
|
+
/* We're the last refcount holder, clean up eonce. */
|
|
1083
|
+
rd_kafka_enq_once_destroy0(eonce);
|
|
1084
|
+
}
|
|
1085
|
+
|
|
1086
|
+
return rko;
|
|
1087
|
+
}
|
|
1088
|
+
|
|
1089
|
+
/**
|
|
1090
|
+
* @brief Trigger enqueuing of the rko (unless already enqueued)
|
|
1091
|
+
* and drops the source's refcount.
|
|
1092
|
+
*
|
|
1093
|
+
* @remark Must only be called by sources (non-owner).
|
|
1094
|
+
*/
|
|
1095
|
+
static RD_INLINE RD_UNUSED void
|
|
1096
|
+
rd_kafka_enq_once_trigger(rd_kafka_enq_once_t *eonce,
|
|
1097
|
+
rd_kafka_resp_err_t err,
|
|
1098
|
+
const char *srcdesc) {
|
|
1099
|
+
int do_destroy;
|
|
1100
|
+
rd_kafka_op_t *rko = NULL;
|
|
1101
|
+
rd_kafka_replyq_t replyq = RD_ZERO_INIT;
|
|
1102
|
+
|
|
1103
|
+
mtx_lock(&eonce->lock);
|
|
1104
|
+
|
|
1105
|
+
rd_assert(eonce->refcnt > 0);
|
|
1106
|
+
eonce->refcnt--;
|
|
1107
|
+
do_destroy = eonce->refcnt == 0;
|
|
1108
|
+
|
|
1109
|
+
if (eonce->rko) {
|
|
1110
|
+
/* Not already enqueued, do it.
|
|
1111
|
+
* Detach the rko and replyq from the eonce and unlock the eonce
|
|
1112
|
+
* before enqueuing rko on reply to avoid recursive locks
|
|
1113
|
+
* if the replyq has been disabled and the ops
|
|
1114
|
+
* destructor is called (which might then access the eonce
|
|
1115
|
+
* to clean up). */
|
|
1116
|
+
rko = eonce->rko;
|
|
1117
|
+
replyq = eonce->replyq;
|
|
1118
|
+
|
|
1119
|
+
eonce->rko = NULL;
|
|
1120
|
+
rd_kafka_replyq_clear(&eonce->replyq);
|
|
1121
|
+
|
|
1122
|
+
/* Reply is enqueued at the end of this function */
|
|
1123
|
+
}
|
|
1124
|
+
mtx_unlock(&eonce->lock);
|
|
1125
|
+
|
|
1126
|
+
if (do_destroy) {
|
|
1127
|
+
/* We're the last refcount holder, clean up eonce. */
|
|
1128
|
+
rd_kafka_enq_once_destroy0(eonce);
|
|
1129
|
+
}
|
|
1130
|
+
|
|
1131
|
+
if (rko) {
|
|
1132
|
+
rko->rko_err = err;
|
|
1133
|
+
rd_kafka_replyq_enq(&replyq, rko, replyq.version);
|
|
1134
|
+
rd_kafka_replyq_destroy(&replyq);
|
|
1135
|
+
}
|
|
1136
|
+
}
|
|
1137
|
+
|
|
1138
|
+
/**
|
|
1139
|
+
* @brief Destroy eonce, must only be called by the owner.
|
|
1140
|
+
* There may be outstanding refcounts by non-owners after this call
|
|
1141
|
+
*/
|
|
1142
|
+
static RD_INLINE RD_UNUSED void
|
|
1143
|
+
rd_kafka_enq_once_destroy(rd_kafka_enq_once_t *eonce) {
|
|
1144
|
+
int do_destroy;
|
|
1145
|
+
|
|
1146
|
+
mtx_lock(&eonce->lock);
|
|
1147
|
+
rd_assert(eonce->refcnt > 0);
|
|
1148
|
+
eonce->refcnt--;
|
|
1149
|
+
do_destroy = eonce->refcnt == 0;
|
|
1150
|
+
|
|
1151
|
+
eonce->rko = NULL;
|
|
1152
|
+
rd_kafka_replyq_destroy(&eonce->replyq);
|
|
1153
|
+
|
|
1154
|
+
mtx_unlock(&eonce->lock);
|
|
1155
|
+
|
|
1156
|
+
if (do_destroy) {
|
|
1157
|
+
/* We're the last refcount holder, clean up eonce. */
|
|
1158
|
+
rd_kafka_enq_once_destroy0(eonce);
|
|
1159
|
+
}
|
|
1160
|
+
}
|
|
1161
|
+
|
|
1162
|
+
|
|
1163
|
+
/**
|
|
1164
|
+
* @brief Disable the owner's eonce, extracting, resetting and returning
|
|
1165
|
+
* the \c rko object.
|
|
1166
|
+
*
|
|
1167
|
+
* This is the same as rd_kafka_enq_once_destroy() but returning
|
|
1168
|
+
* the rko.
|
|
1169
|
+
*
|
|
1170
|
+
* Use this for owner-thread triggering where the enqueuing of the
|
|
1171
|
+
* rko on the replyq is not necessary.
|
|
1172
|
+
*
|
|
1173
|
+
* @returns the eonce's rko object, if still available, else NULL.
|
|
1174
|
+
*/
|
|
1175
|
+
static RD_INLINE RD_UNUSED rd_kafka_op_t *
|
|
1176
|
+
rd_kafka_enq_once_disable(rd_kafka_enq_once_t *eonce) {
|
|
1177
|
+
int do_destroy;
|
|
1178
|
+
rd_kafka_op_t *rko;
|
|
1179
|
+
|
|
1180
|
+
mtx_lock(&eonce->lock);
|
|
1181
|
+
rd_assert(eonce->refcnt > 0);
|
|
1182
|
+
eonce->refcnt--;
|
|
1183
|
+
do_destroy = eonce->refcnt == 0;
|
|
1184
|
+
|
|
1185
|
+
/* May be NULL */
|
|
1186
|
+
rko = eonce->rko;
|
|
1187
|
+
eonce->rko = NULL;
|
|
1188
|
+
rd_kafka_replyq_destroy(&eonce->replyq);
|
|
1189
|
+
|
|
1190
|
+
mtx_unlock(&eonce->lock);
|
|
1191
|
+
|
|
1192
|
+
if (do_destroy) {
|
|
1193
|
+
/* We're the last refcount holder, clean up eonce. */
|
|
1194
|
+
rd_kafka_enq_once_destroy0(eonce);
|
|
1195
|
+
}
|
|
1196
|
+
|
|
1197
|
+
return rko;
|
|
1198
|
+
}
|
|
1199
|
+
|
|
1200
|
+
/**
|
|
1201
|
+
* @brief Returns true if the queue can contain fetched messages.
|
|
1202
|
+
*
|
|
1203
|
+
* @locks rd_kafka_q_lock(rkq) if do_lock is set.
|
|
1204
|
+
*/
|
|
1205
|
+
static RD_INLINE RD_UNUSED rd_bool_t
|
|
1206
|
+
rd_kafka_q_can_contain_fetched_msgs(rd_kafka_q_t *rkq, rd_bool_t do_lock) {
|
|
1207
|
+
rd_bool_t val;
|
|
1208
|
+
if (do_lock)
|
|
1209
|
+
mtx_lock(&rkq->rkq_lock);
|
|
1210
|
+
val = rkq->rkq_flags & RD_KAFKA_Q_F_CONSUMER;
|
|
1211
|
+
if (do_lock)
|
|
1212
|
+
mtx_unlock(&rkq->rkq_lock);
|
|
1213
|
+
return val;
|
|
1214
|
+
}
|
|
1215
|
+
|
|
1216
|
+
|
|
1217
|
+
/**@}*/
|
|
1218
|
+
|
|
1219
|
+
|
|
1220
|
+
#endif /* _RDKAFKA_QUEUE_H_ */
|