@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.
Files changed (293) hide show
  1. package/README.md +5 -5
  2. package/bench/seed.sh +0 -0
  3. package/binding.gyp +3 -3
  4. package/ci/prepublish.js +4 -3
  5. package/ci/update-version.js +123 -0
  6. package/config.d.ts +126 -10
  7. package/configure +0 -0
  8. package/deps/librdkafka/.semaphore/run-all-tests.yml +77 -0
  9. package/deps/librdkafka/.semaphore/semaphore-integration.yml +250 -0
  10. package/deps/librdkafka/.semaphore/semaphore.yml +67 -44
  11. package/deps/librdkafka/.semaphore/verify-linux-packages.yml +41 -0
  12. package/deps/librdkafka/CHANGELOG.md +471 -1
  13. package/deps/librdkafka/CONFIGURATION.md +29 -9
  14. package/deps/librdkafka/INTRODUCTION.md +909 -601
  15. package/deps/librdkafka/Makefile +2 -1
  16. package/deps/librdkafka/configure +0 -0
  17. package/deps/librdkafka/debian/rules +0 -0
  18. package/deps/librdkafka/dev-conf.sh +0 -0
  19. package/deps/librdkafka/examples/consumer.c +18 -8
  20. package/deps/librdkafka/examples/describe_consumer_groups.c +25 -6
  21. package/deps/librdkafka/examples/incremental_alter_configs.c +4 -5
  22. package/deps/librdkafka/examples/kafkatest_verifiable_client.cpp +26 -42
  23. package/deps/librdkafka/examples/openssl_engine_example.cpp +3 -4
  24. package/deps/librdkafka/examples/producer.cpp +2 -2
  25. package/deps/librdkafka/examples/user_scram.c +4 -5
  26. package/deps/librdkafka/examples/win_ssl_cert_store.cpp +4 -3
  27. package/deps/librdkafka/lds-gen.py +0 -0
  28. package/deps/librdkafka/mklove/Makefile.base +0 -0
  29. package/deps/librdkafka/packaging/RELEASE.md +8 -0
  30. package/deps/librdkafka/packaging/alpine/build-alpine.sh +0 -0
  31. package/deps/librdkafka/packaging/cp/README.md +4 -1
  32. package/deps/librdkafka/packaging/cp/check_features.c +12 -4
  33. package/deps/librdkafka/packaging/cp/verify-deb.sh +6 -6
  34. package/deps/librdkafka/packaging/cp/verify-packages.sh +52 -31
  35. package/deps/librdkafka/packaging/cp/verify-rpm.sh +6 -13
  36. package/deps/librdkafka/packaging/debian/docs +5 -0
  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 +12 -13
  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/deps/librdkafka/.semaphore/project.yml +0 -43
  292. package/deps/librdkafka/.semaphore/project_public.yml +0 -20
  293. package/deps/librdkafka/win32/install-openssl.ps1 +0 -33
@@ -93,10 +93,12 @@ void rd_kafka_q_init0(rd_kafka_q_t *rkq,
93
93
  rkq->rkq_flags = RD_KAFKA_Q_F_READY;
94
94
  if (for_consume)
95
95
  rkq->rkq_flags |= RD_KAFKA_Q_F_CONSUMER;
96
- rkq->rkq_rk = rk;
97
- rkq->rkq_qio = NULL;
98
- rkq->rkq_serve = NULL;
99
- rkq->rkq_opaque = NULL;
96
+ rkq->rkq_rk = rk;
97
+ rkq->rkq_qio = NULL;
98
+ rkq->rkq_serve = NULL;
99
+ rkq->rkq_opaque = NULL;
100
+ rkq->rkq_ts_last_poll_start = 0;
101
+ rkq->rkq_ts_last_poll_end = 0;
100
102
  mtx_init(&rkq->rkq_lock, mtx_plain);
101
103
  cnd_init(&rkq->rkq_cond);
102
104
  #if ENABLE_DEVEL
@@ -380,16 +382,26 @@ rd_kafka_op_filter(rd_kafka_q_t *rkq, rd_kafka_op_t *rko, int version) {
380
382
  * Serve q like rd_kafka_q_serve() until an op is found that can be returned
381
383
  * as an event to the application.
382
384
  *
385
+ * @param rkq Queue to pop from.
386
+ * @param timeout_us Maximum time to wait for an op, in microseconds.
387
+ * @param version Fetch version to filter out outdated ops.
388
+ * @param cb_type Callback type to use for the op.
389
+ * @param callback Callback to use for the op, if any.
390
+ * @param opaque Opaque pointer to pass to the callback.
391
+ * @param is_consume_call If `rd_true` and it could be a consumer call it
392
+ * checks if this queue can contain fetched messages.
393
+ *
383
394
  * @returns the first event:able op, or NULL on timeout.
384
395
  *
385
- * Locality: any thread
396
+ * @locality any thread
386
397
  */
387
- rd_kafka_op_t *rd_kafka_q_pop_serve(rd_kafka_q_t *rkq,
388
- rd_ts_t timeout_us,
389
- int32_t version,
390
- rd_kafka_q_cb_type_t cb_type,
391
- rd_kafka_q_serve_cb_t *callback,
392
- void *opaque) {
398
+ static rd_kafka_op_t *rd_kafka_q_pop_serve0(rd_kafka_q_t *rkq,
399
+ rd_ts_t timeout_us,
400
+ int32_t version,
401
+ rd_kafka_q_cb_type_t cb_type,
402
+ rd_kafka_q_serve_cb_t *callback,
403
+ void *opaque,
404
+ rd_bool_t is_consume_call) {
393
405
  rd_kafka_op_t *rko;
394
406
  rd_kafka_q_t *fwdq;
395
407
 
@@ -400,14 +412,14 @@ rd_kafka_op_t *rd_kafka_q_pop_serve(rd_kafka_q_t *rkq,
400
412
  rd_kafka_yield_thread = 0;
401
413
  if (!(fwdq = rd_kafka_q_fwd_get(rkq, 0))) {
402
414
  const rd_bool_t can_q_contain_fetched_msgs =
415
+ is_consume_call &&
403
416
  rd_kafka_q_can_contain_fetched_msgs(rkq, RD_DONT_LOCK);
404
417
 
405
- struct timespec timeout_tspec;
406
-
407
- rd_timeout_init_timespec_us(&timeout_tspec, timeout_us);
418
+ rd_ts_t abs_timeout = rd_timeout_init_us(timeout_us);
408
419
 
409
420
  if (can_q_contain_fetched_msgs)
410
- rd_kafka_app_poll_start(rkq->rkq_rk, 0, timeout_us);
421
+ rd_kafka_app_poll_start(rkq->rkq_rk, rkq, 0,
422
+ timeout_us);
411
423
 
412
424
  while (1) {
413
425
  rd_kafka_op_res_t res;
@@ -447,14 +459,14 @@ rd_kafka_op_t *rd_kafka_q_pop_serve(rd_kafka_q_t *rkq,
447
459
  } else if (unlikely(res ==
448
460
  RD_KAFKA_OP_RES_YIELD)) {
449
461
  if (can_q_contain_fetched_msgs)
450
- rd_kafka_app_polled(
451
- rkq->rkq_rk);
462
+ rd_kafka_app_polled(rkq->rkq_rk,
463
+ rkq);
452
464
  /* Callback yielded, unroll */
453
465
  return NULL;
454
466
  } else {
455
467
  if (can_q_contain_fetched_msgs)
456
- rd_kafka_app_polled(
457
- rkq->rkq_rk);
468
+ rd_kafka_app_polled(rkq->rkq_rk,
469
+ rkq);
458
470
  break; /* Proper op, handle below. */
459
471
  }
460
472
  }
@@ -463,7 +475,7 @@ rd_kafka_op_t *rd_kafka_q_pop_serve(rd_kafka_q_t *rkq,
463
475
  if (is_locked)
464
476
  mtx_unlock(&rkq->rkq_lock);
465
477
  if (can_q_contain_fetched_msgs)
466
- rd_kafka_app_polled(rkq->rkq_rk);
478
+ rd_kafka_app_polled(rkq->rkq_rk, rkq);
467
479
  return NULL;
468
480
  }
469
481
 
@@ -471,10 +483,10 @@ rd_kafka_op_t *rd_kafka_q_pop_serve(rd_kafka_q_t *rkq,
471
483
  mtx_lock(&rkq->rkq_lock);
472
484
 
473
485
  if (cnd_timedwait_abs(&rkq->rkq_cond, &rkq->rkq_lock,
474
- &timeout_tspec) != thrd_success) {
486
+ abs_timeout) != thrd_success) {
475
487
  mtx_unlock(&rkq->rkq_lock);
476
488
  if (can_q_contain_fetched_msgs)
477
- rd_kafka_app_polled(rkq->rkq_rk);
489
+ rd_kafka_app_polled(rkq->rkq_rk, rkq);
478
490
  return NULL;
479
491
  }
480
492
  }
@@ -483,8 +495,8 @@ rd_kafka_op_t *rd_kafka_q_pop_serve(rd_kafka_q_t *rkq,
483
495
  /* Since the q_pop may block we need to release the parent
484
496
  * queue's lock. */
485
497
  mtx_unlock(&rkq->rkq_lock);
486
- rko = rd_kafka_q_pop_serve(fwdq, timeout_us, version, cb_type,
487
- callback, opaque);
498
+ rko = rd_kafka_q_pop_serve0(fwdq, timeout_us, version, cb_type,
499
+ callback, opaque, is_consume_call);
488
500
  rd_kafka_q_destroy(fwdq);
489
501
  }
490
502
 
@@ -492,35 +504,72 @@ rd_kafka_op_t *rd_kafka_q_pop_serve(rd_kafka_q_t *rkq,
492
504
  return rko;
493
505
  }
494
506
 
507
+ rd_kafka_op_t *rd_kafka_q_pop_serve(rd_kafka_q_t *rkq,
508
+ rd_ts_t timeout_us,
509
+ int32_t version,
510
+ rd_kafka_q_cb_type_t cb_type,
511
+ rd_kafka_q_serve_cb_t *callback,
512
+ void *opaque) {
513
+ return rd_kafka_q_pop_serve0(rkq, timeout_us, version, cb_type,
514
+ callback, opaque, rd_false);
515
+ }
516
+
517
+ /**
518
+ * @brief Same as `rd_kafka_q_pop_serve`, use this call when the queue
519
+ * could be a fetch queue, use the other one when it
520
+ * can never be.
521
+ */
522
+ rd_kafka_op_t *
523
+ rd_kafka_q_pop_serve_maybe_consume(rd_kafka_q_t *rkq,
524
+ rd_ts_t timeout_us,
525
+ int32_t version,
526
+ rd_kafka_q_cb_type_t cb_type,
527
+ rd_kafka_q_serve_cb_t *callback,
528
+ void *opaque) {
529
+ return rd_kafka_q_pop_serve0(rkq, timeout_us, version, cb_type,
530
+ callback, opaque,
531
+ /* Only check if to call app_polled when
532
+ * this is a consumer. */
533
+ rkq->rkq_rk->rk_type == RD_KAFKA_CONSUMER);
534
+ }
535
+
495
536
  rd_kafka_op_t *
496
537
  rd_kafka_q_pop(rd_kafka_q_t *rkq, rd_ts_t timeout_us, int32_t version) {
497
538
  return rd_kafka_q_pop_serve(rkq, timeout_us, version,
498
539
  RD_KAFKA_Q_CB_RETURN, NULL, NULL);
499
540
  }
500
541
 
501
-
502
542
  /**
503
543
  * Pop all available ops from a queue and call the provided
504
544
  * callback for each op.
505
- * `max_cnt` limits the number of ops served, 0 = no limit.
506
545
  *
507
- * Returns the number of ops served.
546
+ * @param rkq Queue to serve.
547
+ * @param max_cnt Limits the number of ops served, 0 = no limit.
548
+ * @param cb_type Callback type to use.
549
+ * @param callback Callback to call for each op.
550
+ * @param opaque Opaque pointer to pass to the callback.
551
+ * @param is_consume_call If `rd_true` and it could be a consumer call it
552
+ * checks if this queue can contain fetched messages.
508
553
  *
509
- * Locality: any thread.
554
+ * @return The number of ops served.
555
+ *
556
+ * @locality any thread.
510
557
  */
511
- int rd_kafka_q_serve(rd_kafka_q_t *rkq,
512
- int timeout_ms,
513
- int max_cnt,
514
- rd_kafka_q_cb_type_t cb_type,
515
- rd_kafka_q_serve_cb_t *callback,
516
- void *opaque) {
558
+ int rd_kafka_q_serve0(rd_kafka_q_t *rkq,
559
+ int timeout_ms,
560
+ int max_cnt,
561
+ rd_kafka_q_cb_type_t cb_type,
562
+ rd_kafka_q_serve_cb_t *callback,
563
+ void *opaque,
564
+ rd_bool_t is_consume_call) {
517
565
  rd_kafka_t *rk = rkq->rkq_rk;
518
566
  rd_kafka_op_t *rko;
519
567
  rd_kafka_q_t localq;
520
568
  rd_kafka_q_t *fwdq;
521
569
  int cnt = 0;
522
- struct timespec timeout_tspec;
570
+ rd_ts_t abs_timeout;
523
571
  const rd_bool_t can_q_contain_fetched_msgs =
572
+ is_consume_call &&
524
573
  rd_kafka_q_can_contain_fetched_msgs(rkq, RD_DONT_LOCK);
525
574
 
526
575
  rd_dassert(cb_type);
@@ -533,23 +582,23 @@ int rd_kafka_q_serve(rd_kafka_q_t *rkq,
533
582
  /* Since the q_pop may block we need to release the parent
534
583
  * queue's lock. */
535
584
  mtx_unlock(&rkq->rkq_lock);
536
- ret = rd_kafka_q_serve(fwdq, timeout_ms, max_cnt, cb_type,
537
- callback, opaque);
585
+ ret = rd_kafka_q_serve0(fwdq, timeout_ms, max_cnt, cb_type,
586
+ callback, opaque, is_consume_call);
538
587
  rd_kafka_q_destroy(fwdq);
539
588
  return ret;
540
589
  }
541
590
 
542
591
 
543
- rd_timeout_init_timespec(&timeout_tspec, timeout_ms);
592
+ abs_timeout = rd_timeout_init(timeout_ms);
544
593
 
545
594
  if (can_q_contain_fetched_msgs)
546
- rd_kafka_app_poll_start(rk, 0, timeout_ms);
595
+ rd_kafka_app_poll_start(rk, rkq, 0, timeout_ms);
547
596
 
548
597
  /* Wait for op */
549
598
  while (!(rko = TAILQ_FIRST(&rkq->rkq_q)) &&
550
599
  !rd_kafka_q_check_yield(rkq) &&
551
- cnd_timedwait_abs(&rkq->rkq_cond, &rkq->rkq_lock,
552
- &timeout_tspec) == thrd_success)
600
+ cnd_timedwait_abs(&rkq->rkq_cond, &rkq->rkq_lock, abs_timeout) ==
601
+ thrd_success)
553
602
  ;
554
603
 
555
604
  rd_kafka_q_mark_served(rkq);
@@ -557,7 +606,7 @@ int rd_kafka_q_serve(rd_kafka_q_t *rkq,
557
606
  if (!rko) {
558
607
  mtx_unlock(&rkq->rkq_lock);
559
608
  if (can_q_contain_fetched_msgs)
560
- rd_kafka_app_polled(rk);
609
+ rd_kafka_app_polled(rk, rkq);
561
610
  return 0;
562
611
  }
563
612
 
@@ -593,13 +642,41 @@ int rd_kafka_q_serve(rd_kafka_q_t *rkq,
593
642
  }
594
643
 
595
644
  if (can_q_contain_fetched_msgs)
596
- rd_kafka_app_polled(rk);
645
+ rd_kafka_app_polled(rk, rkq);
597
646
 
598
647
  rd_kafka_q_destroy_owner(&localq);
599
648
 
600
649
  return cnt;
601
650
  }
602
651
 
652
+ int rd_kafka_q_serve(rd_kafka_q_t *rkq,
653
+ int timeout_ms,
654
+ int max_cnt,
655
+ rd_kafka_q_cb_type_t cb_type,
656
+ rd_kafka_q_serve_cb_t *callback,
657
+ void *opaque) {
658
+ return rd_kafka_q_serve0(rkq, timeout_ms, max_cnt, cb_type, callback,
659
+ opaque, rd_false);
660
+ }
661
+
662
+ /**
663
+ * @brief Same as `rd_kafka_q_serve`, use this call when the queue
664
+ * could be a fetch queue, use the other one when it
665
+ * can never be.
666
+ */
667
+ int rd_kafka_q_serve_maybe_consume(rd_kafka_q_t *rkq,
668
+ int timeout_ms,
669
+ int max_cnt,
670
+ rd_kafka_q_cb_type_t cb_type,
671
+ rd_kafka_q_serve_cb_t *callback,
672
+ void *opaque) {
673
+ return rd_kafka_q_serve0(rkq, timeout_ms, max_cnt, cb_type, callback,
674
+ opaque,
675
+ /* Only check if to call app_polled when
676
+ * this is a consumer. */
677
+ rkq->rkq_rk->rk_type == RD_KAFKA_CONSUMER);
678
+ }
679
+
603
680
  /**
604
681
  * @brief Filter out and destroy outdated messages.
605
682
  *
@@ -665,7 +742,7 @@ int rd_kafka_q_serve_rkmessages(rd_kafka_q_t *rkq,
665
742
  rd_kafka_op_t *rko, *next;
666
743
  rd_kafka_t *rk = rkq->rkq_rk;
667
744
  rd_kafka_q_t *fwdq;
668
- struct timespec timeout_tspec;
745
+ rd_ts_t abs_timeout;
669
746
  int i;
670
747
 
671
748
  mtx_lock(&rkq->rkq_lock);
@@ -681,9 +758,9 @@ int rd_kafka_q_serve_rkmessages(rd_kafka_q_t *rkq,
681
758
 
682
759
  mtx_unlock(&rkq->rkq_lock);
683
760
 
684
- rd_timeout_init_timespec(&timeout_tspec, timeout_ms);
761
+ abs_timeout = rd_timeout_init(timeout_ms);
685
762
 
686
- rd_kafka_app_poll_start(rk, 0, timeout_ms);
763
+ rd_kafka_app_poll_start(rk, rkq, 0, timeout_ms);
687
764
 
688
765
  rd_kafka_yield_thread = 0;
689
766
  while (cnt < rkmessages_size) {
@@ -694,7 +771,7 @@ int rd_kafka_q_serve_rkmessages(rd_kafka_q_t *rkq,
694
771
  while (!(rko = TAILQ_FIRST(&rkq->rkq_q)) &&
695
772
  !rd_kafka_q_check_yield(rkq) &&
696
773
  cnd_timedwait_abs(&rkq->rkq_cond, &rkq->rkq_lock,
697
- &timeout_tspec) == thrd_success)
774
+ abs_timeout) == thrd_success)
698
775
  ;
699
776
 
700
777
  rd_kafka_q_mark_served(rkq);
@@ -787,7 +864,7 @@ int rd_kafka_q_serve_rkmessages(rd_kafka_q_t *rkq,
787
864
  rd_kafka_op_destroy(rko);
788
865
  }
789
866
 
790
- rd_kafka_app_polled(rk);
867
+ rd_kafka_app_polled(rk, rkq);
791
868
 
792
869
  return cnt;
793
870
  }
@@ -91,6 +91,12 @@ struct rd_kafka_q_s {
91
91
  * Shall return 1 if op was handled, else 0. */
92
92
  rd_kafka_q_serve_cb_t *rkq_serve;
93
93
  void *rkq_opaque;
94
+ rd_ts_t rkq_ts_last_poll_start; /**< Timestamp of last queue
95
+ * poll() call start
96
+ * Only relevant for a consumer. */
97
+ rd_ts_t rkq_ts_last_poll_end; /**< Timestamp of last queue
98
+ * poll() call end
99
+ * Only relevant for a consumer. */
94
100
 
95
101
  #if ENABLE_DEVEL
96
102
  char rkq_name[64]; /* Debugging: queue name (FUNC:LINE) */
@@ -841,6 +847,13 @@ rd_kafka_op_t *rd_kafka_q_pop_serve(rd_kafka_q_t *rkq,
841
847
  rd_kafka_q_serve_cb_t *callback,
842
848
  void *opaque);
843
849
  rd_kafka_op_t *
850
+ rd_kafka_q_pop_serve_maybe_consume(rd_kafka_q_t *rkq,
851
+ rd_ts_t timeout_us,
852
+ int32_t version,
853
+ rd_kafka_q_cb_type_t cb_type,
854
+ rd_kafka_q_serve_cb_t *callback,
855
+ void *opaque);
856
+ rd_kafka_op_t *
844
857
  rd_kafka_q_pop(rd_kafka_q_t *rkq, rd_ts_t timeout_us, int32_t version);
845
858
  int rd_kafka_q_serve(rd_kafka_q_t *rkq,
846
859
  int timeout_ms,
@@ -848,6 +861,12 @@ int rd_kafka_q_serve(rd_kafka_q_t *rkq,
848
861
  rd_kafka_q_cb_type_t cb_type,
849
862
  rd_kafka_q_serve_cb_t *callback,
850
863
  void *opaque);
864
+ int rd_kafka_q_serve_maybe_consume(rd_kafka_q_t *rkq,
865
+ int timeout_ms,
866
+ int max_cnt,
867
+ rd_kafka_q_cb_type_t cb_type,
868
+ rd_kafka_q_serve_cb_t *callback,
869
+ void *opaque);
851
870
 
852
871
 
853
872
  int rd_kafka_q_move_cnt(rd_kafka_q_t *dstq,
@@ -1424,7 +1424,7 @@ static int ut_testRackAwareAssignmentWithCoPartitioning0(
1424
1424
  char *subscription12[] = {"t1", "t2"};
1425
1425
  char *subscription34[] = {"t3", "t4"};
1426
1426
  char **subscriptions[] = {subscription12, subscription12,
1427
- subscription34, subscription34};
1427
+ subscription34, subscription34};
1428
1428
  int racks[] = {0, 1, 1, 0};
1429
1429
 
1430
1430
  if (parametrization !=