@ohos-ports/confluentinc-kafka-javascript 1.10.0-beta.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/CHANGELOG.md +457 -0
- package/LICENSE.kafkajs +31 -0
- package/LICENSE.node-rdkafka +25 -0
- package/LICENSE.txt +20 -0
- package/README.md +133 -0
- package/binding.gyp +184 -0
- package/build/Release/confluent-kafka-javascript.node +0 -0
- package/build/deps/librdkafka++.so.1 +0 -0
- package/build/deps/librdkafka.Makefile +6 -0
- package/build/deps/librdkafka.so.1 +0 -0
- package/build/deps/librdkafka.target.mk +55 -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 +35 -0
- package/deps/librdkafka/.gdbmacros +19 -0
- package/deps/librdkafka/CHANGELOG.md +2477 -0
- package/deps/librdkafka/CMakeLists.txt +291 -0
- package/deps/librdkafka/CODE_OF_CONDUCT.md +46 -0
- package/deps/librdkafka/CONFIGURATION.md +212 -0
- package/deps/librdkafka/CONTRIBUTING.md +431 -0
- package/deps/librdkafka/Doxyfile +2375 -0
- package/deps/librdkafka/INTRODUCTION.md +2752 -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 +201 -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 +341 -0
- package/deps/librdkafka/dev-conf.sh +123 -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/service.yml +182 -0
- package/deps/librdkafka/src/CMakeLists.txt +379 -0
- package/deps/librdkafka/src/Makefile +105 -0
- package/deps/librdkafka/src/README.lz4.md +30 -0
- package/deps/librdkafka/src/cJSON.c +3191 -0
- package/deps/librdkafka/src/cJSON.h +306 -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 +592 -0
- package/deps/librdkafka/src/rdaddr.c +255 -0
- package/deps/librdkafka/src/rdaddr.h +202 -0
- package/deps/librdkafka/src/rdatomic.h +262 -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 +831 -0
- package/deps/librdkafka/src/rdhttp.h +101 -0
- package/deps/librdkafka/src/rdinterval.h +177 -0
- package/deps/librdkafka/src/rdkafka.c +7287 -0
- package/deps/librdkafka/src/rdkafka.h +11795 -0
- package/deps/librdkafka/src/rdkafka_admin.c +10165 -0
- package/deps/librdkafka/src/rdkafka_admin.h +658 -0
- package/deps/librdkafka/src/rdkafka_assignment.c +1282 -0
- package/deps/librdkafka/src/rdkafka_assignment.h +73 -0
- package/deps/librdkafka/src/rdkafka_assignor.c +1800 -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 +222 -0
- package/deps/librdkafka/src/rdkafka_broker.c +6736 -0
- package/deps/librdkafka/src/rdkafka_broker.h +851 -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 +8310 -0
- package/deps/librdkafka/src/rdkafka_cgrp.h +589 -0
- package/deps/librdkafka/src/rdkafka_conf.c +5177 -0
- package/deps/librdkafka/src/rdkafka_conf.h +746 -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 +3820 -0
- package/deps/librdkafka/src/rdkafka_fetcher.h +62 -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 +1505 -0
- package/deps/librdkafka/src/rdkafka_interceptor.c +842 -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 +2347 -0
- package/deps/librdkafka/src/rdkafka_metadata.h +350 -0
- package/deps/librdkafka/src/rdkafka_metadata_cache.c +1183 -0
- package/deps/librdkafka/src/rdkafka_mock.c +4514 -0
- package/deps/librdkafka/src/rdkafka_mock.h +867 -0
- package/deps/librdkafka/src/rdkafka_mock_cgrp.c +1877 -0
- package/deps/librdkafka/src/rdkafka_mock_handlers.c +5255 -0
- package/deps/librdkafka/src/rdkafka_mock_int.h +1005 -0
- package/deps/librdkafka/src/rdkafka_mock_sharegrp.c +1207 -0
- package/deps/librdkafka/src/rdkafka_msg.c +2619 -0
- package/deps/librdkafka/src/rdkafka_msg.h +629 -0
- package/deps/librdkafka/src/rdkafka_msgbatch.h +62 -0
- package/deps/librdkafka/src/rdkafka_msgset.h +105 -0
- package/deps/librdkafka/src/rdkafka_msgset_reader.c +2099 -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 +1219 -0
- package/deps/librdkafka/src/rdkafka_op.h +1065 -0
- package/deps/librdkafka/src/rdkafka_partition.c +5109 -0
- package/deps/librdkafka/src/rdkafka_partition.h +1215 -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 +739 -0
- package/deps/librdkafka/src/rdkafka_protocol.h +131 -0
- package/deps/librdkafka/src/rdkafka_queue.c +1351 -0
- package/deps/librdkafka/src/rdkafka_queue.h +1235 -0
- package/deps/librdkafka/src/rdkafka_range_assignor.c +1748 -0
- package/deps/librdkafka/src/rdkafka_request.c +7298 -0
- package/deps/librdkafka/src/rdkafka_request.h +761 -0
- package/deps/librdkafka/src/rdkafka_roundrobin_assignor.c +123 -0
- package/deps/librdkafka/src/rdkafka_sasl.c +589 -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 +1827 -0
- package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.h +52 -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_share_acknowledgement.c +1445 -0
- package/deps/librdkafka/src/rdkafka_share_acknowledgement.h +373 -0
- package/deps/librdkafka/src/rdkafka_ssl.c +2235 -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 +411 -0
- package/deps/librdkafka/src/rdkafka_telemetry.c +761 -0
- package/deps/librdkafka/src/rdkafka_telemetry.h +52 -0
- package/deps/librdkafka/src/rdkafka_telemetry_decode.c +1307 -0
- package/deps/librdkafka/src/rdkafka_telemetry_decode.h +59 -0
- package/deps/librdkafka/src/rdkafka_telemetry_encode.c +1309 -0
- package/deps/librdkafka/src/rdkafka_telemetry_encode.h +459 -0
- package/deps/librdkafka/src/rdkafka_timer.c +407 -0
- package/deps/librdkafka/src/rdkafka_timer.h +117 -0
- package/deps/librdkafka/src/rdkafka_topic.c +2382 -0
- package/deps/librdkafka/src/rdkafka_topic.h +369 -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 +593 -0
- package/deps/librdkafka/src/rdlist.h +444 -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 +151 -0
- package/deps/librdkafka/src/rdrand.h +72 -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 +564 -0
- package/deps/librdkafka/src/rdunittest.h +232 -0
- package/deps/librdkafka/src/rdunittest_acknowledge.c +1177 -0
- package/deps/librdkafka/src/rdunittest_fetcher.c +1211 -0
- package/deps/librdkafka/src/rdunittest_msgset_errors.c +1521 -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 +210 -0
- package/deps/librdkafka/src/tinycthread_extra.h +218 -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 +272 -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 +444 -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 +331 -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 +529 -0
- package/deps/librdkafka/tests/0065-yield.cpp +140 -0
- package/deps/librdkafka/tests/0066-plugins.cpp +143 -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 +366 -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 +674 -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 +1164 -0
- package/deps/librdkafka/tests/0127-fetch_queue_backoff.cpp +165 -0
- package/deps/librdkafka/tests/0128-sasl_callback_queue.cpp +217 -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 +279 -0
- package/deps/librdkafka/tests/0136-resolve_cb.c +181 -0
- package/deps/librdkafka/tests/0137-barrier_batch_consume.c +752 -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 +931 -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 +1210 -0
- package/deps/librdkafka/tests/0148-offset_fetch_commit_error_mock.c +569 -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/0155-share_group_heartbeat_mock.c +2695 -0
- package/deps/librdkafka/tests/0156-share_consumer_fetch_mock.c +1551 -0
- package/deps/librdkafka/tests/0157-share_consumer_ack_mock.c +1788 -0
- package/deps/librdkafka/tests/0158-share_consumer_transactions_mock.c +467 -0
- package/deps/librdkafka/tests/0170-share_consumer_subscription.c +2192 -0
- package/deps/librdkafka/tests/0171-share_consumer_consume.c +2150 -0
- package/deps/librdkafka/tests/0172-share_consumer_acknowledge.c +1919 -0
- package/deps/librdkafka/tests/0173-share_consumer_commit_async.c +2735 -0
- package/deps/librdkafka/tests/0174-share_consumer_concurrency.c +1434 -0
- package/deps/librdkafka/tests/0175-share_consumer_groups.c +574 -0
- package/deps/librdkafka/tests/0176-share_consumer_commit_sync.c +2986 -0
- package/deps/librdkafka/tests/0177-share_consumer_transactions.c +1815 -0
- package/deps/librdkafka/tests/0178-share_consumer_close.c +2102 -0
- package/deps/librdkafka/tests/0179-share_consumer_destroy.c +2482 -0
- package/deps/librdkafka/tests/0180-share_consumer_config.c +1677 -0
- package/deps/librdkafka/tests/0181-share_consumer_topic_delete.c +354 -0
- package/deps/librdkafka/tests/0182-share_consumer_error_handling_mock.c +3358 -0
- package/deps/librdkafka/tests/0183-share_consumer_leader_change_mock.c +1234 -0
- package/deps/librdkafka/tests/0184-share_consumer_topic_recreate.c +1356 -0
- package/deps/librdkafka/tests/0185-share_consumer_max_poll_interval.c +557 -0
- package/deps/librdkafka/tests/0186-share_consumer_fatal_error.c +360 -0
- package/deps/librdkafka/tests/0190-share_consumer_telemetry.c +387 -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 +193 -0
- package/deps/librdkafka/tests/LibrdkafkaTestApp.py +291 -0
- package/deps/librdkafka/tests/Makefile +182 -0
- package/deps/librdkafka/tests/README.md +514 -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 +203 -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 +81 -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 +141 -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/share_telemetry_verify/share-otel-collector-config.yaml +28 -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 +8376 -0
- package/deps/librdkafka/tests/test.conf.example +27 -0
- package/deps/librdkafka/tests/test.h +1150 -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.15.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 +282 -0
- package/deps/librdkafka/win32/librdkafkacpp/librdkafkacpp.vcxproj +104 -0
- package/deps/librdkafka/win32/msbuild.ps1 +58 -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 +278 -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 +83 -0
- package/deps/windows-install.py +80 -0
- package/index.d.ts +3 -0
- package/lib/admin.js +732 -0
- package/lib/client.js +679 -0
- package/lib/error.js +501 -0
- package/lib/index.js +8 -0
- package/lib/kafka-consumer-stream.js +399 -0
- package/lib/kafka-consumer.js +798 -0
- package/lib/kafkajs/_admin.js +1052 -0
- package/lib/kafkajs/_common.js +887 -0
- package/lib/kafkajs/_consumer.js +2156 -0
- package/lib/kafkajs/_consumer_cache.js +310 -0
- package/lib/kafkajs/_error.js +298 -0
- package/lib/kafkajs/_kafka.js +125 -0
- package/lib/kafkajs/_linked-list.js +220 -0
- package/lib/kafkajs/_producer.js +863 -0
- package/lib/kafkajs/index.js +5 -0
- package/lib/producer/high-level-producer.js +400 -0
- package/lib/producer-stream.js +337 -0
- package/lib/producer.js +405 -0
- package/lib/rdkafka.js +44 -0
- package/lib/tools/ref-counter.js +53 -0
- package/lib/topic-partition.js +91 -0
- package/lib/topic.js +43 -0
- package/lib/util.js +55 -0
- package/librdkafka.js +12 -0
- package/package.json +85 -0
- package/shim/source_location +54 -0
- package/src/admin.cc +1597 -0
- package/src/admin.h +112 -0
- package/src/binding.cc +76 -0
- package/src/binding.h +25 -0
- package/src/callbacks.cc +676 -0
- package/src/callbacks.h +302 -0
- package/src/common.cc +1628 -0
- package/src/common.h +192 -0
- package/src/config.cc +219 -0
- package/src/config.h +61 -0
- package/src/connection.cc +703 -0
- package/src/connection.h +117 -0
- package/src/errors.cc +119 -0
- package/src/errors.h +60 -0
- package/src/kafka-consumer.cc +1539 -0
- package/src/kafka-consumer.h +147 -0
- package/src/producer.cc +917 -0
- package/src/producer.h +124 -0
- package/src/topic.cc +173 -0
- package/src/topic.h +54 -0
- package/src/workers.cc +1714 -0
- package/src/workers.h +690 -0
- package/types/config.d.ts +1269 -0
- package/types/errors.d.ts +373 -0
- package/types/kafkajs.d.ts +568 -0
- package/types/rdkafka.d.ts +571 -0
- package/util/configure.js +32 -0
- package/util/generate-docs.sh +18 -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,1677 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* librdkafka - Apache Kafka C library
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2026, Confluent Inc.
|
|
5
|
+
* All rights reserved.
|
|
6
|
+
*
|
|
7
|
+
* Redistribution and use in source and binary forms, with or without
|
|
8
|
+
* modification, are permitted provided that the following conditions are met:
|
|
9
|
+
*
|
|
10
|
+
* 1. Redistributions of source code must retain the above copyright notice,
|
|
11
|
+
* this list of conditions and the following disclaimer.
|
|
12
|
+
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
13
|
+
* this list of conditions and the following disclaimer in the documentation
|
|
14
|
+
* and/or other materials provided with the distribution.
|
|
15
|
+
*
|
|
16
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
17
|
+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
18
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
19
|
+
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
20
|
+
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
21
|
+
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
22
|
+
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
23
|
+
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
24
|
+
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
25
|
+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
26
|
+
* POSSIBILITY OF SUCH DAMAGE.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
#include "test.h"
|
|
30
|
+
|
|
31
|
+
#include <signal.h> /* for SIGIO (internal.termination.signal test) */
|
|
32
|
+
|
|
33
|
+
#include "../src/rdkafka_proto.h" /* for RD_KAFKAP_ShareFetch etc. */
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @brief Verify that a particular conf shape is rejected by
|
|
37
|
+
* rd_kafka_share_consumer_new.
|
|
38
|
+
*
|
|
39
|
+
* The setter callback is applied to a fresh conf to produce the
|
|
40
|
+
* case-under-test (e.g. set rebalance_cb, set events). The helper
|
|
41
|
+
* then calls rd_kafka_share_consumer_new and asserts the call returns
|
|
42
|
+
* NULL with an errstr containing expected_substr.
|
|
43
|
+
*/
|
|
44
|
+
static void
|
|
45
|
+
verify_share_consumer_conf_set_rejected(const char *case_name,
|
|
46
|
+
void (*conf_setter)(rd_kafka_conf_t *),
|
|
47
|
+
const char *expected_substr) {
|
|
48
|
+
rd_kafka_conf_t *conf;
|
|
49
|
+
rd_kafka_share_t *rkshare;
|
|
50
|
+
char errstr[512];
|
|
51
|
+
|
|
52
|
+
conf = rd_kafka_conf_new();
|
|
53
|
+
conf_setter(conf);
|
|
54
|
+
errstr[0] = '\0';
|
|
55
|
+
rkshare = rd_kafka_share_consumer_new(conf, errstr, sizeof(errstr));
|
|
56
|
+
TEST_ASSERT(rkshare == NULL,
|
|
57
|
+
"[%s] expected NULL share consumer, got non-NULL",
|
|
58
|
+
case_name);
|
|
59
|
+
TEST_ASSERT(strstr(errstr, expected_substr) != NULL,
|
|
60
|
+
"[%s] errstr should mention '%s', got: %s", case_name,
|
|
61
|
+
expected_substr, errstr);
|
|
62
|
+
TEST_SAY("[%s] rejected with: %s\n", case_name, errstr);
|
|
63
|
+
rd_kafka_conf_destroy(conf);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* @brief Verify that setting prop_name to value (via the generic
|
|
68
|
+
* rd_kafka_conf_set string interface) causes
|
|
69
|
+
* rd_kafka_share_consumer_new to fail with an errstr that
|
|
70
|
+
* mentions prop_name.
|
|
71
|
+
*/
|
|
72
|
+
static void verify_share_consumer_conf_prop_rejected(const char *prop_name,
|
|
73
|
+
const char *value) {
|
|
74
|
+
rd_kafka_conf_t *conf;
|
|
75
|
+
rd_kafka_share_t *rkshare;
|
|
76
|
+
char errstr[512];
|
|
77
|
+
rd_kafka_conf_res_t res;
|
|
78
|
+
|
|
79
|
+
conf = rd_kafka_conf_new();
|
|
80
|
+
res = rd_kafka_conf_set(conf, prop_name, value, errstr, sizeof(errstr));
|
|
81
|
+
TEST_ASSERT(res == RD_KAFKA_CONF_OK,
|
|
82
|
+
"[%s=%s] precondition rd_kafka_conf_set failed: %s",
|
|
83
|
+
prop_name, value, errstr);
|
|
84
|
+
errstr[0] = '\0';
|
|
85
|
+
rkshare = rd_kafka_share_consumer_new(conf, errstr, sizeof(errstr));
|
|
86
|
+
TEST_ASSERT(rkshare == NULL,
|
|
87
|
+
"[%s=%s] expected NULL share consumer, got non-NULL",
|
|
88
|
+
prop_name, value);
|
|
89
|
+
TEST_ASSERT(strstr(errstr, prop_name) != NULL,
|
|
90
|
+
"[%s=%s] errstr should mention '%s', got: %s", prop_name,
|
|
91
|
+
value, prop_name, errstr);
|
|
92
|
+
TEST_SAY("[%s=%s] rejected with: %s\n", prop_name, value, errstr);
|
|
93
|
+
rd_kafka_conf_destroy(conf);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* @brief Verify that creating a REGULAR (non-share) consumer with
|
|
98
|
+
* prop_name=value fails at construction (rd_kafka_new returns
|
|
99
|
+
* NULL) with an errstr that mentions prop_name.
|
|
100
|
+
*
|
|
101
|
+
* group.id is set so the consumer reaches the consumer-specific
|
|
102
|
+
* finalize validation.
|
|
103
|
+
*/
|
|
104
|
+
static void verify_regular_consumer_conf_prop_rejected(const char *prop_name,
|
|
105
|
+
const char *value) {
|
|
106
|
+
rd_kafka_conf_t *conf;
|
|
107
|
+
rd_kafka_t *rk;
|
|
108
|
+
char errstr[512];
|
|
109
|
+
|
|
110
|
+
conf = rd_kafka_conf_new();
|
|
111
|
+
TEST_ASSERT(rd_kafka_conf_set(conf, "group.id", "0180-regular", errstr,
|
|
112
|
+
sizeof(errstr)) == RD_KAFKA_CONF_OK,
|
|
113
|
+
"group.id: %s", errstr);
|
|
114
|
+
TEST_ASSERT(rd_kafka_conf_set(conf, prop_name, value, errstr,
|
|
115
|
+
sizeof(errstr)) == RD_KAFKA_CONF_OK,
|
|
116
|
+
"[%s=%s] precondition rd_kafka_conf_set failed: %s",
|
|
117
|
+
prop_name, value, errstr);
|
|
118
|
+
|
|
119
|
+
errstr[0] = '\0';
|
|
120
|
+
rk = rd_kafka_new(RD_KAFKA_CONSUMER, conf, errstr, sizeof(errstr));
|
|
121
|
+
TEST_ASSERT(rk == NULL,
|
|
122
|
+
"[%s=%s] expected regular consumer creation to fail, "
|
|
123
|
+
"got non-NULL",
|
|
124
|
+
prop_name, value);
|
|
125
|
+
TEST_ASSERT(strstr(errstr, prop_name) != NULL,
|
|
126
|
+
"[%s=%s] errstr should mention '%s', got: %s", prop_name,
|
|
127
|
+
value, prop_name, errstr);
|
|
128
|
+
TEST_SAY("[%s=%s] regular consumer rejected with: %s\n", prop_name,
|
|
129
|
+
value, errstr);
|
|
130
|
+
/* rd_kafka_new failed, so it did not take ownership of conf. */
|
|
131
|
+
rd_kafka_conf_destroy(conf);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/* Unused stub used only as a non-NULL function-pointer value for
|
|
135
|
+
* rd_kafka_conf_set_rebalance_cb in the rejection test. */
|
|
136
|
+
static void unused_rebalance_cb(rd_kafka_t *rk,
|
|
137
|
+
rd_kafka_resp_err_t err,
|
|
138
|
+
rd_kafka_topic_partition_list_t *parts,
|
|
139
|
+
void *opaque) {
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
static void setter_rebalance_cb(rd_kafka_conf_t *conf) {
|
|
143
|
+
rd_kafka_conf_set_rebalance_cb(conf, unused_rebalance_cb);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
static void setter_event_rebalance(rd_kafka_conf_t *conf) {
|
|
147
|
+
rd_kafka_conf_set_events(conf, RD_KAFKA_EVENT_REBALANCE);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/* Unused stub used only as a non-NULL function-pointer value for
|
|
151
|
+
* rd_kafka_conf_set_offset_commit_cb in the rejection test. */
|
|
152
|
+
static void unused_offset_commit_cb(rd_kafka_t *rk,
|
|
153
|
+
rd_kafka_resp_err_t err,
|
|
154
|
+
rd_kafka_topic_partition_list_t *offsets,
|
|
155
|
+
void *opaque) {
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
static void setter_offset_commit_cb(rd_kafka_conf_t *conf) {
|
|
159
|
+
rd_kafka_conf_set_offset_commit_cb(conf, unused_offset_commit_cb);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/* Unused stub used only as a non-NULL function-pointer value for
|
|
163
|
+
* rd_kafka_conf_set_consume_cb in the rejection test. */
|
|
164
|
+
static void unused_consume_cb(rd_kafka_message_t *rkmessage, void *opaque) {
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
static void setter_consume_cb(rd_kafka_conf_t *conf) {
|
|
168
|
+
rd_kafka_conf_set_consume_cb(conf, unused_consume_cb);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/* Records the result of attempting to register the various interceptor
|
|
172
|
+
* hooks from the on_new interceptor (see interceptor_on_new). All hooks
|
|
173
|
+
* are expected to be rejected for share consumers. */
|
|
174
|
+
struct interceptor_add_results {
|
|
175
|
+
rd_kafka_resp_err_t on_destroy_err;
|
|
176
|
+
rd_kafka_resp_err_t on_consume_err;
|
|
177
|
+
rd_kafka_resp_err_t on_commit_err;
|
|
178
|
+
rd_kafka_resp_err_t on_send_err;
|
|
179
|
+
rd_kafka_resp_err_t on_acknowledgement_err;
|
|
180
|
+
rd_kafka_resp_err_t on_request_sent_err;
|
|
181
|
+
rd_kafka_resp_err_t on_response_received_err;
|
|
182
|
+
rd_kafka_resp_err_t on_thread_start_err;
|
|
183
|
+
rd_kafka_resp_err_t on_thread_exit_err;
|
|
184
|
+
rd_kafka_resp_err_t on_broker_state_change_err;
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
static rd_kafka_resp_err_t unused_on_destroy_ic(rd_kafka_t *rk,
|
|
188
|
+
void *ic_opaque) {
|
|
189
|
+
return RD_KAFKA_RESP_ERR_NO_ERROR;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/* Unused interceptor hooks: only used as non-NULL function pointers in the
|
|
193
|
+
* registration attempts. */
|
|
194
|
+
static rd_kafka_resp_err_t unused_on_consume_ic(rd_kafka_t *rk,
|
|
195
|
+
rd_kafka_message_t *rkmessage,
|
|
196
|
+
void *ic_opaque) {
|
|
197
|
+
return RD_KAFKA_RESP_ERR_NO_ERROR;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
static rd_kafka_resp_err_t
|
|
201
|
+
unused_on_commit_ic(rd_kafka_t *rk,
|
|
202
|
+
const rd_kafka_topic_partition_list_t *offsets,
|
|
203
|
+
rd_kafka_resp_err_t err,
|
|
204
|
+
void *ic_opaque) {
|
|
205
|
+
return RD_KAFKA_RESP_ERR_NO_ERROR;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
static rd_kafka_resp_err_t unused_on_send_ic(rd_kafka_t *rk,
|
|
209
|
+
rd_kafka_message_t *rkmessage,
|
|
210
|
+
void *ic_opaque) {
|
|
211
|
+
return RD_KAFKA_RESP_ERR_NO_ERROR;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
static rd_kafka_resp_err_t
|
|
215
|
+
unused_on_acknowledgement_ic(rd_kafka_t *rk,
|
|
216
|
+
rd_kafka_message_t *rkmessage,
|
|
217
|
+
void *ic_opaque) {
|
|
218
|
+
return RD_KAFKA_RESP_ERR_NO_ERROR;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
static rd_kafka_resp_err_t unused_on_request_sent_ic(rd_kafka_t *rk,
|
|
222
|
+
int sockfd,
|
|
223
|
+
const char *brokername,
|
|
224
|
+
int32_t brokerid,
|
|
225
|
+
int16_t ApiKey,
|
|
226
|
+
int16_t ApiVersion,
|
|
227
|
+
int32_t CorrId,
|
|
228
|
+
size_t size,
|
|
229
|
+
void *ic_opaque) {
|
|
230
|
+
return RD_KAFKA_RESP_ERR_NO_ERROR;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
static rd_kafka_resp_err_t
|
|
234
|
+
unused_on_response_received_ic(rd_kafka_t *rk,
|
|
235
|
+
int sockfd,
|
|
236
|
+
const char *brokername,
|
|
237
|
+
int32_t brokerid,
|
|
238
|
+
int16_t ApiKey,
|
|
239
|
+
int16_t ApiVersion,
|
|
240
|
+
int32_t CorrId,
|
|
241
|
+
size_t size,
|
|
242
|
+
int64_t rtt,
|
|
243
|
+
rd_kafka_resp_err_t err,
|
|
244
|
+
void *ic_opaque) {
|
|
245
|
+
return RD_KAFKA_RESP_ERR_NO_ERROR;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
static rd_kafka_resp_err_t
|
|
249
|
+
unused_on_thread_start_ic(rd_kafka_t *rk,
|
|
250
|
+
rd_kafka_thread_type_t thread_type,
|
|
251
|
+
const char *thread_name,
|
|
252
|
+
void *ic_opaque) {
|
|
253
|
+
return RD_KAFKA_RESP_ERR_NO_ERROR;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
static rd_kafka_resp_err_t
|
|
257
|
+
unused_on_thread_exit_ic(rd_kafka_t *rk,
|
|
258
|
+
rd_kafka_thread_type_t thread_type,
|
|
259
|
+
const char *thread_name,
|
|
260
|
+
void *ic_opaque) {
|
|
261
|
+
return RD_KAFKA_RESP_ERR_NO_ERROR;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
static rd_kafka_resp_err_t
|
|
265
|
+
unused_on_broker_state_change_ic(rd_kafka_t *rk,
|
|
266
|
+
int32_t broker_id,
|
|
267
|
+
const char *secproto,
|
|
268
|
+
const char *host,
|
|
269
|
+
int port,
|
|
270
|
+
const char *state,
|
|
271
|
+
void *ic_opaque) {
|
|
272
|
+
return RD_KAFKA_RESP_ERR_NO_ERROR;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/* on_new interceptor: tries to register one interceptor of each hook
|
|
276
|
+
* category (the only point at which the rk-level hooks may be added) and
|
|
277
|
+
* records the per-hook return codes. For share consumers every hook is
|
|
278
|
+
* expected to be rejected. Returns NO_ERROR itself so construction is not
|
|
279
|
+
* failed by this interceptor. */
|
|
280
|
+
static rd_kafka_resp_err_t interceptor_on_new(rd_kafka_t *rk,
|
|
281
|
+
const rd_kafka_conf_t *conf,
|
|
282
|
+
void *ic_opaque,
|
|
283
|
+
char *errstr,
|
|
284
|
+
size_t errstr_size) {
|
|
285
|
+
struct interceptor_add_results *r = ic_opaque;
|
|
286
|
+
|
|
287
|
+
r->on_destroy_err = rd_kafka_interceptor_add_on_destroy(
|
|
288
|
+
rk, "test-on-destroy", unused_on_destroy_ic, NULL);
|
|
289
|
+
r->on_consume_err = rd_kafka_interceptor_add_on_consume(
|
|
290
|
+
rk, "test-on-consume", unused_on_consume_ic, NULL);
|
|
291
|
+
r->on_commit_err = rd_kafka_interceptor_add_on_commit(
|
|
292
|
+
rk, "test-on-commit", unused_on_commit_ic, NULL);
|
|
293
|
+
r->on_send_err = rd_kafka_interceptor_add_on_send(
|
|
294
|
+
rk, "test-on-send", unused_on_send_ic, NULL);
|
|
295
|
+
r->on_acknowledgement_err = rd_kafka_interceptor_add_on_acknowledgement(
|
|
296
|
+
rk, "test-on-acknowledgement", unused_on_acknowledgement_ic, NULL);
|
|
297
|
+
r->on_request_sent_err = rd_kafka_interceptor_add_on_request_sent(
|
|
298
|
+
rk, "test-on-request-sent", unused_on_request_sent_ic, NULL);
|
|
299
|
+
r->on_response_received_err =
|
|
300
|
+
rd_kafka_interceptor_add_on_response_received(
|
|
301
|
+
rk, "test-on-response-received", unused_on_response_received_ic,
|
|
302
|
+
NULL);
|
|
303
|
+
r->on_thread_start_err = rd_kafka_interceptor_add_on_thread_start(
|
|
304
|
+
rk, "test-on-thread-start", unused_on_thread_start_ic, NULL);
|
|
305
|
+
r->on_thread_exit_err = rd_kafka_interceptor_add_on_thread_exit(
|
|
306
|
+
rk, "test-on-thread-exit", unused_on_thread_exit_ic, NULL);
|
|
307
|
+
r->on_broker_state_change_err =
|
|
308
|
+
rd_kafka_interceptor_add_on_broker_state_change(
|
|
309
|
+
rk, "test-on-broker-state-change",
|
|
310
|
+
unused_on_broker_state_change_ic, NULL);
|
|
311
|
+
|
|
312
|
+
return RD_KAFKA_RESP_ERR_NO_ERROR;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* @brief Share consumer has no rebalance callback semantics; the
|
|
317
|
+
* factory rejects rebalance_cb at construction so an app's
|
|
318
|
+
* handler can never silently never-fire.
|
|
319
|
+
*/
|
|
320
|
+
static void test_rebalance_cb_rejected_at_construction(void) {
|
|
321
|
+
SUB_TEST_QUICK();
|
|
322
|
+
|
|
323
|
+
verify_share_consumer_conf_set_rejected(
|
|
324
|
+
"rebalance_cb set", setter_rebalance_cb, "rebalance_cb");
|
|
325
|
+
|
|
326
|
+
SUB_TEST_PASS();
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* @brief Same reasoning as rebalance_cb — the event-mask form of
|
|
331
|
+
* opting into rebalance delivery is also rejected.
|
|
332
|
+
*/
|
|
333
|
+
static void test_event_rebalance_rejected_at_construction(void) {
|
|
334
|
+
SUB_TEST_QUICK();
|
|
335
|
+
|
|
336
|
+
verify_share_consumer_conf_set_rejected("RD_KAFKA_EVENT_REBALANCE set",
|
|
337
|
+
setter_event_rebalance,
|
|
338
|
+
"RD_KAFKA_EVENT_REBALANCE");
|
|
339
|
+
|
|
340
|
+
SUB_TEST_PASS();
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* @brief `offset_commit_cb` reports completion of offset commits. Share
|
|
345
|
+
* consumers do not commit offsets (they acknowledge records, with
|
|
346
|
+
* enable.auto.commit forced off), so the callback never fires on
|
|
347
|
+
* the share path; it is rejected at construction. The Java share
|
|
348
|
+
* consumer likewise has no OffsetCommitCallback (its analog is
|
|
349
|
+
* AcknowledgementCommitCallback).
|
|
350
|
+
*/
|
|
351
|
+
static void test_offset_commit_cb_rejected_at_construction(void) {
|
|
352
|
+
SUB_TEST_QUICK();
|
|
353
|
+
|
|
354
|
+
verify_share_consumer_conf_set_rejected("offset_commit_cb set",
|
|
355
|
+
setter_offset_commit_cb,
|
|
356
|
+
"offset_commit_cb");
|
|
357
|
+
|
|
358
|
+
SUB_TEST_PASS();
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* @brief `consume_cb` delivers messages via the classic
|
|
363
|
+
* rd_kafka_consumer_poll()/rd_kafka_consume_callback*() dispatch
|
|
364
|
+
* path. Share consumers use the batch-returning rd_kafka_share_poll()
|
|
365
|
+
* and never invoke this callback, so it is rejected at construction.
|
|
366
|
+
* Java has no per-message consume callback for either consumer type.
|
|
367
|
+
*/
|
|
368
|
+
static void test_consume_cb_rejected_at_construction(void) {
|
|
369
|
+
SUB_TEST_QUICK();
|
|
370
|
+
|
|
371
|
+
verify_share_consumer_conf_set_rejected(
|
|
372
|
+
"consume_cb set", setter_consume_cb, "consume_cb");
|
|
373
|
+
|
|
374
|
+
SUB_TEST_PASS();
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* @brief Interceptors are not supported for share consumers: registering
|
|
379
|
+
* any handle-level interceptor hook (the only opportunity is from an
|
|
380
|
+
* on_new interceptor) returns RD_KAFKA_RESP_ERR__NOT_IMPLEMENTED.
|
|
381
|
+
* This mirrors the Java share consumer rejecting ConsumerInterceptor.
|
|
382
|
+
* The plugin loader (and the on_new interceptor itself) still run, so
|
|
383
|
+
* construction succeeds; only the hook registrations are rejected.
|
|
384
|
+
*/
|
|
385
|
+
static void test_interceptors_rejected_for_share_consumer(void) {
|
|
386
|
+
rd_kafka_conf_t *conf;
|
|
387
|
+
rd_kafka_share_t *rkshare;
|
|
388
|
+
struct interceptor_add_results results;
|
|
389
|
+
char errstr[512];
|
|
390
|
+
|
|
391
|
+
SUB_TEST_QUICK();
|
|
392
|
+
|
|
393
|
+
memset(&results, 0, sizeof(results));
|
|
394
|
+
|
|
395
|
+
conf = rd_kafka_conf_new();
|
|
396
|
+
rd_kafka_conf_interceptor_add_on_new(conf, "test-on-new",
|
|
397
|
+
interceptor_on_new, &results);
|
|
398
|
+
|
|
399
|
+
rkshare = rd_kafka_share_consumer_new(conf, errstr, sizeof(errstr));
|
|
400
|
+
TEST_ASSERT(rkshare,
|
|
401
|
+
"share consumer construction should still succeed: %s",
|
|
402
|
+
errstr);
|
|
403
|
+
|
|
404
|
+
#define ASSERT_IC_REJECTED(field) \
|
|
405
|
+
TEST_ASSERT(results.field == RD_KAFKA_RESP_ERR__NOT_IMPLEMENTED, \
|
|
406
|
+
"expected " #field \
|
|
407
|
+
" to be rejected with " \
|
|
408
|
+
"_NOT_IMPLEMENTED, got %s", \
|
|
409
|
+
rd_kafka_err2name(results.field))
|
|
410
|
+
|
|
411
|
+
ASSERT_IC_REJECTED(on_destroy_err);
|
|
412
|
+
ASSERT_IC_REJECTED(on_consume_err);
|
|
413
|
+
ASSERT_IC_REJECTED(on_commit_err);
|
|
414
|
+
ASSERT_IC_REJECTED(on_send_err);
|
|
415
|
+
ASSERT_IC_REJECTED(on_acknowledgement_err);
|
|
416
|
+
ASSERT_IC_REJECTED(on_request_sent_err);
|
|
417
|
+
ASSERT_IC_REJECTED(on_response_received_err);
|
|
418
|
+
ASSERT_IC_REJECTED(on_thread_start_err);
|
|
419
|
+
ASSERT_IC_REJECTED(on_thread_exit_err);
|
|
420
|
+
ASSERT_IC_REJECTED(on_broker_state_change_err);
|
|
421
|
+
|
|
422
|
+
#undef ASSERT_IC_REJECTED
|
|
423
|
+
|
|
424
|
+
test_share_destroy(rkshare);
|
|
425
|
+
|
|
426
|
+
SUB_TEST_PASS();
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
/**
|
|
430
|
+
* @brief `consume.callback.max.messages` caps the batch size dispatched
|
|
431
|
+
* per rd_kafka_consume_callback*() call. That callback path is not
|
|
432
|
+
* used by share consumers (which use rd_kafka_share_poll()), so the
|
|
433
|
+
* property is rejected at construction. No Java equivalent.
|
|
434
|
+
*/
|
|
435
|
+
static void test_consume_callback_max_messages_rejected_at_construction(void) {
|
|
436
|
+
SUB_TEST_QUICK();
|
|
437
|
+
|
|
438
|
+
verify_share_consumer_conf_prop_rejected(
|
|
439
|
+
"consume.callback.max.messages", "100");
|
|
440
|
+
|
|
441
|
+
SUB_TEST_PASS();
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
/**
|
|
445
|
+
* @brief Share consumer locks enable.auto.commit to false internally.
|
|
446
|
+
* Any explicit set by the app (true or false) is rejected so
|
|
447
|
+
* the value can only come from the library default.
|
|
448
|
+
*/
|
|
449
|
+
static void test_enable_auto_commit_rejected_at_construction(void) {
|
|
450
|
+
SUB_TEST_QUICK();
|
|
451
|
+
|
|
452
|
+
verify_share_consumer_conf_prop_rejected("enable.auto.commit", "true");
|
|
453
|
+
verify_share_consumer_conf_prop_rejected("enable.auto.commit", "false");
|
|
454
|
+
|
|
455
|
+
SUB_TEST_PASS();
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
/**
|
|
459
|
+
* @brief Share consumer requires group.protocol=consumer (forced
|
|
460
|
+
* internally); any explicit set by the app — even to the
|
|
461
|
+
* same value — is rejected so the value can only come from
|
|
462
|
+
* the library.
|
|
463
|
+
*/
|
|
464
|
+
static void test_group_protocol_rejected_at_construction(void) {
|
|
465
|
+
SUB_TEST_QUICK();
|
|
466
|
+
|
|
467
|
+
verify_share_consumer_conf_prop_rejected("group.protocol", "consumer");
|
|
468
|
+
verify_share_consumer_conf_prop_rejected("group.protocol", "classic");
|
|
469
|
+
|
|
470
|
+
SUB_TEST_PASS();
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
/**
|
|
474
|
+
* @brief Share consumer forces socket.max.fails=1 to keep the broker
|
|
475
|
+
* share session in sync; any explicit set by the app is
|
|
476
|
+
* rejected.
|
|
477
|
+
*/
|
|
478
|
+
static void test_socket_max_fails_rejected_at_construction(void) {
|
|
479
|
+
SUB_TEST_QUICK();
|
|
480
|
+
|
|
481
|
+
verify_share_consumer_conf_prop_rejected("socket.max.fails", "1");
|
|
482
|
+
verify_share_consumer_conf_prop_rejected("socket.max.fails", "5");
|
|
483
|
+
|
|
484
|
+
SUB_TEST_PASS();
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
/**
|
|
488
|
+
* @brief For non-share (regular) consumers, fetch.min.bytes must stay in
|
|
489
|
+
* the historical range 1..100000000. The property bounds were
|
|
490
|
+
* widened to 0..INT_MAX for share-consumer parity with the Java
|
|
491
|
+
* client; regular consumers are re-restricted at finalize, so 0
|
|
492
|
+
* and values above 100000000 (e.g. INT_MAX) are rejected.
|
|
493
|
+
*/
|
|
494
|
+
static void test_fetch_min_bytes_regular_consumer_range_rejected(void) {
|
|
495
|
+
SUB_TEST_QUICK();
|
|
496
|
+
|
|
497
|
+
/* 0 is below the regular-consumer minimum of 1. */
|
|
498
|
+
verify_regular_consumer_conf_prop_rejected("fetch.min.bytes", "0");
|
|
499
|
+
/* INT_MAX exceeds the regular-consumer maximum of 100000000. */
|
|
500
|
+
verify_regular_consumer_conf_prop_rejected("fetch.min.bytes",
|
|
501
|
+
"2147483647");
|
|
502
|
+
verify_regular_consumer_conf_prop_rejected("fetch.min.bytes",
|
|
503
|
+
"100000001");
|
|
504
|
+
|
|
505
|
+
SUB_TEST_PASS();
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
/**
|
|
509
|
+
* @brief Offset-reset for share consumer is a broker-side share-
|
|
510
|
+
* group property (`share.auto.offset.reset`); the client
|
|
511
|
+
* `auto.offset.reset` is not used. Any explicit set on the
|
|
512
|
+
* client is rejected.
|
|
513
|
+
*/
|
|
514
|
+
static void test_auto_offset_reset_rejected_at_construction(void) {
|
|
515
|
+
SUB_TEST_QUICK();
|
|
516
|
+
|
|
517
|
+
verify_share_consumer_conf_prop_rejected("auto.offset.reset",
|
|
518
|
+
"earliest");
|
|
519
|
+
verify_share_consumer_conf_prop_rejected("auto.offset.reset", "latest");
|
|
520
|
+
|
|
521
|
+
SUB_TEST_PASS();
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
/**
|
|
525
|
+
* @brief Share consumer forces group.protocol=consumer, so the
|
|
526
|
+
* downstream consumer-protocol validation rejects
|
|
527
|
+
* session.timeout.ms (defined broker side). Verify the
|
|
528
|
+
* rejection surfaces for share consumer too.
|
|
529
|
+
*/
|
|
530
|
+
static void test_session_timeout_ms_rejected_at_construction(void) {
|
|
531
|
+
SUB_TEST_QUICK();
|
|
532
|
+
|
|
533
|
+
verify_share_consumer_conf_prop_rejected("session.timeout.ms", "30000");
|
|
534
|
+
|
|
535
|
+
SUB_TEST_PASS();
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
/**
|
|
539
|
+
* @brief Share consumer forces group.protocol=consumer, so the
|
|
540
|
+
* downstream consumer-protocol validation rejects
|
|
541
|
+
* partition.assignment.strategy. Verify the rejection
|
|
542
|
+
* surfaces for share consumer too.
|
|
543
|
+
*/
|
|
544
|
+
static void test_partition_assignment_strategy_rejected_at_construction(void) {
|
|
545
|
+
SUB_TEST_QUICK();
|
|
546
|
+
|
|
547
|
+
verify_share_consumer_conf_prop_rejected(
|
|
548
|
+
"partition.assignment.strategy", "range");
|
|
549
|
+
|
|
550
|
+
SUB_TEST_PASS();
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
/**
|
|
554
|
+
* @brief Share consumer forces group.protocol=consumer, so the
|
|
555
|
+
* downstream consumer-protocol validation rejects
|
|
556
|
+
* group.protocol.type. Verify the rejection surfaces for
|
|
557
|
+
* share consumer too.
|
|
558
|
+
*/
|
|
559
|
+
static void test_group_protocol_type_rejected_at_construction(void) {
|
|
560
|
+
SUB_TEST_QUICK();
|
|
561
|
+
|
|
562
|
+
verify_share_consumer_conf_prop_rejected("group.protocol.type",
|
|
563
|
+
"consumer");
|
|
564
|
+
|
|
565
|
+
SUB_TEST_PASS();
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
/**
|
|
569
|
+
* @brief Share consumer forces group.protocol=consumer, so the
|
|
570
|
+
* downstream consumer-protocol validation rejects
|
|
571
|
+
* heartbeat.interval.ms (defined broker side). Verify the
|
|
572
|
+
* rejection surfaces for share consumer too.
|
|
573
|
+
*/
|
|
574
|
+
static void test_heartbeat_interval_ms_rejected_at_construction(void) {
|
|
575
|
+
SUB_TEST_QUICK();
|
|
576
|
+
|
|
577
|
+
verify_share_consumer_conf_prop_rejected("heartbeat.interval.ms",
|
|
578
|
+
"3000");
|
|
579
|
+
|
|
580
|
+
SUB_TEST_PASS();
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
/**
|
|
584
|
+
* @brief For receive.message.max.bytes, an explicit value below
|
|
585
|
+
* `fetch.max.bytes` + 512 is rejected at construction so the receive cap can
|
|
586
|
+
* always hold a full fetch response. Here `fetch.max.bytes` is left at its
|
|
587
|
+
* default
|
|
588
|
+
* (~50 MB), so any value below that + 512 (e.g. 1 MB) is rejected.
|
|
589
|
+
*/
|
|
590
|
+
static void
|
|
591
|
+
test_receive_message_max_bytes_below_floor_rejected_at_construction(void) {
|
|
592
|
+
SUB_TEST_QUICK();
|
|
593
|
+
|
|
594
|
+
verify_share_consumer_conf_prop_rejected("receive.message.max.bytes",
|
|
595
|
+
"1000000");
|
|
596
|
+
|
|
597
|
+
SUB_TEST_PASS();
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
/**
|
|
601
|
+
* @brief `reconnect.backoff.max.ms` must be >= `reconnect.backoff.ms`;
|
|
602
|
+
* a smaller max is rejected at construction. This is a common
|
|
603
|
+
* (non-share-specific) finalize check, exercised here for the
|
|
604
|
+
* share consumer factory.
|
|
605
|
+
*/
|
|
606
|
+
static void
|
|
607
|
+
test_reconnect_backoff_max_below_min_rejected_at_construction(void) {
|
|
608
|
+
rd_kafka_conf_t *conf;
|
|
609
|
+
rd_kafka_share_t *rkshare;
|
|
610
|
+
char errstr[512];
|
|
611
|
+
|
|
612
|
+
SUB_TEST_QUICK();
|
|
613
|
+
|
|
614
|
+
conf = rd_kafka_conf_new();
|
|
615
|
+
TEST_ASSERT(rd_kafka_conf_set(conf, "reconnect.backoff.ms", "1000",
|
|
616
|
+
errstr,
|
|
617
|
+
sizeof(errstr)) == RD_KAFKA_CONF_OK,
|
|
618
|
+
"reconnect.backoff.ms: %s", errstr);
|
|
619
|
+
TEST_ASSERT(rd_kafka_conf_set(conf, "reconnect.backoff.max.ms", "500",
|
|
620
|
+
errstr,
|
|
621
|
+
sizeof(errstr)) == RD_KAFKA_CONF_OK,
|
|
622
|
+
"reconnect.backoff.max.ms: %s", errstr);
|
|
623
|
+
|
|
624
|
+
errstr[0] = '\0';
|
|
625
|
+
rkshare = rd_kafka_share_consumer_new(conf, errstr, sizeof(errstr));
|
|
626
|
+
TEST_ASSERT(rkshare == NULL,
|
|
627
|
+
"expected NULL share consumer when "
|
|
628
|
+
"reconnect.backoff.max.ms < reconnect.backoff.ms");
|
|
629
|
+
TEST_ASSERT(strstr(errstr, "reconnect.backoff.max.ms") != NULL,
|
|
630
|
+
"errstr should mention reconnect.backoff.max.ms, got: %s",
|
|
631
|
+
errstr);
|
|
632
|
+
TEST_SAY("rejected with: %s\n", errstr);
|
|
633
|
+
rd_kafka_conf_destroy(conf);
|
|
634
|
+
|
|
635
|
+
SUB_TEST_PASS();
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
/**
|
|
639
|
+
* @brief Static membership (`group.instance.id`) is not supported for
|
|
640
|
+
* share groups; the property is rejected for share consumers.
|
|
641
|
+
*/
|
|
642
|
+
static void test_group_instance_id_rejected_at_construction(void) {
|
|
643
|
+
SUB_TEST_QUICK();
|
|
644
|
+
|
|
645
|
+
verify_share_consumer_conf_prop_rejected("group.instance.id",
|
|
646
|
+
"share-instance-1");
|
|
647
|
+
|
|
648
|
+
SUB_TEST_PASS();
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
/**
|
|
652
|
+
* @brief `isolation.level` is defined broker-side for share groups; the
|
|
653
|
+
* client property is rejected for share consumers.
|
|
654
|
+
*/
|
|
655
|
+
static void test_isolation_level_rejected_at_construction(void) {
|
|
656
|
+
SUB_TEST_QUICK();
|
|
657
|
+
|
|
658
|
+
verify_share_consumer_conf_prop_rejected("isolation.level",
|
|
659
|
+
"read_committed");
|
|
660
|
+
|
|
661
|
+
SUB_TEST_PASS();
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
/**
|
|
665
|
+
* @brief Share-group assignment is broker-driven; the client
|
|
666
|
+
* `group.remote.assignor` property is rejected for share
|
|
667
|
+
* consumers.
|
|
668
|
+
*/
|
|
669
|
+
static void test_group_remote_assignor_rejected_at_construction(void) {
|
|
670
|
+
SUB_TEST_QUICK();
|
|
671
|
+
|
|
672
|
+
verify_share_consumer_conf_prop_rejected("group.remote.assignor",
|
|
673
|
+
"uniform");
|
|
674
|
+
|
|
675
|
+
SUB_TEST_PASS();
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
/**
|
|
679
|
+
* @brief `queued.min.messages` tunes the per-partition prefetch queue,
|
|
680
|
+
* which share consumers (broker-driven via max.poll.records) do
|
|
681
|
+
* not use; it is rejected for share consumers.
|
|
682
|
+
*/
|
|
683
|
+
static void test_queued_min_messages_rejected_at_construction(void) {
|
|
684
|
+
SUB_TEST_QUICK();
|
|
685
|
+
|
|
686
|
+
verify_share_consumer_conf_prop_rejected("queued.min.messages", "1000");
|
|
687
|
+
|
|
688
|
+
SUB_TEST_PASS();
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
/**
|
|
692
|
+
* @brief `queued.max.messages.kbytes` tunes the per-partition prefetch
|
|
693
|
+
* queue, which share consumers do not use; it is rejected for
|
|
694
|
+
* share consumers.
|
|
695
|
+
*/
|
|
696
|
+
static void test_queued_max_messages_kbytes_rejected_at_construction(void) {
|
|
697
|
+
SUB_TEST_QUICK();
|
|
698
|
+
|
|
699
|
+
verify_share_consumer_conf_prop_rejected("queued.max.messages.kbytes",
|
|
700
|
+
"1024");
|
|
701
|
+
|
|
702
|
+
SUB_TEST_PASS();
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
/**
|
|
706
|
+
* @brief `fetch.queue.backoff.ms` backs off the per-partition prefetch
|
|
707
|
+
* queue throttle (queued.min.messages / queued.max.messages.kbytes),
|
|
708
|
+
* which share consumers do not use; it is rejected for share
|
|
709
|
+
* consumers. No Java equivalent.
|
|
710
|
+
*/
|
|
711
|
+
static void test_fetch_queue_backoff_ms_rejected_at_construction(void) {
|
|
712
|
+
SUB_TEST_QUICK();
|
|
713
|
+
|
|
714
|
+
verify_share_consumer_conf_prop_rejected("fetch.queue.backoff.ms",
|
|
715
|
+
"1000");
|
|
716
|
+
|
|
717
|
+
SUB_TEST_PASS();
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
/**
|
|
721
|
+
* @brief `fetch.error.backoff.ms` postpones the next Fetch after a fetch
|
|
722
|
+
* error, but it is only consulted on the regular (non-share) Fetch
|
|
723
|
+
* RPC path (rd_kafka_broker_fetch_backoff /
|
|
724
|
+
* rd_kafka_toppar_fetch_backoff). The ShareFetch path does not use
|
|
725
|
+
* it: ShareFetch/ShareAcknowledge RPC-level errors are not retried
|
|
726
|
+
* with a fetch backoff (they are handled via session reset or the
|
|
727
|
+
* next poll), and connection failures reconnect via
|
|
728
|
+
* reconnect.backoff.ms. It is also librdkafka-specific (no Java
|
|
729
|
+
* equivalent; Java uses the generic retry.backoff.ms). So it is
|
|
730
|
+
* rejected for share consumers.
|
|
731
|
+
*/
|
|
732
|
+
static void test_fetch_error_backoff_ms_rejected_at_construction(void) {
|
|
733
|
+
SUB_TEST_QUICK();
|
|
734
|
+
|
|
735
|
+
verify_share_consumer_conf_prop_rejected("fetch.error.backoff.ms",
|
|
736
|
+
"1000");
|
|
737
|
+
|
|
738
|
+
SUB_TEST_PASS();
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
/**
|
|
742
|
+
* @brief `enable.partition.eof` emits a synthetic PARTITION_EOF event
|
|
743
|
+
* when the client's per-partition fetch cursor reaches the
|
|
744
|
+
* broker-reported high-water mark. Share consumers do not
|
|
745
|
+
* maintain a per-partition fetch cursor (the broker manages the
|
|
746
|
+
* share-group offset / acquired ranges), so the EOF event is
|
|
747
|
+
* never produced on the ShareFetch path. librdkafka-specific (no
|
|
748
|
+
* Java equivalent). It is rejected for share consumers.
|
|
749
|
+
*/
|
|
750
|
+
static void test_enable_partition_eof_rejected_at_construction(void) {
|
|
751
|
+
SUB_TEST_QUICK();
|
|
752
|
+
|
|
753
|
+
verify_share_consumer_conf_prop_rejected("enable.partition.eof",
|
|
754
|
+
"true");
|
|
755
|
+
|
|
756
|
+
SUB_TEST_PASS();
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
/**
|
|
760
|
+
* @brief `message.copy.max.bytes` is a producer-only copy/zero-copy
|
|
761
|
+
* threshold used solely when building ProduceRequests. It is
|
|
762
|
+
* flagged _RK_GLOBAL (not _RK_PRODUCER), so unlike linger.ms /
|
|
763
|
+
* batch.* it is silently accepted by consumers rather than warned
|
|
764
|
+
* about; it does nothing on the share-consumer path. Rejected for
|
|
765
|
+
* share consumers. No Java equivalent.
|
|
766
|
+
*/
|
|
767
|
+
static void test_message_copy_max_bytes_rejected_at_construction(void) {
|
|
768
|
+
SUB_TEST_QUICK();
|
|
769
|
+
|
|
770
|
+
verify_share_consumer_conf_prop_rejected("message.copy.max.bytes",
|
|
771
|
+
"1000");
|
|
772
|
+
|
|
773
|
+
SUB_TEST_PASS();
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
/**
|
|
777
|
+
* @brief `topic.blacklist` is a librdkafka-specific metadata filter (no
|
|
778
|
+
* Java equivalent) that drops matching topics from broker metadata
|
|
779
|
+
* "as if they did not exist". The Apache Kafka Java share consumer
|
|
780
|
+
* has no such config, so to keep the share-consumer config surface
|
|
781
|
+
* on par with the Java client it is rejected for share consumers.
|
|
782
|
+
*/
|
|
783
|
+
static void test_topic_blacklist_rejected_at_construction(void) {
|
|
784
|
+
SUB_TEST_QUICK();
|
|
785
|
+
|
|
786
|
+
verify_share_consumer_conf_prop_rejected("topic.blacklist", "^test.*");
|
|
787
|
+
|
|
788
|
+
SUB_TEST_PASS();
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
struct idle_reconnect_counters {
|
|
792
|
+
rd_atomic32_t idle_closes;
|
|
793
|
+
rd_atomic32_t reconnects_after_idle;
|
|
794
|
+
};
|
|
795
|
+
|
|
796
|
+
/* ===================================================================
|
|
797
|
+
* Log callback for the fetch-connection idle test. Same as
|
|
798
|
+
* idle_reconnect_log_cb but filtered to the FETCH (leader) connection
|
|
799
|
+
* only: the broker name is prefixed into buf, so coordinator lines
|
|
800
|
+
* contain "GroupCoordinator" and fetch-broker lines do not.
|
|
801
|
+
* =================================================================== */
|
|
802
|
+
static void fetch_idle_log_cb(const rd_kafka_t *rk,
|
|
803
|
+
int level,
|
|
804
|
+
const char *fac,
|
|
805
|
+
const char *buf) {
|
|
806
|
+
struct idle_reconnect_counters *c = rd_kafka_opaque(rk);
|
|
807
|
+
if (!c || strstr(buf, "GroupCoordinator"))
|
|
808
|
+
return; /* ignore the coordinator connection */
|
|
809
|
+
if (!strcmp(fac, "FAIL") &&
|
|
810
|
+
strstr(buf, "Connection max idle time exceeded"))
|
|
811
|
+
rd_atomic32_add(&c->idle_closes, 1);
|
|
812
|
+
else if (!strcmp(fac, "CONNECT") && strstr(buf, "connecting") &&
|
|
813
|
+
rd_atomic32_get(&c->idle_closes) > 0)
|
|
814
|
+
rd_atomic32_add(&c->reconnects_after_idle, 1);
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
/**
|
|
818
|
+
* @brief Build a producer with linger.ms=0 so each rd_kafka_produce()
|
|
819
|
+
* flushes as its own broker batch.
|
|
820
|
+
*/
|
|
821
|
+
static rd_kafka_t *create_no_linger_producer(void) {
|
|
822
|
+
rd_kafka_conf_t *conf;
|
|
823
|
+
char errstr[512];
|
|
824
|
+
|
|
825
|
+
test_conf_init(&conf, NULL, 0);
|
|
826
|
+
TEST_ASSERT(rd_kafka_conf_set(conf, "linger.ms", "0", errstr,
|
|
827
|
+
sizeof(errstr)) == RD_KAFKA_CONF_OK,
|
|
828
|
+
"linger.ms=0: %s", errstr);
|
|
829
|
+
return test_create_handle(RD_KAFKA_PRODUCER, conf);
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
|
|
833
|
+
/**
|
|
834
|
+
* @brief Build a share consumer for \p group_id, optionally setting one
|
|
835
|
+
* extra config property \p prop to \p value.
|
|
836
|
+
*/
|
|
837
|
+
static rd_kafka_share_t *create_share_consumer_with_prop(const char *group_id,
|
|
838
|
+
const char *prop,
|
|
839
|
+
int value) {
|
|
840
|
+
rd_kafka_conf_t *conf;
|
|
841
|
+
rd_kafka_share_t *rkshare;
|
|
842
|
+
char errstr[512];
|
|
843
|
+
char val[32];
|
|
844
|
+
|
|
845
|
+
test_conf_init(&conf, NULL, 0);
|
|
846
|
+
rd_kafka_conf_set(conf, "group.id", group_id, errstr, sizeof(errstr));
|
|
847
|
+
|
|
848
|
+
if (prop) {
|
|
849
|
+
rd_snprintf(val, sizeof(val), "%d", value);
|
|
850
|
+
TEST_ASSERT(rd_kafka_conf_set(conf, prop, val, errstr,
|
|
851
|
+
sizeof(errstr)) ==
|
|
852
|
+
RD_KAFKA_CONF_OK,
|
|
853
|
+
"%s=%d: %s", prop, value, errstr);
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
rkshare = rd_kafka_share_consumer_new(conf, errstr, sizeof(errstr));
|
|
857
|
+
TEST_ASSERT(rkshare, "Failed to create share consumer: %s", errstr);
|
|
858
|
+
return rkshare;
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
|
|
862
|
+
/**
|
|
863
|
+
* @brief Produce \p msgcnt records to \p topic, partition 0, with
|
|
864
|
+
* \p gap_ms between each produce call. With linger.ms=0 on the
|
|
865
|
+
* producer this lands each record as its own broker batch.
|
|
866
|
+
*/
|
|
867
|
+
static void produce_one_per_batch(rd_kafka_t *producer,
|
|
868
|
+
const char *topic,
|
|
869
|
+
int msgcnt,
|
|
870
|
+
int gap_ms) {
|
|
871
|
+
rd_kafka_topic_t *rkt;
|
|
872
|
+
rd_kafka_resp_err_t err;
|
|
873
|
+
char payload[64];
|
|
874
|
+
int i;
|
|
875
|
+
|
|
876
|
+
rkt = rd_kafka_topic_new(producer, topic, NULL);
|
|
877
|
+
TEST_ASSERT(rkt, "topic_new(%s) failed: %s", topic,
|
|
878
|
+
rd_kafka_err2str(rd_kafka_last_error()));
|
|
879
|
+
|
|
880
|
+
for (i = 0; i < msgcnt; i++) {
|
|
881
|
+
rd_snprintf(payload, sizeof(payload), "msg-%d", i);
|
|
882
|
+
if (rd_kafka_produce(rkt, 0, RD_KAFKA_MSG_F_COPY, payload,
|
|
883
|
+
strlen(payload), NULL, 0, NULL) == -1)
|
|
884
|
+
TEST_FAIL("produce #%d failed: %s", i,
|
|
885
|
+
rd_kafka_err2str(rd_kafka_last_error()));
|
|
886
|
+
|
|
887
|
+
err = rd_kafka_flush(producer, 30 * 1000);
|
|
888
|
+
TEST_ASSERT(!err, "flush after produce #%d: %s", i,
|
|
889
|
+
rd_kafka_err2str(err));
|
|
890
|
+
|
|
891
|
+
if (i + 1 < msgcnt)
|
|
892
|
+
rd_usleep(gap_ms * 1000, NULL);
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
rd_kafka_topic_destroy(rkt);
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
|
|
899
|
+
/**
|
|
900
|
+
* @brief Consume \p target records and record how many records came in
|
|
901
|
+
* each batch returned by rd_kafka_share_poll().
|
|
902
|
+
*
|
|
903
|
+
* @returns Number of batches it took to reach \p target records.
|
|
904
|
+
* Out-param \p batch_sizes is filled with each batch's
|
|
905
|
+
* record count, up to \p batch_sizes_cap entries.
|
|
906
|
+
*/
|
|
907
|
+
static int consume_record_batches(rd_kafka_share_t *rkshare,
|
|
908
|
+
int target,
|
|
909
|
+
int *batch_sizes,
|
|
910
|
+
int batch_sizes_cap,
|
|
911
|
+
int per_call_timeout_ms,
|
|
912
|
+
int max_calls) {
|
|
913
|
+
rd_kafka_messages_t *batch = NULL;
|
|
914
|
+
size_t rcvd;
|
|
915
|
+
size_t j;
|
|
916
|
+
rd_kafka_error_t *error;
|
|
917
|
+
int batches = 0;
|
|
918
|
+
int got = 0;
|
|
919
|
+
int call;
|
|
920
|
+
|
|
921
|
+
for (call = 0; call < max_calls && got < target; call++) {
|
|
922
|
+
error =
|
|
923
|
+
rd_kafka_share_poll(rkshare, per_call_timeout_ms, &batch);
|
|
924
|
+
if (error) {
|
|
925
|
+
rd_kafka_error_destroy(error);
|
|
926
|
+
continue;
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
rcvd = rd_kafka_messages_count(batch);
|
|
930
|
+
if (rcvd == 0) {
|
|
931
|
+
rd_kafka_messages_destroy(batch);
|
|
932
|
+
batch = NULL;
|
|
933
|
+
continue;
|
|
934
|
+
}
|
|
935
|
+
|
|
936
|
+
if (batches < batch_sizes_cap)
|
|
937
|
+
batch_sizes[batches] = (int)rcvd;
|
|
938
|
+
batches++;
|
|
939
|
+
|
|
940
|
+
for (j = 0; j < rcvd; j++) {
|
|
941
|
+
rd_kafka_message_t *rkm =
|
|
942
|
+
rd_kafka_messages_get(batch, j);
|
|
943
|
+
if (!rkm->err)
|
|
944
|
+
got++;
|
|
945
|
+
}
|
|
946
|
+
rd_kafka_messages_destroy(batch);
|
|
947
|
+
batch = NULL;
|
|
948
|
+
}
|
|
949
|
+
return batches;
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
/**
|
|
953
|
+
* @brief Drain \p msgcnt records from \p topic with a share consumer
|
|
954
|
+
* configured by \p set_fetch_max_bytes / \p fetch_max_bytes, and
|
|
955
|
+
* return how many non-empty poll batches it took.
|
|
956
|
+
*
|
|
957
|
+
* max.poll.records is left at the library default so that the only
|
|
958
|
+
* thing capping a single poll batch is the byte limit under test.
|
|
959
|
+
*/
|
|
960
|
+
static int drain_count_with_fetch_max_bytes(const char *group,
|
|
961
|
+
const char *topic,
|
|
962
|
+
int msgcnt,
|
|
963
|
+
rd_bool_t set_fetch_max_bytes,
|
|
964
|
+
int fetch_max_bytes) {
|
|
965
|
+
rd_kafka_share_t *rkshare;
|
|
966
|
+
int batch_sizes[256] = {0};
|
|
967
|
+
int batches;
|
|
968
|
+
|
|
969
|
+
rkshare = create_share_consumer_with_prop(
|
|
970
|
+
group, set_fetch_max_bytes ? "fetch.max.bytes" : NULL,
|
|
971
|
+
fetch_max_bytes);
|
|
972
|
+
test_share_set_auto_offset_reset(group, "earliest");
|
|
973
|
+
test_share_consumer_subscribe_multi(rkshare, 1, topic);
|
|
974
|
+
|
|
975
|
+
batches =
|
|
976
|
+
consume_record_batches(rkshare, msgcnt, batch_sizes,
|
|
977
|
+
(int)RD_ARRAY_SIZE(batch_sizes), 3000, 200);
|
|
978
|
+
|
|
979
|
+
test_share_consumer_close(rkshare);
|
|
980
|
+
test_share_destroy(rkshare);
|
|
981
|
+
return batches;
|
|
982
|
+
}
|
|
983
|
+
|
|
984
|
+
/**
|
|
985
|
+
* @brief Produce a single record of \p value_size bytes to \p topic
|
|
986
|
+
* partition 0. The default producer message.max.bytes (1 MB) and
|
|
987
|
+
* broker max.message.bytes (~1 MB) both comfortably exceed the
|
|
988
|
+
* sizes used here, so no size overrides are needed.
|
|
989
|
+
*/
|
|
990
|
+
static void
|
|
991
|
+
produce_one_sized(rd_kafka_t *producer, const char *topic, int value_size) {
|
|
992
|
+
rd_kafka_topic_t *rkt;
|
|
993
|
+
char *payload;
|
|
994
|
+
|
|
995
|
+
rkt = rd_kafka_topic_new(producer, topic, NULL);
|
|
996
|
+
TEST_ASSERT(rkt, "topic_new(%s) failed: %s", topic,
|
|
997
|
+
rd_kafka_err2str(rd_kafka_last_error()));
|
|
998
|
+
|
|
999
|
+
payload = rd_malloc(value_size);
|
|
1000
|
+
memset(payload, 'x', value_size);
|
|
1001
|
+
|
|
1002
|
+
if (rd_kafka_produce(rkt, 0, RD_KAFKA_MSG_F_COPY, payload, value_size,
|
|
1003
|
+
NULL, 0, NULL) == -1)
|
|
1004
|
+
TEST_FAIL("produce (%d bytes) failed: %s", value_size,
|
|
1005
|
+
rd_kafka_err2str(rd_kafka_last_error()));
|
|
1006
|
+
TEST_ASSERT(!rd_kafka_flush(producer, 30 * 1000), "flush timed out");
|
|
1007
|
+
|
|
1008
|
+
rd_free(payload);
|
|
1009
|
+
rd_kafka_topic_destroy(rkt);
|
|
1010
|
+
}
|
|
1011
|
+
|
|
1012
|
+
/* Set when the receive-cap test sees the expected _BAD_MSG error via the
|
|
1013
|
+
* client error_cb. The receive-side size check fails the broker
|
|
1014
|
+
* connection (rdkafka_broker.c), so the error is delivered to error_cb,
|
|
1015
|
+
* not as the rd_kafka_share_poll() return value. */
|
|
1016
|
+
static rd_atomic32_t recv_max_bad_msg_seen;
|
|
1017
|
+
|
|
1018
|
+
/* is_fatal_cb for the receive-cap test: the oversized-response
|
|
1019
|
+
* _BAD_MSG is expected (not test-fatal); record it and let the test
|
|
1020
|
+
* continue. Any other error is still treated as fatal. */
|
|
1021
|
+
static int recv_max_is_fatal_cb(rd_kafka_t *rk,
|
|
1022
|
+
rd_kafka_resp_err_t err,
|
|
1023
|
+
const char *reason) {
|
|
1024
|
+
if (err == RD_KAFKA_RESP_ERR__BAD_MSG && reason &&
|
|
1025
|
+
strstr(reason, "Invalid response size")) {
|
|
1026
|
+
rd_atomic32_add(&recv_max_bad_msg_seen, 1);
|
|
1027
|
+
return 0; /* not fatal */
|
|
1028
|
+
}
|
|
1029
|
+
if (err == RD_KAFKA_RESP_ERR__TRANSPORT ||
|
|
1030
|
+
err == RD_KAFKA_RESP_ERR__ALL_BROKERS_DOWN)
|
|
1031
|
+
return 0; /* expected cascade from the receive-cap failure */
|
|
1032
|
+
return 1; /* fatal */
|
|
1033
|
+
}
|
|
1034
|
+
|
|
1035
|
+
/**
|
|
1036
|
+
* @brief Verify max.poll.records=5 splits 10 single-record broker
|
|
1037
|
+
* batches into 2 consume_batch() returns of ~5 records each.
|
|
1038
|
+
*
|
|
1039
|
+
* Setup: producer with linger.ms=0 emits 10 records with 500ms gap, so
|
|
1040
|
+
* each lands as its own broker batch. Consumer with
|
|
1041
|
+
* max.poll.records=5: across all consume_batch() calls, no single call
|
|
1042
|
+
* returns more than 5 records and the 10 records are drained in 2 or
|
|
1043
|
+
* more batches (the cap is the upper bound the lib must respect).
|
|
1044
|
+
*/
|
|
1045
|
+
static void test_max_poll_records_caps_batch_at_5(void) {
|
|
1046
|
+
const char *topic;
|
|
1047
|
+
const char *group = "0180-max-poll-records-5";
|
|
1048
|
+
rd_kafka_t *producer;
|
|
1049
|
+
rd_kafka_share_t *rkshare;
|
|
1050
|
+
const int msgcnt = 10;
|
|
1051
|
+
const int max_poll = 5;
|
|
1052
|
+
int batch_sizes[32] = {0};
|
|
1053
|
+
int batches;
|
|
1054
|
+
int i;
|
|
1055
|
+
|
|
1056
|
+
SUB_TEST();
|
|
1057
|
+
|
|
1058
|
+
producer = create_no_linger_producer();
|
|
1059
|
+
|
|
1060
|
+
topic = test_mk_topic_name("0180-max-poll-5", 1);
|
|
1061
|
+
test_create_topic_wait_exists(NULL, topic, 1, -1, 60 * 1000);
|
|
1062
|
+
|
|
1063
|
+
produce_one_per_batch(producer, topic, msgcnt, 500);
|
|
1064
|
+
|
|
1065
|
+
rkshare = create_share_consumer_with_prop(group, "max.poll.records",
|
|
1066
|
+
max_poll);
|
|
1067
|
+
test_share_set_auto_offset_reset(group, "earliest");
|
|
1068
|
+
test_share_consumer_subscribe_multi(rkshare, 1, topic);
|
|
1069
|
+
|
|
1070
|
+
batches =
|
|
1071
|
+
consume_record_batches(rkshare, msgcnt, batch_sizes,
|
|
1072
|
+
(int)RD_ARRAY_SIZE(batch_sizes), 3000, 30);
|
|
1073
|
+
|
|
1074
|
+
TEST_SAY("max.poll.records=%d, msgcnt=%d -> %d batch(es):", max_poll,
|
|
1075
|
+
msgcnt, batches);
|
|
1076
|
+
for (i = 0; i < batches && i < (int)RD_ARRAY_SIZE(batch_sizes); i++)
|
|
1077
|
+
TEST_SAY0(" %d", batch_sizes[i]);
|
|
1078
|
+
TEST_SAY0("\n");
|
|
1079
|
+
|
|
1080
|
+
for (i = 0; i < batches && i < (int)RD_ARRAY_SIZE(batch_sizes); i++)
|
|
1081
|
+
TEST_ASSERT(batch_sizes[i] <= max_poll,
|
|
1082
|
+
"Batch #%d returned %d records, exceeds "
|
|
1083
|
+
"max.poll.records=%d",
|
|
1084
|
+
i, batch_sizes[i], max_poll);
|
|
1085
|
+
|
|
1086
|
+
TEST_ASSERT(batches >= 2,
|
|
1087
|
+
"Expected at least 2 batches with max.poll.records=%d "
|
|
1088
|
+
"for %d records, got %d",
|
|
1089
|
+
max_poll, msgcnt, batches);
|
|
1090
|
+
|
|
1091
|
+
test_share_consumer_close(rkshare);
|
|
1092
|
+
test_share_destroy(rkshare);
|
|
1093
|
+
rd_kafka_destroy(producer);
|
|
1094
|
+
|
|
1095
|
+
SUB_TEST_PASS();
|
|
1096
|
+
}
|
|
1097
|
+
|
|
1098
|
+
|
|
1099
|
+
/**
|
|
1100
|
+
* @brief Verify max.poll.records=10 drains 10 single-record broker
|
|
1101
|
+
* batches in a single consume_batch() call.
|
|
1102
|
+
*/
|
|
1103
|
+
static void test_max_poll_records_allows_full_drain_at_10(void) {
|
|
1104
|
+
const char *topic;
|
|
1105
|
+
const char *group = "0180-max-poll-records-10";
|
|
1106
|
+
rd_kafka_t *producer;
|
|
1107
|
+
rd_kafka_share_t *rkshare;
|
|
1108
|
+
const int msgcnt = 10;
|
|
1109
|
+
const int max_poll = 10;
|
|
1110
|
+
int batch_sizes[32] = {0};
|
|
1111
|
+
int batches;
|
|
1112
|
+
int i;
|
|
1113
|
+
|
|
1114
|
+
SUB_TEST();
|
|
1115
|
+
|
|
1116
|
+
producer = create_no_linger_producer();
|
|
1117
|
+
|
|
1118
|
+
topic = test_mk_topic_name("0180-max-poll-10", 1);
|
|
1119
|
+
test_create_topic_wait_exists(NULL, topic, 1, -1, 60 * 1000);
|
|
1120
|
+
|
|
1121
|
+
produce_one_per_batch(producer, topic, msgcnt, 500);
|
|
1122
|
+
|
|
1123
|
+
rkshare = create_share_consumer_with_prop(group, "max.poll.records",
|
|
1124
|
+
max_poll);
|
|
1125
|
+
test_share_set_auto_offset_reset(group, "earliest");
|
|
1126
|
+
test_share_consumer_subscribe_multi(rkshare, 1, topic);
|
|
1127
|
+
|
|
1128
|
+
batches =
|
|
1129
|
+
consume_record_batches(rkshare, msgcnt, batch_sizes,
|
|
1130
|
+
(int)RD_ARRAY_SIZE(batch_sizes), 5000, 30);
|
|
1131
|
+
|
|
1132
|
+
TEST_SAY("max.poll.records=%d, msgcnt=%d -> %d batch(es):", max_poll,
|
|
1133
|
+
msgcnt, batches);
|
|
1134
|
+
for (i = 0; i < batches && i < (int)RD_ARRAY_SIZE(batch_sizes); i++)
|
|
1135
|
+
TEST_SAY0(" %d", batch_sizes[i]);
|
|
1136
|
+
TEST_SAY0("\n");
|
|
1137
|
+
|
|
1138
|
+
{
|
|
1139
|
+
int sum = 0;
|
|
1140
|
+
for (i = 0; i < batches && i < (int)RD_ARRAY_SIZE(batch_sizes);
|
|
1141
|
+
i++) {
|
|
1142
|
+
TEST_ASSERT(batch_sizes[i] <= max_poll,
|
|
1143
|
+
"Batch #%d returned %d records, "
|
|
1144
|
+
"exceeds max.poll.records=%d",
|
|
1145
|
+
i, batch_sizes[i], max_poll);
|
|
1146
|
+
sum += batch_sizes[i];
|
|
1147
|
+
}
|
|
1148
|
+
TEST_ASSERT(sum == msgcnt,
|
|
1149
|
+
"Expected %d total records across batches, "
|
|
1150
|
+
"got %d",
|
|
1151
|
+
msgcnt, sum);
|
|
1152
|
+
}
|
|
1153
|
+
|
|
1154
|
+
test_share_consumer_close(rkshare);
|
|
1155
|
+
test_share_destroy(rkshare);
|
|
1156
|
+
rd_kafka_destroy(producer);
|
|
1157
|
+
|
|
1158
|
+
SUB_TEST_PASS();
|
|
1159
|
+
}
|
|
1160
|
+
|
|
1161
|
+
/**
|
|
1162
|
+
* @brief Verify fetch.max.bytes behaves as a soft per-fetch byte limit
|
|
1163
|
+
* for share consumers.
|
|
1164
|
+
*
|
|
1165
|
+
* Produces msgcnt single-record broker batches (linger.ms=0 producer
|
|
1166
|
+
* with a gap between produces). Then:
|
|
1167
|
+
*
|
|
1168
|
+
* - With fetch.max.bytes UNSET (library default 50 MB): the broker can
|
|
1169
|
+
* pack many batches into one ShareFetch response, so the records
|
|
1170
|
+
* drain in far fewer poll calls than there are batches.
|
|
1171
|
+
*
|
|
1172
|
+
* - With fetch.max.bytes=1: the limit is a soft cap and the broker's
|
|
1173
|
+
* "return at least one batch" guarantee yields
|
|
1174
|
+
* exactly one broker batch per ShareFetch response, so draining
|
|
1175
|
+
* takes one poll per produced batch.
|
|
1176
|
+
* The two phases use distinct topics/groups so their share sessions and
|
|
1177
|
+
* offsets do not interfere.
|
|
1178
|
+
*/
|
|
1179
|
+
static void test_fetch_max_bytes_one_is_soft_limit(void) {
|
|
1180
|
+
const char *topic_default;
|
|
1181
|
+
const char *topic_one;
|
|
1182
|
+
const int msgcnt = 10;
|
|
1183
|
+
rd_kafka_t *producer;
|
|
1184
|
+
int drains_default;
|
|
1185
|
+
int drains_one;
|
|
1186
|
+
|
|
1187
|
+
SUB_TEST();
|
|
1188
|
+
|
|
1189
|
+
producer = create_no_linger_producer();
|
|
1190
|
+
|
|
1191
|
+
/* Phase 1: default fetch.max.bytes. */
|
|
1192
|
+
topic_default = test_mk_topic_name("0180-fmb-default", 1);
|
|
1193
|
+
test_create_topic_wait_exists(NULL, topic_default, 1, -1, 60 * 1000);
|
|
1194
|
+
produce_one_per_batch(producer, topic_default, msgcnt, 200);
|
|
1195
|
+
|
|
1196
|
+
drains_default = drain_count_with_fetch_max_bytes(
|
|
1197
|
+
"0180-fetch-max-bytes-default", topic_default, msgcnt,
|
|
1198
|
+
rd_false /*unset*/, 0);
|
|
1199
|
+
TEST_SAY(
|
|
1200
|
+
"fetch.max.bytes default: %d record(s) drained in %d poll "
|
|
1201
|
+
"batch(es)\n",
|
|
1202
|
+
msgcnt, drains_default);
|
|
1203
|
+
|
|
1204
|
+
/* Phase 2: fetch.max.bytes=1. */
|
|
1205
|
+
topic_one = test_mk_topic_name("0180-fmb-one", 1);
|
|
1206
|
+
test_create_topic_wait_exists(NULL, topic_one, 1, -1, 60 * 1000);
|
|
1207
|
+
produce_one_per_batch(producer, topic_one, msgcnt, 200);
|
|
1208
|
+
|
|
1209
|
+
drains_one = drain_count_with_fetch_max_bytes(
|
|
1210
|
+
"0180-fetch-max-bytes-one", topic_one, msgcnt, rd_true /*set*/, 1);
|
|
1211
|
+
TEST_SAY(
|
|
1212
|
+
"fetch.max.bytes=1: %d record(s) drained in %d poll "
|
|
1213
|
+
"batch(es)\n",
|
|
1214
|
+
msgcnt, drains_one);
|
|
1215
|
+
|
|
1216
|
+
/* With fetch.max.bytes=1 the broker returns one batch per fetch,
|
|
1217
|
+
* so the number of poll batches equals the number of produced
|
|
1218
|
+
* broker batches (msgcnt single-record batches). */
|
|
1219
|
+
TEST_ASSERT(drains_one == msgcnt,
|
|
1220
|
+
"fetch.max.bytes=1 should drain one batch per fetch: "
|
|
1221
|
+
"expected %d poll batches, got %d",
|
|
1222
|
+
msgcnt, drains_one);
|
|
1223
|
+
|
|
1224
|
+
/* The default (large) limit must drain in strictly fewer poll
|
|
1225
|
+
* batches than the one-per-fetch case. */
|
|
1226
|
+
TEST_ASSERT(drains_default < drains_one,
|
|
1227
|
+
"default fetch.max.bytes (%d poll batches) should drain "
|
|
1228
|
+
"in fewer batches than fetch.max.bytes=1 (%d poll "
|
|
1229
|
+
"batches)",
|
|
1230
|
+
drains_default, drains_one);
|
|
1231
|
+
|
|
1232
|
+
rd_kafka_destroy(producer);
|
|
1233
|
+
|
|
1234
|
+
SUB_TEST_PASS();
|
|
1235
|
+
}
|
|
1236
|
+
|
|
1237
|
+
|
|
1238
|
+
/**
|
|
1239
|
+
* @brief Drain msgcnt records from a fresh topic with a share consumer
|
|
1240
|
+
* configured with fetch.min.bytes=\p value, and assert all
|
|
1241
|
+
* records are received.
|
|
1242
|
+
*
|
|
1243
|
+
* Confirms fetch.min.bytes is functional end-to-end for share consumers
|
|
1244
|
+
* across its range:
|
|
1245
|
+
* - 0 : broker responds immediately (no long-poll).
|
|
1246
|
+
* - INT_MAX : broker can never satisfy the threshold, so it responds
|
|
1247
|
+
* when fetch.max.wait.ms elapses.
|
|
1248
|
+
* In both cases all records must still drain (matches the Java client).
|
|
1249
|
+
*/
|
|
1250
|
+
static void verify_share_fetch_min_bytes_drains_all(const char *group,
|
|
1251
|
+
const char *topic_suffix,
|
|
1252
|
+
int value) {
|
|
1253
|
+
const char *topic;
|
|
1254
|
+
const int msgcnt = 10;
|
|
1255
|
+
rd_kafka_t *producer;
|
|
1256
|
+
rd_kafka_share_t *rkshare;
|
|
1257
|
+
int batch_sizes[64] = {0};
|
|
1258
|
+
int batches;
|
|
1259
|
+
int i;
|
|
1260
|
+
int total = 0;
|
|
1261
|
+
|
|
1262
|
+
producer = create_no_linger_producer();
|
|
1263
|
+
|
|
1264
|
+
topic = test_mk_topic_name(topic_suffix, 1);
|
|
1265
|
+
test_create_topic_wait_exists(NULL, topic, 1, -1, 60 * 1000);
|
|
1266
|
+
produce_one_per_batch(producer, topic, msgcnt, 200);
|
|
1267
|
+
|
|
1268
|
+
rkshare =
|
|
1269
|
+
create_share_consumer_with_prop(group, "fetch.min.bytes", value);
|
|
1270
|
+
test_share_set_auto_offset_reset(group, "earliest");
|
|
1271
|
+
test_share_consumer_subscribe_multi(rkshare, 1, topic);
|
|
1272
|
+
|
|
1273
|
+
batches =
|
|
1274
|
+
consume_record_batches(rkshare, msgcnt, batch_sizes,
|
|
1275
|
+
(int)RD_ARRAY_SIZE(batch_sizes), 3000, 60);
|
|
1276
|
+
|
|
1277
|
+
for (i = 0; i < batches && i < (int)RD_ARRAY_SIZE(batch_sizes); i++)
|
|
1278
|
+
total += batch_sizes[i];
|
|
1279
|
+
|
|
1280
|
+
TEST_SAY(
|
|
1281
|
+
"fetch.min.bytes=%d: drained %d/%d record(s) in %d poll "
|
|
1282
|
+
"batch(es)\n",
|
|
1283
|
+
value, total, msgcnt, batches);
|
|
1284
|
+
|
|
1285
|
+
TEST_ASSERT(total == msgcnt,
|
|
1286
|
+
"fetch.min.bytes=%d should drain all records: expected "
|
|
1287
|
+
"%d, got %d",
|
|
1288
|
+
value, msgcnt, total);
|
|
1289
|
+
|
|
1290
|
+
test_share_consumer_close(rkshare);
|
|
1291
|
+
test_share_destroy(rkshare);
|
|
1292
|
+
rd_kafka_destroy(producer);
|
|
1293
|
+
}
|
|
1294
|
+
|
|
1295
|
+
/**
|
|
1296
|
+
* @brief fetch.min.bytes=0 is functional for share consumers (broker
|
|
1297
|
+
* responds immediately, no long-poll). Matches the Java client.
|
|
1298
|
+
*/
|
|
1299
|
+
static void test_fetch_min_bytes_zero_drains_all(void) {
|
|
1300
|
+
SUB_TEST();
|
|
1301
|
+
verify_share_fetch_min_bytes_drains_all("0180-fetch-min-bytes-zero",
|
|
1302
|
+
"0180-fmin-zero", 0);
|
|
1303
|
+
SUB_TEST_PASS();
|
|
1304
|
+
}
|
|
1305
|
+
|
|
1306
|
+
/**
|
|
1307
|
+
* @brief fetch.min.bytes=INT_MAX is functional for share consumers: the
|
|
1308
|
+
* broker can't satisfy the threshold, so it responds when
|
|
1309
|
+
* fetch.max.wait.ms elapses and all records still drain. Confirms
|
|
1310
|
+
* the INT_MAX upper bound (raised for Java parity) works
|
|
1311
|
+
* end-to-end.
|
|
1312
|
+
*/
|
|
1313
|
+
static void test_fetch_min_bytes_max_drains_all(void) {
|
|
1314
|
+
SUB_TEST();
|
|
1315
|
+
verify_share_fetch_min_bytes_drains_all("0180-fetch-min-bytes-max",
|
|
1316
|
+
"0180-fmin-max", 2147483647);
|
|
1317
|
+
SUB_TEST_PASS();
|
|
1318
|
+
}
|
|
1319
|
+
|
|
1320
|
+
|
|
1321
|
+
/**
|
|
1322
|
+
* @brief Verify fetch.max.bytes=0 returns no records for a share consumer.
|
|
1323
|
+
*
|
|
1324
|
+
* fetch.max.bytes=0 is accepted, but a ShareFetch with MaxBytes=0 returns
|
|
1325
|
+
* no records. This matches the Java client.
|
|
1326
|
+
* This test pins the resulting behavior so it does not silently change.
|
|
1327
|
+
*/
|
|
1328
|
+
static void test_fetch_max_bytes_zero_returns_no_records(void) {
|
|
1329
|
+
const char *topic;
|
|
1330
|
+
const char *group = "0180-fetch-max-bytes-zero";
|
|
1331
|
+
const int msgcnt = 10;
|
|
1332
|
+
rd_kafka_t *producer;
|
|
1333
|
+
rd_kafka_share_t *rkshare;
|
|
1334
|
+
rd_kafka_messages_t *batch = NULL;
|
|
1335
|
+
int received = 0;
|
|
1336
|
+
int call;
|
|
1337
|
+
|
|
1338
|
+
SUB_TEST();
|
|
1339
|
+
|
|
1340
|
+
producer = create_no_linger_producer();
|
|
1341
|
+
|
|
1342
|
+
topic = test_mk_topic_name("0180-fmax-zero", 1);
|
|
1343
|
+
test_create_topic_wait_exists(NULL, topic, 1, -1, 60 * 1000);
|
|
1344
|
+
produce_one_per_batch(producer, topic, msgcnt, 200);
|
|
1345
|
+
|
|
1346
|
+
rkshare = create_share_consumer_with_prop(group, "fetch.max.bytes", 0);
|
|
1347
|
+
test_share_set_auto_offset_reset(group, "earliest");
|
|
1348
|
+
test_share_consumer_subscribe_multi(rkshare, 1, topic);
|
|
1349
|
+
|
|
1350
|
+
/* Poll a bounded number of times; with fetch.max.bytes=0 the broker
|
|
1351
|
+
* returns no records, so every poll must be empty. */
|
|
1352
|
+
for (call = 0; call < 5; call++) {
|
|
1353
|
+
rd_kafka_error_t *error =
|
|
1354
|
+
rd_kafka_share_poll(rkshare, 1000, &batch);
|
|
1355
|
+
TEST_ASSERT(!error, "fetch.max.bytes=0 poll #%d failed: %s",
|
|
1356
|
+
call, error ? rd_kafka_error_string(error) : "");
|
|
1357
|
+
received += (int)rd_kafka_messages_count(batch);
|
|
1358
|
+
rd_kafka_messages_destroy(batch);
|
|
1359
|
+
batch = NULL;
|
|
1360
|
+
}
|
|
1361
|
+
|
|
1362
|
+
TEST_SAY("fetch.max.bytes=0: received %d record(s) over 5 polls\n",
|
|
1363
|
+
received);
|
|
1364
|
+
|
|
1365
|
+
TEST_ASSERT(received == 0,
|
|
1366
|
+
"fetch.max.bytes=0 should return no records, got %d",
|
|
1367
|
+
received);
|
|
1368
|
+
|
|
1369
|
+
test_share_consumer_close(rkshare);
|
|
1370
|
+
test_share_destroy(rkshare);
|
|
1371
|
+
rd_kafka_destroy(producer);
|
|
1372
|
+
|
|
1373
|
+
SUB_TEST_PASS();
|
|
1374
|
+
}
|
|
1375
|
+
|
|
1376
|
+
/**
|
|
1377
|
+
* @brief Characterize the FETCH connection's idle behavior after the
|
|
1378
|
+
* consumer has drained all records and stopped polling.
|
|
1379
|
+
*
|
|
1380
|
+
* While records are available the share fetch loop self-perpetuates and
|
|
1381
|
+
* the fetch connection stays busy. Once all records are consumed,
|
|
1382
|
+
* share_fetch_more_records clears and no further ShareFetch is enqueued,
|
|
1383
|
+
* so the fetch (leader) connection goes idle. This test produces a few
|
|
1384
|
+
* records, drains them, then stops polling and sleeps past
|
|
1385
|
+
* connections.max.idle.ms, and asserts the fetch connection idle-closed
|
|
1386
|
+
* and then reconnected (current behavior: a persistent connection is
|
|
1387
|
+
* requested while the broker has an assignment and is not UP).
|
|
1388
|
+
*/
|
|
1389
|
+
static void test_share_consumer_fetch_conn_idle_after_drain(void) {
|
|
1390
|
+
const char *topic;
|
|
1391
|
+
const char *group = "0180-fetch-idle";
|
|
1392
|
+
const int msgcnt = 5;
|
|
1393
|
+
const int idle_ms = 5000;
|
|
1394
|
+
rd_kafka_conf_t *conf;
|
|
1395
|
+
rd_kafka_share_t *rkshare;
|
|
1396
|
+
rd_kafka_t *producer;
|
|
1397
|
+
struct idle_reconnect_counters counters;
|
|
1398
|
+
rd_kafka_messages_t *batch = NULL;
|
|
1399
|
+
char errstr[512];
|
|
1400
|
+
int drained = 0;
|
|
1401
|
+
int i;
|
|
1402
|
+
|
|
1403
|
+
SUB_TEST();
|
|
1404
|
+
|
|
1405
|
+
rd_atomic32_init(&counters.idle_closes, 0);
|
|
1406
|
+
rd_atomic32_init(&counters.reconnects_after_idle, 0);
|
|
1407
|
+
|
|
1408
|
+
producer = create_no_linger_producer();
|
|
1409
|
+
topic = test_mk_topic_name("0180-fetch-idle", 1);
|
|
1410
|
+
test_create_topic_wait_exists(NULL, topic, 1, -1, 60 * 1000);
|
|
1411
|
+
produce_one_per_batch(producer, topic, msgcnt, 100);
|
|
1412
|
+
|
|
1413
|
+
test_conf_init(&conf, NULL, 60);
|
|
1414
|
+
test_conf_set(conf, "group.id", group);
|
|
1415
|
+
test_conf_set(conf, "debug", "all");
|
|
1416
|
+
/* Short idle timeout so the test runs fast (overrides the 9-min
|
|
1417
|
+
* share-consumer default). */
|
|
1418
|
+
test_conf_set(conf, "connections.max.idle.ms", "5000");
|
|
1419
|
+
rd_kafka_conf_set_log_cb(conf, fetch_idle_log_cb);
|
|
1420
|
+
rd_kafka_conf_set_opaque(conf, &counters);
|
|
1421
|
+
|
|
1422
|
+
rkshare = rd_kafka_share_consumer_new(conf, errstr, sizeof(errstr));
|
|
1423
|
+
TEST_ASSERT(rkshare, "Failed to create share consumer: %s", errstr);
|
|
1424
|
+
test_share_set_auto_offset_reset(group, "earliest");
|
|
1425
|
+
test_share_consumer_subscribe_multi(rkshare, 1, topic);
|
|
1426
|
+
|
|
1427
|
+
/* Drain all records so share_fetch_more_records clears and the
|
|
1428
|
+
* fetch loop quiesces. */
|
|
1429
|
+
for (i = 0; i < 30 && drained < msgcnt; i++) {
|
|
1430
|
+
rd_kafka_error_t *error =
|
|
1431
|
+
rd_kafka_share_poll(rkshare, 1000, &batch);
|
|
1432
|
+
if (error) {
|
|
1433
|
+
rd_kafka_error_destroy(error);
|
|
1434
|
+
continue;
|
|
1435
|
+
}
|
|
1436
|
+
drained += (int)rd_kafka_messages_count(batch);
|
|
1437
|
+
rd_kafka_messages_destroy(batch);
|
|
1438
|
+
batch = NULL;
|
|
1439
|
+
}
|
|
1440
|
+
TEST_ASSERT(drained >= msgcnt, "expected to drain %d records, got %d",
|
|
1441
|
+
msgcnt, drained);
|
|
1442
|
+
|
|
1443
|
+
/* Stop polling and idle past the timeout (~2x) so the fetch
|
|
1444
|
+
* connection can be closed by connections.max.idle.ms. */
|
|
1445
|
+
rd_sleep((idle_ms * 2) / 1000 + 2);
|
|
1446
|
+
|
|
1447
|
+
TEST_SAY("fetch-conn idle closes=%d, reconnects-after-idle=%d\n",
|
|
1448
|
+
rd_atomic32_get(&counters.idle_closes),
|
|
1449
|
+
rd_atomic32_get(&counters.reconnects_after_idle));
|
|
1450
|
+
|
|
1451
|
+
TEST_ASSERT(rd_atomic32_get(&counters.idle_closes) >= 1,
|
|
1452
|
+
"expected the idle fetch connection to be closed by "
|
|
1453
|
+
"connections.max.idle.ms, got %d closes",
|
|
1454
|
+
rd_atomic32_get(&counters.idle_closes));
|
|
1455
|
+
TEST_ASSERT(rd_atomic32_get(&counters.reconnects_after_idle) >= 1,
|
|
1456
|
+
"expected the fetch connection to reconnect after the "
|
|
1457
|
+
"idle close (persistent connection requested while the "
|
|
1458
|
+
"broker has an assignment), got %d",
|
|
1459
|
+
rd_atomic32_get(&counters.reconnects_after_idle));
|
|
1460
|
+
|
|
1461
|
+
test_share_consumer_close(rkshare);
|
|
1462
|
+
test_share_destroy(rkshare);
|
|
1463
|
+
rd_kafka_destroy(producer);
|
|
1464
|
+
}
|
|
1465
|
+
|
|
1466
|
+
/**
|
|
1467
|
+
* @brief A user-set `receive.message.max.bytes` is honored at runtime:
|
|
1468
|
+
* a record whose batch fits under the cap is consumed normally,
|
|
1469
|
+
* but a record whose batch alone exceeds the cap trips the
|
|
1470
|
+
* receive-side size check
|
|
1471
|
+
* (`Invalid response size ... increase receive.message.max.bytes`,
|
|
1472
|
+
* rdkafka_broker.c). That fails the broker connection, so the
|
|
1473
|
+
* error is delivered as RD_KAFKA_RESP_ERR__BAD_MSG via the client
|
|
1474
|
+
* error_cb (captured here by recv_max_is_fatal_cb), rather than as
|
|
1475
|
+
* the rd_kafka_share_poll() return.
|
|
1476
|
+
*
|
|
1477
|
+
* `fetch.max.bytes` is set below `receive.message.max.bytes` - 512 so the
|
|
1478
|
+
* config is accepted; the broker still returns at least one full batch per
|
|
1479
|
+
* fetch (minOneMessage), so an oversized batch is delivered in full and
|
|
1480
|
+
* overflows the receive cap.
|
|
1481
|
+
*/
|
|
1482
|
+
static void test_receive_message_max_bytes_is_honored(void) {
|
|
1483
|
+
const char *topic;
|
|
1484
|
+
const char *group = "0180-recv-max-bytes";
|
|
1485
|
+
const int recv_max = 100000; /* 100 KB receive cap */
|
|
1486
|
+
const int small_sz = 1000; /* fits under the cap */
|
|
1487
|
+
const int big_sz = 200000; /* one batch exceeds the cap */
|
|
1488
|
+
rd_kafka_conf_t *conf;
|
|
1489
|
+
rd_kafka_t *producer;
|
|
1490
|
+
rd_kafka_share_t *rkshare;
|
|
1491
|
+
rd_kafka_messages_t *batch = NULL;
|
|
1492
|
+
rd_kafka_error_t *error;
|
|
1493
|
+
char errstr[512];
|
|
1494
|
+
char val[32];
|
|
1495
|
+
int small_consumed = 0;
|
|
1496
|
+
int call;
|
|
1497
|
+
|
|
1498
|
+
SUB_TEST();
|
|
1499
|
+
|
|
1500
|
+
rd_atomic32_init(&recv_max_bad_msg_seen, 0);
|
|
1501
|
+
/* The oversized-response _BAD_MSG arrives via error_cb and would
|
|
1502
|
+
* otherwise fail the test; mark it as expected. */
|
|
1503
|
+
test_curr->is_fatal_cb = recv_max_is_fatal_cb;
|
|
1504
|
+
|
|
1505
|
+
topic = test_mk_topic_name("0180-recv-max-bytes", 1);
|
|
1506
|
+
test_create_topic_wait_exists(NULL, topic, 1, -1, 60 * 1000);
|
|
1507
|
+
|
|
1508
|
+
/* Small record first, then the oversized one. */
|
|
1509
|
+
producer = create_no_linger_producer();
|
|
1510
|
+
produce_one_sized(producer, topic, small_sz);
|
|
1511
|
+
produce_one_sized(producer, topic, big_sz);
|
|
1512
|
+
rd_kafka_destroy(producer);
|
|
1513
|
+
|
|
1514
|
+
test_conf_init(&conf, NULL, 60);
|
|
1515
|
+
test_conf_set(conf, "group.id", group);
|
|
1516
|
+
rd_snprintf(val, sizeof(val), "%d", recv_max);
|
|
1517
|
+
test_conf_set(conf, "receive.message.max.bytes", val);
|
|
1518
|
+
/* Must be <= receive.message.max.bytes - 512 to be accepted. */
|
|
1519
|
+
rd_snprintf(val, sizeof(val), "%d", recv_max - 512);
|
|
1520
|
+
test_conf_set(conf, "fetch.max.bytes", val);
|
|
1521
|
+
|
|
1522
|
+
rkshare = rd_kafka_share_consumer_new(conf, errstr, sizeof(errstr));
|
|
1523
|
+
TEST_ASSERT(rkshare, "Failed to create share consumer: %s", errstr);
|
|
1524
|
+
test_share_set_auto_offset_reset(group, "earliest");
|
|
1525
|
+
test_share_consumer_subscribe_multi(rkshare, 1, topic);
|
|
1526
|
+
|
|
1527
|
+
/* Poll: the small record should arrive; fetching the oversized
|
|
1528
|
+
* batch trips the receive cap and surfaces _BAD_MSG via error_cb. */
|
|
1529
|
+
for (call = 0;
|
|
1530
|
+
call < 40 && rd_atomic32_get(&recv_max_bad_msg_seen) == 0;
|
|
1531
|
+
call++) {
|
|
1532
|
+
error = rd_kafka_share_poll(rkshare, 1000, &batch);
|
|
1533
|
+
if (error) {
|
|
1534
|
+
rd_kafka_error_destroy(error);
|
|
1535
|
+
continue;
|
|
1536
|
+
}
|
|
1537
|
+
if (batch) {
|
|
1538
|
+
small_consumed += (int)rd_kafka_messages_count(batch);
|
|
1539
|
+
rd_kafka_messages_destroy(batch);
|
|
1540
|
+
batch = NULL;
|
|
1541
|
+
}
|
|
1542
|
+
}
|
|
1543
|
+
|
|
1544
|
+
TEST_SAY("small records consumed=%d, _BAD_MSG seen=%d\n",
|
|
1545
|
+
small_consumed, rd_atomic32_get(&recv_max_bad_msg_seen));
|
|
1546
|
+
TEST_ASSERT(small_consumed == 1,
|
|
1547
|
+
"expected the small record to be consumed, got %d",
|
|
1548
|
+
small_consumed);
|
|
1549
|
+
TEST_ASSERT(rd_atomic32_get(&recv_max_bad_msg_seen) >= 1,
|
|
1550
|
+
"expected RD_KAFKA_RESP_ERR__BAD_MSG when a batch exceeds "
|
|
1551
|
+
"receive.message.max.bytes=%d",
|
|
1552
|
+
recv_max);
|
|
1553
|
+
|
|
1554
|
+
test_share_consumer_close(rkshare);
|
|
1555
|
+
test_share_destroy(rkshare);
|
|
1556
|
+
test_curr->is_fatal_cb = NULL;
|
|
1557
|
+
}
|
|
1558
|
+
|
|
1559
|
+
|
|
1560
|
+
/**
|
|
1561
|
+
* @brief `internal.termination.signal` makes librdkafka signal its internal
|
|
1562
|
+
* threads on destroy so they break out of blocking syscalls quickly.
|
|
1563
|
+
* This is generic thread-lifecycle plumbing (not share-specific), but
|
|
1564
|
+
* verify a share consumer with the signal configured constructs,
|
|
1565
|
+
* runs, and closes/destroys cleanly (no hang or crash on the
|
|
1566
|
+
* signal-driven teardown path).
|
|
1567
|
+
*
|
|
1568
|
+
* The signal must be handled (or ignored) by the application; we set it to
|
|
1569
|
+
* SIG_IGN here as the test framework does for its own clients. Skipped on
|
|
1570
|
+
* platforms without SIGIO.
|
|
1571
|
+
*/
|
|
1572
|
+
static void test_internal_termination_signal_destroy(void) {
|
|
1573
|
+
#ifdef SIGIO
|
|
1574
|
+
const char *topic;
|
|
1575
|
+
const char *group = "0180-term-signal";
|
|
1576
|
+
rd_kafka_conf_t *conf;
|
|
1577
|
+
rd_kafka_t *producer;
|
|
1578
|
+
rd_kafka_share_t *rkshare;
|
|
1579
|
+
rd_kafka_messages_t *batch = NULL;
|
|
1580
|
+
char errstr[512];
|
|
1581
|
+
char sigbuf[32];
|
|
1582
|
+
int i;
|
|
1583
|
+
|
|
1584
|
+
SUB_TEST();
|
|
1585
|
+
|
|
1586
|
+
producer = create_no_linger_producer();
|
|
1587
|
+
topic = test_mk_topic_name("0180-term-signal", 1);
|
|
1588
|
+
test_create_topic_wait_exists(NULL, topic, 1, -1, 60 * 1000);
|
|
1589
|
+
produce_one_per_batch(producer, topic, 5, 100);
|
|
1590
|
+
rd_kafka_destroy(producer);
|
|
1591
|
+
|
|
1592
|
+
test_conf_init(&conf, NULL, 60);
|
|
1593
|
+
test_conf_set(conf, "group.id", group);
|
|
1594
|
+
/* Explicitly configure the termination signal (test_conf_init also
|
|
1595
|
+
* sets it, but make the intent of this test self-evident). */
|
|
1596
|
+
rd_snprintf(sigbuf, sizeof(sigbuf), "%d", SIGIO);
|
|
1597
|
+
test_conf_set(conf, "internal.termination.signal", sigbuf);
|
|
1598
|
+
signal(SIGIO, SIG_IGN);
|
|
1599
|
+
|
|
1600
|
+
rkshare = rd_kafka_share_consumer_new(conf, errstr, sizeof(errstr));
|
|
1601
|
+
TEST_ASSERT(rkshare, "Failed to create share consumer: %s", errstr);
|
|
1602
|
+
test_share_set_auto_offset_reset(group, "earliest");
|
|
1603
|
+
test_share_consumer_subscribe_multi(rkshare, 1, topic);
|
|
1604
|
+
|
|
1605
|
+
/* Poll a few times so the internal threads are connected and
|
|
1606
|
+
* running (blocked in syscalls) when we tear down -- this is the
|
|
1607
|
+
* case the termination signal is meant to short-circuit. */
|
|
1608
|
+
for (i = 0; i < 5; i++) {
|
|
1609
|
+
rd_kafka_error_t *error =
|
|
1610
|
+
rd_kafka_share_poll(rkshare, 1000, &batch);
|
|
1611
|
+
if (error)
|
|
1612
|
+
rd_kafka_error_destroy(error);
|
|
1613
|
+
if (batch) {
|
|
1614
|
+
rd_kafka_messages_destroy(batch);
|
|
1615
|
+
batch = NULL;
|
|
1616
|
+
}
|
|
1617
|
+
}
|
|
1618
|
+
|
|
1619
|
+
/* The actual assertion is that these complete without hanging or
|
|
1620
|
+
* crashing on the signal-driven teardown path. */
|
|
1621
|
+
test_share_consumer_close(rkshare);
|
|
1622
|
+
test_share_destroy(rkshare);
|
|
1623
|
+
|
|
1624
|
+
SUB_TEST_PASS();
|
|
1625
|
+
#else
|
|
1626
|
+
SUB_TEST_SKIP("SIGIO not available on this platform\n");
|
|
1627
|
+
#endif
|
|
1628
|
+
}
|
|
1629
|
+
|
|
1630
|
+
|
|
1631
|
+
/* Behavioural tests that require a real broker. */
|
|
1632
|
+
int main_0180_share_consumer_config(int argc, char **argv) {
|
|
1633
|
+
test_timeout_set(120);
|
|
1634
|
+
test_max_poll_records_caps_batch_at_5();
|
|
1635
|
+
test_max_poll_records_allows_full_drain_at_10();
|
|
1636
|
+
test_fetch_max_bytes_one_is_soft_limit();
|
|
1637
|
+
test_fetch_min_bytes_zero_drains_all();
|
|
1638
|
+
test_fetch_min_bytes_max_drains_all();
|
|
1639
|
+
test_fetch_max_bytes_zero_returns_no_records();
|
|
1640
|
+
test_receive_message_max_bytes_is_honored();
|
|
1641
|
+
test_internal_termination_signal_destroy();
|
|
1642
|
+
test_share_consumer_fetch_conn_idle_after_drain();
|
|
1643
|
+
return 0;
|
|
1644
|
+
}
|
|
1645
|
+
|
|
1646
|
+
|
|
1647
|
+
/* Construction-time conf-rejection tests; no broker required. */
|
|
1648
|
+
int main_0180_share_consumer_config_local(int argc, char **argv) {
|
|
1649
|
+
test_rebalance_cb_rejected_at_construction();
|
|
1650
|
+
test_event_rebalance_rejected_at_construction();
|
|
1651
|
+
test_offset_commit_cb_rejected_at_construction();
|
|
1652
|
+
test_consume_cb_rejected_at_construction();
|
|
1653
|
+
test_interceptors_rejected_for_share_consumer();
|
|
1654
|
+
test_enable_auto_commit_rejected_at_construction();
|
|
1655
|
+
test_group_protocol_rejected_at_construction();
|
|
1656
|
+
test_socket_max_fails_rejected_at_construction();
|
|
1657
|
+
test_auto_offset_reset_rejected_at_construction();
|
|
1658
|
+
test_consume_callback_max_messages_rejected_at_construction();
|
|
1659
|
+
test_session_timeout_ms_rejected_at_construction();
|
|
1660
|
+
test_partition_assignment_strategy_rejected_at_construction();
|
|
1661
|
+
test_group_protocol_type_rejected_at_construction();
|
|
1662
|
+
test_heartbeat_interval_ms_rejected_at_construction();
|
|
1663
|
+
test_group_instance_id_rejected_at_construction();
|
|
1664
|
+
test_isolation_level_rejected_at_construction();
|
|
1665
|
+
test_group_remote_assignor_rejected_at_construction();
|
|
1666
|
+
test_queued_min_messages_rejected_at_construction();
|
|
1667
|
+
test_queued_max_messages_kbytes_rejected_at_construction();
|
|
1668
|
+
test_fetch_queue_backoff_ms_rejected_at_construction();
|
|
1669
|
+
test_fetch_error_backoff_ms_rejected_at_construction();
|
|
1670
|
+
test_enable_partition_eof_rejected_at_construction();
|
|
1671
|
+
test_message_copy_max_bytes_rejected_at_construction();
|
|
1672
|
+
test_topic_blacklist_rejected_at_construction();
|
|
1673
|
+
test_receive_message_max_bytes_below_floor_rejected_at_construction();
|
|
1674
|
+
test_fetch_min_bytes_regular_consumer_range_rejected();
|
|
1675
|
+
test_reconnect_backoff_max_below_min_rejected_at_construction();
|
|
1676
|
+
return 0;
|
|
1677
|
+
}
|