@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
@@ -110,6 +110,23 @@ static void test_find_coordinator(rd_kafka_mock_cluster_t *mcluster,
110
110
  SUB_TEST_PASS();
111
111
  }
112
112
 
113
+ /** @brief Max Jitter is 20 percent each side so buffer chosen
114
+ * is +- a fixed error to account for latency delays. */
115
+ static void check_time_difference(int64_t time_difference, int retry_count) {
116
+ int32_t error = retry_ms / 2;
117
+ int64_t low = (1 << retry_count) * retry_ms * 0.8 - error;
118
+ int64_t high = (1 << retry_count) * retry_ms * 1.2 + error;
119
+ if (high > (retry_max_ms * 1.2 + error))
120
+ high = retry_max_ms * 1.2 + error;
121
+ if (low > (retry_max_ms * 0.8 - error))
122
+ low = retry_max_ms * 0.8 - error;
123
+ TEST_ASSERT((time_difference < high) && (time_difference > low),
124
+ "Time difference is not respected, should "
125
+ "be between %" PRId64 " and %" PRId64
126
+ " where time difference is %" PRId64 "\n",
127
+ low, high, time_difference);
128
+ }
129
+
113
130
  /**
114
131
  * Exponential Backoff needs to be checked for the request_type. Also the
115
132
  * request_type should only be retried if one previous has failed for correct
@@ -138,22 +155,7 @@ static void helper_exponential_backoff(rd_kafka_mock_cluster_t *mcluster,
138
155
  (rd_kafka_mock_request_timestamp(requests[i]) -
139
156
  previous_request_ts) /
140
157
  1000;
141
- /* Max Jitter is 20 percent each side so buffer chosen
142
- * is 25 percent to account for latency delays */
143
- int64_t low =
144
- ((1 << retry_count) * (retry_ms)*75) / 100;
145
- int64_t high =
146
- ((1 << retry_count) * (retry_ms)*125) / 100;
147
- if (high > ((retry_max_ms * 125) / 100))
148
- high = (retry_max_ms * 125) / 100;
149
- if (low > ((retry_max_ms * 75) / 100))
150
- low = (retry_max_ms * 75) / 100;
151
- TEST_ASSERT((time_difference < high) &&
152
- (time_difference > low),
153
- "Time difference is not respected, should "
154
- "be between %" PRId64 " and %" PRId64
155
- " where time difference is %" PRId64 "\n",
156
- low, high, time_difference);
158
+ check_time_difference(time_difference, retry_count);
157
159
  retry_count++;
158
160
  }
159
161
  previous_request_ts =
@@ -226,6 +228,7 @@ static void test_produce(rd_kafka_mock_cluster_t *mcluster,
226
228
 
227
229
  producer = test_create_handle(RD_KAFKA_PRODUCER, conf);
228
230
  rkt = test_create_producer_topic(producer, topic, NULL);
231
+ test_wait_topic_exists(producer, topic, 5000);
229
232
 
230
233
  rd_kafka_mock_push_request_errors(
231
234
  mcluster, RD_KAFKAP_Produce, 7,
@@ -304,15 +307,20 @@ static void test_heartbeat_find_coordinator(rd_kafka_mock_cluster_t *mcluster,
304
307
  rd_kafka_conf_t *conf) {
305
308
  rd_kafka_t *consumer;
306
309
  rd_kafka_message_t *rkm;
310
+ int ApiKey;
307
311
  SUB_TEST();
308
312
  test_conf_set(conf, "auto.offset.reset", "earliest");
309
313
  test_conf_set(conf, "enable.auto.commit", "false");
310
314
 
311
315
  consumer = test_create_consumer(topic, NULL, conf, NULL);
312
316
 
317
+ if (test_consumer_group_protocol_classic()) {
318
+ ApiKey = RD_KAFKAP_Heartbeat;
319
+ } else {
320
+ ApiKey = RD_KAFKAP_ConsumerGroupHeartbeat;
321
+ }
313
322
  rd_kafka_mock_push_request_errors(
314
- mcluster, RD_KAFKAP_Heartbeat, 1,
315
- RD_KAFKA_RESP_ERR_NOT_COORDINATOR_FOR_GROUP);
323
+ mcluster, ApiKey, 1, RD_KAFKA_RESP_ERR_NOT_COORDINATOR_FOR_GROUP);
316
324
 
317
325
  rd_kafka_mock_clear_requests(mcluster);
318
326
  test_consumer_subscribe(consumer, topic);
@@ -323,7 +331,7 @@ static void test_heartbeat_find_coordinator(rd_kafka_mock_cluster_t *mcluster,
323
331
  rd_sleep(6);
324
332
 
325
333
 
326
- helper_find_coordinator_trigger(mcluster, RD_KAFKAP_Heartbeat);
334
+ helper_find_coordinator_trigger(mcluster, ApiKey);
327
335
 
328
336
 
329
337
  rd_kafka_destroy(consumer);
@@ -389,6 +397,7 @@ static void test_produce_fast_leader_query(rd_kafka_mock_cluster_t *mcluster,
389
397
 
390
398
  producer = test_create_handle(RD_KAFKA_PRODUCER, conf);
391
399
  rkt = test_create_producer_topic(producer, topic, NULL);
400
+ test_wait_topic_exists(producer, topic, 5000);
392
401
 
393
402
  rd_kafka_mock_push_request_errors(
394
403
  mcluster, RD_KAFKAP_Produce, 1,
@@ -418,24 +427,8 @@ static void test_produce_fast_leader_query(rd_kafka_mock_cluster_t *mcluster,
418
427
  requests[i]) -
419
428
  previous_request_ts) /
420
429
  1000;
421
- /* Max Jitter is 20 percent each side so buffer
422
- * chosen is 25 percent to account for latency
423
- * delays */
424
- int64_t low =
425
- ((1 << retry_count) * (retry_ms)*75) / 100;
426
- int64_t high =
427
- ((1 << retry_count) * (retry_ms)*125) / 100;
428
- if (high > ((retry_max_ms * 125) / 100))
429
- high = (retry_max_ms * 125) / 100;
430
- if (low > ((retry_max_ms * 75) / 100))
431
- low = (retry_max_ms * 75) / 100;
432
- TEST_ASSERT(
433
- (time_difference < high) &&
434
- (time_difference > low),
435
- "Time difference is not respected, should "
436
- "be between %" PRId64 " and %" PRId64
437
- " where time difference is %" PRId64 "\n",
438
- low, high, time_difference);
430
+ check_time_difference(time_difference,
431
+ retry_count);
439
432
  retry_count++;
440
433
  }
441
434
  previous_request_ts =
@@ -500,7 +493,8 @@ static void test_fetch_fast_leader_query(rd_kafka_mock_cluster_t *mcluster,
500
493
  previous_request_was_Fetch) {
501
494
  Metadata_after_Fetch = rd_true;
502
495
  break;
503
- } else
496
+ } else if (rd_kafka_mock_request_api_key(requests[i]) !=
497
+ RD_KAFKAP_ConsumerGroupHeartbeat)
504
498
  previous_request_was_Fetch = rd_false;
505
499
  }
506
500
  rd_kafka_destroy(consumer);
@@ -542,11 +536,16 @@ int main_0143_exponential_backoff_mock(int argc, char **argv) {
542
536
  test_offset_commit(mcluster, topic, rd_kafka_conf_dup(conf));
543
537
  test_heartbeat_find_coordinator(mcluster, topic,
544
538
  rd_kafka_conf_dup(conf));
545
- test_joingroup_find_coordinator(mcluster, topic,
546
- rd_kafka_conf_dup(conf));
547
539
  test_fetch_fast_leader_query(mcluster, topic, rd_kafka_conf_dup(conf));
548
540
  test_produce_fast_leader_query(mcluster, topic,
549
541
  rd_kafka_conf_dup(conf));
542
+
543
+ /* No JoinGroup RPC in KIP 848 protocol. */
544
+ if (test_consumer_group_protocol_classic()) {
545
+ test_joingroup_find_coordinator(mcluster, topic,
546
+ rd_kafka_conf_dup(conf));
547
+ }
548
+
550
549
  test_mock_cluster_destroy(mcluster);
551
550
  rd_kafka_conf_destroy(conf);
552
551
  return 0;
@@ -104,19 +104,41 @@ static void do_test_metadata_persists_in_cache(const char *assignor) {
104
104
  }
105
105
 
106
106
  /**
107
- * @brief No loop of metadata requests should be started
108
- * when a metadata request is made without leader epoch change.
109
- * See issue #4577
107
+ * @brief Tests about the fast metadata refresh feature.
108
+ *
109
+ * - variation 0: no loop of metadata requests should be started
110
+ * when a metadata request is made without leader epoch change.
111
+ * It's expected it stops after the first request.
112
+ * See issue #4577
113
+ *
114
+ * - variation 1: an error is returned on subsequent metadata response too,
115
+ * metadata refreshes continue every second until the error is cleared.
116
+ *
117
+ * It's expected that the temporary error doesn't remove the topic from cache,
118
+ * produce requests aren't blocked from metadata errors and no error is
119
+ * to be surfaced to the application.
110
120
  */
111
- static void do_test_fast_metadata_refresh_stops(void) {
121
+ static void do_test_fast_metadata_refresh(int variation) {
112
122
  rd_kafka_t *rk;
113
123
  const char *bootstraps;
114
124
  rd_kafka_mock_cluster_t *mcluster;
115
125
  const char *topic = test_mk_topic_name(__FUNCTION__, 1);
116
126
  rd_kafka_conf_t *conf;
117
127
  int metadata_requests;
128
+ int expected_metadata_requests;
129
+ switch (variation) {
130
+ case 0:
131
+ expected_metadata_requests = 2;
132
+ break;
133
+ case 1:
134
+ expected_metadata_requests = 7;
135
+ break;
136
+ default:
137
+ TEST_FAIL("Invalid variation %d", variation);
138
+ break;
139
+ }
118
140
 
119
- SUB_TEST_QUICK();
141
+ SUB_TEST_QUICK("%s", variation == 0 ? "stops" : "retries");
120
142
 
121
143
  mcluster = test_mock_cluster_new(3, &bootstraps);
122
144
  rd_kafka_mock_topic_create(mcluster, topic, 1, 1);
@@ -127,22 +149,51 @@ static void do_test_fast_metadata_refresh_stops(void) {
127
149
 
128
150
  rk = test_create_handle(RD_KAFKA_PRODUCER, conf);
129
151
 
152
+ rd_kafka_mock_start_request_tracking(mcluster);
153
+
154
+ if (variation == 1) {
155
+ /* Produce some messages to the topic
156
+ * and keep metadata in cache. */
157
+ test_produce_msgs2(rk, topic, 0, 0, 0, 3, NULL, 5);
158
+ }
159
+
130
160
  /* This error triggers a metadata refresh but no leader change
131
161
  * happened */
132
162
  rd_kafka_mock_push_request_errors(
133
163
  mcluster, RD_KAFKAP_Produce, 1,
134
164
  RD_KAFKA_RESP_ERR_KAFKA_STORAGE_ERROR);
135
165
 
136
- rd_kafka_mock_start_request_tracking(mcluster);
137
- test_produce_msgs2(rk, topic, 0, 0, 0, 1, NULL, 5);
166
+ if (variation == 1) {
167
+ rd_kafka_mock_topic_set_error(
168
+ mcluster, topic, RD_KAFKA_RESP_ERR_KAFKA_STORAGE_ERROR);
169
+ }
170
+
171
+ test_produce_msgs2(rk, topic, 0, 0, 0, 3, NULL, 5);
172
+
173
+ /* Wait some time for seeing the retries */
174
+ rd_sleep(3);
175
+
176
+ if (variation == 1) {
177
+ /* Clear topic error to stop the retries */
178
+ rd_kafka_mock_topic_set_error(mcluster, topic,
179
+ RD_KAFKA_RESP_ERR_NO_ERROR);
180
+ }
138
181
 
139
182
  /* First call is for getting initial metadata,
140
183
  * second one happens after the error,
141
- * it should stop refreshing metadata after that. */
184
+ * it should stop refreshing metadata after that.
185
+ *
186
+ * There can be an additional metadata request originating from
187
+ * the 1s timer when the partition is being delegated or
188
+ * the broker is connecting but still not up. */
142
189
  metadata_requests = test_mock_wait_matching_requests(
143
- mcluster, 2, 500, is_metadata_request, NULL);
144
- TEST_ASSERT(metadata_requests == 2,
145
- "Expected 2 metadata request, got %d", metadata_requests);
190
+ mcluster, expected_metadata_requests, 500, is_metadata_request,
191
+ NULL);
192
+ TEST_ASSERT(expected_metadata_requests <= metadata_requests &&
193
+ metadata_requests <= expected_metadata_requests + 1,
194
+ "Expected %d or %d metadata request, got %d",
195
+ expected_metadata_requests, expected_metadata_requests + 1,
196
+ metadata_requests);
146
197
  rd_kafka_mock_stop_request_tracking(mcluster);
147
198
 
148
199
  rd_kafka_destroy(rk);
@@ -344,8 +395,16 @@ static void do_test_metadata_update_operation(rd_bool_t producer,
344
395
  test_produce_msgs2(rk, topic, 0, 1, 0, 1, NULL, 0);
345
396
  rd_kafka_flush(rk, 1000);
346
397
  } else {
398
+ test_produce_msgs_easy_v(topic, 0, 0, 0, 1, 0,
399
+ "bootstrap.servers", bootstraps, NULL);
400
+ test_produce_msgs_easy_v(topic, 0, 1, 0, 1, 0,
401
+ "bootstrap.servers", bootstraps, NULL);
402
+
347
403
  rd_kafka_topic_partition_list_t *assignment;
348
404
  test_conf_set(conf, "group.id", topic);
405
+ test_conf_set(conf, "fetch.wait.max.ms", "100");
406
+ test_conf_set(conf, "auto.offset.reset", "earliest");
407
+
349
408
  rk = test_create_handle(RD_KAFKA_CONSUMER, conf);
350
409
 
351
410
  assignment = rd_kafka_topic_partition_list_new(1);
@@ -355,7 +414,8 @@ static void do_test_metadata_update_operation(rd_bool_t producer,
355
414
  rd_kafka_topic_partition_list_destroy(assignment);
356
415
 
357
416
  /* Start consuming from leader 1 and 2 */
358
- test_consumer_poll_no_msgs("no errors", rk, 0, 1000);
417
+ test_consumer_poll_timeout("initial leaders", rk, 0, -1, -1, 2,
418
+ NULL, 5000);
359
419
  }
360
420
 
361
421
  TIMING_START(&timing, "Metadata update and partition migration");
@@ -377,10 +437,10 @@ static void do_test_metadata_update_operation(rd_bool_t producer,
377
437
  "bootstrap.servers", bootstraps, NULL);
378
438
  test_produce_msgs_easy_v(topic, 0, 1, 0, 1, 0,
379
439
  "bootstrap.servers", bootstraps, NULL);
380
- test_consumer_poll_timeout("partition 0", rk, 0, -1, -1, 2,
440
+ test_consumer_poll_timeout("changed leaders", rk, 0, -1, -1, 2,
381
441
  NULL, 5000);
382
442
  }
383
- TIMING_ASSERT_LATER(&timing, 0, 2000);
443
+ TIMING_ASSERT_LATER(&timing, 0, 500);
384
444
 
385
445
  /* Leader change triggers the metadata update and migration
386
446
  * of partition 0 to brokers 3 and with 'second_leader_change' also
@@ -429,7 +489,8 @@ int main_0146_metadata_mock(int argc, char **argv) {
429
489
 
430
490
  do_test_metadata_call_before_join();
431
491
 
432
- do_test_fast_metadata_refresh_stops();
492
+ do_test_fast_metadata_refresh(0);
493
+ do_test_fast_metadata_refresh(1);
433
494
 
434
495
  do_test_stale_metadata_doesnt_migrate_partition();
435
496