@platformatic/rdkafka 4.0.1 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (294) hide show
  1. package/README.md +5 -5
  2. package/bench/seed.sh +0 -0
  3. package/binding.gyp +8 -1
  4. package/ci/prepublish.js +0 -1
  5. package/config.d.ts +126 -10
  6. package/configure +0 -0
  7. package/deps/librdkafka/.semaphore/run-all-tests.yml +77 -0
  8. package/deps/librdkafka/.semaphore/semaphore-integration.yml +250 -0
  9. package/deps/librdkafka/.semaphore/semaphore.yml +67 -44
  10. package/deps/librdkafka/.semaphore/verify-linux-packages.yml +41 -0
  11. package/deps/librdkafka/CHANGELOG.md +471 -1
  12. package/deps/librdkafka/CONFIGURATION.md +29 -9
  13. package/deps/librdkafka/INTRODUCTION.md +909 -601
  14. package/deps/librdkafka/LICENSES.txt +592 -1
  15. package/deps/librdkafka/Makefile +2 -1
  16. package/deps/librdkafka/_mkltmpuuWEwa.c +13 -0
  17. package/deps/librdkafka/configure +0 -0
  18. package/deps/librdkafka/debian/rules +0 -0
  19. package/deps/librdkafka/dev-conf.sh +0 -0
  20. package/deps/librdkafka/examples/consumer.c +18 -8
  21. package/deps/librdkafka/examples/describe_consumer_groups.c +25 -6
  22. package/deps/librdkafka/examples/incremental_alter_configs.c +4 -5
  23. package/deps/librdkafka/examples/kafkatest_verifiable_client.cpp +26 -42
  24. package/deps/librdkafka/examples/openssl_engine_example.cpp +3 -4
  25. package/deps/librdkafka/examples/producer.cpp +2 -2
  26. package/deps/librdkafka/examples/user_scram.c +4 -5
  27. package/deps/librdkafka/examples/win_ssl_cert_store.cpp +4 -3
  28. package/deps/librdkafka/lds-gen.py +0 -0
  29. package/deps/librdkafka/mklove/Makefile.base +0 -0
  30. package/deps/librdkafka/packaging/RELEASE.md +8 -0
  31. package/deps/librdkafka/packaging/alpine/build-alpine.sh +0 -0
  32. package/deps/librdkafka/packaging/cp/README.md +4 -1
  33. package/deps/librdkafka/packaging/cp/check_features.c +12 -4
  34. package/deps/librdkafka/packaging/cp/verify-deb.sh +6 -6
  35. package/deps/librdkafka/packaging/cp/verify-packages.sh +52 -31
  36. package/deps/librdkafka/packaging/cp/verify-rpm.sh +6 -13
  37. package/deps/librdkafka/packaging/debian/rules +0 -0
  38. package/deps/librdkafka/packaging/get_version.py +0 -0
  39. package/deps/librdkafka/packaging/homebrew/brew-update-pr.sh +0 -0
  40. package/deps/librdkafka/packaging/mingw-w64/{travis-before-install.sh → export-variables.sh} +0 -7
  41. package/deps/librdkafka/packaging/mingw-w64/semaphoreci-build.sh +1 -1
  42. package/deps/librdkafka/packaging/nuget/artifact.py +0 -0
  43. package/deps/librdkafka/packaging/nuget/cleanup-s3.py +0 -0
  44. package/deps/librdkafka/packaging/nuget/nuget.sh +0 -0
  45. package/deps/librdkafka/packaging/nuget/packaging.py +0 -0
  46. package/deps/librdkafka/packaging/nuget/push-to-nuget.sh +0 -0
  47. package/deps/librdkafka/packaging/nuget/release.py +0 -0
  48. package/deps/librdkafka/packaging/nuget/requirements.txt +3 -3
  49. package/deps/librdkafka/packaging/rpm/mock-on-docker.sh +0 -0
  50. package/deps/librdkafka/packaging/rpm/tests/run-test.sh +0 -0
  51. package/deps/librdkafka/packaging/rpm/tests/test-on-docker.sh +0 -0
  52. package/deps/librdkafka/packaging/tools/build-configurations-checks.sh +3 -1
  53. package/deps/librdkafka/packaging/tools/build-deb-package.sh +0 -0
  54. package/deps/librdkafka/packaging/tools/build-debian.sh +0 -0
  55. package/deps/librdkafka/packaging/tools/build-manylinux.sh +0 -0
  56. package/deps/librdkafka/packaging/tools/build-release-artifacts.sh +0 -0
  57. package/deps/librdkafka/packaging/tools/distro-build.sh +0 -0
  58. package/deps/librdkafka/packaging/tools/gh-release-checksums.py +0 -0
  59. package/deps/librdkafka/packaging/tools/rdutcoverage.sh +0 -0
  60. package/deps/librdkafka/packaging/tools/run-in-docker.sh +28 -0
  61. package/deps/librdkafka/packaging/tools/run-integration-tests.sh +31 -0
  62. package/deps/librdkafka/packaging/tools/run-style-check.sh +4 -0
  63. package/deps/librdkafka/packaging/tools/style-format.sh +6 -5
  64. package/deps/librdkafka/packaging/tools/update_rpcs_max_versions.py +100 -0
  65. package/deps/librdkafka/service.yml +154 -0
  66. package/deps/librdkafka/src/generate_proto.sh +0 -0
  67. package/deps/librdkafka/src/rd.h +145 -2
  68. package/deps/librdkafka/src/rdaddr.h +6 -7
  69. package/deps/librdkafka/src/rdatomic.h +15 -11
  70. package/deps/librdkafka/src/rdavg.h +3 -2
  71. package/deps/librdkafka/src/rdbase64.c +33 -2
  72. package/deps/librdkafka/src/rdbase64.h +2 -0
  73. package/deps/librdkafka/src/rdendian.h +10 -9
  74. package/deps/librdkafka/src/rdhttp.c +418 -100
  75. package/deps/librdkafka/src/rdhttp.h +23 -5
  76. package/deps/librdkafka/src/rdkafka.c +299 -145
  77. package/deps/librdkafka/src/rdkafka.h +89 -6
  78. package/deps/librdkafka/src/rdkafka_admin.c +482 -105
  79. package/deps/librdkafka/src/rdkafka_admin.h +42 -0
  80. package/deps/librdkafka/src/rdkafka_broker.c +463 -312
  81. package/deps/librdkafka/src/rdkafka_broker.h +68 -10
  82. package/deps/librdkafka/src/rdkafka_buf.c +8 -5
  83. package/deps/librdkafka/src/rdkafka_buf.h +4 -3
  84. package/deps/librdkafka/src/rdkafka_cert.c +25 -1
  85. package/deps/librdkafka/src/rdkafka_cert.h +4 -3
  86. package/deps/librdkafka/src/rdkafka_cgrp.c +468 -143
  87. package/deps/librdkafka/src/rdkafka_cgrp.h +36 -2
  88. package/deps/librdkafka/src/rdkafka_conf.c +526 -102
  89. package/deps/librdkafka/src/rdkafka_conf.h +68 -4
  90. package/deps/librdkafka/src/rdkafka_feature.c +472 -35
  91. package/deps/librdkafka/src/rdkafka_feature.h +2 -0
  92. package/deps/librdkafka/src/rdkafka_fetcher.c +22 -2
  93. package/deps/librdkafka/src/rdkafka_fetcher.h +2 -2
  94. package/deps/librdkafka/src/rdkafka_int.h +84 -46
  95. package/deps/librdkafka/src/rdkafka_metadata.c +221 -136
  96. package/deps/librdkafka/src/rdkafka_metadata.h +15 -11
  97. package/deps/librdkafka/src/rdkafka_metadata_cache.c +279 -73
  98. package/deps/librdkafka/src/rdkafka_mock.c +795 -19
  99. package/deps/librdkafka/src/rdkafka_mock.h +119 -0
  100. package/deps/librdkafka/src/rdkafka_mock_cgrp.c +1298 -132
  101. package/deps/librdkafka/src/rdkafka_mock_handlers.c +345 -49
  102. package/deps/librdkafka/src/rdkafka_mock_int.h +180 -61
  103. package/deps/librdkafka/src/rdkafka_msg.c +35 -19
  104. package/deps/librdkafka/src/rdkafka_msg.h +3 -3
  105. package/deps/librdkafka/src/rdkafka_msgset_writer.c +14 -10
  106. package/deps/librdkafka/src/rdkafka_offset.c +33 -5
  107. package/deps/librdkafka/src/rdkafka_op.c +1 -1
  108. package/deps/librdkafka/src/rdkafka_op.h +45 -21
  109. package/deps/librdkafka/src/rdkafka_partition.c +118 -23
  110. package/deps/librdkafka/src/rdkafka_partition.h +16 -7
  111. package/deps/librdkafka/src/rdkafka_proto.h +4 -1
  112. package/deps/librdkafka/src/rdkafka_protocol.h +1 -0
  113. package/deps/librdkafka/src/rdkafka_queue.c +125 -48
  114. package/deps/librdkafka/src/rdkafka_queue.h +19 -0
  115. package/deps/librdkafka/src/rdkafka_range_assignor.c +1 -1
  116. package/deps/librdkafka/src/rdkafka_request.c +336 -64
  117. package/deps/librdkafka/src/rdkafka_request.h +24 -1
  118. package/deps/librdkafka/src/rdkafka_sasl.c +5 -3
  119. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.c +14 -10
  120. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.c +1166 -89
  121. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.h +13 -3
  122. package/deps/librdkafka/src/rdkafka_sasl_plain.c +3 -3
  123. package/deps/librdkafka/src/rdkafka_sasl_scram.c +4 -3
  124. package/deps/librdkafka/src/rdkafka_ssl.c +306 -81
  125. package/deps/librdkafka/src/rdkafka_ssl.h +22 -0
  126. package/deps/librdkafka/src/rdkafka_sticky_assignor.c +4 -0
  127. package/deps/librdkafka/src/rdkafka_telemetry.c +80 -23
  128. package/deps/librdkafka/src/rdkafka_telemetry_encode.c +5 -1
  129. package/deps/librdkafka/src/rdkafka_telemetry_encode.h +20 -20
  130. package/deps/librdkafka/src/rdkafka_topic.c +220 -137
  131. package/deps/librdkafka/src/rdkafka_topic.h +14 -8
  132. package/deps/librdkafka/src/rdkafka_transport.c +59 -47
  133. package/deps/librdkafka/src/rdkafka_transport.h +5 -0
  134. package/deps/librdkafka/src/rdkafka_txnmgr.c +6 -1
  135. package/deps/librdkafka/src/rdmap.c +6 -1
  136. package/deps/librdkafka/src/rdrand.c +11 -1
  137. package/deps/librdkafka/src/rdtime.h +48 -17
  138. package/deps/librdkafka/src/rdunittest.c +42 -25
  139. package/deps/librdkafka/src/rdunittest.h +2 -0
  140. package/deps/librdkafka/src/rdwin32.h +1 -1
  141. package/deps/librdkafka/src/regexp.c +47 -42
  142. package/deps/librdkafka/src/tinycthread_extra.c +45 -21
  143. package/deps/librdkafka/src/tinycthread_extra.h +7 -3
  144. package/deps/librdkafka/src-cpp/rdkafkacpp.h +28 -2
  145. package/deps/librdkafka/tests/0001-multiobj.c +4 -0
  146. package/deps/librdkafka/tests/0004-conf.c +103 -36
  147. package/deps/librdkafka/tests/0009-mock_cluster.c +1 -0
  148. package/deps/librdkafka/tests/0011-produce_batch.c +2 -1
  149. package/deps/librdkafka/tests/0016-client_swname.c +18 -3
  150. package/deps/librdkafka/tests/0017-compression.c +6 -8
  151. package/deps/librdkafka/tests/0018-cgrp_term.c +8 -3
  152. package/deps/librdkafka/tests/0021-rkt_destroy.c +1 -0
  153. package/deps/librdkafka/tests/0022-consume_batch.c +4 -1
  154. package/deps/librdkafka/tests/0026-consume_pause.c +12 -14
  155. package/deps/librdkafka/tests/0028-long_topicnames.c +1 -1
  156. package/deps/librdkafka/tests/0029-assign_offset.c +6 -8
  157. package/deps/librdkafka/tests/0030-offset_commit.c +2 -2
  158. package/deps/librdkafka/tests/0033-regex_subscribe.c +33 -17
  159. package/deps/librdkafka/tests/0034-offset_reset.c +25 -4
  160. package/deps/librdkafka/tests/0036-partial_fetch.c +1 -0
  161. package/deps/librdkafka/tests/0038-performance.c +1 -0
  162. package/deps/librdkafka/tests/0040-io_event.c +11 -5
  163. package/deps/librdkafka/tests/0041-fetch_max_bytes.c +1 -0
  164. package/deps/librdkafka/tests/0044-partition_cnt.c +3 -2
  165. package/deps/librdkafka/tests/0045-subscribe_update.c +284 -20
  166. package/deps/librdkafka/tests/0047-partial_buf_tmout.c +1 -0
  167. package/deps/librdkafka/tests/0048-partitioner.c +1 -1
  168. package/deps/librdkafka/tests/0050-subscribe_adds.c +1 -0
  169. package/deps/librdkafka/tests/0051-assign_adds.c +1 -0
  170. package/deps/librdkafka/tests/0052-msg_timestamps.c +22 -4
  171. package/deps/librdkafka/tests/0053-stats_cb.cpp +12 -20
  172. package/deps/librdkafka/tests/0055-producer_latency.c +176 -3
  173. package/deps/librdkafka/tests/0056-balanced_group_mt.c +6 -2
  174. package/deps/librdkafka/tests/0058-log.cpp +3 -3
  175. package/deps/librdkafka/tests/0059-bsearch.cpp +8 -4
  176. package/deps/librdkafka/tests/0061-consumer_lag.cpp +25 -5
  177. package/deps/librdkafka/tests/0067-empty_topic.cpp +3 -0
  178. package/deps/librdkafka/tests/0068-produce_timeout.c +21 -23
  179. package/deps/librdkafka/tests/0069-consumer_add_parts.c +3 -7
  180. package/deps/librdkafka/tests/0075-retry.c +38 -1
  181. package/deps/librdkafka/tests/0076-produce_retry.c +2 -0
  182. package/deps/librdkafka/tests/0077-compaction.c +8 -2
  183. package/deps/librdkafka/tests/0080-admin_ut.c +34 -4
  184. package/deps/librdkafka/tests/0081-admin.c +455 -155
  185. package/deps/librdkafka/tests/0082-fetch_max_bytes.cpp +4 -0
  186. package/deps/librdkafka/tests/0083-cb_event.c +8 -3
  187. package/deps/librdkafka/tests/0084-destroy_flags.c +14 -18
  188. package/deps/librdkafka/tests/0085-headers.cpp +4 -0
  189. package/deps/librdkafka/tests/0086-purge.c +40 -7
  190. package/deps/librdkafka/tests/0088-produce_metadata_timeout.c +1 -1
  191. package/deps/librdkafka/tests/0089-max_poll_interval.c +12 -7
  192. package/deps/librdkafka/tests/0090-idempotence.c +1 -2
  193. package/deps/librdkafka/tests/0091-max_poll_interval_timeout.c +5 -7
  194. package/deps/librdkafka/tests/0092-mixed_msgver.c +6 -0
  195. package/deps/librdkafka/tests/0093-holb.c +8 -5
  196. package/deps/librdkafka/tests/0094-idempotence_msg_timeout.c +1 -0
  197. package/deps/librdkafka/tests/0097-ssl_verify.cpp +262 -70
  198. package/deps/librdkafka/tests/0098-consumer-txn.cpp +16 -16
  199. package/deps/librdkafka/tests/0099-commit_metadata.c +1 -1
  200. package/deps/librdkafka/tests/0101-fetch-from-follower.cpp +1 -1
  201. package/deps/librdkafka/tests/0102-static_group_rebalance.c +317 -16
  202. package/deps/librdkafka/tests/0103-transactions.c +7 -7
  203. package/deps/librdkafka/tests/0104-fetch_from_follower_mock.c +1 -0
  204. package/deps/librdkafka/tests/0105-transactions_mock.c +18 -11
  205. package/deps/librdkafka/tests/0106-cgrp_sess_timeout.c +35 -14
  206. package/deps/librdkafka/tests/0107-topic_recreate.c +2 -2
  207. package/deps/librdkafka/tests/0109-auto_create_topics.cpp +86 -26
  208. package/deps/librdkafka/tests/0110-batch_size.cpp +1 -2
  209. package/deps/librdkafka/tests/0112-assign_unknown_part.c +3 -14
  210. package/deps/librdkafka/tests/0113-cooperative_rebalance.cpp +248 -104
  211. package/deps/librdkafka/tests/0114-sticky_partitioning.cpp +3 -3
  212. package/deps/librdkafka/tests/0115-producer_auth.cpp +4 -1
  213. package/deps/librdkafka/tests/0116-kafkaconsumer_close.cpp +7 -5
  214. package/deps/librdkafka/tests/0117-mock_errors.c +15 -5
  215. package/deps/librdkafka/tests/0118-commit_rebalance.c +41 -8
  216. package/deps/librdkafka/tests/0119-consumer_auth.cpp +20 -1
  217. package/deps/librdkafka/tests/0120-asymmetric_subscription.c +8 -3
  218. package/deps/librdkafka/tests/0125-immediate_flush.c +1 -1
  219. package/deps/librdkafka/tests/0126-oauthbearer_oidc.c +323 -8
  220. package/deps/librdkafka/tests/0129-fetch_aborted_msgs.c +1 -0
  221. package/deps/librdkafka/tests/0132-strategy_ordering.c +12 -4
  222. package/deps/librdkafka/tests/0133-ssl_keys.c +28 -6
  223. package/deps/librdkafka/tests/0137-barrier_batch_consume.c +24 -14
  224. package/deps/librdkafka/tests/0139-offset_validation_mock.c +510 -2
  225. package/deps/librdkafka/tests/0140-commit_metadata.cpp +1 -1
  226. package/deps/librdkafka/tests/0142-reauthentication.c +37 -17
  227. package/deps/librdkafka/tests/0143-exponential_backoff_mock.c +39 -40
  228. package/deps/librdkafka/tests/0146-metadata_mock.c +76 -15
  229. package/deps/librdkafka/tests/0147-consumer_group_consumer_mock.c +952 -0
  230. package/deps/librdkafka/tests/0148-offset_fetch_commit_error_mock.c +563 -0
  231. package/deps/librdkafka/tests/0149-broker-same-host-port.c +140 -0
  232. package/deps/librdkafka/tests/0150-telemetry_mock.c +9 -6
  233. package/deps/librdkafka/tests/0151-purge-brokers.c +566 -0
  234. package/deps/librdkafka/tests/0152-rebootstrap.c +59 -0
  235. package/deps/librdkafka/tests/0153-memberid.c +128 -0
  236. package/deps/librdkafka/tests/CMakeLists.txt +6 -0
  237. package/deps/librdkafka/tests/LibrdkafkaTestApp.py +34 -9
  238. package/deps/librdkafka/tests/autotest.sh +0 -0
  239. package/deps/librdkafka/tests/broker_version_tests.py +0 -0
  240. package/deps/librdkafka/tests/buildbox.sh +0 -0
  241. package/deps/librdkafka/tests/cleanup-checker-tests.sh +0 -0
  242. package/deps/librdkafka/tests/cluster_testing.py +0 -0
  243. package/deps/librdkafka/tests/delete-test-topics.sh +0 -0
  244. package/deps/librdkafka/tests/fixtures/oauthbearer/jwt_assertion_template.json +10 -0
  245. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.intermediate.p12 +0 -0
  246. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.p12 +0 -0
  247. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.intermediate.pem +72 -0
  248. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.pem +42 -101
  249. package/deps/librdkafka/tests/fixtures/ssl/client2.intermediate.key +46 -0
  250. package/deps/librdkafka/tests/fixtures/ssl/client2.key +41 -29
  251. package/deps/librdkafka/tests/fixtures/ssl/create_keys.sh +112 -37
  252. package/deps/librdkafka/tests/gen-ssl-certs.sh +0 -0
  253. package/deps/librdkafka/tests/interactive_broker_version.py +0 -0
  254. package/deps/librdkafka/tests/java/Makefile +2 -1
  255. package/deps/librdkafka/tests/java/run-class.sh +0 -0
  256. package/deps/librdkafka/tests/lz4_manual_test.sh +0 -0
  257. package/deps/librdkafka/tests/multi-broker-version-test.sh +0 -0
  258. package/deps/librdkafka/tests/parse-refcnt.sh +0 -0
  259. package/deps/librdkafka/tests/performance_plot.py +0 -0
  260. package/deps/librdkafka/tests/requirements.txt +1 -1
  261. package/deps/librdkafka/tests/run-all-tests.sh +79 -0
  262. package/deps/librdkafka/tests/run-consumer-tests.sh +0 -0
  263. package/deps/librdkafka/tests/run-producer-tests.sh +0 -0
  264. package/deps/librdkafka/tests/run-test-batches.py +157 -0
  265. package/deps/librdkafka/tests/run-test.sh +0 -0
  266. package/deps/librdkafka/tests/sasl_test.py +0 -0
  267. package/deps/librdkafka/tests/test.c +478 -18
  268. package/deps/librdkafka/tests/test.h +62 -13
  269. package/deps/librdkafka/tests/testcpp.cpp +6 -1
  270. package/deps/librdkafka/tests/testcpp.h +30 -2
  271. package/deps/librdkafka/tests/testshared.h +16 -2
  272. package/deps/librdkafka/tests/tools/stats/graph.py +0 -0
  273. package/deps/librdkafka/tests/tools/stats/to_csv.py +1 -1
  274. package/deps/librdkafka/tests/trivup/trivup-0.14.0.tar.gz +0 -0
  275. package/deps/librdkafka/tests/until-fail.sh +0 -0
  276. package/deps/librdkafka/tests/xxxx-metadata.cpp +1 -1
  277. package/deps/librdkafka/vcpkg.json +1 -1
  278. package/deps/librdkafka/win32/setup-msys2.ps1 +24 -8
  279. package/deps/librdkafka/win32/setup-vcpkg.ps1 +28 -6
  280. package/deps/librdkafka/win32/tests/tests.vcxproj +6 -0
  281. package/deps/librdkafka/win32/wingetopt.h +5 -4
  282. package/errors.d.ts +27 -1
  283. package/lib/error.js +29 -3
  284. package/make_docs.sh +0 -0
  285. package/package.json +11 -11
  286. package/run_docker.sh +0 -0
  287. package/src/callbacks.cc +6 -9
  288. package/src/callbacks.h +1 -5
  289. package/test/kafka-consumer-worker.js +10 -7
  290. package/test/kafka-consumer.spec.js +32 -21
  291. package/ci/update-version.js +0 -123
  292. package/deps/librdkafka/.semaphore/project.yml +0 -43
  293. package/deps/librdkafka/.semaphore/project_public.yml +0 -20
  294. package/deps/librdkafka/win32/install-openssl.ps1 +0 -33
@@ -30,6 +30,7 @@
30
30
 
31
31
  #include "rdkafka_int.h"
32
32
  #include "rdkafka_feature.h"
33
+ #include "rdunittest.h"
33
34
 
34
35
  #include <stdlib.h>
35
36
 
@@ -74,8 +75,8 @@ static const struct rd_kafka_feature_map {
74
75
  .feature = RD_KAFKA_FEATURE_MSGVER1,
75
76
  .depends =
76
77
  {
77
- {RD_KAFKAP_Produce, 2, 2},
78
- {RD_KAFKAP_Fetch, 2, 2},
78
+ {RD_KAFKAP_Produce, 2, RD_KAFKAP_RPC_VERSION_MAX},
79
+ {RD_KAFKAP_Fetch, 2, RD_KAFKAP_RPC_VERSION_MAX},
79
80
  {-1},
80
81
  },
81
82
  },
@@ -84,8 +85,8 @@ static const struct rd_kafka_feature_map {
84
85
  .feature = RD_KAFKA_FEATURE_MSGVER2,
85
86
  .depends =
86
87
  {
87
- {RD_KAFKAP_Produce, 3, 3},
88
- {RD_KAFKAP_Fetch, 4, 4},
88
+ {RD_KAFKAP_Produce, 3, RD_KAFKAP_RPC_VERSION_MAX},
89
+ {RD_KAFKAP_Fetch, 4, RD_KAFKAP_RPC_VERSION_MAX},
89
90
  {-1},
90
91
  },
91
92
  },
@@ -97,7 +98,7 @@ static const struct rd_kafka_feature_map {
97
98
  .feature = RD_KAFKA_FEATURE_APIVERSION,
98
99
  .depends =
99
100
  {
100
- {RD_KAFKAP_ApiVersion, 0, 0},
101
+ {RD_KAFKAP_ApiVersion, 0, RD_KAFKAP_RPC_VERSION_MAX},
101
102
  {-1},
102
103
  },
103
104
  },
@@ -106,22 +107,34 @@ static const struct rd_kafka_feature_map {
106
107
  .feature = RD_KAFKA_FEATURE_BROKER_GROUP_COORD,
107
108
  .depends =
108
109
  {
109
- {RD_KAFKAP_FindCoordinator, 0, 0},
110
+ {RD_KAFKAP_FindCoordinator, 0, RD_KAFKAP_RPC_VERSION_MAX},
110
111
  {-1},
111
112
  },
112
113
  },
113
114
  {
114
- /* @brief >=0.9.0: Broker-based balanced consumer groups. */
115
+ /* @brief >=0.9.0: Broker-based balanced consumer groups (classic). */
115
116
  .feature = RD_KAFKA_FEATURE_BROKER_BALANCED_CONSUMER,
116
117
  .depends =
117
118
  {
118
- {RD_KAFKAP_FindCoordinator, 0, 0},
119
- {RD_KAFKAP_OffsetCommit, 1, 2},
120
- {RD_KAFKAP_OffsetFetch, 1, 1},
121
- {RD_KAFKAP_JoinGroup, 0, 0},
122
- {RD_KAFKAP_SyncGroup, 0, 0},
123
- {RD_KAFKAP_Heartbeat, 0, 0},
124
- {RD_KAFKAP_LeaveGroup, 0, 0},
119
+ {RD_KAFKAP_FindCoordinator, 0, RD_KAFKAP_RPC_VERSION_MAX},
120
+ {RD_KAFKAP_OffsetCommit, 1, RD_KAFKAP_RPC_VERSION_MAX},
121
+ {RD_KAFKAP_OffsetFetch, 1, RD_KAFKAP_RPC_VERSION_MAX},
122
+ {RD_KAFKAP_JoinGroup, 0, RD_KAFKAP_RPC_VERSION_MAX},
123
+ {RD_KAFKAP_SyncGroup, 0, RD_KAFKAP_RPC_VERSION_MAX},
124
+ {RD_KAFKAP_Heartbeat, 0, RD_KAFKAP_RPC_VERSION_MAX},
125
+ {RD_KAFKAP_LeaveGroup, 0, RD_KAFKAP_RPC_VERSION_MAX},
126
+ {-1},
127
+ },
128
+ },
129
+ {
130
+ /* @brief Broker-based balanced consumer groups (KIP 848). */
131
+ .feature = RD_KAFKA_FEATURE_BROKER_BALANCED_CONSUMER,
132
+ .depends =
133
+ {
134
+ {RD_KAFKAP_ConsumerGroupHeartbeat, 0,
135
+ RD_KAFKAP_RPC_VERSION_MAX},
136
+ {RD_KAFKAP_OffsetCommit, 9, RD_KAFKAP_RPC_VERSION_MAX},
137
+ {RD_KAFKAP_OffsetFetch, 9, RD_KAFKAP_RPC_VERSION_MAX},
125
138
  {-1},
126
139
  },
127
140
  },
@@ -130,8 +143,8 @@ static const struct rd_kafka_feature_map {
130
143
  .feature = RD_KAFKA_FEATURE_THROTTLETIME,
131
144
  .depends =
132
145
  {
133
- {RD_KAFKAP_Produce, 1, 2},
134
- {RD_KAFKAP_Fetch, 1, 2},
146
+ {RD_KAFKAP_Produce, 1, RD_KAFKAP_RPC_VERSION_MAX},
147
+ {RD_KAFKAP_Fetch, 1, RD_KAFKAP_RPC_VERSION_MAX},
135
148
  {-1},
136
149
  },
137
150
 
@@ -145,7 +158,18 @@ static const struct rd_kafka_feature_map {
145
158
  .feature = RD_KAFKA_FEATURE_SASL_GSSAPI,
146
159
  .depends =
147
160
  {
148
- {RD_KAFKAP_JoinGroup, 0, 0},
161
+ {RD_KAFKAP_JoinGroup, 0, RD_KAFKAP_RPC_VERSION_MAX},
162
+ {-1},
163
+ },
164
+ },
165
+ {
166
+ /* @brief >=0.10.0: SASL (GSSAPI) authentication.
167
+ * Fallback in case JoinGroup is removed along with the
168
+ * "classic" consumer group protocol. */
169
+ .feature = RD_KAFKA_FEATURE_SASL_GSSAPI,
170
+ .depends =
171
+ {
172
+ {RD_KAFKAP_SaslHandshake, 0, RD_KAFKAP_RPC_VERSION_MAX},
149
173
  {-1},
150
174
  },
151
175
  },
@@ -156,7 +180,7 @@ static const struct rd_kafka_feature_map {
156
180
  .feature = RD_KAFKA_FEATURE_SASL_HANDSHAKE,
157
181
  .depends =
158
182
  {
159
- {RD_KAFKAP_SaslHandshake, 0, 0},
183
+ {RD_KAFKAP_SaslHandshake, 0, RD_KAFKAP_RPC_VERSION_MAX},
160
184
  {-1},
161
185
  },
162
186
  },
@@ -170,7 +194,7 @@ static const struct rd_kafka_feature_map {
170
194
  .feature = RD_KAFKA_FEATURE_LZ4,
171
195
  .depends =
172
196
  {
173
- {RD_KAFKAP_FindCoordinator, 0, 0},
197
+ {RD_KAFKAP_FindCoordinator, 0, RD_KAFKAP_RPC_VERSION_MAX},
174
198
  {-1},
175
199
  },
176
200
  },
@@ -179,14 +203,14 @@ static const struct rd_kafka_feature_map {
179
203
  .feature = RD_KAFKA_FEATURE_OFFSET_TIME,
180
204
  .depends =
181
205
  {
182
- {RD_KAFKAP_ListOffsets, 1, 1},
206
+ {RD_KAFKAP_ListOffsets, 1, RD_KAFKAP_RPC_VERSION_MAX},
183
207
  {-1},
184
208
  }},
185
209
  {/* @brief >=0.11.0.0: Idempotent Producer*/
186
210
  .feature = RD_KAFKA_FEATURE_IDEMPOTENT_PRODUCER,
187
211
  .depends =
188
212
  {
189
- {RD_KAFKAP_InitProducerId, 0, 0},
213
+ {RD_KAFKAP_InitProducerId, 0, RD_KAFKAP_RPC_VERSION_MAX},
190
214
  {-1},
191
215
  }},
192
216
  {
@@ -194,8 +218,8 @@ static const struct rd_kafka_feature_map {
194
218
  .feature = RD_KAFKA_FEATURE_ZSTD,
195
219
  .depends =
196
220
  {
197
- {RD_KAFKAP_Produce, 7, 7},
198
- {RD_KAFKAP_Fetch, 10, 10},
221
+ {RD_KAFKAP_Produce, 7, RD_KAFKAP_RPC_VERSION_MAX},
222
+ {RD_KAFKAP_Fetch, 10, RD_KAFKAP_RPC_VERSION_MAX},
199
223
  {-1},
200
224
  },
201
225
  },
@@ -204,8 +228,8 @@ static const struct rd_kafka_feature_map {
204
228
  .feature = RD_KAFKA_FEATURE_SASL_AUTH_REQ,
205
229
  .depends =
206
230
  {
207
- {RD_KAFKAP_SaslHandshake, 1, 1},
208
- {RD_KAFKAP_SaslAuthenticate, 0, 1},
231
+ {RD_KAFKAP_SaslHandshake, 1, RD_KAFKAP_RPC_VERSION_MAX},
232
+ {RD_KAFKAP_SaslAuthenticate, 0, RD_KAFKAP_RPC_VERSION_MAX},
209
233
  {-1},
210
234
  },
211
235
  },
@@ -273,20 +297,20 @@ int rd_kafka_get_legacy_ApiVersions(const char *broker_version,
273
297
  struct rd_kafka_ApiVersion **apisp,
274
298
  size_t *api_cntp,
275
299
  const char *fallback) {
300
+ #define _VERMAP(PFX, APIS) \
301
+ { PFX, APIS, RD_ARRAYSIZE(APIS) }
276
302
  static const struct {
277
303
  const char *pfx;
278
304
  struct rd_kafka_ApiVersion *apis;
279
305
  size_t api_cnt;
280
- } vermap[] = {
281
- #define _VERMAP(PFX, APIS) {PFX, APIS, RD_ARRAYSIZE(APIS)}
282
- _VERMAP("0.9.0", rd_kafka_ApiVersion_0_9_0),
283
- _VERMAP("0.8.2", rd_kafka_ApiVersion_0_8_2),
284
- _VERMAP("0.8.1", rd_kafka_ApiVersion_0_8_1),
285
- _VERMAP("0.8.0", rd_kafka_ApiVersion_0_8_0),
286
- {"0.7.", NULL}, /* Unsupported */
287
- {"0.6.", NULL}, /* Unsupported */
288
- _VERMAP("", rd_kafka_ApiVersion_Queryable),
289
- {NULL}};
306
+ } vermap[] = {_VERMAP("0.9.0", rd_kafka_ApiVersion_0_9_0),
307
+ _VERMAP("0.8.2", rd_kafka_ApiVersion_0_8_2),
308
+ _VERMAP("0.8.1", rd_kafka_ApiVersion_0_8_1),
309
+ _VERMAP("0.8.0", rd_kafka_ApiVersion_0_8_0),
310
+ {"0.7.", NULL}, /* Unsupported */
311
+ {"0.6.", NULL}, /* Unsupported */
312
+ _VERMAP("", rd_kafka_ApiVersion_Queryable),
313
+ {NULL}};
290
314
  int i;
291
315
  int fallback_i = -1;
292
316
  int ret = 0;
@@ -459,3 +483,416 @@ const char *rd_kafka_features2str(int features) {
459
483
 
460
484
  return ret[reti];
461
485
  }
486
+
487
+ int rd_ut_features_check_assert_features(const char *testname,
488
+ int features,
489
+ rd_bool_t all_enabled) {
490
+ int i;
491
+ for (i = 0; rd_kafka_feature_map[i].feature != 0; i++) {
492
+ rd_bool_t enabled =
493
+ (features & rd_kafka_feature_map[i].feature) > 0;
494
+ RD_UT_ASSERT(
495
+ enabled == all_enabled,
496
+ "%s: Feature \"%s\" should %sbe enabled", testname,
497
+ rd_kafka_features2str(rd_kafka_feature_map[i].feature),
498
+ all_enabled ? "" : "not ");
499
+ }
500
+ return 0;
501
+ }
502
+
503
+ int rd_ut_features_check(void) {
504
+ rd_kafka_t rk = RD_ZERO_INIT;
505
+ rd_kafka_broker_t rkb = RD_ZERO_INIT;
506
+ rkb.rkb_rk = &rk;
507
+ int features;
508
+ int fails = 0;
509
+
510
+ /* ApiVersions must be sorted in these structs */
511
+
512
+ /* No ApiVersions for testing matching no feature */
513
+ struct rd_kafka_ApiVersion api_versions_none[] = {0};
514
+
515
+ /* ApiVersions removed in KIP-896 */
516
+ struct rd_kafka_ApiVersion api_versions_kip_896[] = {
517
+ {
518
+ .ApiKey = RD_KAFKAP_Produce,
519
+ .MinVer = 3,
520
+ .MaxVer = 12,
521
+ },
522
+ {
523
+ .ApiKey = RD_KAFKAP_Fetch,
524
+ .MinVer = 4,
525
+ .MaxVer = 17,
526
+ },
527
+ {
528
+ .ApiKey = RD_KAFKAP_ListOffsets,
529
+ .MinVer = 1,
530
+ .MaxVer = 10,
531
+ },
532
+ {
533
+ .ApiKey = RD_KAFKAP_Metadata,
534
+ .MinVer = 0,
535
+ .MaxVer = 13,
536
+ },
537
+ {
538
+ .ApiKey = RD_KAFKAP_OffsetCommit,
539
+ .MinVer = 2,
540
+ .MaxVer = 9,
541
+ },
542
+ {
543
+ .ApiKey = RD_KAFKAP_OffsetFetch,
544
+ .MinVer = 1,
545
+ .MaxVer = 9,
546
+ },
547
+ {
548
+ .ApiKey = RD_KAFKAP_FindCoordinator,
549
+ .MinVer = 0,
550
+ .MaxVer = 6,
551
+ },
552
+ {
553
+ .ApiKey = RD_KAFKAP_JoinGroup,
554
+ .MinVer = 2,
555
+ .MaxVer = 9,
556
+ },
557
+ {
558
+ .ApiKey = RD_KAFKAP_Heartbeat,
559
+ .MinVer = 0,
560
+ .MaxVer = 4,
561
+ },
562
+ {
563
+ .ApiKey = RD_KAFKAP_LeaveGroup,
564
+ .MinVer = 0,
565
+ .MaxVer = 5,
566
+ },
567
+ {
568
+ .ApiKey = RD_KAFKAP_SyncGroup,
569
+ .MinVer = 0,
570
+ .MaxVer = 5,
571
+ },
572
+ {
573
+ .ApiKey = RD_KAFKAP_SaslHandshake,
574
+ .MinVer = 0,
575
+ .MaxVer = 1,
576
+ },
577
+ {
578
+ .ApiKey = RD_KAFKAP_ApiVersion,
579
+ .MinVer = 0,
580
+ .MaxVer = 4,
581
+ },
582
+ {
583
+ .ApiKey = RD_KAFKAP_InitProducerId,
584
+ .MinVer = 0,
585
+ .MaxVer = 5,
586
+ },
587
+ {
588
+ .ApiKey = RD_KAFKAP_SaslAuthenticate,
589
+ .MinVer = 0,
590
+ .MaxVer = 2,
591
+ },
592
+ };
593
+
594
+ /* ApiVersions to remove in next Apache Kafka version
595
+ * (see baseline in KIP-896) */
596
+ struct rd_kafka_ApiVersion api_versions_next_apache_kafka_next[] = {
597
+ {
598
+ .ApiKey = RD_KAFKAP_Produce,
599
+ .MinVer = 7,
600
+ .MaxVer = 12,
601
+ },
602
+ {
603
+ .ApiKey = RD_KAFKAP_Fetch,
604
+ .MinVer = 10,
605
+ .MaxVer = 17,
606
+ },
607
+ {
608
+ .ApiKey = RD_KAFKAP_ListOffsets,
609
+ .MinVer = 4,
610
+ .MaxVer = 10,
611
+ },
612
+ {
613
+ .ApiKey = RD_KAFKAP_Metadata,
614
+ .MinVer = 7,
615
+ .MaxVer = 13,
616
+ },
617
+ {
618
+ .ApiKey = RD_KAFKAP_OffsetCommit,
619
+ .MinVer = 6,
620
+ .MaxVer = 9,
621
+ },
622
+ {
623
+ .ApiKey = RD_KAFKAP_OffsetFetch,
624
+ .MinVer = 5,
625
+ .MaxVer = 9,
626
+ },
627
+ {
628
+ .ApiKey = RD_KAFKAP_FindCoordinator,
629
+ .MinVer = 2,
630
+ .MaxVer = 6,
631
+ },
632
+ {
633
+ .ApiKey = RD_KAFKAP_JoinGroup,
634
+ .MinVer = 3,
635
+ .MaxVer = 9,
636
+ },
637
+ {
638
+ .ApiKey = RD_KAFKAP_Heartbeat,
639
+ .MinVer = 2,
640
+ .MaxVer = 4,
641
+ },
642
+ {
643
+ .ApiKey = RD_KAFKAP_LeaveGroup,
644
+ .MinVer = 2,
645
+ .MaxVer = 5,
646
+ },
647
+ {
648
+ .ApiKey = RD_KAFKAP_SyncGroup,
649
+ .MinVer = 2,
650
+ .MaxVer = 5,
651
+ },
652
+ {
653
+ .ApiKey = RD_KAFKAP_SaslHandshake,
654
+ .MinVer = 1,
655
+ .MaxVer = 1,
656
+ },
657
+ {
658
+ .ApiKey = RD_KAFKAP_ApiVersion,
659
+ .MinVer = 2,
660
+ .MaxVer = 4,
661
+ },
662
+ {
663
+ .ApiKey = RD_KAFKAP_InitProducerId,
664
+ .MinVer = 1,
665
+ .MaxVer = 5,
666
+ },
667
+ {
668
+ .ApiKey = RD_KAFKAP_SaslAuthenticate,
669
+ .MinVer = 0,
670
+ .MaxVer = 2,
671
+ },
672
+ };
673
+
674
+ /* ApiVersions don't overlap with those enabling the feature.
675
+ * At least one condition isn't matching */
676
+ struct rd_kafka_ApiVersion api_versions_no_overlap[] = {
677
+ {
678
+ .ApiKey = RD_KAFKAP_Produce,
679
+ .MinVer = 2,
680
+ .MaxVer = 2,
681
+ },
682
+ {
683
+ .ApiKey = RD_KAFKAP_Fetch,
684
+ .MinVer = 0,
685
+ .MaxVer = 0,
686
+ },
687
+ {
688
+ .ApiKey = RD_KAFKAP_ListOffsets,
689
+ .MinVer = 0,
690
+ .MaxVer = 0,
691
+ },
692
+ {
693
+ .ApiKey = RD_KAFKAP_Metadata,
694
+ .MinVer = 7,
695
+ .MaxVer = 13,
696
+ },
697
+ {
698
+ .ApiKey = RD_KAFKAP_OffsetCommit,
699
+ .MinVer = 6,
700
+ .MaxVer = 9,
701
+ },
702
+ {
703
+ .ApiKey = RD_KAFKAP_OffsetFetch,
704
+ .MinVer = 5,
705
+ .MaxVer = 8,
706
+ },
707
+ {
708
+ .ApiKey = RD_KAFKAP_Heartbeat,
709
+ .MinVer = 2,
710
+ .MaxVer = 4,
711
+ },
712
+ {
713
+ .ApiKey = RD_KAFKAP_LeaveGroup,
714
+ .MinVer = 2,
715
+ .MaxVer = 5,
716
+ },
717
+ {
718
+ .ApiKey = RD_KAFKAP_SyncGroup,
719
+ .MinVer = 2,
720
+ .MaxVer = 5,
721
+ },
722
+ {
723
+ .ApiKey = RD_KAFKAP_SaslAuthenticate,
724
+ .MinVer = 0,
725
+ .MaxVer = 2,
726
+ },
727
+ };
728
+
729
+ /* ApiVersions where the maximum version corresponds to
730
+ * the minimum version necessary for enabling all features. */
731
+ struct rd_kafka_ApiVersion api_versions_overlap_by_one[] = {
732
+ {
733
+ .ApiKey = RD_KAFKAP_Produce,
734
+ .MinVer = 3,
735
+ .MaxVer = 7,
736
+ },
737
+ {
738
+ .ApiKey = RD_KAFKAP_Fetch,
739
+ .MinVer = 4,
740
+ .MaxVer = 10,
741
+ },
742
+ {
743
+ .ApiKey = RD_KAFKAP_ListOffsets,
744
+ .MinVer = 1,
745
+ .MaxVer = 1,
746
+ },
747
+ {
748
+ .ApiKey = RD_KAFKAP_Metadata,
749
+ .MinVer = 0,
750
+ .MaxVer = 13,
751
+ },
752
+ {
753
+ .ApiKey = RD_KAFKAP_OffsetCommit,
754
+ .MinVer = 2,
755
+ .MaxVer = 9,
756
+ },
757
+ {
758
+ .ApiKey = RD_KAFKAP_OffsetFetch,
759
+ .MinVer = 1,
760
+ .MaxVer = 9,
761
+ },
762
+ {
763
+ .ApiKey = RD_KAFKAP_FindCoordinator,
764
+ .MinVer = 0,
765
+ .MaxVer = 0,
766
+ },
767
+ {
768
+ .ApiKey = RD_KAFKAP_JoinGroup,
769
+ .MinVer = 0,
770
+ .MaxVer = 0,
771
+ },
772
+ {
773
+ .ApiKey = RD_KAFKAP_Heartbeat,
774
+ .MinVer = 0,
775
+ .MaxVer = 0,
776
+ },
777
+ {
778
+ .ApiKey = RD_KAFKAP_LeaveGroup,
779
+ .MinVer = 0,
780
+ .MaxVer = 0,
781
+ },
782
+ {
783
+ .ApiKey = RD_KAFKAP_SyncGroup,
784
+ .MinVer = 0,
785
+ .MaxVer = 0,
786
+ },
787
+ {
788
+ .ApiKey = RD_KAFKAP_SaslHandshake,
789
+ .MinVer = 0,
790
+ .MaxVer = 1,
791
+ },
792
+ {
793
+ .ApiKey = RD_KAFKAP_ApiVersion,
794
+ .MinVer = 0,
795
+ .MaxVer = 0,
796
+ },
797
+ {
798
+ .ApiKey = RD_KAFKAP_InitProducerId,
799
+ .MinVer = 0,
800
+ .MaxVer = 0,
801
+ },
802
+ {
803
+ .ApiKey = RD_KAFKAP_SaslAuthenticate,
804
+ .MinVer = 0,
805
+ .MaxVer = 0,
806
+ },
807
+ };
808
+
809
+ /* ApiVersions where the classic way of enabling SASL_GSSAPI
810
+ * or BROKER_BALANCED_CONSUMER was removed. */
811
+ struct rd_kafka_ApiVersion api_versions_kip_848[] = {
812
+ {
813
+ .ApiKey = RD_KAFKAP_OffsetCommit,
814
+ .MinVer = 6,
815
+ .MaxVer = 9,
816
+ },
817
+ {
818
+ .ApiKey = RD_KAFKAP_OffsetFetch,
819
+ .MinVer = 5,
820
+ .MaxVer = 9,
821
+ },
822
+ {
823
+ .ApiKey = RD_KAFKAP_SaslHandshake,
824
+ .MinVer = 0,
825
+ .MaxVer = 1,
826
+ },
827
+ {
828
+ .ApiKey = RD_KAFKAP_ConsumerGroupHeartbeat,
829
+ .MinVer = 0,
830
+ .MaxVer = 1,
831
+ },
832
+ };
833
+
834
+ /* With empty ApiVersions. */
835
+ features = rd_kafka_features_check(&rkb, api_versions_none,
836
+ RD_ARRAY_SIZE(api_versions_none));
837
+ fails += rd_ut_features_check_assert_features("no API versions",
838
+ features, rd_false);
839
+
840
+ /* Without KIP-896 removed versions. */
841
+ features = rd_kafka_features_check(&rkb, api_versions_kip_896,
842
+ RD_ARRAY_SIZE(api_versions_kip_896));
843
+ fails += rd_ut_features_check_assert_features("KIP-896 API versions",
844
+ features, rd_true);
845
+
846
+ /* Without versions to remove in next Apache Kafka major version. */
847
+ features = rd_kafka_features_check(
848
+ &rkb, api_versions_next_apache_kafka_next,
849
+ RD_ARRAY_SIZE(api_versions_next_apache_kafka_next));
850
+ fails += rd_ut_features_check_assert_features(
851
+ "next Apache Kafka API versions", features, rd_true);
852
+
853
+ /* With a RPC version range non overlapping with the one necessary
854
+ * for the feature. */
855
+ features =
856
+ rd_kafka_features_check(&rkb, api_versions_no_overlap,
857
+ RD_ARRAY_SIZE(api_versions_no_overlap));
858
+ fails += rd_ut_features_check_assert_features(
859
+ "not overlapping API versions", features, rd_false);
860
+
861
+ /* Only a single RPC version is overlapping with broker
862
+ * supported ones. */
863
+ features =
864
+ rd_kafka_features_check(&rkb, api_versions_overlap_by_one,
865
+ RD_ARRAY_SIZE(api_versions_overlap_by_one));
866
+ fails += rd_ut_features_check_assert_features(
867
+ "overlapping API versions by one version", features, rd_true);
868
+
869
+ /* Even when removing the classic protocol and its APIs,
870
+ * these features must be enabled. */
871
+ features = rd_kafka_features_check(&rkb, api_versions_kip_848,
872
+ RD_ARRAY_SIZE(api_versions_kip_848));
873
+ if (!(features & RD_KAFKA_FEATURE_BROKER_BALANCED_CONSUMER) ||
874
+ !(features & RD_KAFKA_FEATURE_SASL_GSSAPI)) {
875
+ fails++;
876
+ }
877
+
878
+
879
+ if (fails)
880
+ return fails;
881
+
882
+ RD_UT_PASS();
883
+ }
884
+
885
+ /**
886
+ * @name Unit tests
887
+ * @{
888
+ *
889
+ */
890
+ int unittest_feature(void) {
891
+ int fails = 0;
892
+
893
+ fails += rd_ut_features_check();
894
+
895
+ return fails;
896
+ }
897
+
898
+ /**@}*/
@@ -99,4 +99,6 @@ int rd_kafka_features_check(rd_kafka_broker_t *rkb,
99
99
 
100
100
  const char *rd_kafka_features2str(int features);
101
101
 
102
+ int unittest_feature(void);
103
+
102
104
  #endif /* _RDKAFKA_FEATURE_H_ */
@@ -677,7 +677,7 @@ static rd_kafka_resp_err_t rd_kafka_fetch_reply_handle_partition(
677
677
  * desynchronized clusters): if so ignore it. */
678
678
  tver_skel.rktp = rktp;
679
679
  tver = rd_list_find(request->rkbuf_rktp_vers, &tver_skel,
680
- rd_kafka_toppar_ver_cmp);
680
+ rd_kafka_toppar_ver_cmp);
681
681
  rd_kafka_assert(NULL, tver);
682
682
  if (tver->rktp != rktp || tver->version < fetch_version) {
683
683
  rd_rkb_dbg(rkb, MSG, "DROP",
@@ -1227,7 +1227,7 @@ int rd_kafka_broker_fetch_toppars(rd_kafka_broker_t *rkb, rd_ts_t now) {
1227
1227
  * @locality any
1228
1228
  * @locks toppar_lock() MUST be held
1229
1229
  */
1230
- rd_bool_t rd_kafka_toppar_fetch_decide_start_from_next_fetch_start(
1230
+ static rd_bool_t rd_kafka_toppar_fetch_decide_start_from_next_fetch_start(
1231
1231
  rd_kafka_toppar_t *rktp) {
1232
1232
  return rktp->rktp_op_version > rktp->rktp_fetch_version ||
1233
1233
  rd_kafka_fetch_pos_cmp(&rktp->rktp_next_fetch_start,
@@ -1235,6 +1235,26 @@ rd_bool_t rd_kafka_toppar_fetch_decide_start_from_next_fetch_start(
1235
1235
  rktp->rktp_offsets.fetch_pos.offset == RD_KAFKA_OFFSET_INVALID;
1236
1236
  }
1237
1237
 
1238
+ /**
1239
+ * @brief Return next fetch start position:
1240
+ * if it should start fetching from next fetch start
1241
+ * or continue with current fetch pos.
1242
+ *
1243
+ * @param rktp The toppar
1244
+ *
1245
+ * @returns Next fetch start position
1246
+ *
1247
+ * @locality any
1248
+ * @locks toppar_lock() MUST be held
1249
+ */
1250
+ rd_kafka_fetch_pos_t
1251
+ rd_kafka_toppar_fetch_decide_next_fetch_start_pos(rd_kafka_toppar_t *rktp) {
1252
+ if (rd_kafka_toppar_fetch_decide_start_from_next_fetch_start(rktp))
1253
+ return rktp->rktp_next_fetch_start;
1254
+ else
1255
+ return rktp->rktp_offsets.fetch_pos;
1256
+ }
1257
+
1238
1258
  /**
1239
1259
  * @brief Decide whether this toppar should be on the fetch list or not.
1240
1260
  *
@@ -33,8 +33,8 @@
33
33
 
34
34
  int rd_kafka_broker_fetch_toppars(rd_kafka_broker_t *rkb, rd_ts_t now);
35
35
 
36
- rd_bool_t rd_kafka_toppar_fetch_decide_start_from_next_fetch_start(
37
- rd_kafka_toppar_t *rktp);
36
+ rd_kafka_fetch_pos_t
37
+ rd_kafka_toppar_fetch_decide_next_fetch_start_pos(rd_kafka_toppar_t *rktp);
38
38
 
39
39
  rd_ts_t rd_kafka_toppar_fetch_decide(rd_kafka_toppar_t *rktp,
40
40
  rd_kafka_broker_t *rkb,