@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,1309 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* librdkafka - Apache Kafka C library
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2015-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
|
+
#ifdef _WIN32
|
|
30
|
+
#pragma comment(lib, "ws2_32.lib")
|
|
31
|
+
#endif
|
|
32
|
+
|
|
33
|
+
#define __need_IOV_MAX
|
|
34
|
+
|
|
35
|
+
#define _DARWIN_C_SOURCE /* MSG_DONTWAIT */
|
|
36
|
+
|
|
37
|
+
#include "rdkafka_int.h"
|
|
38
|
+
#include "rdaddr.h"
|
|
39
|
+
#include "rdkafka_transport.h"
|
|
40
|
+
#include "rdkafka_transport_int.h"
|
|
41
|
+
#include "rdkafka_broker.h"
|
|
42
|
+
#include "rdkafka_interceptor.h"
|
|
43
|
+
|
|
44
|
+
#include <errno.h>
|
|
45
|
+
|
|
46
|
+
/* AIX doesn't have MSG_DONTWAIT */
|
|
47
|
+
#ifndef MSG_DONTWAIT
|
|
48
|
+
#define MSG_DONTWAIT MSG_NONBLOCK
|
|
49
|
+
#endif
|
|
50
|
+
|
|
51
|
+
#if WITH_SSL
|
|
52
|
+
#include "rdkafka_ssl.h"
|
|
53
|
+
#endif
|
|
54
|
+
|
|
55
|
+
/**< Current thread's rd_kafka_transport_t instance.
|
|
56
|
+
* This pointer is set up when calling any OpenSSL APIs that might
|
|
57
|
+
* trigger SSL callbacks, and is used to retrieve the SSL object's
|
|
58
|
+
* corresponding rd_kafka_transport_t instance.
|
|
59
|
+
* There is an set/get_ex_data() API in OpenSSL, but it requires storing
|
|
60
|
+
* a unique index somewhere, which we can't do without having a singleton
|
|
61
|
+
* object, so instead we cut out the middle man and store the
|
|
62
|
+
* rd_kafka_transport_t pointer directly in the thread-local memory. */
|
|
63
|
+
RD_TLS rd_kafka_transport_t *rd_kafka_curr_transport;
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
static int rd_kafka_transport_poll(rd_kafka_transport_t *rktrans, int tmout);
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Low-level socket close
|
|
71
|
+
*/
|
|
72
|
+
static void rd_kafka_transport_close0(rd_kafka_t *rk, rd_socket_t s) {
|
|
73
|
+
if (rk->rk_conf.closesocket_cb)
|
|
74
|
+
rk->rk_conf.closesocket_cb((int)s, rk->rk_conf.opaque);
|
|
75
|
+
else
|
|
76
|
+
rd_socket_close(s);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Close and destroy a transport handle
|
|
81
|
+
*/
|
|
82
|
+
void rd_kafka_transport_close(rd_kafka_transport_t *rktrans) {
|
|
83
|
+
#if WITH_SSL
|
|
84
|
+
rd_kafka_curr_transport = rktrans;
|
|
85
|
+
if (rktrans->rktrans_ssl)
|
|
86
|
+
rd_kafka_transport_ssl_close(rktrans);
|
|
87
|
+
#endif
|
|
88
|
+
|
|
89
|
+
rd_kafka_sasl_close(rktrans);
|
|
90
|
+
|
|
91
|
+
if (rktrans->rktrans_recv_buf)
|
|
92
|
+
rd_kafka_buf_destroy(rktrans->rktrans_recv_buf);
|
|
93
|
+
|
|
94
|
+
#ifdef _WIN32
|
|
95
|
+
WSACloseEvent(rktrans->rktrans_wsaevent);
|
|
96
|
+
#endif
|
|
97
|
+
|
|
98
|
+
if (rktrans->rktrans_s != -1)
|
|
99
|
+
rd_kafka_transport_close0(rktrans->rktrans_rkb->rkb_rk,
|
|
100
|
+
rktrans->rktrans_s);
|
|
101
|
+
|
|
102
|
+
rd_free(rktrans);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* @brief shutdown(2) a transport's underlying socket.
|
|
107
|
+
*
|
|
108
|
+
* This will prohibit further sends and receives.
|
|
109
|
+
* rd_kafka_transport_close() must still be called to close the socket.
|
|
110
|
+
*/
|
|
111
|
+
void rd_kafka_transport_shutdown(rd_kafka_transport_t *rktrans) {
|
|
112
|
+
shutdown(rktrans->rktrans_s,
|
|
113
|
+
#ifdef _WIN32
|
|
114
|
+
SD_BOTH
|
|
115
|
+
#else
|
|
116
|
+
SHUT_RDWR
|
|
117
|
+
#endif
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
#ifndef _WIN32
|
|
123
|
+
/**
|
|
124
|
+
* @brief sendmsg() abstraction, converting a list of segments to iovecs.
|
|
125
|
+
* @remark should only be called if the number of segments is > 1.
|
|
126
|
+
*/
|
|
127
|
+
static ssize_t rd_kafka_transport_socket_sendmsg(rd_kafka_transport_t *rktrans,
|
|
128
|
+
rd_slice_t *slice,
|
|
129
|
+
char *errstr,
|
|
130
|
+
size_t errstr_size) {
|
|
131
|
+
struct iovec iov[IOV_MAX];
|
|
132
|
+
struct msghdr msg = {.msg_iov = iov};
|
|
133
|
+
size_t iovlen;
|
|
134
|
+
ssize_t r;
|
|
135
|
+
size_t r2;
|
|
136
|
+
|
|
137
|
+
rd_slice_get_iov(slice, msg.msg_iov, &iovlen, IOV_MAX,
|
|
138
|
+
/* FIXME: Measure the effects of this */
|
|
139
|
+
rktrans->rktrans_sndbuf_size);
|
|
140
|
+
msg.msg_iovlen = (int)iovlen;
|
|
141
|
+
|
|
142
|
+
#ifdef __sun
|
|
143
|
+
/* See recvmsg() comment. Setting it here to be safe. */
|
|
144
|
+
rd_socket_errno = EAGAIN;
|
|
145
|
+
#endif
|
|
146
|
+
|
|
147
|
+
r = sendmsg(rktrans->rktrans_s, &msg,
|
|
148
|
+
MSG_DONTWAIT
|
|
149
|
+
#ifdef MSG_NOSIGNAL
|
|
150
|
+
| MSG_NOSIGNAL
|
|
151
|
+
#endif
|
|
152
|
+
);
|
|
153
|
+
|
|
154
|
+
if (r == -1) {
|
|
155
|
+
if (rd_socket_errno == EAGAIN)
|
|
156
|
+
return 0;
|
|
157
|
+
rd_snprintf(errstr, errstr_size, "%s", rd_strerror(errno));
|
|
158
|
+
return -1;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/* Update buffer read position */
|
|
162
|
+
r2 = rd_slice_read(slice, NULL, (size_t)r);
|
|
163
|
+
rd_assert((size_t)r == r2 &&
|
|
164
|
+
*"BUG: wrote more bytes than available in slice");
|
|
165
|
+
|
|
166
|
+
return r;
|
|
167
|
+
}
|
|
168
|
+
#endif
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* @brief Plain send() abstraction
|
|
173
|
+
*/
|
|
174
|
+
static ssize_t rd_kafka_transport_socket_send0(rd_kafka_transport_t *rktrans,
|
|
175
|
+
rd_slice_t *slice,
|
|
176
|
+
char *errstr,
|
|
177
|
+
size_t errstr_size) {
|
|
178
|
+
ssize_t sum = 0;
|
|
179
|
+
const void *p;
|
|
180
|
+
size_t rlen;
|
|
181
|
+
|
|
182
|
+
while ((rlen = rd_slice_peeker(slice, &p))) {
|
|
183
|
+
ssize_t r;
|
|
184
|
+
size_t r2;
|
|
185
|
+
|
|
186
|
+
r = send(rktrans->rktrans_s, p,
|
|
187
|
+
#ifdef _WIN32
|
|
188
|
+
(int)rlen, (int)0
|
|
189
|
+
#else
|
|
190
|
+
rlen, 0
|
|
191
|
+
#endif
|
|
192
|
+
);
|
|
193
|
+
|
|
194
|
+
#ifdef _WIN32
|
|
195
|
+
if (unlikely(r == RD_SOCKET_ERROR)) {
|
|
196
|
+
if (sum > 0 || rd_socket_errno == WSAEWOULDBLOCK) {
|
|
197
|
+
rktrans->rktrans_blocked = rd_true;
|
|
198
|
+
return sum;
|
|
199
|
+
} else {
|
|
200
|
+
rd_snprintf(
|
|
201
|
+
errstr, errstr_size, "%s",
|
|
202
|
+
rd_socket_strerror(rd_socket_errno));
|
|
203
|
+
return -1;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
rktrans->rktrans_blocked = rd_false;
|
|
208
|
+
#else
|
|
209
|
+
if (unlikely(r <= 0)) {
|
|
210
|
+
if (r == 0 || rd_socket_errno == EAGAIN)
|
|
211
|
+
return 0;
|
|
212
|
+
rd_snprintf(errstr, errstr_size, "%s",
|
|
213
|
+
rd_socket_strerror(rd_socket_errno));
|
|
214
|
+
return -1;
|
|
215
|
+
}
|
|
216
|
+
#endif
|
|
217
|
+
|
|
218
|
+
/* Update buffer read position */
|
|
219
|
+
r2 = rd_slice_read(slice, NULL, (size_t)r);
|
|
220
|
+
rd_assert((size_t)r == r2 &&
|
|
221
|
+
*"BUG: wrote more bytes than available in slice");
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
sum += r;
|
|
225
|
+
|
|
226
|
+
/* FIXME: remove this and try again immediately and let
|
|
227
|
+
* the next write() call fail instead? */
|
|
228
|
+
if ((size_t)r < rlen)
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
return sum;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
static ssize_t rd_kafka_transport_socket_send(rd_kafka_transport_t *rktrans,
|
|
237
|
+
rd_slice_t *slice,
|
|
238
|
+
char *errstr,
|
|
239
|
+
size_t errstr_size) {
|
|
240
|
+
#ifndef _WIN32
|
|
241
|
+
/* FIXME: Use sendmsg() with iovecs if there's more than one segment
|
|
242
|
+
* remaining, otherwise (or if platform does not have sendmsg)
|
|
243
|
+
* use plain send(). */
|
|
244
|
+
return rd_kafka_transport_socket_sendmsg(rktrans, slice, errstr,
|
|
245
|
+
errstr_size);
|
|
246
|
+
#endif
|
|
247
|
+
return rd_kafka_transport_socket_send0(rktrans, slice, errstr,
|
|
248
|
+
errstr_size);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
#ifndef _WIN32
|
|
254
|
+
/**
|
|
255
|
+
* @brief recvmsg() abstraction, converting a list of segments to iovecs.
|
|
256
|
+
* @remark should only be called if the number of segments is > 1.
|
|
257
|
+
*/
|
|
258
|
+
static ssize_t rd_kafka_transport_socket_recvmsg(rd_kafka_transport_t *rktrans,
|
|
259
|
+
rd_buf_t *rbuf,
|
|
260
|
+
char *errstr,
|
|
261
|
+
size_t errstr_size) {
|
|
262
|
+
ssize_t r;
|
|
263
|
+
struct iovec iov[IOV_MAX];
|
|
264
|
+
struct msghdr msg = {.msg_iov = iov};
|
|
265
|
+
size_t iovlen;
|
|
266
|
+
|
|
267
|
+
rd_buf_get_write_iov(rbuf, msg.msg_iov, &iovlen, IOV_MAX,
|
|
268
|
+
/* FIXME: Measure the effects of this */
|
|
269
|
+
rktrans->rktrans_rcvbuf_size);
|
|
270
|
+
msg.msg_iovlen = (int)iovlen;
|
|
271
|
+
|
|
272
|
+
#ifdef __sun
|
|
273
|
+
/* SunOS doesn't seem to set errno when recvmsg() fails
|
|
274
|
+
* due to no data and MSG_DONTWAIT is set. */
|
|
275
|
+
rd_socket_errno = EAGAIN;
|
|
276
|
+
#endif
|
|
277
|
+
r = recvmsg(rktrans->rktrans_s, &msg, MSG_DONTWAIT);
|
|
278
|
+
if (unlikely(r <= 0)) {
|
|
279
|
+
if (r == -1 && rd_socket_errno == EAGAIN)
|
|
280
|
+
return 0;
|
|
281
|
+
else if (r == 0) {
|
|
282
|
+
/* Receive 0 after POLLIN event means
|
|
283
|
+
* connection closed. */
|
|
284
|
+
rd_snprintf(errstr, errstr_size,
|
|
285
|
+
"Disconnected: connection closed by "
|
|
286
|
+
"peer: receive 0 after POLLIN");
|
|
287
|
+
return -1;
|
|
288
|
+
} else if (r == -1 && rd_socket_errno == ECONNRESET) {
|
|
289
|
+
rd_snprintf(errstr, errstr_size,
|
|
290
|
+
"Disconnected: connection "
|
|
291
|
+
"reset by peer");
|
|
292
|
+
return -1;
|
|
293
|
+
} else if (r == -1) {
|
|
294
|
+
rd_snprintf(errstr, errstr_size, "%s",
|
|
295
|
+
rd_strerror(errno));
|
|
296
|
+
return -1;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/* Update buffer write position */
|
|
301
|
+
rd_buf_write(rbuf, NULL, (size_t)r);
|
|
302
|
+
|
|
303
|
+
return r;
|
|
304
|
+
}
|
|
305
|
+
#endif
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* @brief Plain recv()
|
|
310
|
+
*/
|
|
311
|
+
static ssize_t rd_kafka_transport_socket_recv0(rd_kafka_transport_t *rktrans,
|
|
312
|
+
rd_buf_t *rbuf,
|
|
313
|
+
char *errstr,
|
|
314
|
+
size_t errstr_size) {
|
|
315
|
+
ssize_t sum = 0;
|
|
316
|
+
void *p;
|
|
317
|
+
size_t len;
|
|
318
|
+
|
|
319
|
+
while ((len = rd_buf_get_writable(rbuf, &p))) {
|
|
320
|
+
ssize_t r;
|
|
321
|
+
|
|
322
|
+
r = recv(rktrans->rktrans_s, p,
|
|
323
|
+
#ifdef _WIN32
|
|
324
|
+
(int)
|
|
325
|
+
#endif
|
|
326
|
+
len,
|
|
327
|
+
0);
|
|
328
|
+
|
|
329
|
+
if (unlikely(r == RD_SOCKET_ERROR)) {
|
|
330
|
+
if (rd_socket_errno == EAGAIN
|
|
331
|
+
#ifdef _WIN32
|
|
332
|
+
|| rd_socket_errno == WSAEWOULDBLOCK
|
|
333
|
+
#endif
|
|
334
|
+
)
|
|
335
|
+
return sum;
|
|
336
|
+
else {
|
|
337
|
+
rd_snprintf(
|
|
338
|
+
errstr, errstr_size, "%s",
|
|
339
|
+
rd_socket_strerror(rd_socket_errno));
|
|
340
|
+
return -1;
|
|
341
|
+
}
|
|
342
|
+
} else if (unlikely(r == 0)) {
|
|
343
|
+
/* Receive 0 after POLLIN event means
|
|
344
|
+
* connection closed. */
|
|
345
|
+
rd_snprintf(errstr, errstr_size,
|
|
346
|
+
"Disconnected: connection closed by "
|
|
347
|
+
"peer: receive 0 after POLLIN");
|
|
348
|
+
return -1;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/* Update buffer write position */
|
|
352
|
+
rd_buf_write(rbuf, NULL, (size_t)r);
|
|
353
|
+
|
|
354
|
+
sum += r;
|
|
355
|
+
|
|
356
|
+
/* FIXME: remove this and try again immediately and let
|
|
357
|
+
* the next recv() call fail instead? */
|
|
358
|
+
if ((size_t)r < len)
|
|
359
|
+
break;
|
|
360
|
+
}
|
|
361
|
+
return sum;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
static ssize_t rd_kafka_transport_socket_recv(rd_kafka_transport_t *rktrans,
|
|
366
|
+
rd_buf_t *buf,
|
|
367
|
+
char *errstr,
|
|
368
|
+
size_t errstr_size) {
|
|
369
|
+
#ifndef _WIN32
|
|
370
|
+
return rd_kafka_transport_socket_recvmsg(rktrans, buf, errstr,
|
|
371
|
+
errstr_size);
|
|
372
|
+
#endif
|
|
373
|
+
return rd_kafka_transport_socket_recv0(rktrans, buf, errstr,
|
|
374
|
+
errstr_size);
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
/**
|
|
380
|
+
* CONNECT state is failed (errstr!=NULL) or done (TCP is up, SSL is working..).
|
|
381
|
+
* From this state we either hand control back to the broker code,
|
|
382
|
+
* or if authentication is configured we ente the AUTH state.
|
|
383
|
+
*/
|
|
384
|
+
void rd_kafka_transport_connect_done(rd_kafka_transport_t *rktrans,
|
|
385
|
+
char *errstr) {
|
|
386
|
+
rd_kafka_broker_t *rkb = rktrans->rktrans_rkb;
|
|
387
|
+
|
|
388
|
+
rd_kafka_curr_transport = rktrans;
|
|
389
|
+
|
|
390
|
+
rd_kafka_broker_connect_done(rkb, errstr);
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
ssize_t rd_kafka_transport_send(rd_kafka_transport_t *rktrans,
|
|
396
|
+
rd_slice_t *slice,
|
|
397
|
+
char *errstr,
|
|
398
|
+
size_t errstr_size) {
|
|
399
|
+
ssize_t r;
|
|
400
|
+
#if WITH_SSL
|
|
401
|
+
if (rktrans->rktrans_ssl) {
|
|
402
|
+
rd_kafka_curr_transport = rktrans;
|
|
403
|
+
r = rd_kafka_transport_ssl_send(rktrans, slice, errstr,
|
|
404
|
+
errstr_size);
|
|
405
|
+
} else
|
|
406
|
+
#endif
|
|
407
|
+
r = rd_kafka_transport_socket_send(rktrans, slice, errstr,
|
|
408
|
+
errstr_size);
|
|
409
|
+
|
|
410
|
+
return r;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
|
|
414
|
+
ssize_t rd_kafka_transport_recv(rd_kafka_transport_t *rktrans,
|
|
415
|
+
rd_buf_t *rbuf,
|
|
416
|
+
char *errstr,
|
|
417
|
+
size_t errstr_size) {
|
|
418
|
+
ssize_t r;
|
|
419
|
+
|
|
420
|
+
#if WITH_SSL
|
|
421
|
+
if (rktrans->rktrans_ssl) {
|
|
422
|
+
rd_kafka_curr_transport = rktrans;
|
|
423
|
+
r = rd_kafka_transport_ssl_recv(rktrans, rbuf, errstr,
|
|
424
|
+
errstr_size);
|
|
425
|
+
} else
|
|
426
|
+
#endif
|
|
427
|
+
r = rd_kafka_transport_socket_recv(rktrans, rbuf, errstr,
|
|
428
|
+
errstr_size);
|
|
429
|
+
|
|
430
|
+
return r;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
|
|
434
|
+
|
|
435
|
+
/**
|
|
436
|
+
* @brief Notify transport layer of full request sent.
|
|
437
|
+
*/
|
|
438
|
+
void rd_kafka_transport_request_sent(rd_kafka_broker_t *rkb,
|
|
439
|
+
rd_kafka_buf_t *rkbuf) {
|
|
440
|
+
rd_kafka_transport_t *rktrans = rkb->rkb_transport;
|
|
441
|
+
|
|
442
|
+
/* Call on_request_sent interceptors */
|
|
443
|
+
rd_kafka_interceptors_on_request_sent(
|
|
444
|
+
rkb->rkb_rk, (int)rktrans->rktrans_s, rkb->rkb_name,
|
|
445
|
+
rkb->rkb_nodeid, rkbuf->rkbuf_reqhdr.ApiKey,
|
|
446
|
+
rkbuf->rkbuf_reqhdr.ApiVersion, rkbuf->rkbuf_corrid,
|
|
447
|
+
rd_slice_size(&rkbuf->rkbuf_reader));
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
/**
|
|
453
|
+
* Length framed receive handling.
|
|
454
|
+
* Currently only supports a the following framing:
|
|
455
|
+
* [int32_t:big_endian_length_of_payload][payload]
|
|
456
|
+
*
|
|
457
|
+
* To be used on POLLIN event, will return:
|
|
458
|
+
* -1: on fatal error (errstr will be updated, *rkbufp remains unset)
|
|
459
|
+
* 0: still waiting for data (*rkbufp remains unset)
|
|
460
|
+
* 1: data complete, (buffer returned in *rkbufp)
|
|
461
|
+
*/
|
|
462
|
+
int rd_kafka_transport_framed_recv(rd_kafka_transport_t *rktrans,
|
|
463
|
+
rd_kafka_buf_t **rkbufp,
|
|
464
|
+
char *errstr,
|
|
465
|
+
size_t errstr_size) {
|
|
466
|
+
rd_kafka_buf_t *rkbuf = rktrans->rktrans_recv_buf;
|
|
467
|
+
ssize_t r;
|
|
468
|
+
const int log_decode_errors = LOG_ERR;
|
|
469
|
+
|
|
470
|
+
/* States:
|
|
471
|
+
* !rktrans_recv_buf: initial state; set up buf to receive header.
|
|
472
|
+
* rkbuf_totlen == 0: awaiting header
|
|
473
|
+
* rkbuf_totlen > 0: awaiting payload
|
|
474
|
+
*/
|
|
475
|
+
|
|
476
|
+
if (!rkbuf) {
|
|
477
|
+
rkbuf = rd_kafka_buf_new(1, 4 /*length field's length*/);
|
|
478
|
+
/* Set up buffer reader for the length field */
|
|
479
|
+
rd_buf_write_ensure(&rkbuf->rkbuf_buf, 4, 4);
|
|
480
|
+
rktrans->rktrans_recv_buf = rkbuf;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
|
|
484
|
+
r = rd_kafka_transport_recv(rktrans, &rkbuf->rkbuf_buf, errstr,
|
|
485
|
+
errstr_size);
|
|
486
|
+
if (r == 0)
|
|
487
|
+
return 0;
|
|
488
|
+
else if (r == -1)
|
|
489
|
+
return -1;
|
|
490
|
+
|
|
491
|
+
if (rkbuf->rkbuf_totlen == 0) {
|
|
492
|
+
/* Frame length not known yet. */
|
|
493
|
+
int32_t frame_len;
|
|
494
|
+
|
|
495
|
+
if (rd_buf_write_pos(&rkbuf->rkbuf_buf) < sizeof(frame_len)) {
|
|
496
|
+
/* Wait for entire frame header. */
|
|
497
|
+
return 0;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
/* Initialize reader */
|
|
501
|
+
rd_slice_init(&rkbuf->rkbuf_reader, &rkbuf->rkbuf_buf, 0, 4);
|
|
502
|
+
|
|
503
|
+
/* Reader header: payload length */
|
|
504
|
+
rd_kafka_buf_read_i32(rkbuf, &frame_len);
|
|
505
|
+
|
|
506
|
+
if (frame_len < 0 ||
|
|
507
|
+
frame_len > rktrans->rktrans_rkb->rkb_rk->rk_conf
|
|
508
|
+
.recv_max_msg_size) {
|
|
509
|
+
rd_snprintf(errstr, errstr_size,
|
|
510
|
+
"Invalid frame size %" PRId32, frame_len);
|
|
511
|
+
return -1;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
rkbuf->rkbuf_totlen = 4 + frame_len;
|
|
515
|
+
if (frame_len == 0) {
|
|
516
|
+
/* Payload is empty, we're done. */
|
|
517
|
+
rktrans->rktrans_recv_buf = NULL;
|
|
518
|
+
*rkbufp = rkbuf;
|
|
519
|
+
return 1;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
/* Allocate memory to hold entire frame payload in contigious
|
|
523
|
+
* memory. */
|
|
524
|
+
rd_buf_write_ensure_contig(&rkbuf->rkbuf_buf, frame_len);
|
|
525
|
+
|
|
526
|
+
/* Try reading directly, there is probably more data available*/
|
|
527
|
+
return rd_kafka_transport_framed_recv(rktrans, rkbufp, errstr,
|
|
528
|
+
errstr_size);
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
if (rd_buf_write_pos(&rkbuf->rkbuf_buf) == rkbuf->rkbuf_totlen) {
|
|
532
|
+
/* Payload is complete. */
|
|
533
|
+
rktrans->rktrans_recv_buf = NULL;
|
|
534
|
+
*rkbufp = rkbuf;
|
|
535
|
+
return 1;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
/* Wait for more data */
|
|
539
|
+
return 0;
|
|
540
|
+
|
|
541
|
+
err_parse:
|
|
542
|
+
rd_snprintf(errstr, errstr_size, "Frame header parsing failed: %s",
|
|
543
|
+
rd_kafka_err2str(rkbuf->rkbuf_err));
|
|
544
|
+
return -1;
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
|
|
548
|
+
/**
|
|
549
|
+
* @brief Final socket setup after a connection has been established
|
|
550
|
+
*/
|
|
551
|
+
void rd_kafka_transport_post_connect_setup(rd_kafka_transport_t *rktrans) {
|
|
552
|
+
rd_kafka_broker_t *rkb = rktrans->rktrans_rkb;
|
|
553
|
+
unsigned int slen;
|
|
554
|
+
|
|
555
|
+
/* Get send and receive buffer sizes to allow limiting
|
|
556
|
+
* the total number of bytes passed with iovecs to sendmsg()
|
|
557
|
+
* and recvmsg(). */
|
|
558
|
+
slen = sizeof(rktrans->rktrans_rcvbuf_size);
|
|
559
|
+
if (getsockopt(rktrans->rktrans_s, SOL_SOCKET, SO_RCVBUF,
|
|
560
|
+
(void *)&rktrans->rktrans_rcvbuf_size,
|
|
561
|
+
&slen) == RD_SOCKET_ERROR) {
|
|
562
|
+
rd_rkb_log(rkb, LOG_WARNING, "RCVBUF",
|
|
563
|
+
"Failed to get socket receive "
|
|
564
|
+
"buffer size: %s: assuming 1MB",
|
|
565
|
+
rd_socket_strerror(rd_socket_errno));
|
|
566
|
+
rktrans->rktrans_rcvbuf_size = 1024 * 1024;
|
|
567
|
+
} else if (rktrans->rktrans_rcvbuf_size < 1024 * 64)
|
|
568
|
+
rktrans->rktrans_rcvbuf_size =
|
|
569
|
+
1024 * 64; /* Use at least 64KB */
|
|
570
|
+
|
|
571
|
+
slen = sizeof(rktrans->rktrans_sndbuf_size);
|
|
572
|
+
if (getsockopt(rktrans->rktrans_s, SOL_SOCKET, SO_SNDBUF,
|
|
573
|
+
(void *)&rktrans->rktrans_sndbuf_size,
|
|
574
|
+
&slen) == RD_SOCKET_ERROR) {
|
|
575
|
+
rd_rkb_log(rkb, LOG_WARNING, "RCVBUF",
|
|
576
|
+
"Failed to get socket send "
|
|
577
|
+
"buffer size: %s: assuming 1MB",
|
|
578
|
+
rd_socket_strerror(rd_socket_errno));
|
|
579
|
+
rktrans->rktrans_sndbuf_size = 1024 * 1024;
|
|
580
|
+
} else if (rktrans->rktrans_sndbuf_size < 1024 * 64)
|
|
581
|
+
rktrans->rktrans_sndbuf_size =
|
|
582
|
+
1024 * 64; /* Use at least 64KB */
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
|
|
586
|
+
/**
|
|
587
|
+
* TCP connection established.
|
|
588
|
+
* Set up socket options, SSL, etc.
|
|
589
|
+
*
|
|
590
|
+
* Locality: broker thread
|
|
591
|
+
*/
|
|
592
|
+
static void rd_kafka_transport_connected(rd_kafka_transport_t *rktrans) {
|
|
593
|
+
rd_kafka_broker_t *rkb = rktrans->rktrans_rkb;
|
|
594
|
+
|
|
595
|
+
rd_rkb_dbg(
|
|
596
|
+
rkb, BROKER, "CONNECT", "Connected to %s",
|
|
597
|
+
rd_sockaddr2str(rkb->rkb_addr_last,
|
|
598
|
+
RD_SOCKADDR2STR_F_PORT | RD_SOCKADDR2STR_F_FAMILY));
|
|
599
|
+
|
|
600
|
+
rd_kafka_transport_post_connect_setup(rktrans);
|
|
601
|
+
|
|
602
|
+
#if WITH_SSL
|
|
603
|
+
if (rkb->rkb_proto == RD_KAFKA_PROTO_SSL ||
|
|
604
|
+
rkb->rkb_proto == RD_KAFKA_PROTO_SASL_SSL) {
|
|
605
|
+
char errstr[512];
|
|
606
|
+
|
|
607
|
+
rd_kafka_broker_lock(rkb);
|
|
608
|
+
rd_kafka_broker_set_state(rkb,
|
|
609
|
+
RD_KAFKA_BROKER_STATE_SSL_HANDSHAKE);
|
|
610
|
+
rd_kafka_broker_unlock(rkb);
|
|
611
|
+
|
|
612
|
+
/* Set up SSL connection.
|
|
613
|
+
* This is also an asynchronous operation so dont
|
|
614
|
+
* propagate to broker_connect_done() just yet. */
|
|
615
|
+
if (rd_kafka_transport_ssl_connect(rkb, rktrans, errstr,
|
|
616
|
+
sizeof(errstr)) == -1) {
|
|
617
|
+
rd_kafka_transport_connect_done(rktrans, errstr);
|
|
618
|
+
return;
|
|
619
|
+
}
|
|
620
|
+
return;
|
|
621
|
+
}
|
|
622
|
+
#endif
|
|
623
|
+
|
|
624
|
+
/* Propagate connect success */
|
|
625
|
+
rd_kafka_transport_connect_done(rktrans, NULL);
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
|
|
629
|
+
|
|
630
|
+
/**
|
|
631
|
+
* @brief the kernel SO_ERROR in \p errp for the given transport.
|
|
632
|
+
* @returns 0 if getsockopt() was succesful (and \p and errp can be trusted),
|
|
633
|
+
* else -1 in which case \p errp 's value is undefined.
|
|
634
|
+
*/
|
|
635
|
+
static int rd_kafka_transport_get_socket_error(rd_kafka_transport_t *rktrans,
|
|
636
|
+
int *errp) {
|
|
637
|
+
socklen_t intlen = sizeof(*errp);
|
|
638
|
+
|
|
639
|
+
if (getsockopt(rktrans->rktrans_s, SOL_SOCKET, SO_ERROR, (void *)errp,
|
|
640
|
+
&intlen) == -1) {
|
|
641
|
+
rd_rkb_dbg(rktrans->rktrans_rkb, BROKER, "SO_ERROR",
|
|
642
|
+
"Failed to get socket error: %s",
|
|
643
|
+
rd_socket_strerror(rd_socket_errno));
|
|
644
|
+
return -1;
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
return 0;
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
|
|
651
|
+
/**
|
|
652
|
+
* IO event handler.
|
|
653
|
+
*
|
|
654
|
+
* @param socket_errstr Is an optional (else NULL) error string from the
|
|
655
|
+
* socket layer.
|
|
656
|
+
*
|
|
657
|
+
* Locality: broker thread
|
|
658
|
+
*/
|
|
659
|
+
static void rd_kafka_transport_io_event(rd_kafka_transport_t *rktrans,
|
|
660
|
+
int events,
|
|
661
|
+
const char *socket_errstr) {
|
|
662
|
+
char errstr[512];
|
|
663
|
+
int r;
|
|
664
|
+
rd_kafka_broker_t *rkb = rktrans->rktrans_rkb;
|
|
665
|
+
|
|
666
|
+
switch (rkb->rkb_state) {
|
|
667
|
+
case RD_KAFKA_BROKER_STATE_CONNECT:
|
|
668
|
+
/* Asynchronous connect finished, read status. */
|
|
669
|
+
if (!(events & (POLLOUT | POLLERR | POLLHUP)))
|
|
670
|
+
return;
|
|
671
|
+
|
|
672
|
+
if (socket_errstr)
|
|
673
|
+
rd_kafka_broker_fail(
|
|
674
|
+
rkb, LOG_ERR, RD_KAFKA_RESP_ERR__TRANSPORT,
|
|
675
|
+
"Connect to %s failed: %s",
|
|
676
|
+
rd_sockaddr2str(rkb->rkb_addr_last,
|
|
677
|
+
RD_SOCKADDR2STR_F_PORT |
|
|
678
|
+
RD_SOCKADDR2STR_F_FAMILY),
|
|
679
|
+
socket_errstr);
|
|
680
|
+
else if (rd_kafka_transport_get_socket_error(rktrans, &r) ==
|
|
681
|
+
-1) {
|
|
682
|
+
rd_kafka_broker_fail(
|
|
683
|
+
rkb, LOG_ERR, RD_KAFKA_RESP_ERR__TRANSPORT,
|
|
684
|
+
"Connect to %s failed: "
|
|
685
|
+
"unable to get status from "
|
|
686
|
+
"socket %d: %s",
|
|
687
|
+
rd_sockaddr2str(rkb->rkb_addr_last,
|
|
688
|
+
RD_SOCKADDR2STR_F_PORT |
|
|
689
|
+
RD_SOCKADDR2STR_F_FAMILY),
|
|
690
|
+
rktrans->rktrans_s, rd_strerror(rd_socket_errno));
|
|
691
|
+
} else if (r != 0) {
|
|
692
|
+
/* Connect failed */
|
|
693
|
+
rd_snprintf(
|
|
694
|
+
errstr, sizeof(errstr), "Connect to %s failed: %s",
|
|
695
|
+
rd_sockaddr2str(rkb->rkb_addr_last,
|
|
696
|
+
RD_SOCKADDR2STR_F_PORT |
|
|
697
|
+
RD_SOCKADDR2STR_F_FAMILY),
|
|
698
|
+
rd_strerror(r));
|
|
699
|
+
|
|
700
|
+
rd_kafka_transport_connect_done(rktrans, errstr);
|
|
701
|
+
} else {
|
|
702
|
+
/* Connect succeeded */
|
|
703
|
+
rd_kafka_transport_connected(rktrans);
|
|
704
|
+
}
|
|
705
|
+
break;
|
|
706
|
+
|
|
707
|
+
case RD_KAFKA_BROKER_STATE_SSL_HANDSHAKE:
|
|
708
|
+
#if WITH_SSL
|
|
709
|
+
rd_assert(rktrans->rktrans_ssl);
|
|
710
|
+
|
|
711
|
+
/* Currently setting up SSL connection:
|
|
712
|
+
* perform handshake. */
|
|
713
|
+
r = rd_kafka_transport_ssl_handshake(rktrans);
|
|
714
|
+
|
|
715
|
+
if (r == 0 /* handshake still in progress */ &&
|
|
716
|
+
(events & POLLHUP)) {
|
|
717
|
+
rd_kafka_broker_conn_closed(
|
|
718
|
+
rkb, RD_KAFKA_RESP_ERR__TRANSPORT,
|
|
719
|
+
"Disconnected: during "
|
|
720
|
+
"SSL connection handshake");
|
|
721
|
+
return;
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
#else
|
|
725
|
+
RD_NOTREACHED();
|
|
726
|
+
#endif
|
|
727
|
+
break;
|
|
728
|
+
|
|
729
|
+
case RD_KAFKA_BROKER_STATE_AUTH_LEGACY:
|
|
730
|
+
/* SASL authentication.
|
|
731
|
+
* Prior to broker version v1.0.0 this is performed
|
|
732
|
+
* directly on the socket without Kafka framing. */
|
|
733
|
+
if (rd_kafka_sasl_io_event(rktrans, events, errstr,
|
|
734
|
+
sizeof(errstr)) == -1) {
|
|
735
|
+
rd_kafka_broker_fail(
|
|
736
|
+
rkb, LOG_ERR, RD_KAFKA_RESP_ERR__AUTHENTICATION,
|
|
737
|
+
"SASL authentication failure: %s", errstr);
|
|
738
|
+
return;
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
if (events & POLLHUP) {
|
|
742
|
+
rd_kafka_broker_fail(rkb, LOG_ERR,
|
|
743
|
+
RD_KAFKA_RESP_ERR__AUTHENTICATION,
|
|
744
|
+
"Disconnected: hung up from "
|
|
745
|
+
"peer in state AUTH_LEGACY");
|
|
746
|
+
|
|
747
|
+
return;
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
break;
|
|
751
|
+
|
|
752
|
+
case RD_KAFKA_BROKER_STATE_APIVERSION_QUERY:
|
|
753
|
+
case RD_KAFKA_BROKER_STATE_AUTH_HANDSHAKE:
|
|
754
|
+
case RD_KAFKA_BROKER_STATE_AUTH_REQ:
|
|
755
|
+
case RD_KAFKA_BROKER_STATE_UP:
|
|
756
|
+
|
|
757
|
+
if (events & POLLIN) {
|
|
758
|
+
while (rkb->rkb_state >= RD_KAFKA_BROKER_STATE_UP &&
|
|
759
|
+
rd_kafka_recv(rkb) > 0)
|
|
760
|
+
;
|
|
761
|
+
|
|
762
|
+
/* If connection went down: bail out early */
|
|
763
|
+
if (rkb->rkb_state == RD_KAFKA_BROKER_STATE_DOWN)
|
|
764
|
+
return;
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
if (events & POLLHUP) {
|
|
768
|
+
rd_kafka_broker_conn_closed(
|
|
769
|
+
rkb, RD_KAFKA_RESP_ERR__TRANSPORT,
|
|
770
|
+
"Disconnected: connection closed by "
|
|
771
|
+
"peer: POLLHUP");
|
|
772
|
+
return;
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
if (events & POLLOUT) {
|
|
776
|
+
while (rd_kafka_send(rkb) > 0)
|
|
777
|
+
;
|
|
778
|
+
}
|
|
779
|
+
break;
|
|
780
|
+
|
|
781
|
+
case RD_KAFKA_BROKER_STATE_INIT:
|
|
782
|
+
case RD_KAFKA_BROKER_STATE_DOWN:
|
|
783
|
+
case RD_KAFKA_BROKER_STATE_TRY_CONNECT:
|
|
784
|
+
case RD_KAFKA_BROKER_STATE_REAUTH:
|
|
785
|
+
rd_kafka_assert(rkb->rkb_rk, !*"bad state");
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
|
|
790
|
+
|
|
791
|
+
#ifdef _WIN32
|
|
792
|
+
/**
|
|
793
|
+
* @brief Convert WSA FD_.. events to POLL.. events.
|
|
794
|
+
*/
|
|
795
|
+
static RD_INLINE int rd_kafka_transport_wsa2events(long wevents) {
|
|
796
|
+
int events = 0;
|
|
797
|
+
|
|
798
|
+
if (unlikely(wevents == 0))
|
|
799
|
+
return 0;
|
|
800
|
+
|
|
801
|
+
if (wevents & FD_READ)
|
|
802
|
+
events |= POLLIN;
|
|
803
|
+
if (wevents & (FD_WRITE | FD_CONNECT))
|
|
804
|
+
events |= POLLOUT;
|
|
805
|
+
if (wevents & FD_CLOSE)
|
|
806
|
+
events |= POLLHUP;
|
|
807
|
+
|
|
808
|
+
rd_dassert(events != 0);
|
|
809
|
+
|
|
810
|
+
return events;
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
/**
|
|
814
|
+
* @brief Convert POLL.. events to WSA FD_.. events.
|
|
815
|
+
*/
|
|
816
|
+
static RD_INLINE int rd_kafka_transport_events2wsa(int events,
|
|
817
|
+
rd_bool_t is_connecting) {
|
|
818
|
+
long wevents = FD_CLOSE;
|
|
819
|
+
|
|
820
|
+
if (unlikely(is_connecting))
|
|
821
|
+
return wevents | FD_CONNECT;
|
|
822
|
+
|
|
823
|
+
if (events & POLLIN)
|
|
824
|
+
wevents |= FD_READ;
|
|
825
|
+
if (events & POLLOUT)
|
|
826
|
+
wevents |= FD_WRITE;
|
|
827
|
+
|
|
828
|
+
return wevents;
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
|
|
832
|
+
/**
|
|
833
|
+
* @returns the WinSocket events (as POLL.. events) for the broker socket.
|
|
834
|
+
*/
|
|
835
|
+
static int rd_kafka_transport_get_wsa_events(rd_kafka_transport_t *rktrans) {
|
|
836
|
+
const int try_bits[4 * 2] = {FD_READ_BIT, POLLIN, FD_WRITE_BIT,
|
|
837
|
+
POLLOUT, FD_CONNECT_BIT, POLLOUT,
|
|
838
|
+
FD_CLOSE_BIT, POLLHUP};
|
|
839
|
+
int r, i;
|
|
840
|
+
WSANETWORKEVENTS netevents;
|
|
841
|
+
int events = 0;
|
|
842
|
+
const char *socket_errstr = NULL;
|
|
843
|
+
rd_kafka_broker_t *rkb = rktrans->rktrans_rkb;
|
|
844
|
+
|
|
845
|
+
/* Get Socket event */
|
|
846
|
+
r = WSAEnumNetworkEvents(rktrans->rktrans_s, rktrans->rktrans_wsaevent,
|
|
847
|
+
&netevents);
|
|
848
|
+
if (unlikely(r == SOCKET_ERROR)) {
|
|
849
|
+
rd_rkb_log(rkb, LOG_ERR, "WSAWAIT",
|
|
850
|
+
"WSAEnumNetworkEvents() failed: %s",
|
|
851
|
+
rd_socket_strerror(rd_socket_errno));
|
|
852
|
+
socket_errstr = rd_socket_strerror(rd_socket_errno);
|
|
853
|
+
return POLLHUP | POLLERR;
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
/* Get fired events and errors for each event type */
|
|
857
|
+
for (i = 0; i < RD_ARRAYSIZE(try_bits); i += 2) {
|
|
858
|
+
const int bit = try_bits[i];
|
|
859
|
+
const int event = try_bits[i + 1];
|
|
860
|
+
|
|
861
|
+
if (!(netevents.lNetworkEvents & (1 << bit)))
|
|
862
|
+
continue;
|
|
863
|
+
|
|
864
|
+
if (unlikely(netevents.iErrorCode[bit])) {
|
|
865
|
+
socket_errstr =
|
|
866
|
+
rd_socket_strerror(netevents.iErrorCode[bit]);
|
|
867
|
+
events |= POLLHUP;
|
|
868
|
+
} else {
|
|
869
|
+
events |= event;
|
|
870
|
+
|
|
871
|
+
if (bit == FD_WRITE_BIT) {
|
|
872
|
+
/* Writing no longer blocked */
|
|
873
|
+
rktrans->rktrans_blocked = rd_false;
|
|
874
|
+
}
|
|
875
|
+
}
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
return events;
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
|
|
882
|
+
/**
|
|
883
|
+
* @brief Win32: Poll transport and \p rkq cond events.
|
|
884
|
+
*
|
|
885
|
+
* @returns the transport socket POLL.. event bits.
|
|
886
|
+
*/
|
|
887
|
+
static int rd_kafka_transport_io_serve_win32(rd_kafka_transport_t *rktrans,
|
|
888
|
+
rd_kafka_q_t *rkq,
|
|
889
|
+
int timeout_ms) {
|
|
890
|
+
const DWORD wsaevent_cnt = 3;
|
|
891
|
+
WSAEVENT wsaevents[3] = {
|
|
892
|
+
rkq->rkq_cond.mEvents[0], /* rkq: cnd_signal */
|
|
893
|
+
rkq->rkq_cond.mEvents[1], /* rkq: cnd_broadcast */
|
|
894
|
+
rktrans->rktrans_wsaevent, /* socket */
|
|
895
|
+
};
|
|
896
|
+
DWORD r;
|
|
897
|
+
int events = 0;
|
|
898
|
+
rd_kafka_broker_t *rkb = rktrans->rktrans_rkb;
|
|
899
|
+
rd_bool_t set_pollout = rd_false;
|
|
900
|
+
rd_bool_t cnd_is_waiting = rd_false;
|
|
901
|
+
|
|
902
|
+
/* WSA only sets FD_WRITE (e.g., POLLOUT) when the socket was
|
|
903
|
+
* previously blocked, unlike BSD sockets that set POLLOUT as long as
|
|
904
|
+
* the socket isn't blocked. So we need to imitate the BSD behaviour
|
|
905
|
+
* here and cut the timeout short if a write is wanted and the socket
|
|
906
|
+
* is not currently blocked. */
|
|
907
|
+
if (rktrans->rktrans_rkb->rkb_state != RD_KAFKA_BROKER_STATE_CONNECT &&
|
|
908
|
+
!rktrans->rktrans_blocked &&
|
|
909
|
+
(rktrans->rktrans_pfd[0].events & POLLOUT)) {
|
|
910
|
+
timeout_ms = 0;
|
|
911
|
+
set_pollout = rd_true;
|
|
912
|
+
} else {
|
|
913
|
+
/* Check if the queue already has ops enqueued in which case we
|
|
914
|
+
* cut the timeout short. Else add this thread as waiting on the
|
|
915
|
+
* queue's condvar so that cnd_signal() (et.al.) will perform
|
|
916
|
+
* SetEvent() and thus wake up this thread in case a new op is
|
|
917
|
+
* added to the queue. */
|
|
918
|
+
mtx_lock(&rkq->rkq_lock);
|
|
919
|
+
if (rkq->rkq_qlen > 0) {
|
|
920
|
+
timeout_ms = 0;
|
|
921
|
+
} else {
|
|
922
|
+
cnd_is_waiting = rd_true;
|
|
923
|
+
cnd_wait_enter(&rkq->rkq_cond);
|
|
924
|
+
}
|
|
925
|
+
mtx_unlock(&rkq->rkq_lock);
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
/* Wait for IO and queue events */
|
|
929
|
+
r = WSAWaitForMultipleEvents(wsaevent_cnt, wsaevents, FALSE, timeout_ms,
|
|
930
|
+
FALSE);
|
|
931
|
+
|
|
932
|
+
if (cnd_is_waiting) {
|
|
933
|
+
mtx_lock(&rkq->rkq_lock);
|
|
934
|
+
cnd_wait_exit(&rkq->rkq_cond);
|
|
935
|
+
mtx_unlock(&rkq->rkq_lock);
|
|
936
|
+
}
|
|
937
|
+
|
|
938
|
+
if (unlikely(r == WSA_WAIT_FAILED)) {
|
|
939
|
+
rd_rkb_log(rkb, LOG_CRIT, "WSAWAIT",
|
|
940
|
+
"WSAWaitForMultipleEvents failed: %s",
|
|
941
|
+
rd_socket_strerror(rd_socket_errno));
|
|
942
|
+
return POLLERR;
|
|
943
|
+
} else if (r != WSA_WAIT_TIMEOUT) {
|
|
944
|
+
r -= WSA_WAIT_EVENT_0;
|
|
945
|
+
|
|
946
|
+
/* Reset the cond events if any of them were triggered */
|
|
947
|
+
if (r < 2) {
|
|
948
|
+
ResetEvent(rkq->rkq_cond.mEvents[0]);
|
|
949
|
+
ResetEvent(rkq->rkq_cond.mEvents[1]);
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
/* Get the socket events. */
|
|
953
|
+
events = rd_kafka_transport_get_wsa_events(rktrans);
|
|
954
|
+
}
|
|
955
|
+
|
|
956
|
+
/* As explained above we need to set the POLLOUT flag
|
|
957
|
+
* in case it is wanted but not triggered by Winsocket so that
|
|
958
|
+
* io_event() knows it can attempt to send more data. */
|
|
959
|
+
if (likely(set_pollout && !(events & (POLLHUP | POLLERR | POLLOUT))))
|
|
960
|
+
events |= POLLOUT;
|
|
961
|
+
|
|
962
|
+
return events;
|
|
963
|
+
}
|
|
964
|
+
#endif
|
|
965
|
+
|
|
966
|
+
|
|
967
|
+
/**
|
|
968
|
+
* @brief Poll and serve IOs
|
|
969
|
+
*
|
|
970
|
+
* @returns 0 if \p rkq may need additional blocking/timeout polling, else 1.
|
|
971
|
+
*
|
|
972
|
+
* @locality broker thread
|
|
973
|
+
*/
|
|
974
|
+
int rd_kafka_transport_io_serve(rd_kafka_transport_t *rktrans,
|
|
975
|
+
rd_kafka_q_t *rkq,
|
|
976
|
+
int timeout_ms) {
|
|
977
|
+
rd_kafka_broker_t *rkb = rktrans->rktrans_rkb;
|
|
978
|
+
int events;
|
|
979
|
+
|
|
980
|
+
rd_kafka_curr_transport = rktrans;
|
|
981
|
+
|
|
982
|
+
if (
|
|
983
|
+
#ifndef _WIN32
|
|
984
|
+
/* BSD sockets use POLLOUT to indicate success to connect.
|
|
985
|
+
* Windows has its own flag for this (FD_CONNECT). */
|
|
986
|
+
rkb->rkb_state == RD_KAFKA_BROKER_STATE_CONNECT ||
|
|
987
|
+
#endif
|
|
988
|
+
(rkb->rkb_state > RD_KAFKA_BROKER_STATE_SSL_HANDSHAKE &&
|
|
989
|
+
rd_kafka_bufq_cnt(&rkb->rkb_waitresps) < rkb->rkb_max_inflight &&
|
|
990
|
+
rd_kafka_bufq_cnt(&rkb->rkb_outbufs) > 0))
|
|
991
|
+
rd_kafka_transport_poll_set(rkb->rkb_transport, POLLOUT);
|
|
992
|
+
|
|
993
|
+
#ifdef _WIN32
|
|
994
|
+
/* BSD sockets use POLLIN and a following recv() returning 0 to
|
|
995
|
+
* to indicate connection close.
|
|
996
|
+
* Windows has its own flag for this (FD_CLOSE). */
|
|
997
|
+
if (rd_kafka_bufq_cnt(&rkb->rkb_waitresps) > 0)
|
|
998
|
+
#endif
|
|
999
|
+
rd_kafka_transport_poll_set(rkb->rkb_transport, POLLIN);
|
|
1000
|
+
|
|
1001
|
+
/* On Windows we can wait for both IO and condvars (rkq)
|
|
1002
|
+
* simultaneously.
|
|
1003
|
+
*
|
|
1004
|
+
* On *nix/BSD sockets we use a local pipe (pfd[1]) to wake
|
|
1005
|
+
* up the rkq. */
|
|
1006
|
+
#ifdef _WIN32
|
|
1007
|
+
events = rd_kafka_transport_io_serve_win32(rktrans, rkq, timeout_ms);
|
|
1008
|
+
|
|
1009
|
+
#else
|
|
1010
|
+
if (rd_kafka_transport_poll(rktrans, timeout_ms) < 1)
|
|
1011
|
+
return 0; /* No events, caller can block on \p rkq poll */
|
|
1012
|
+
|
|
1013
|
+
/* Broker socket events */
|
|
1014
|
+
events = rktrans->rktrans_pfd[0].revents;
|
|
1015
|
+
#endif
|
|
1016
|
+
|
|
1017
|
+
if (events) {
|
|
1018
|
+
rd_kafka_transport_poll_clear(rktrans, POLLOUT | POLLIN);
|
|
1019
|
+
|
|
1020
|
+
rd_kafka_transport_io_event(rktrans, events, NULL);
|
|
1021
|
+
}
|
|
1022
|
+
|
|
1023
|
+
return 1;
|
|
1024
|
+
}
|
|
1025
|
+
|
|
1026
|
+
|
|
1027
|
+
/**
|
|
1028
|
+
* @brief Create a new transport object using existing socket \p s.
|
|
1029
|
+
*/
|
|
1030
|
+
rd_kafka_transport_t *rd_kafka_transport_new(rd_kafka_broker_t *rkb,
|
|
1031
|
+
rd_socket_t s,
|
|
1032
|
+
char *errstr,
|
|
1033
|
+
size_t errstr_size) {
|
|
1034
|
+
rd_kafka_transport_t *rktrans;
|
|
1035
|
+
int on = 1;
|
|
1036
|
+
int r;
|
|
1037
|
+
|
|
1038
|
+
#ifdef SO_NOSIGPIPE
|
|
1039
|
+
/* Disable SIGPIPE signalling for this socket on OSX */
|
|
1040
|
+
if (setsockopt(s, SOL_SOCKET, SO_NOSIGPIPE, &on, sizeof(on)) == -1)
|
|
1041
|
+
rd_rkb_dbg(rkb, BROKER, "SOCKET",
|
|
1042
|
+
"Failed to set SO_NOSIGPIPE: %s",
|
|
1043
|
+
rd_socket_strerror(rd_socket_errno));
|
|
1044
|
+
#endif
|
|
1045
|
+
|
|
1046
|
+
#ifdef SO_KEEPALIVE
|
|
1047
|
+
/* Enable TCP keep-alives, if configured. */
|
|
1048
|
+
if (rkb->rkb_rk->rk_conf.socket_keepalive) {
|
|
1049
|
+
if (setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (void *)&on,
|
|
1050
|
+
sizeof(on)) == RD_SOCKET_ERROR)
|
|
1051
|
+
rd_rkb_dbg(rkb, BROKER, "SOCKET",
|
|
1052
|
+
"Failed to set SO_KEEPALIVE: %s",
|
|
1053
|
+
rd_socket_strerror(rd_socket_errno));
|
|
1054
|
+
}
|
|
1055
|
+
#endif
|
|
1056
|
+
|
|
1057
|
+
#ifdef TCP_NODELAY
|
|
1058
|
+
if (rkb->rkb_rk->rk_conf.socket_nagle_disable) {
|
|
1059
|
+
int one = 1;
|
|
1060
|
+
if (setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (void *)&one,
|
|
1061
|
+
sizeof(one)) == RD_SOCKET_ERROR)
|
|
1062
|
+
rd_rkb_log(rkb, LOG_WARNING, "NAGLE",
|
|
1063
|
+
"Failed to disable Nagle (TCP_NODELAY) "
|
|
1064
|
+
"on socket: %s",
|
|
1065
|
+
rd_socket_strerror(rd_socket_errno));
|
|
1066
|
+
}
|
|
1067
|
+
#endif
|
|
1068
|
+
|
|
1069
|
+
/* Set socket send & receive buffer sizes if configuerd */
|
|
1070
|
+
if (rkb->rkb_rk->rk_conf.socket_sndbuf_size != 0) {
|
|
1071
|
+
if (setsockopt(
|
|
1072
|
+
s, SOL_SOCKET, SO_SNDBUF,
|
|
1073
|
+
(void *)&rkb->rkb_rk->rk_conf.socket_sndbuf_size,
|
|
1074
|
+
sizeof(rkb->rkb_rk->rk_conf.socket_sndbuf_size)) ==
|
|
1075
|
+
RD_SOCKET_ERROR)
|
|
1076
|
+
rd_rkb_log(rkb, LOG_WARNING, "SNDBUF",
|
|
1077
|
+
"Failed to set socket send "
|
|
1078
|
+
"buffer size to %i: %s",
|
|
1079
|
+
rkb->rkb_rk->rk_conf.socket_sndbuf_size,
|
|
1080
|
+
rd_socket_strerror(rd_socket_errno));
|
|
1081
|
+
}
|
|
1082
|
+
|
|
1083
|
+
if (rkb->rkb_rk->rk_conf.socket_rcvbuf_size != 0) {
|
|
1084
|
+
if (setsockopt(
|
|
1085
|
+
s, SOL_SOCKET, SO_RCVBUF,
|
|
1086
|
+
(void *)&rkb->rkb_rk->rk_conf.socket_rcvbuf_size,
|
|
1087
|
+
sizeof(rkb->rkb_rk->rk_conf.socket_rcvbuf_size)) ==
|
|
1088
|
+
RD_SOCKET_ERROR)
|
|
1089
|
+
rd_rkb_log(rkb, LOG_WARNING, "RCVBUF",
|
|
1090
|
+
"Failed to set socket receive "
|
|
1091
|
+
"buffer size to %i: %s",
|
|
1092
|
+
rkb->rkb_rk->rk_conf.socket_rcvbuf_size,
|
|
1093
|
+
rd_socket_strerror(rd_socket_errno));
|
|
1094
|
+
}
|
|
1095
|
+
|
|
1096
|
+
/* Set the socket to non-blocking */
|
|
1097
|
+
if ((r = rd_fd_set_nonblocking(s))) {
|
|
1098
|
+
rd_snprintf(errstr, errstr_size,
|
|
1099
|
+
"Failed to set socket non-blocking: %s",
|
|
1100
|
+
rd_socket_strerror(r));
|
|
1101
|
+
return NULL;
|
|
1102
|
+
}
|
|
1103
|
+
|
|
1104
|
+
|
|
1105
|
+
rktrans = rd_calloc(1, sizeof(*rktrans));
|
|
1106
|
+
rktrans->rktrans_rkb = rkb;
|
|
1107
|
+
rktrans->rktrans_s = s;
|
|
1108
|
+
|
|
1109
|
+
#ifdef _WIN32
|
|
1110
|
+
rktrans->rktrans_wsaevent = WSACreateEvent();
|
|
1111
|
+
rd_assert(rktrans->rktrans_wsaevent != NULL);
|
|
1112
|
+
#endif
|
|
1113
|
+
|
|
1114
|
+
return rktrans;
|
|
1115
|
+
}
|
|
1116
|
+
|
|
1117
|
+
|
|
1118
|
+
/**
|
|
1119
|
+
* Initiate asynchronous connection attempt.
|
|
1120
|
+
*
|
|
1121
|
+
* Locality: broker thread
|
|
1122
|
+
*/
|
|
1123
|
+
rd_kafka_transport_t *rd_kafka_transport_connect(rd_kafka_broker_t *rkb,
|
|
1124
|
+
const rd_sockaddr_inx_t *sinx,
|
|
1125
|
+
char *errstr,
|
|
1126
|
+
size_t errstr_size) {
|
|
1127
|
+
rd_kafka_transport_t *rktrans;
|
|
1128
|
+
int s = -1;
|
|
1129
|
+
int r;
|
|
1130
|
+
|
|
1131
|
+
rkb->rkb_addr_last = sinx;
|
|
1132
|
+
|
|
1133
|
+
s = rkb->rkb_rk->rk_conf.socket_cb(sinx->in.sin_family, SOCK_STREAM,
|
|
1134
|
+
IPPROTO_TCP,
|
|
1135
|
+
rkb->rkb_rk->rk_conf.opaque);
|
|
1136
|
+
if (s == -1) {
|
|
1137
|
+
rd_snprintf(errstr, errstr_size, "Failed to create socket: %s",
|
|
1138
|
+
rd_socket_strerror(rd_socket_errno));
|
|
1139
|
+
return NULL;
|
|
1140
|
+
}
|
|
1141
|
+
|
|
1142
|
+
rktrans = rd_kafka_transport_new(rkb, s, errstr, errstr_size);
|
|
1143
|
+
if (!rktrans) {
|
|
1144
|
+
rd_kafka_transport_close0(rkb->rkb_rk, s);
|
|
1145
|
+
return NULL;
|
|
1146
|
+
}
|
|
1147
|
+
|
|
1148
|
+
rd_rkb_dbg(rkb, BROKER, "CONNECT",
|
|
1149
|
+
"Connecting to %s (%s) "
|
|
1150
|
+
"with socket %i",
|
|
1151
|
+
rd_sockaddr2str(sinx, RD_SOCKADDR2STR_F_FAMILY |
|
|
1152
|
+
RD_SOCKADDR2STR_F_PORT),
|
|
1153
|
+
rd_kafka_secproto_names[rkb->rkb_proto], s);
|
|
1154
|
+
|
|
1155
|
+
/* Connect to broker */
|
|
1156
|
+
if (rkb->rkb_rk->rk_conf.connect_cb) {
|
|
1157
|
+
rd_kafka_broker_lock(rkb); /* for rkb_nodename */
|
|
1158
|
+
r = rkb->rkb_rk->rk_conf.connect_cb(
|
|
1159
|
+
s, (struct sockaddr *)sinx, RD_SOCKADDR_INX_LEN(sinx),
|
|
1160
|
+
rkb->rkb_nodename, rkb->rkb_rk->rk_conf.opaque);
|
|
1161
|
+
rd_kafka_broker_unlock(rkb);
|
|
1162
|
+
} else {
|
|
1163
|
+
if (connect(s, (struct sockaddr *)sinx,
|
|
1164
|
+
RD_SOCKADDR_INX_LEN(sinx)) == RD_SOCKET_ERROR &&
|
|
1165
|
+
(rd_socket_errno != EINPROGRESS
|
|
1166
|
+
#ifdef _WIN32
|
|
1167
|
+
&& rd_socket_errno != WSAEWOULDBLOCK
|
|
1168
|
+
#endif
|
|
1169
|
+
))
|
|
1170
|
+
r = rd_socket_errno;
|
|
1171
|
+
else
|
|
1172
|
+
r = 0;
|
|
1173
|
+
}
|
|
1174
|
+
|
|
1175
|
+
if (r != 0) {
|
|
1176
|
+
rd_rkb_dbg(rkb, BROKER, "CONNECT",
|
|
1177
|
+
"Couldn't connect to %s: %s (%i)",
|
|
1178
|
+
rd_sockaddr2str(sinx, RD_SOCKADDR2STR_F_PORT |
|
|
1179
|
+
RD_SOCKADDR2STR_F_FAMILY),
|
|
1180
|
+
rd_socket_strerror(r), r);
|
|
1181
|
+
rd_snprintf(errstr, errstr_size,
|
|
1182
|
+
"Failed to connect to broker at %s: %s",
|
|
1183
|
+
rd_sockaddr2str(sinx, RD_SOCKADDR2STR_F_NICE),
|
|
1184
|
+
rd_socket_strerror(r));
|
|
1185
|
+
|
|
1186
|
+
rd_kafka_transport_close(rktrans);
|
|
1187
|
+
return NULL;
|
|
1188
|
+
}
|
|
1189
|
+
|
|
1190
|
+
/* Set up transport handle */
|
|
1191
|
+
rktrans->rktrans_pfd[rktrans->rktrans_pfd_cnt++].fd = s;
|
|
1192
|
+
if (rkb->rkb_wakeup_fd[0] != -1) {
|
|
1193
|
+
rktrans->rktrans_pfd[rktrans->rktrans_pfd_cnt].events = POLLIN;
|
|
1194
|
+
rktrans->rktrans_pfd[rktrans->rktrans_pfd_cnt++].fd =
|
|
1195
|
+
rkb->rkb_wakeup_fd[0];
|
|
1196
|
+
}
|
|
1197
|
+
|
|
1198
|
+
|
|
1199
|
+
/* Poll writability to trigger on connection success/failure. */
|
|
1200
|
+
rd_kafka_transport_poll_set(rktrans, POLLOUT);
|
|
1201
|
+
|
|
1202
|
+
return rktrans;
|
|
1203
|
+
}
|
|
1204
|
+
|
|
1205
|
+
|
|
1206
|
+
#ifdef _WIN32
|
|
1207
|
+
/**
|
|
1208
|
+
* @brief Set the WinSocket event poll bit to \p events.
|
|
1209
|
+
*/
|
|
1210
|
+
static void rd_kafka_transport_poll_set_wsa(rd_kafka_transport_t *rktrans,
|
|
1211
|
+
int events) {
|
|
1212
|
+
int r;
|
|
1213
|
+
r = WSAEventSelect(
|
|
1214
|
+
rktrans->rktrans_s, rktrans->rktrans_wsaevent,
|
|
1215
|
+
rd_kafka_transport_events2wsa(rktrans->rktrans_pfd[0].events,
|
|
1216
|
+
rktrans->rktrans_rkb->rkb_state ==
|
|
1217
|
+
RD_KAFKA_BROKER_STATE_CONNECT));
|
|
1218
|
+
if (unlikely(r != 0)) {
|
|
1219
|
+
rd_rkb_log(rktrans->rktrans_rkb, LOG_CRIT, "WSAEVENT",
|
|
1220
|
+
"WSAEventSelect() failed: %s",
|
|
1221
|
+
rd_socket_strerror(rd_socket_errno));
|
|
1222
|
+
}
|
|
1223
|
+
}
|
|
1224
|
+
#endif
|
|
1225
|
+
|
|
1226
|
+
void rd_kafka_transport_poll_set(rd_kafka_transport_t *rktrans, int event) {
|
|
1227
|
+
if ((rktrans->rktrans_pfd[0].events & event) == event)
|
|
1228
|
+
return;
|
|
1229
|
+
|
|
1230
|
+
rktrans->rktrans_pfd[0].events |= event;
|
|
1231
|
+
|
|
1232
|
+
#ifdef _WIN32
|
|
1233
|
+
rd_kafka_transport_poll_set_wsa(rktrans,
|
|
1234
|
+
rktrans->rktrans_pfd[0].events);
|
|
1235
|
+
#endif
|
|
1236
|
+
}
|
|
1237
|
+
|
|
1238
|
+
void rd_kafka_transport_poll_clear(rd_kafka_transport_t *rktrans, int event) {
|
|
1239
|
+
if (!(rktrans->rktrans_pfd[0].events & event))
|
|
1240
|
+
return;
|
|
1241
|
+
|
|
1242
|
+
rktrans->rktrans_pfd[0].events &= ~event;
|
|
1243
|
+
|
|
1244
|
+
#ifdef _WIN32
|
|
1245
|
+
rd_kafka_transport_poll_set_wsa(rktrans,
|
|
1246
|
+
rktrans->rktrans_pfd[0].events);
|
|
1247
|
+
#endif
|
|
1248
|
+
}
|
|
1249
|
+
|
|
1250
|
+
#ifndef _WIN32
|
|
1251
|
+
/**
|
|
1252
|
+
* @brief Poll transport fds.
|
|
1253
|
+
*
|
|
1254
|
+
* @returns 1 if an event was raised, else 0, or -1 on error.
|
|
1255
|
+
*/
|
|
1256
|
+
static int rd_kafka_transport_poll(rd_kafka_transport_t *rktrans, int tmout) {
|
|
1257
|
+
int r;
|
|
1258
|
+
|
|
1259
|
+
r = poll(rktrans->rktrans_pfd, rktrans->rktrans_pfd_cnt, tmout);
|
|
1260
|
+
if (r <= 0)
|
|
1261
|
+
return r;
|
|
1262
|
+
|
|
1263
|
+
if (rktrans->rktrans_pfd[1].revents & POLLIN) {
|
|
1264
|
+
/* Read wake-up fd data and throw away, just used for wake-ups*/
|
|
1265
|
+
char buf[1024];
|
|
1266
|
+
while (rd_socket_read((int)rktrans->rktrans_pfd[1].fd, buf,
|
|
1267
|
+
sizeof(buf)) > 0)
|
|
1268
|
+
; /* Read all buffered signalling bytes */
|
|
1269
|
+
}
|
|
1270
|
+
|
|
1271
|
+
return 1;
|
|
1272
|
+
}
|
|
1273
|
+
#endif
|
|
1274
|
+
|
|
1275
|
+
#ifdef _WIN32
|
|
1276
|
+
/**
|
|
1277
|
+
* @brief A socket write operation would block, flag the socket
|
|
1278
|
+
* as blocked so that POLLOUT events are handled correctly.
|
|
1279
|
+
*
|
|
1280
|
+
* This is really only used on Windows where POLLOUT (FD_WRITE) is
|
|
1281
|
+
* edge-triggered rather than level-triggered.
|
|
1282
|
+
*/
|
|
1283
|
+
void rd_kafka_transport_set_blocked(rd_kafka_transport_t *rktrans,
|
|
1284
|
+
rd_bool_t blocked) {
|
|
1285
|
+
rktrans->rktrans_blocked = blocked;
|
|
1286
|
+
}
|
|
1287
|
+
#endif
|
|
1288
|
+
|
|
1289
|
+
|
|
1290
|
+
#if 0
|
|
1291
|
+
/**
|
|
1292
|
+
* Global cleanup.
|
|
1293
|
+
* This is dangerous and SHOULD NOT be called since it will rip
|
|
1294
|
+
* the rug from under the application if it uses any of this functionality
|
|
1295
|
+
* in its own code. This means we might leak some memory on exit.
|
|
1296
|
+
*/
|
|
1297
|
+
void rd_kafka_transport_term (void) {
|
|
1298
|
+
#ifdef _WIN32
|
|
1299
|
+
(void)WSACleanup(); /* FIXME: dangerous */
|
|
1300
|
+
#endif
|
|
1301
|
+
}
|
|
1302
|
+
#endif
|
|
1303
|
+
|
|
1304
|
+
void rd_kafka_transport_init(void) {
|
|
1305
|
+
#ifdef _WIN32
|
|
1306
|
+
WSADATA d;
|
|
1307
|
+
(void)WSAStartup(MAKEWORD(2, 2), &d);
|
|
1308
|
+
#endif
|
|
1309
|
+
}
|