@platformatic/rdkafka 4.0.0 → 4.1.0-alpha.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/README.md +5 -5
- package/bench/seed.sh +0 -0
- package/binding.gyp +3 -3
- package/ci/prepublish.js +4 -3
- package/ci/update-version.js +123 -0
- package/config.d.ts +126 -10
- package/configure +0 -0
- package/deps/librdkafka/.semaphore/run-all-tests.yml +77 -0
- package/deps/librdkafka/.semaphore/semaphore-integration.yml +250 -0
- package/deps/librdkafka/.semaphore/semaphore.yml +67 -44
- package/deps/librdkafka/.semaphore/verify-linux-packages.yml +41 -0
- package/deps/librdkafka/CHANGELOG.md +471 -1
- package/deps/librdkafka/CONFIGURATION.md +29 -9
- package/deps/librdkafka/INTRODUCTION.md +909 -601
- package/deps/librdkafka/Makefile +2 -1
- package/deps/librdkafka/configure +0 -0
- package/deps/librdkafka/debian/rules +0 -0
- package/deps/librdkafka/dev-conf.sh +0 -0
- package/deps/librdkafka/examples/consumer.c +18 -8
- package/deps/librdkafka/examples/describe_consumer_groups.c +25 -6
- package/deps/librdkafka/examples/incremental_alter_configs.c +4 -5
- package/deps/librdkafka/examples/kafkatest_verifiable_client.cpp +26 -42
- package/deps/librdkafka/examples/openssl_engine_example.cpp +3 -4
- package/deps/librdkafka/examples/producer.cpp +2 -2
- package/deps/librdkafka/examples/user_scram.c +4 -5
- package/deps/librdkafka/examples/win_ssl_cert_store.cpp +4 -3
- package/deps/librdkafka/lds-gen.py +0 -0
- package/deps/librdkafka/mklove/Makefile.base +0 -0
- package/deps/librdkafka/packaging/RELEASE.md +8 -0
- package/deps/librdkafka/packaging/alpine/build-alpine.sh +0 -0
- package/deps/librdkafka/packaging/cp/README.md +4 -1
- package/deps/librdkafka/packaging/cp/check_features.c +12 -4
- package/deps/librdkafka/packaging/cp/verify-deb.sh +6 -6
- package/deps/librdkafka/packaging/cp/verify-packages.sh +52 -31
- package/deps/librdkafka/packaging/cp/verify-rpm.sh +6 -13
- package/deps/librdkafka/packaging/debian/docs +5 -0
- package/deps/librdkafka/packaging/debian/rules +0 -0
- package/deps/librdkafka/packaging/get_version.py +0 -0
- package/deps/librdkafka/packaging/homebrew/brew-update-pr.sh +0 -0
- package/deps/librdkafka/packaging/mingw-w64/{travis-before-install.sh → export-variables.sh} +0 -7
- package/deps/librdkafka/packaging/mingw-w64/semaphoreci-build.sh +1 -1
- package/deps/librdkafka/packaging/nuget/artifact.py +0 -0
- package/deps/librdkafka/packaging/nuget/cleanup-s3.py +0 -0
- package/deps/librdkafka/packaging/nuget/nuget.sh +0 -0
- package/deps/librdkafka/packaging/nuget/packaging.py +0 -0
- package/deps/librdkafka/packaging/nuget/push-to-nuget.sh +0 -0
- package/deps/librdkafka/packaging/nuget/release.py +0 -0
- package/deps/librdkafka/packaging/nuget/requirements.txt +3 -3
- package/deps/librdkafka/packaging/rpm/mock-on-docker.sh +0 -0
- package/deps/librdkafka/packaging/rpm/tests/run-test.sh +0 -0
- package/deps/librdkafka/packaging/rpm/tests/test-on-docker.sh +0 -0
- package/deps/librdkafka/packaging/tools/build-configurations-checks.sh +3 -1
- package/deps/librdkafka/packaging/tools/build-deb-package.sh +0 -0
- package/deps/librdkafka/packaging/tools/build-debian.sh +0 -0
- package/deps/librdkafka/packaging/tools/build-manylinux.sh +0 -0
- package/deps/librdkafka/packaging/tools/build-release-artifacts.sh +0 -0
- package/deps/librdkafka/packaging/tools/distro-build.sh +0 -0
- package/deps/librdkafka/packaging/tools/gh-release-checksums.py +0 -0
- package/deps/librdkafka/packaging/tools/rdutcoverage.sh +0 -0
- package/deps/librdkafka/packaging/tools/run-in-docker.sh +28 -0
- package/deps/librdkafka/packaging/tools/run-integration-tests.sh +31 -0
- package/deps/librdkafka/packaging/tools/run-style-check.sh +4 -0
- package/deps/librdkafka/packaging/tools/style-format.sh +6 -5
- package/deps/librdkafka/packaging/tools/update_rpcs_max_versions.py +100 -0
- package/deps/librdkafka/service.yml +154 -0
- package/deps/librdkafka/src/generate_proto.sh +0 -0
- package/deps/librdkafka/src/rd.h +145 -2
- package/deps/librdkafka/src/rdaddr.h +6 -7
- package/deps/librdkafka/src/rdatomic.h +15 -11
- package/deps/librdkafka/src/rdavg.h +3 -2
- package/deps/librdkafka/src/rdbase64.c +33 -2
- package/deps/librdkafka/src/rdbase64.h +2 -0
- package/deps/librdkafka/src/rdendian.h +10 -9
- package/deps/librdkafka/src/rdhttp.c +418 -100
- package/deps/librdkafka/src/rdhttp.h +23 -5
- package/deps/librdkafka/src/rdkafka.c +299 -145
- package/deps/librdkafka/src/rdkafka.h +89 -6
- package/deps/librdkafka/src/rdkafka_admin.c +482 -105
- package/deps/librdkafka/src/rdkafka_admin.h +42 -0
- package/deps/librdkafka/src/rdkafka_broker.c +463 -312
- package/deps/librdkafka/src/rdkafka_broker.h +68 -10
- package/deps/librdkafka/src/rdkafka_buf.c +8 -5
- package/deps/librdkafka/src/rdkafka_buf.h +4 -3
- package/deps/librdkafka/src/rdkafka_cert.c +25 -1
- package/deps/librdkafka/src/rdkafka_cert.h +4 -3
- package/deps/librdkafka/src/rdkafka_cgrp.c +468 -143
- package/deps/librdkafka/src/rdkafka_cgrp.h +36 -2
- package/deps/librdkafka/src/rdkafka_conf.c +526 -102
- package/deps/librdkafka/src/rdkafka_conf.h +68 -4
- package/deps/librdkafka/src/rdkafka_feature.c +472 -35
- package/deps/librdkafka/src/rdkafka_feature.h +2 -0
- package/deps/librdkafka/src/rdkafka_fetcher.c +22 -2
- package/deps/librdkafka/src/rdkafka_fetcher.h +2 -2
- package/deps/librdkafka/src/rdkafka_int.h +84 -46
- package/deps/librdkafka/src/rdkafka_metadata.c +221 -136
- package/deps/librdkafka/src/rdkafka_metadata.h +15 -11
- package/deps/librdkafka/src/rdkafka_metadata_cache.c +279 -73
- package/deps/librdkafka/src/rdkafka_mock.c +795 -19
- package/deps/librdkafka/src/rdkafka_mock.h +119 -0
- package/deps/librdkafka/src/rdkafka_mock_cgrp.c +1298 -132
- package/deps/librdkafka/src/rdkafka_mock_handlers.c +345 -49
- package/deps/librdkafka/src/rdkafka_mock_int.h +180 -61
- package/deps/librdkafka/src/rdkafka_msg.c +35 -19
- package/deps/librdkafka/src/rdkafka_msg.h +3 -3
- package/deps/librdkafka/src/rdkafka_msgset_writer.c +14 -10
- package/deps/librdkafka/src/rdkafka_offset.c +33 -5
- package/deps/librdkafka/src/rdkafka_op.c +1 -1
- package/deps/librdkafka/src/rdkafka_op.h +45 -21
- package/deps/librdkafka/src/rdkafka_partition.c +118 -23
- package/deps/librdkafka/src/rdkafka_partition.h +16 -7
- package/deps/librdkafka/src/rdkafka_proto.h +4 -1
- package/deps/librdkafka/src/rdkafka_protocol.h +1 -0
- package/deps/librdkafka/src/rdkafka_queue.c +125 -48
- package/deps/librdkafka/src/rdkafka_queue.h +19 -0
- package/deps/librdkafka/src/rdkafka_range_assignor.c +1 -1
- package/deps/librdkafka/src/rdkafka_request.c +336 -64
- package/deps/librdkafka/src/rdkafka_request.h +24 -1
- package/deps/librdkafka/src/rdkafka_sasl.c +5 -3
- package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.c +14 -10
- package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.c +1166 -89
- package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.h +13 -3
- package/deps/librdkafka/src/rdkafka_sasl_plain.c +3 -3
- package/deps/librdkafka/src/rdkafka_sasl_scram.c +4 -3
- package/deps/librdkafka/src/rdkafka_ssl.c +306 -81
- package/deps/librdkafka/src/rdkafka_ssl.h +22 -0
- package/deps/librdkafka/src/rdkafka_sticky_assignor.c +4 -0
- package/deps/librdkafka/src/rdkafka_telemetry.c +80 -23
- package/deps/librdkafka/src/rdkafka_telemetry_encode.c +5 -1
- package/deps/librdkafka/src/rdkafka_telemetry_encode.h +20 -20
- package/deps/librdkafka/src/rdkafka_topic.c +220 -137
- package/deps/librdkafka/src/rdkafka_topic.h +14 -8
- package/deps/librdkafka/src/rdkafka_transport.c +59 -47
- package/deps/librdkafka/src/rdkafka_transport.h +5 -0
- package/deps/librdkafka/src/rdkafka_txnmgr.c +6 -1
- package/deps/librdkafka/src/rdmap.c +6 -1
- package/deps/librdkafka/src/rdrand.c +11 -1
- package/deps/librdkafka/src/rdtime.h +48 -17
- package/deps/librdkafka/src/rdunittest.c +42 -25
- package/deps/librdkafka/src/rdunittest.h +2 -0
- package/deps/librdkafka/src/rdwin32.h +1 -1
- package/deps/librdkafka/src/regexp.c +47 -42
- package/deps/librdkafka/src/tinycthread_extra.c +45 -21
- package/deps/librdkafka/src/tinycthread_extra.h +7 -3
- package/deps/librdkafka/src-cpp/rdkafkacpp.h +28 -2
- package/deps/librdkafka/tests/0001-multiobj.c +4 -0
- package/deps/librdkafka/tests/0004-conf.c +103 -36
- package/deps/librdkafka/tests/0009-mock_cluster.c +1 -0
- package/deps/librdkafka/tests/0011-produce_batch.c +2 -1
- package/deps/librdkafka/tests/0016-client_swname.c +18 -3
- package/deps/librdkafka/tests/0017-compression.c +6 -8
- package/deps/librdkafka/tests/0018-cgrp_term.c +8 -3
- package/deps/librdkafka/tests/0021-rkt_destroy.c +1 -0
- package/deps/librdkafka/tests/0022-consume_batch.c +4 -1
- package/deps/librdkafka/tests/0026-consume_pause.c +12 -14
- package/deps/librdkafka/tests/0028-long_topicnames.c +1 -1
- package/deps/librdkafka/tests/0029-assign_offset.c +6 -8
- package/deps/librdkafka/tests/0030-offset_commit.c +2 -2
- package/deps/librdkafka/tests/0033-regex_subscribe.c +33 -17
- package/deps/librdkafka/tests/0034-offset_reset.c +25 -4
- package/deps/librdkafka/tests/0036-partial_fetch.c +1 -0
- package/deps/librdkafka/tests/0038-performance.c +1 -0
- package/deps/librdkafka/tests/0040-io_event.c +11 -5
- package/deps/librdkafka/tests/0041-fetch_max_bytes.c +1 -0
- package/deps/librdkafka/tests/0044-partition_cnt.c +3 -2
- package/deps/librdkafka/tests/0045-subscribe_update.c +284 -20
- package/deps/librdkafka/tests/0047-partial_buf_tmout.c +1 -0
- package/deps/librdkafka/tests/0048-partitioner.c +1 -1
- package/deps/librdkafka/tests/0050-subscribe_adds.c +1 -0
- package/deps/librdkafka/tests/0051-assign_adds.c +1 -0
- package/deps/librdkafka/tests/0052-msg_timestamps.c +22 -4
- package/deps/librdkafka/tests/0053-stats_cb.cpp +12 -20
- package/deps/librdkafka/tests/0055-producer_latency.c +176 -3
- package/deps/librdkafka/tests/0056-balanced_group_mt.c +6 -2
- package/deps/librdkafka/tests/0058-log.cpp +3 -3
- package/deps/librdkafka/tests/0059-bsearch.cpp +8 -4
- package/deps/librdkafka/tests/0061-consumer_lag.cpp +25 -5
- package/deps/librdkafka/tests/0067-empty_topic.cpp +3 -0
- package/deps/librdkafka/tests/0068-produce_timeout.c +21 -23
- package/deps/librdkafka/tests/0069-consumer_add_parts.c +3 -7
- package/deps/librdkafka/tests/0075-retry.c +38 -1
- package/deps/librdkafka/tests/0076-produce_retry.c +2 -0
- package/deps/librdkafka/tests/0077-compaction.c +8 -2
- package/deps/librdkafka/tests/0080-admin_ut.c +34 -4
- package/deps/librdkafka/tests/0081-admin.c +455 -155
- package/deps/librdkafka/tests/0082-fetch_max_bytes.cpp +4 -0
- package/deps/librdkafka/tests/0083-cb_event.c +8 -3
- package/deps/librdkafka/tests/0084-destroy_flags.c +14 -18
- package/deps/librdkafka/tests/0085-headers.cpp +4 -0
- package/deps/librdkafka/tests/0086-purge.c +40 -7
- package/deps/librdkafka/tests/0088-produce_metadata_timeout.c +1 -1
- package/deps/librdkafka/tests/0089-max_poll_interval.c +12 -7
- package/deps/librdkafka/tests/0090-idempotence.c +1 -2
- package/deps/librdkafka/tests/0091-max_poll_interval_timeout.c +5 -7
- package/deps/librdkafka/tests/0092-mixed_msgver.c +6 -0
- package/deps/librdkafka/tests/0093-holb.c +8 -5
- package/deps/librdkafka/tests/0094-idempotence_msg_timeout.c +1 -0
- package/deps/librdkafka/tests/0097-ssl_verify.cpp +262 -70
- package/deps/librdkafka/tests/0098-consumer-txn.cpp +16 -16
- package/deps/librdkafka/tests/0099-commit_metadata.c +1 -1
- package/deps/librdkafka/tests/0101-fetch-from-follower.cpp +1 -1
- package/deps/librdkafka/tests/0102-static_group_rebalance.c +317 -16
- package/deps/librdkafka/tests/0103-transactions.c +7 -7
- package/deps/librdkafka/tests/0104-fetch_from_follower_mock.c +1 -0
- package/deps/librdkafka/tests/0105-transactions_mock.c +18 -11
- package/deps/librdkafka/tests/0106-cgrp_sess_timeout.c +35 -14
- package/deps/librdkafka/tests/0107-topic_recreate.c +2 -2
- package/deps/librdkafka/tests/0109-auto_create_topics.cpp +86 -26
- package/deps/librdkafka/tests/0110-batch_size.cpp +1 -2
- package/deps/librdkafka/tests/0112-assign_unknown_part.c +3 -14
- package/deps/librdkafka/tests/0113-cooperative_rebalance.cpp +248 -104
- package/deps/librdkafka/tests/0114-sticky_partitioning.cpp +3 -3
- package/deps/librdkafka/tests/0115-producer_auth.cpp +4 -1
- package/deps/librdkafka/tests/0116-kafkaconsumer_close.cpp +7 -5
- package/deps/librdkafka/tests/0117-mock_errors.c +15 -5
- package/deps/librdkafka/tests/0118-commit_rebalance.c +41 -8
- package/deps/librdkafka/tests/0119-consumer_auth.cpp +20 -1
- package/deps/librdkafka/tests/0120-asymmetric_subscription.c +8 -3
- package/deps/librdkafka/tests/0125-immediate_flush.c +1 -1
- package/deps/librdkafka/tests/0126-oauthbearer_oidc.c +323 -8
- package/deps/librdkafka/tests/0129-fetch_aborted_msgs.c +1 -0
- package/deps/librdkafka/tests/0132-strategy_ordering.c +12 -4
- package/deps/librdkafka/tests/0133-ssl_keys.c +28 -6
- package/deps/librdkafka/tests/0137-barrier_batch_consume.c +24 -14
- package/deps/librdkafka/tests/0139-offset_validation_mock.c +510 -2
- package/deps/librdkafka/tests/0140-commit_metadata.cpp +1 -1
- package/deps/librdkafka/tests/0142-reauthentication.c +37 -17
- package/deps/librdkafka/tests/0143-exponential_backoff_mock.c +39 -40
- package/deps/librdkafka/tests/0146-metadata_mock.c +76 -15
- package/deps/librdkafka/tests/0147-consumer_group_consumer_mock.c +952 -0
- package/deps/librdkafka/tests/0148-offset_fetch_commit_error_mock.c +563 -0
- package/deps/librdkafka/tests/0149-broker-same-host-port.c +140 -0
- package/deps/librdkafka/tests/0150-telemetry_mock.c +9 -6
- 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/CMakeLists.txt +6 -0
- package/deps/librdkafka/tests/LibrdkafkaTestApp.py +34 -9
- package/deps/librdkafka/tests/autotest.sh +0 -0
- package/deps/librdkafka/tests/broker_version_tests.py +0 -0
- package/deps/librdkafka/tests/buildbox.sh +0 -0
- package/deps/librdkafka/tests/cleanup-checker-tests.sh +0 -0
- package/deps/librdkafka/tests/cluster_testing.py +0 -0
- package/deps/librdkafka/tests/delete-test-topics.sh +0 -0
- package/deps/librdkafka/tests/fixtures/oauthbearer/jwt_assertion_template.json +10 -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 +42 -101
- package/deps/librdkafka/tests/fixtures/ssl/client2.intermediate.key +46 -0
- package/deps/librdkafka/tests/fixtures/ssl/client2.key +41 -29
- package/deps/librdkafka/tests/fixtures/ssl/create_keys.sh +112 -37
- package/deps/librdkafka/tests/gen-ssl-certs.sh +0 -0
- package/deps/librdkafka/tests/interactive_broker_version.py +0 -0
- package/deps/librdkafka/tests/java/Makefile +2 -1
- package/deps/librdkafka/tests/java/run-class.sh +0 -0
- package/deps/librdkafka/tests/lz4_manual_test.sh +0 -0
- package/deps/librdkafka/tests/multi-broker-version-test.sh +0 -0
- package/deps/librdkafka/tests/parse-refcnt.sh +0 -0
- package/deps/librdkafka/tests/performance_plot.py +0 -0
- package/deps/librdkafka/tests/requirements.txt +1 -1
- package/deps/librdkafka/tests/run-all-tests.sh +79 -0
- package/deps/librdkafka/tests/run-consumer-tests.sh +0 -0
- package/deps/librdkafka/tests/run-producer-tests.sh +0 -0
- package/deps/librdkafka/tests/run-test-batches.py +157 -0
- package/deps/librdkafka/tests/run-test.sh +0 -0
- package/deps/librdkafka/tests/sasl_test.py +0 -0
- package/deps/librdkafka/tests/test.c +478 -18
- package/deps/librdkafka/tests/test.h +62 -13
- package/deps/librdkafka/tests/testcpp.cpp +6 -1
- package/deps/librdkafka/tests/testcpp.h +30 -2
- package/deps/librdkafka/tests/testshared.h +16 -2
- package/deps/librdkafka/tests/tools/stats/graph.py +0 -0
- package/deps/librdkafka/tests/tools/stats/to_csv.py +1 -1
- package/deps/librdkafka/tests/trivup/trivup-0.14.0.tar.gz +0 -0
- package/deps/librdkafka/tests/until-fail.sh +0 -0
- package/deps/librdkafka/tests/xxxx-metadata.cpp +1 -1
- package/deps/librdkafka/vcpkg.json +1 -1
- package/deps/librdkafka/win32/setup-msys2.ps1 +24 -8
- package/deps/librdkafka/win32/setup-vcpkg.ps1 +28 -6
- package/deps/librdkafka/win32/tests/tests.vcxproj +6 -0
- package/deps/librdkafka/win32/wingetopt.h +5 -4
- package/errors.d.ts +27 -1
- package/lib/error.js +29 -3
- package/make_docs.sh +0 -0
- package/package.json +12 -13
- package/run_docker.sh +0 -0
- package/src/callbacks.cc +6 -9
- package/src/callbacks.h +1 -5
- package/test/kafka-consumer-worker.js +10 -7
- package/test/kafka-consumer.spec.js +32 -21
- package/deps/librdkafka/.semaphore/project.yml +0 -43
- package/deps/librdkafka/.semaphore/project_public.yml +0 -20
- package/deps/librdkafka/win32/install-openssl.ps1 +0 -33
|
@@ -30,6 +30,8 @@
|
|
|
30
30
|
#ifndef _RDKAFKA_MOCK_INT_H_
|
|
31
31
|
#define _RDKAFKA_MOCK_INT_H_
|
|
32
32
|
|
|
33
|
+
#include "rdkafka_request.h"
|
|
34
|
+
|
|
33
35
|
/**
|
|
34
36
|
* @name Mock cluster - internal data types
|
|
35
37
|
*
|
|
@@ -65,33 +67,33 @@ typedef TAILQ_HEAD(rd_kafka_mock_error_stack_head_s,
|
|
|
65
67
|
/**
|
|
66
68
|
* @struct Consumer group protocol name and metadata.
|
|
67
69
|
*/
|
|
68
|
-
typedef struct
|
|
70
|
+
typedef struct rd_kafka_mock_cgrp_classic_proto_s {
|
|
69
71
|
rd_kafkap_str_t *name;
|
|
70
72
|
rd_kafkap_bytes_t *metadata;
|
|
71
|
-
}
|
|
73
|
+
} rd_kafka_mock_cgrp_classic_proto_t;
|
|
72
74
|
|
|
73
75
|
/**
|
|
74
76
|
* @struct Consumer group member
|
|
75
77
|
*/
|
|
76
|
-
typedef struct
|
|
77
|
-
TAILQ_ENTRY(
|
|
78
|
+
typedef struct rd_kafka_mock_cgrp_classic_member_s {
|
|
79
|
+
TAILQ_ENTRY(rd_kafka_mock_cgrp_classic_member_s) link;
|
|
78
80
|
char *id; /**< MemberId */
|
|
79
81
|
char *group_instance_id; /**< Group instance id */
|
|
80
82
|
rd_ts_t ts_last_activity; /**< Last activity, e.g., Heartbeat */
|
|
81
|
-
|
|
82
|
-
int proto_cnt;
|
|
83
|
-
rd_kafkap_bytes_t *assignment;
|
|
83
|
+
rd_kafka_mock_cgrp_classic_proto_t *protos; /**< Protocol names */
|
|
84
|
+
int proto_cnt; /**< Number of protocols */
|
|
85
|
+
rd_kafkap_bytes_t *assignment; /**< Current assignment */
|
|
84
86
|
rd_kafka_buf_t *resp; /**< Current response buffer */
|
|
85
87
|
struct rd_kafka_mock_connection_s *conn; /**< Connection, may be NULL
|
|
86
88
|
* if there is no ongoing
|
|
87
89
|
* request. */
|
|
88
|
-
}
|
|
90
|
+
} rd_kafka_mock_cgrp_classic_member_t;
|
|
89
91
|
|
|
90
92
|
/**
|
|
91
|
-
* @struct
|
|
93
|
+
* @struct Classic consumer group.
|
|
92
94
|
*/
|
|
93
|
-
typedef struct
|
|
94
|
-
TAILQ_ENTRY(
|
|
95
|
+
typedef struct rd_kafka_mock_cgrp_classic_s {
|
|
96
|
+
TAILQ_ENTRY(rd_kafka_mock_cgrp_classic_s) link;
|
|
95
97
|
struct rd_kafka_mock_cluster_s *cluster; /**< Cluster */
|
|
96
98
|
struct rd_kafka_mock_connection_s *conn; /**< Connection */
|
|
97
99
|
char *id; /**< Group Id */
|
|
@@ -99,20 +101,83 @@ typedef struct rd_kafka_mock_cgrp_s {
|
|
|
99
101
|
char *protocol_name; /**< Elected protocol name */
|
|
100
102
|
int32_t generation_id; /**< Generation Id */
|
|
101
103
|
int session_timeout_ms; /**< Session timeout */
|
|
102
|
-
enum {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
104
|
+
enum {
|
|
105
|
+
RD_KAFKA_MOCK_CGRP_STATE_EMPTY, /* No members */
|
|
106
|
+
RD_KAFKA_MOCK_CGRP_STATE_JOINING, /* Members are joining */
|
|
107
|
+
RD_KAFKA_MOCK_CGRP_STATE_SYNCING, /* Syncing assignments */
|
|
108
|
+
RD_KAFKA_MOCK_CGRP_STATE_REBALANCING, /* Rebalance triggered */
|
|
109
|
+
RD_KAFKA_MOCK_CGRP_STATE_UP, /* Group is operational */
|
|
107
110
|
} state; /**< Consumer group state */
|
|
108
111
|
rd_kafka_timer_t session_tmr; /**< Session timeout timer */
|
|
109
112
|
rd_kafka_timer_t rebalance_tmr; /**< Rebalance state timer */
|
|
110
|
-
TAILQ_HEAD(,
|
|
113
|
+
TAILQ_HEAD(, rd_kafka_mock_cgrp_classic_member_s)
|
|
114
|
+
members; /**< Group members */
|
|
111
115
|
int member_cnt; /**< Number of group members */
|
|
112
116
|
int last_member_cnt; /**< Mumber of group members at last election */
|
|
113
117
|
int assignment_cnt; /**< Number of member assignments in last Sync */
|
|
114
|
-
|
|
115
|
-
}
|
|
118
|
+
rd_kafka_mock_cgrp_classic_member_t *leader; /**< Elected leader */
|
|
119
|
+
} rd_kafka_mock_cgrp_classic_t;
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* @struct "Consumer" Consumer group (KIP-848).
|
|
124
|
+
*/
|
|
125
|
+
typedef struct rd_kafka_mock_cgrp_consumer_s {
|
|
126
|
+
TAILQ_ENTRY(rd_kafka_mock_cgrp_consumer_s) link;
|
|
127
|
+
struct rd_kafka_mock_cluster_s *cluster; /**< Cluster */
|
|
128
|
+
char *id; /**< Group Id */
|
|
129
|
+
int32_t group_epoch; /**< Group epoch */
|
|
130
|
+
int session_timeout_ms; /**< Session timeout */
|
|
131
|
+
rd_kafka_timer_t session_tmr; /**< Session timeout timer */
|
|
132
|
+
int heartbeat_interval_ms; /**< Heartbeat interval */
|
|
133
|
+
TAILQ_HEAD(, rd_kafka_mock_cgrp_consumer_member_s)
|
|
134
|
+
members; /**< Group members */
|
|
135
|
+
int member_cnt; /**< Number of group members */
|
|
136
|
+
rd_bool_t manual_assignment; /**< Use manual assignment */
|
|
137
|
+
} rd_kafka_mock_cgrp_consumer_t;
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* @struct "Consumer" Consumer group member (KIP-848).
|
|
142
|
+
*/
|
|
143
|
+
typedef struct rd_kafka_mock_cgrp_consumer_member_s {
|
|
144
|
+
TAILQ_ENTRY(rd_kafka_mock_cgrp_consumer_member_s) link;
|
|
145
|
+
char *id; /**< MemberId */
|
|
146
|
+
char *instance_id; /**< Group instance id */
|
|
147
|
+
rd_ts_t ts_last_activity; /**< Last activity, e.g.,
|
|
148
|
+
* ConsumerGroupHeartbeat */
|
|
149
|
+
int32_t current_member_epoch; /**< Current member epoch,
|
|
150
|
+
* updated only on heartbeat. */
|
|
151
|
+
int32_t
|
|
152
|
+
target_member_epoch; /**< Target member epoch,
|
|
153
|
+
* updated only when calling
|
|
154
|
+
* rd_kafka_mock_cgrp_consumer_target_assignment.
|
|
155
|
+
*/
|
|
156
|
+
rd_kafka_topic_partition_list_t
|
|
157
|
+
*current_assignment; /**< Current assignment,
|
|
158
|
+
* only updated when reported by the client.
|
|
159
|
+
*/
|
|
160
|
+
rd_kafka_topic_partition_list_t *
|
|
161
|
+
target_assignment; /**< Target assignment,
|
|
162
|
+
* only updated when calling
|
|
163
|
+
* rd_kafka_mock_cgrp_consumer_target_assignment.
|
|
164
|
+
*/
|
|
165
|
+
rd_kafka_topic_partition_list_t
|
|
166
|
+
*returned_assignment; /**< Returned assignment */
|
|
167
|
+
|
|
168
|
+
rd_list_t *subscribed_topics; /**< Final list of Subscribed topics after
|
|
169
|
+
considering regex as well*/
|
|
170
|
+
rd_list_t *subscribed_topic_names; /**< Subscribed topic names received
|
|
171
|
+
in the heartbeat */
|
|
172
|
+
char *subscribed_topic_regex; /**< Subscribed regex */
|
|
173
|
+
|
|
174
|
+
rd_bool_t left_static_membership; /**< Member left the group
|
|
175
|
+
* with static membership. */
|
|
176
|
+
struct rd_kafka_mock_connection_s *conn; /**< Connection, may be NULL
|
|
177
|
+
* if there is no ongoing
|
|
178
|
+
* request. */
|
|
179
|
+
rd_kafka_mock_cgrp_consumer_t *mcgrp; /**< Consumer group */
|
|
180
|
+
} rd_kafka_mock_cgrp_consumer_member_t;
|
|
116
181
|
|
|
117
182
|
|
|
118
183
|
/**
|
|
@@ -360,7 +425,9 @@ struct rd_kafka_mock_cluster_s {
|
|
|
360
425
|
TAILQ_HEAD(, rd_kafka_mock_topic_s) topics;
|
|
361
426
|
int topic_cnt;
|
|
362
427
|
|
|
363
|
-
TAILQ_HEAD(,
|
|
428
|
+
TAILQ_HEAD(, rd_kafka_mock_cgrp_classic_s) cgrps_classic;
|
|
429
|
+
|
|
430
|
+
TAILQ_HEAD(, rd_kafka_mock_cgrp_consumer_s) cgrps_consumer;
|
|
364
431
|
|
|
365
432
|
/** Explicit coordinators (set with mock_set_coordinator()) */
|
|
366
433
|
TAILQ_HEAD(, rd_kafka_mock_coord_s) coords;
|
|
@@ -396,13 +463,17 @@ struct rd_kafka_mock_cluster_s {
|
|
|
396
463
|
int replication_factor; /**< Auto topic create repl factor */
|
|
397
464
|
/** Group initial rebalance delay */
|
|
398
465
|
int32_t group_initial_rebalance_delay_ms;
|
|
466
|
+
/** Session timeout (KIP 848) */
|
|
467
|
+
int group_consumer_session_timeout_ms;
|
|
468
|
+
/** Heartbeat interval (KIP 848) */
|
|
469
|
+
int group_consumer_heartbeat_interval_ms;
|
|
399
470
|
} defaults;
|
|
400
471
|
|
|
401
472
|
/**< Dynamic array of IO handlers for corresponding fd in .fds */
|
|
402
473
|
struct {
|
|
403
474
|
rd_kafka_mock_io_handler_t *cb; /**< Callback */
|
|
404
475
|
void *opaque; /**< Callbacks' opaque */
|
|
405
|
-
} *
|
|
476
|
+
} *handlers;
|
|
406
477
|
|
|
407
478
|
/**< Per-protocol request error stack. */
|
|
408
479
|
rd_kafka_mock_error_stack_head_t errstacks;
|
|
@@ -538,47 +609,95 @@ rd_kafka_mock_pid_find(rd_kafka_mock_cluster_t *mcluster,
|
|
|
538
609
|
* @name Mock consumer group (rdkafka_mock_cgrp.c)
|
|
539
610
|
* @{
|
|
540
611
|
*/
|
|
541
|
-
void
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
612
|
+
void rd_kafka_mock_cgrp_classic_member_active(
|
|
613
|
+
rd_kafka_mock_cgrp_classic_t *mcgrp,
|
|
614
|
+
rd_kafka_mock_cgrp_classic_member_t *member);
|
|
615
|
+
void rd_kafka_mock_cgrp_classic_member_assignment_set(
|
|
616
|
+
rd_kafka_mock_cgrp_classic_t *mcgrp,
|
|
617
|
+
rd_kafka_mock_cgrp_classic_member_t *member,
|
|
546
618
|
const rd_kafkap_bytes_t *Metadata);
|
|
547
|
-
rd_kafka_resp_err_t
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
rd_kafka_resp_err_t
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
void
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
619
|
+
rd_kafka_resp_err_t rd_kafka_mock_cgrp_classic_member_sync_set(
|
|
620
|
+
rd_kafka_mock_cgrp_classic_t *mcgrp,
|
|
621
|
+
rd_kafka_mock_cgrp_classic_member_t *member,
|
|
622
|
+
rd_kafka_mock_connection_t *mconn,
|
|
623
|
+
rd_kafka_buf_t *resp);
|
|
624
|
+
rd_kafka_resp_err_t rd_kafka_mock_cgrp_classic_member_leave(
|
|
625
|
+
rd_kafka_mock_cgrp_classic_t *mcgrp,
|
|
626
|
+
rd_kafka_mock_cgrp_classic_member_t *member);
|
|
627
|
+
void rd_kafka_mock_cgrp_classic_protos_destroy(
|
|
628
|
+
rd_kafka_mock_cgrp_classic_proto_t *protos,
|
|
629
|
+
int proto_cnt);
|
|
630
|
+
rd_kafka_resp_err_t rd_kafka_mock_cgrp_classic_member_add(
|
|
631
|
+
rd_kafka_mock_cgrp_classic_t *mcgrp,
|
|
632
|
+
rd_kafka_mock_connection_t *mconn,
|
|
633
|
+
rd_kafka_buf_t *resp,
|
|
634
|
+
const rd_kafkap_str_t *MemberId,
|
|
635
|
+
const rd_kafkap_str_t *GroupInstanceId,
|
|
636
|
+
const rd_kafkap_str_t *ProtocolType,
|
|
637
|
+
rd_kafka_mock_cgrp_classic_proto_t *protos,
|
|
638
|
+
int proto_cnt,
|
|
639
|
+
int session_timeout_ms);
|
|
640
|
+
rd_kafka_resp_err_t rd_kafka_mock_cgrp_classic_check_state(
|
|
641
|
+
rd_kafka_mock_cgrp_classic_t *mcgrp,
|
|
642
|
+
rd_kafka_mock_cgrp_classic_member_t *member,
|
|
643
|
+
const rd_kafka_buf_t *request,
|
|
644
|
+
int32_t generation_id);
|
|
645
|
+
rd_kafka_mock_cgrp_classic_member_t *rd_kafka_mock_cgrp_classic_member_find(
|
|
646
|
+
const rd_kafka_mock_cgrp_classic_t *mcgrp,
|
|
647
|
+
const rd_kafkap_str_t *MemberId);
|
|
648
|
+
void rd_kafka_mock_cgrp_classic_destroy(rd_kafka_mock_cgrp_classic_t *mcgrp);
|
|
649
|
+
rd_kafka_mock_cgrp_classic_t *
|
|
650
|
+
rd_kafka_mock_cgrp_classic_find(rd_kafka_mock_cluster_t *mcluster,
|
|
651
|
+
const rd_kafkap_str_t *GroupId);
|
|
652
|
+
rd_kafka_mock_cgrp_classic_t *
|
|
653
|
+
rd_kafka_mock_cgrp_classic_get(rd_kafka_mock_cluster_t *mcluster,
|
|
654
|
+
const rd_kafkap_str_t *GroupId,
|
|
655
|
+
const rd_kafkap_str_t *ProtocolType);
|
|
656
|
+
|
|
657
|
+
/* "consumer" consumer group (KIP-848) */
|
|
658
|
+
|
|
659
|
+
rd_kafka_topic_partition_list_t *
|
|
660
|
+
rd_kafka_mock_cgrp_consumer_member_next_assignment(
|
|
661
|
+
rd_kafka_mock_cgrp_consumer_member_t *member,
|
|
662
|
+
rd_kafka_topic_partition_list_t *current_assignment,
|
|
663
|
+
int *member_epoch);
|
|
664
|
+
|
|
665
|
+
void rd_kafka_mock_cgrp_consumer_member_active(
|
|
666
|
+
rd_kafka_mock_cgrp_consumer_t *mcgrp,
|
|
667
|
+
rd_kafka_mock_cgrp_consumer_member_t *member);
|
|
668
|
+
|
|
669
|
+
void rd_kafka_mock_cgrp_consumer_destroy(rd_kafka_mock_cgrp_consumer_t *mcgrp);
|
|
670
|
+
|
|
671
|
+
rd_kafka_mock_cgrp_consumer_t *
|
|
672
|
+
rd_kafka_mock_cgrp_consumer_find(const rd_kafka_mock_cluster_t *mcluster,
|
|
673
|
+
const rd_kafkap_str_t *GroupId);
|
|
674
|
+
|
|
675
|
+
rd_kafka_mock_cgrp_consumer_t *
|
|
676
|
+
rd_kafka_mock_cgrp_consumer_get(rd_kafka_mock_cluster_t *mcluster,
|
|
677
|
+
const rd_kafkap_str_t *GroupId);
|
|
678
|
+
|
|
679
|
+
void rd_kafka_mock_cgrp_consumer_member_leave(
|
|
680
|
+
rd_kafka_mock_cgrp_consumer_t *mcgrp,
|
|
681
|
+
rd_kafka_mock_cgrp_consumer_member_t *member,
|
|
682
|
+
rd_bool_t static_leave);
|
|
683
|
+
|
|
684
|
+
void rd_kafka_mock_cgrp_consumer_member_fenced(
|
|
685
|
+
rd_kafka_mock_cgrp_consumer_t *mcgrp,
|
|
686
|
+
rd_kafka_mock_cgrp_consumer_member_t *member);
|
|
687
|
+
|
|
688
|
+
rd_kafka_mock_cgrp_consumer_member_t *rd_kafka_mock_cgrp_consumer_member_find(
|
|
689
|
+
const rd_kafka_mock_cgrp_consumer_t *mcgrp,
|
|
690
|
+
const rd_kafkap_str_t *MemberId);
|
|
691
|
+
|
|
692
|
+
rd_kafka_mock_cgrp_consumer_member_t *rd_kafka_mock_cgrp_consumer_member_add(
|
|
693
|
+
rd_kafka_mock_cgrp_consumer_t *mcgrp,
|
|
694
|
+
struct rd_kafka_mock_connection_s *conn,
|
|
695
|
+
const rd_kafkap_str_t *MemberId,
|
|
696
|
+
const rd_kafkap_str_t *InstanceId,
|
|
697
|
+
rd_kafkap_str_t *SubscribedTopicNames,
|
|
698
|
+
int32_t SubscribedTopicNamesCnt,
|
|
699
|
+
const rd_kafkap_str_t *SubscribedTopicRegex);
|
|
700
|
+
|
|
582
701
|
void rd_kafka_mock_cgrps_connection_closed(rd_kafka_mock_cluster_t *mcluster,
|
|
583
702
|
rd_kafka_mock_connection_t *mconn);
|
|
584
703
|
/**
|
|
@@ -383,6 +383,7 @@ rd_kafka_produceva(rd_kafka_t *rk, const rd_kafka_vu_t *vus, size_t cnt) {
|
|
|
383
383
|
rd_kafka_error_t *error = NULL;
|
|
384
384
|
rd_kafka_headers_t *hdrs = NULL;
|
|
385
385
|
rd_kafka_headers_t *app_hdrs = NULL; /* App-provided headers list */
|
|
386
|
+
int existing = 0;
|
|
386
387
|
size_t i;
|
|
387
388
|
|
|
388
389
|
if (unlikely(rd_kafka_check_produce(rk, &error)))
|
|
@@ -392,8 +393,11 @@ rd_kafka_produceva(rd_kafka_t *rk, const rd_kafka_vu_t *vus, size_t cnt) {
|
|
|
392
393
|
const rd_kafka_vu_t *vu = &vus[i];
|
|
393
394
|
switch (vu->vtype) {
|
|
394
395
|
case RD_KAFKA_VTYPE_TOPIC:
|
|
395
|
-
rkt =
|
|
396
|
-
|
|
396
|
+
rkt = rd_kafka_topic_new0(rk, vu->u.cstr, NULL,
|
|
397
|
+
&existing, 1);
|
|
398
|
+
if (!existing)
|
|
399
|
+
rd_kafka_topic_fast_leader_query(
|
|
400
|
+
rk, rd_true /* force */);
|
|
397
401
|
break;
|
|
398
402
|
|
|
399
403
|
case RD_KAFKA_VTYPE_RKT:
|
|
@@ -487,6 +491,8 @@ rd_kafka_produceva(rd_kafka_t *rk, const rd_kafka_vu_t *vus, size_t cnt) {
|
|
|
487
491
|
rd_kafka_err2str(err));
|
|
488
492
|
goto err;
|
|
489
493
|
}
|
|
494
|
+
/* 'hdrs' is now owned by 'rkm' */
|
|
495
|
+
hdrs = NULL;
|
|
490
496
|
|
|
491
497
|
/* Partition the message */
|
|
492
498
|
err = rd_kafka_msg_partitioner(rkt, rkm, 1);
|
|
@@ -549,6 +555,7 @@ rd_kafka_resp_err_t rd_kafka_producev(rd_kafka_t *rk, ...) {
|
|
|
549
555
|
rd_kafka_resp_err_t err;
|
|
550
556
|
rd_kafka_headers_t *hdrs = NULL;
|
|
551
557
|
rd_kafka_headers_t *app_hdrs = NULL; /* App-provided headers list */
|
|
558
|
+
int existing = 0;
|
|
552
559
|
|
|
553
560
|
if (unlikely((err = rd_kafka_check_produce(rk, NULL))))
|
|
554
561
|
return err;
|
|
@@ -559,7 +566,10 @@ rd_kafka_resp_err_t rd_kafka_producev(rd_kafka_t *rk, ...) {
|
|
|
559
566
|
switch (vtype) {
|
|
560
567
|
case RD_KAFKA_VTYPE_TOPIC:
|
|
561
568
|
rkt = rd_kafka_topic_new0(rk, va_arg(ap, const char *),
|
|
562
|
-
NULL,
|
|
569
|
+
NULL, &existing, 1);
|
|
570
|
+
if (!existing)
|
|
571
|
+
rd_kafka_topic_fast_leader_query(
|
|
572
|
+
rk, rd_true /* force */);
|
|
563
573
|
break;
|
|
564
574
|
|
|
565
575
|
case RD_KAFKA_VTYPE_RKT:
|
|
@@ -2528,22 +2538,28 @@ int unittest_msg(void) {
|
|
|
2528
2538
|
{10, 10},
|
|
2529
2539
|
{33692865, 33692865},
|
|
2530
2540
|
{0, 0}});
|
|
2531
|
-
|
|
2532
|
-
|
|
2533
|
-
|
|
2534
|
-
|
|
2535
|
-
|
|
2536
|
-
|
|
2537
|
-
|
|
2538
|
-
|
|
2539
|
-
|
|
2540
|
-
|
|
2541
|
-
|
|
2542
|
-
|
|
2543
|
-
|
|
2544
|
-
|
|
2545
|
-
|
|
2546
|
-
|
|
2541
|
+
if (rd_unittest_with_valgrind) {
|
|
2542
|
+
RD_UT_WARN(
|
|
2543
|
+
"Skipping large message range test "
|
|
2544
|
+
"when using Valgrind");
|
|
2545
|
+
} else {
|
|
2546
|
+
fails += unittest_msgq_insert_sort(
|
|
2547
|
+
"many messages", insert_baseline, NULL,
|
|
2548
|
+
(const struct ut_msg_range[]) {{100000, 200000},
|
|
2549
|
+
{400000, 450000},
|
|
2550
|
+
{900000, 920000},
|
|
2551
|
+
{33692864, 33751992},
|
|
2552
|
+
{33906868, 33993690},
|
|
2553
|
+
{40000000, 44000000},
|
|
2554
|
+
{0, 0}},
|
|
2555
|
+
(const struct ut_msg_range[]) {{1, 199},
|
|
2556
|
+
{350000, 360000},
|
|
2557
|
+
{500000, 500010},
|
|
2558
|
+
{1000000, 1000200},
|
|
2559
|
+
{33751993, 33906867},
|
|
2560
|
+
{50000001, 50000001},
|
|
2561
|
+
{0, 0}});
|
|
2562
|
+
}
|
|
2547
2563
|
fails += unittest_msgq_insert_sort(
|
|
2548
2564
|
"issue #2508", insert_baseline, NULL,
|
|
2549
2565
|
(const struct ut_msg_range[]) {
|
|
@@ -535,9 +535,9 @@ rd_kafka_msgq_overlap(const rd_kafka_msgq_t *a, const rd_kafka_msgq_t *b) {
|
|
|
535
535
|
la = rd_kafka_msgq_last(a);
|
|
536
536
|
lb = rd_kafka_msgq_last(b);
|
|
537
537
|
|
|
538
|
-
return (
|
|
539
|
-
fa->rkm_u.producer.msgid <= lb->rkm_u.producer.msgid &&
|
|
540
|
-
|
|
538
|
+
return (
|
|
539
|
+
rd_bool_t)(fa->rkm_u.producer.msgid <= lb->rkm_u.producer.msgid &&
|
|
540
|
+
fb->rkm_u.producer.msgid <= la->rkm_u.producer.msgid);
|
|
541
541
|
}
|
|
542
542
|
|
|
543
543
|
/**
|
|
@@ -114,9 +114,9 @@ rd_kafka_msgset_writer_select_MsgVersion(rd_kafka_msgset_writer_t *msetw) {
|
|
|
114
114
|
int feature;
|
|
115
115
|
int16_t ApiVersion;
|
|
116
116
|
} compr_req[RD_KAFKA_COMPRESSION_NUM] = {
|
|
117
|
-
|
|
117
|
+
[RD_KAFKA_COMPRESSION_LZ4] = {RD_KAFKA_FEATURE_LZ4, 0},
|
|
118
118
|
#if WITH_ZSTD
|
|
119
|
-
|
|
119
|
+
[RD_KAFKA_COMPRESSION_ZSTD] = {RD_KAFKA_FEATURE_ZSTD, 7},
|
|
120
120
|
#endif
|
|
121
121
|
};
|
|
122
122
|
|
|
@@ -145,12 +145,16 @@ rd_kafka_msgset_writer_select_MsgVersion(rd_kafka_msgset_writer_t *msetw) {
|
|
|
145
145
|
* by both client and broker, else disable compression.
|
|
146
146
|
*/
|
|
147
147
|
if (msetw->msetw_compression &&
|
|
148
|
-
(
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
148
|
+
(
|
|
149
|
+
/* ApiVersion is smaller than the minimum one */
|
|
150
|
+
!rd_kafka_broker_ApiVersion_at_least(
|
|
151
|
+
rkb, RD_KAFKAP_Produce,
|
|
152
|
+
compr_req[msetw->msetw_compression].ApiVersion) ||
|
|
153
|
+
/* There's a corresponding feature and it isn't supported
|
|
154
|
+
* by this broker. */
|
|
155
|
+
(compr_req[msetw->msetw_compression].feature &&
|
|
156
|
+
!(msetw->msetw_rkb->rkb_features &
|
|
157
|
+
compr_req[msetw->msetw_compression].feature)))) {
|
|
154
158
|
if (unlikely(
|
|
155
159
|
rd_interval(&rkb->rkb_suppress.unsupported_compression,
|
|
156
160
|
/* at most once per day */
|
|
@@ -705,8 +709,8 @@ rd_kafka_msgset_writer_write_msg_v2(rd_kafka_msgset_writer_t *msetw,
|
|
|
705
709
|
sizeof(varint_OffsetDelta), Offset);
|
|
706
710
|
sz_KeyLen = rd_uvarint_enc_i32(varint_KeyLen, sizeof(varint_KeyLen),
|
|
707
711
|
rkm->rkm_key
|
|
708
|
-
|
|
709
|
-
|
|
712
|
+
? (int32_t)rkm->rkm_key_len
|
|
713
|
+
: (int32_t)RD_KAFKAP_BYTES_LEN_NULL);
|
|
710
714
|
sz_ValueLen = rd_uvarint_enc_i32(
|
|
711
715
|
varint_ValueLen, sizeof(varint_ValueLen),
|
|
712
716
|
rkm->rkm_payload ? (int32_t)rkm->rkm_len
|
|
@@ -900,7 +900,21 @@ static void rd_kafka_offset_validate_tmr_cb(rd_kafka_timers_t *rkts,
|
|
|
900
900
|
rd_kafka_toppar_t *rktp = arg;
|
|
901
901
|
|
|
902
902
|
rd_kafka_toppar_lock(rktp);
|
|
903
|
-
|
|
903
|
+
/* Retry validation only when it's still needed.
|
|
904
|
+
* Even if validation can be started in fetch states ACTIVE and
|
|
905
|
+
* VALIDATE_EPOCH_WAIT, its retry should be done only
|
|
906
|
+
* in fetch state VALIDATE_EPOCH_WAIT. */
|
|
907
|
+
if (rktp->rktp_fetch_state == RD_KAFKA_TOPPAR_FETCH_VALIDATE_EPOCH_WAIT)
|
|
908
|
+
rd_kafka_offset_validate(rktp, "retrying offset validation");
|
|
909
|
+
else {
|
|
910
|
+
rd_kafka_dbg(rktp->rktp_rkt->rkt_rk, FETCH, "VALIDATE",
|
|
911
|
+
"%.*s [%" PRId32
|
|
912
|
+
"]: skipping offset "
|
|
913
|
+
"validation retry in fetch state %s",
|
|
914
|
+
RD_KAFKAP_STR_PR(rktp->rktp_rkt->rkt_topic),
|
|
915
|
+
rktp->rktp_partition,
|
|
916
|
+
rd_kafka_fetch_states[rktp->rktp_fetch_state]);
|
|
917
|
+
}
|
|
904
918
|
rd_kafka_toppar_unlock(rktp);
|
|
905
919
|
}
|
|
906
920
|
|
|
@@ -923,6 +937,9 @@ static void rd_kafka_toppar_handle_OffsetForLeaderEpoch(rd_kafka_t *rk,
|
|
|
923
937
|
rd_kafka_topic_partition_t *rktpar;
|
|
924
938
|
int64_t end_offset;
|
|
925
939
|
int32_t end_offset_leader_epoch;
|
|
940
|
+
rd_kafka_toppar_lock(rktp);
|
|
941
|
+
rktp->rktp_flags &= ~RD_KAFKA_TOPPAR_F_VALIDATING;
|
|
942
|
+
rd_kafka_toppar_unlock(rktp);
|
|
926
943
|
|
|
927
944
|
if (err == RD_KAFKA_RESP_ERR__DESTROY) {
|
|
928
945
|
rd_kafka_toppar_destroy(rktp); /* Drop refcnt */
|
|
@@ -1142,12 +1159,10 @@ void rd_kafka_offset_validate(rd_kafka_toppar_t *rktp, const char *fmt, ...) {
|
|
|
1142
1159
|
rd_kafka_dbg(rktp->rktp_rkt->rkt_rk, FETCH, "VALIDATE",
|
|
1143
1160
|
"%.*s [%" PRId32
|
|
1144
1161
|
"]: unable to perform offset "
|
|
1145
|
-
"validation: partition leader not available"
|
|
1162
|
+
"validation: partition leader not available. "
|
|
1163
|
+
"Retrying when available",
|
|
1146
1164
|
RD_KAFKAP_STR_PR(rktp->rktp_rkt->rkt_topic),
|
|
1147
1165
|
rktp->rktp_partition);
|
|
1148
|
-
|
|
1149
|
-
rd_kafka_toppar_set_fetch_state(rktp,
|
|
1150
|
-
RD_KAFKA_TOPPAR_FETCH_ACTIVE);
|
|
1151
1166
|
return;
|
|
1152
1167
|
}
|
|
1153
1168
|
|
|
@@ -1169,8 +1184,21 @@ void rd_kafka_offset_validate(rd_kafka_toppar_t *rktp, const char *fmt, ...) {
|
|
|
1169
1184
|
return;
|
|
1170
1185
|
}
|
|
1171
1186
|
|
|
1187
|
+
if (rktp->rktp_flags & RD_KAFKA_TOPPAR_F_VALIDATING) {
|
|
1188
|
+
rd_kafka_dbg(
|
|
1189
|
+
rktp->rktp_rkt->rkt_rk, FETCH, "VALIDATE",
|
|
1190
|
+
"%.*s [%" PRId32
|
|
1191
|
+
"]: skipping offset "
|
|
1192
|
+
"validation for %s: validation is already ongoing",
|
|
1193
|
+
RD_KAFKAP_STR_PR(rktp->rktp_rkt->rkt_topic),
|
|
1194
|
+
rktp->rktp_partition,
|
|
1195
|
+
rd_kafka_fetch_pos2str(rktp->rktp_offset_validation_pos));
|
|
1196
|
+
return;
|
|
1197
|
+
}
|
|
1198
|
+
|
|
1172
1199
|
rd_kafka_toppar_set_fetch_state(
|
|
1173
1200
|
rktp, RD_KAFKA_TOPPAR_FETCH_VALIDATE_EPOCH_WAIT);
|
|
1201
|
+
rktp->rktp_flags |= RD_KAFKA_TOPPAR_F_VALIDATING;
|
|
1174
1202
|
|
|
1175
1203
|
/* Construct and send OffsetForLeaderEpochRequest */
|
|
1176
1204
|
parts = rd_kafka_topic_partition_list_new(1);
|
|
@@ -228,7 +228,7 @@ rd_kafka_op_t *rd_kafka_op_new0(const char *source, rd_kafka_op_type_t type) {
|
|
|
228
228
|
[RD_KAFKA_OP_PARTITION_JOIN] = _RD_KAFKA_OP_EMPTY,
|
|
229
229
|
[RD_KAFKA_OP_PARTITION_LEAVE] = _RD_KAFKA_OP_EMPTY,
|
|
230
230
|
[RD_KAFKA_OP_REBALANCE] = sizeof(rko->rko_u.rebalance),
|
|
231
|
-
[RD_KAFKA_OP_TERMINATE] =
|
|
231
|
+
[RD_KAFKA_OP_TERMINATE] = sizeof(rko->rko_u.terminated),
|
|
232
232
|
[RD_KAFKA_OP_COORD_QUERY] = _RD_KAFKA_OP_EMPTY,
|
|
233
233
|
[RD_KAFKA_OP_SUBSCRIBE] = sizeof(rko->rko_u.subscribe),
|
|
234
234
|
[RD_KAFKA_OP_ASSIGN] = sizeof(rko->rko_u.assign),
|