@ohos-ports/confluentinc-kafka-javascript 1.10.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (628) hide show
  1. package/CHANGELOG.md +457 -0
  2. package/LICENSE.kafkajs +31 -0
  3. package/LICENSE.node-rdkafka +25 -0
  4. package/LICENSE.txt +20 -0
  5. package/README.md +133 -0
  6. package/binding.gyp +184 -0
  7. package/build/Release/confluent-kafka-javascript.node +0 -0
  8. package/build/deps/librdkafka++.so.1 +0 -0
  9. package/build/deps/librdkafka.Makefile +6 -0
  10. package/build/deps/librdkafka.so.1 +0 -0
  11. package/build/deps/librdkafka.target.mk +55 -0
  12. package/deps/librdkafka/.clang-format +136 -0
  13. package/deps/librdkafka/.clang-format-cpp +103 -0
  14. package/deps/librdkafka/.dir-locals.el +10 -0
  15. package/deps/librdkafka/.formatignore +35 -0
  16. package/deps/librdkafka/.gdbmacros +19 -0
  17. package/deps/librdkafka/CHANGELOG.md +2477 -0
  18. package/deps/librdkafka/CMakeLists.txt +291 -0
  19. package/deps/librdkafka/CODE_OF_CONDUCT.md +46 -0
  20. package/deps/librdkafka/CONFIGURATION.md +212 -0
  21. package/deps/librdkafka/CONTRIBUTING.md +431 -0
  22. package/deps/librdkafka/Doxyfile +2375 -0
  23. package/deps/librdkafka/INTRODUCTION.md +2752 -0
  24. package/deps/librdkafka/LICENSE +26 -0
  25. package/deps/librdkafka/LICENSE.cjson +22 -0
  26. package/deps/librdkafka/LICENSE.crc32c +28 -0
  27. package/deps/librdkafka/LICENSE.fnv1a +18 -0
  28. package/deps/librdkafka/LICENSE.hdrhistogram +27 -0
  29. package/deps/librdkafka/LICENSE.lz4 +26 -0
  30. package/deps/librdkafka/LICENSE.murmur2 +25 -0
  31. package/deps/librdkafka/LICENSE.nanopb +22 -0
  32. package/deps/librdkafka/LICENSE.opentelemetry +203 -0
  33. package/deps/librdkafka/LICENSE.pycrc +23 -0
  34. package/deps/librdkafka/LICENSE.queue +31 -0
  35. package/deps/librdkafka/LICENSE.regexp +5 -0
  36. package/deps/librdkafka/LICENSE.snappy +36 -0
  37. package/deps/librdkafka/LICENSE.tinycthread +26 -0
  38. package/deps/librdkafka/LICENSE.wingetopt +49 -0
  39. package/deps/librdkafka/LICENSES.txt +625 -0
  40. package/deps/librdkafka/Makefile +125 -0
  41. package/deps/librdkafka/README.md +201 -0
  42. package/deps/librdkafka/README.win32 +26 -0
  43. package/deps/librdkafka/STATISTICS.md +624 -0
  44. package/deps/librdkafka/configure +214 -0
  45. package/deps/librdkafka/configure.self +341 -0
  46. package/deps/librdkafka/dev-conf.sh +123 -0
  47. package/deps/librdkafka/lds-gen.py +73 -0
  48. package/deps/librdkafka/mainpage.doxy +40 -0
  49. package/deps/librdkafka/mklove/Makefile.base +329 -0
  50. package/deps/librdkafka/mklove/modules/configure.atomics +144 -0
  51. package/deps/librdkafka/mklove/modules/configure.base +2484 -0
  52. package/deps/librdkafka/mklove/modules/configure.builtin +70 -0
  53. package/deps/librdkafka/mklove/modules/configure.cc +186 -0
  54. package/deps/librdkafka/mklove/modules/configure.cxx +8 -0
  55. package/deps/librdkafka/mklove/modules/configure.fileversion +65 -0
  56. package/deps/librdkafka/mklove/modules/configure.gitversion +29 -0
  57. package/deps/librdkafka/mklove/modules/configure.good_cflags +18 -0
  58. package/deps/librdkafka/mklove/modules/configure.host +132 -0
  59. package/deps/librdkafka/mklove/modules/configure.lib +49 -0
  60. package/deps/librdkafka/mklove/modules/configure.libcurl +99 -0
  61. package/deps/librdkafka/mklove/modules/configure.libsasl2 +36 -0
  62. package/deps/librdkafka/mklove/modules/configure.libssl +147 -0
  63. package/deps/librdkafka/mklove/modules/configure.libzstd +58 -0
  64. package/deps/librdkafka/mklove/modules/configure.parseversion +95 -0
  65. package/deps/librdkafka/mklove/modules/configure.pic +16 -0
  66. package/deps/librdkafka/mklove/modules/configure.socket +20 -0
  67. package/deps/librdkafka/mklove/modules/configure.zlib +61 -0
  68. package/deps/librdkafka/mklove/modules/patches/README.md +8 -0
  69. package/deps/librdkafka/mklove/modules/patches/libcurl.0000-no-runtime-linking-check.patch +11 -0
  70. package/deps/librdkafka/mklove/modules/patches/libssl.0000-osx-rand-include-fix-OpenSSL-PR16409.patch +56 -0
  71. package/deps/librdkafka/service.yml +182 -0
  72. package/deps/librdkafka/src/CMakeLists.txt +379 -0
  73. package/deps/librdkafka/src/Makefile +105 -0
  74. package/deps/librdkafka/src/README.lz4.md +30 -0
  75. package/deps/librdkafka/src/cJSON.c +3191 -0
  76. package/deps/librdkafka/src/cJSON.h +306 -0
  77. package/deps/librdkafka/src/crc32c.c +430 -0
  78. package/deps/librdkafka/src/crc32c.h +38 -0
  79. package/deps/librdkafka/src/generate_proto.sh +66 -0
  80. package/deps/librdkafka/src/librdkafka_cgrp_synch.png +0 -0
  81. package/deps/librdkafka/src/lz4.c +2727 -0
  82. package/deps/librdkafka/src/lz4.h +842 -0
  83. package/deps/librdkafka/src/lz4frame.c +2078 -0
  84. package/deps/librdkafka/src/lz4frame.h +692 -0
  85. package/deps/librdkafka/src/lz4frame_static.h +47 -0
  86. package/deps/librdkafka/src/lz4hc.c +1631 -0
  87. package/deps/librdkafka/src/lz4hc.h +413 -0
  88. package/deps/librdkafka/src/nanopb/pb.h +917 -0
  89. package/deps/librdkafka/src/nanopb/pb_common.c +388 -0
  90. package/deps/librdkafka/src/nanopb/pb_common.h +49 -0
  91. package/deps/librdkafka/src/nanopb/pb_decode.c +1727 -0
  92. package/deps/librdkafka/src/nanopb/pb_decode.h +193 -0
  93. package/deps/librdkafka/src/nanopb/pb_encode.c +1000 -0
  94. package/deps/librdkafka/src/nanopb/pb_encode.h +185 -0
  95. package/deps/librdkafka/src/opentelemetry/common.pb.c +32 -0
  96. package/deps/librdkafka/src/opentelemetry/common.pb.h +170 -0
  97. package/deps/librdkafka/src/opentelemetry/metrics.options +2 -0
  98. package/deps/librdkafka/src/opentelemetry/metrics.pb.c +67 -0
  99. package/deps/librdkafka/src/opentelemetry/metrics.pb.h +966 -0
  100. package/deps/librdkafka/src/opentelemetry/resource.pb.c +12 -0
  101. package/deps/librdkafka/src/opentelemetry/resource.pb.h +58 -0
  102. package/deps/librdkafka/src/queue.h +850 -0
  103. package/deps/librdkafka/src/rd.h +592 -0
  104. package/deps/librdkafka/src/rdaddr.c +255 -0
  105. package/deps/librdkafka/src/rdaddr.h +202 -0
  106. package/deps/librdkafka/src/rdatomic.h +262 -0
  107. package/deps/librdkafka/src/rdavg.h +260 -0
  108. package/deps/librdkafka/src/rdavl.c +210 -0
  109. package/deps/librdkafka/src/rdavl.h +250 -0
  110. package/deps/librdkafka/src/rdbase64.c +200 -0
  111. package/deps/librdkafka/src/rdbase64.h +43 -0
  112. package/deps/librdkafka/src/rdbuf.c +1884 -0
  113. package/deps/librdkafka/src/rdbuf.h +375 -0
  114. package/deps/librdkafka/src/rdcrc32.c +114 -0
  115. package/deps/librdkafka/src/rdcrc32.h +170 -0
  116. package/deps/librdkafka/src/rddl.c +179 -0
  117. package/deps/librdkafka/src/rddl.h +43 -0
  118. package/deps/librdkafka/src/rdendian.h +175 -0
  119. package/deps/librdkafka/src/rdfloat.h +67 -0
  120. package/deps/librdkafka/src/rdfnv1a.c +113 -0
  121. package/deps/librdkafka/src/rdfnv1a.h +35 -0
  122. package/deps/librdkafka/src/rdgz.c +120 -0
  123. package/deps/librdkafka/src/rdgz.h +46 -0
  124. package/deps/librdkafka/src/rdhdrhistogram.c +721 -0
  125. package/deps/librdkafka/src/rdhdrhistogram.h +87 -0
  126. package/deps/librdkafka/src/rdhttp.c +831 -0
  127. package/deps/librdkafka/src/rdhttp.h +101 -0
  128. package/deps/librdkafka/src/rdinterval.h +177 -0
  129. package/deps/librdkafka/src/rdkafka.c +7287 -0
  130. package/deps/librdkafka/src/rdkafka.h +11795 -0
  131. package/deps/librdkafka/src/rdkafka_admin.c +10165 -0
  132. package/deps/librdkafka/src/rdkafka_admin.h +658 -0
  133. package/deps/librdkafka/src/rdkafka_assignment.c +1282 -0
  134. package/deps/librdkafka/src/rdkafka_assignment.h +73 -0
  135. package/deps/librdkafka/src/rdkafka_assignor.c +1800 -0
  136. package/deps/librdkafka/src/rdkafka_assignor.h +402 -0
  137. package/deps/librdkafka/src/rdkafka_aux.c +409 -0
  138. package/deps/librdkafka/src/rdkafka_aux.h +174 -0
  139. package/deps/librdkafka/src/rdkafka_background.c +222 -0
  140. package/deps/librdkafka/src/rdkafka_broker.c +6736 -0
  141. package/deps/librdkafka/src/rdkafka_broker.h +851 -0
  142. package/deps/librdkafka/src/rdkafka_buf.c +543 -0
  143. package/deps/librdkafka/src/rdkafka_buf.h +1525 -0
  144. package/deps/librdkafka/src/rdkafka_cert.c +576 -0
  145. package/deps/librdkafka/src/rdkafka_cert.h +62 -0
  146. package/deps/librdkafka/src/rdkafka_cgrp.c +8310 -0
  147. package/deps/librdkafka/src/rdkafka_cgrp.h +589 -0
  148. package/deps/librdkafka/src/rdkafka_conf.c +5177 -0
  149. package/deps/librdkafka/src/rdkafka_conf.h +746 -0
  150. package/deps/librdkafka/src/rdkafka_confval.h +97 -0
  151. package/deps/librdkafka/src/rdkafka_coord.c +623 -0
  152. package/deps/librdkafka/src/rdkafka_coord.h +132 -0
  153. package/deps/librdkafka/src/rdkafka_error.c +228 -0
  154. package/deps/librdkafka/src/rdkafka_error.h +80 -0
  155. package/deps/librdkafka/src/rdkafka_event.c +502 -0
  156. package/deps/librdkafka/src/rdkafka_event.h +126 -0
  157. package/deps/librdkafka/src/rdkafka_feature.c +898 -0
  158. package/deps/librdkafka/src/rdkafka_feature.h +104 -0
  159. package/deps/librdkafka/src/rdkafka_fetcher.c +3820 -0
  160. package/deps/librdkafka/src/rdkafka_fetcher.h +62 -0
  161. package/deps/librdkafka/src/rdkafka_header.c +220 -0
  162. package/deps/librdkafka/src/rdkafka_header.h +76 -0
  163. package/deps/librdkafka/src/rdkafka_idempotence.c +807 -0
  164. package/deps/librdkafka/src/rdkafka_idempotence.h +144 -0
  165. package/deps/librdkafka/src/rdkafka_int.h +1505 -0
  166. package/deps/librdkafka/src/rdkafka_interceptor.c +842 -0
  167. package/deps/librdkafka/src/rdkafka_interceptor.h +104 -0
  168. package/deps/librdkafka/src/rdkafka_lz4.c +450 -0
  169. package/deps/librdkafka/src/rdkafka_lz4.h +49 -0
  170. package/deps/librdkafka/src/rdkafka_metadata.c +2347 -0
  171. package/deps/librdkafka/src/rdkafka_metadata.h +350 -0
  172. package/deps/librdkafka/src/rdkafka_metadata_cache.c +1183 -0
  173. package/deps/librdkafka/src/rdkafka_mock.c +4514 -0
  174. package/deps/librdkafka/src/rdkafka_mock.h +867 -0
  175. package/deps/librdkafka/src/rdkafka_mock_cgrp.c +1877 -0
  176. package/deps/librdkafka/src/rdkafka_mock_handlers.c +5255 -0
  177. package/deps/librdkafka/src/rdkafka_mock_int.h +1005 -0
  178. package/deps/librdkafka/src/rdkafka_mock_sharegrp.c +1207 -0
  179. package/deps/librdkafka/src/rdkafka_msg.c +2619 -0
  180. package/deps/librdkafka/src/rdkafka_msg.h +629 -0
  181. package/deps/librdkafka/src/rdkafka_msgbatch.h +62 -0
  182. package/deps/librdkafka/src/rdkafka_msgset.h +105 -0
  183. package/deps/librdkafka/src/rdkafka_msgset_reader.c +2099 -0
  184. package/deps/librdkafka/src/rdkafka_msgset_writer.c +1474 -0
  185. package/deps/librdkafka/src/rdkafka_offset.c +1565 -0
  186. package/deps/librdkafka/src/rdkafka_offset.h +150 -0
  187. package/deps/librdkafka/src/rdkafka_op.c +1219 -0
  188. package/deps/librdkafka/src/rdkafka_op.h +1065 -0
  189. package/deps/librdkafka/src/rdkafka_partition.c +5109 -0
  190. package/deps/librdkafka/src/rdkafka_partition.h +1215 -0
  191. package/deps/librdkafka/src/rdkafka_pattern.c +228 -0
  192. package/deps/librdkafka/src/rdkafka_pattern.h +70 -0
  193. package/deps/librdkafka/src/rdkafka_plugin.c +213 -0
  194. package/deps/librdkafka/src/rdkafka_plugin.h +41 -0
  195. package/deps/librdkafka/src/rdkafka_proto.h +739 -0
  196. package/deps/librdkafka/src/rdkafka_protocol.h +131 -0
  197. package/deps/librdkafka/src/rdkafka_queue.c +1351 -0
  198. package/deps/librdkafka/src/rdkafka_queue.h +1235 -0
  199. package/deps/librdkafka/src/rdkafka_range_assignor.c +1748 -0
  200. package/deps/librdkafka/src/rdkafka_request.c +7298 -0
  201. package/deps/librdkafka/src/rdkafka_request.h +761 -0
  202. package/deps/librdkafka/src/rdkafka_roundrobin_assignor.c +123 -0
  203. package/deps/librdkafka/src/rdkafka_sasl.c +589 -0
  204. package/deps/librdkafka/src/rdkafka_sasl.h +63 -0
  205. package/deps/librdkafka/src/rdkafka_sasl_cyrus.c +722 -0
  206. package/deps/librdkafka/src/rdkafka_sasl_int.h +89 -0
  207. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.c +1833 -0
  208. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.h +52 -0
  209. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.c +1827 -0
  210. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.h +52 -0
  211. package/deps/librdkafka/src/rdkafka_sasl_plain.c +142 -0
  212. package/deps/librdkafka/src/rdkafka_sasl_scram.c +858 -0
  213. package/deps/librdkafka/src/rdkafka_sasl_win32.c +550 -0
  214. package/deps/librdkafka/src/rdkafka_share_acknowledgement.c +1445 -0
  215. package/deps/librdkafka/src/rdkafka_share_acknowledgement.h +373 -0
  216. package/deps/librdkafka/src/rdkafka_ssl.c +2235 -0
  217. package/deps/librdkafka/src/rdkafka_ssl.h +86 -0
  218. package/deps/librdkafka/src/rdkafka_sticky_assignor.c +4785 -0
  219. package/deps/librdkafka/src/rdkafka_subscription.c +411 -0
  220. package/deps/librdkafka/src/rdkafka_telemetry.c +761 -0
  221. package/deps/librdkafka/src/rdkafka_telemetry.h +52 -0
  222. package/deps/librdkafka/src/rdkafka_telemetry_decode.c +1307 -0
  223. package/deps/librdkafka/src/rdkafka_telemetry_decode.h +59 -0
  224. package/deps/librdkafka/src/rdkafka_telemetry_encode.c +1309 -0
  225. package/deps/librdkafka/src/rdkafka_telemetry_encode.h +459 -0
  226. package/deps/librdkafka/src/rdkafka_timer.c +407 -0
  227. package/deps/librdkafka/src/rdkafka_timer.h +117 -0
  228. package/deps/librdkafka/src/rdkafka_topic.c +2382 -0
  229. package/deps/librdkafka/src/rdkafka_topic.h +369 -0
  230. package/deps/librdkafka/src/rdkafka_transport.c +1309 -0
  231. package/deps/librdkafka/src/rdkafka_transport.h +99 -0
  232. package/deps/librdkafka/src/rdkafka_transport_int.h +100 -0
  233. package/deps/librdkafka/src/rdkafka_txnmgr.c +3256 -0
  234. package/deps/librdkafka/src/rdkafka_txnmgr.h +171 -0
  235. package/deps/librdkafka/src/rdkafka_zstd.c +226 -0
  236. package/deps/librdkafka/src/rdkafka_zstd.h +57 -0
  237. package/deps/librdkafka/src/rdlist.c +593 -0
  238. package/deps/librdkafka/src/rdlist.h +444 -0
  239. package/deps/librdkafka/src/rdlog.c +89 -0
  240. package/deps/librdkafka/src/rdlog.h +41 -0
  241. package/deps/librdkafka/src/rdmap.c +508 -0
  242. package/deps/librdkafka/src/rdmap.h +492 -0
  243. package/deps/librdkafka/src/rdmurmur2.c +167 -0
  244. package/deps/librdkafka/src/rdmurmur2.h +35 -0
  245. package/deps/librdkafka/src/rdports.c +61 -0
  246. package/deps/librdkafka/src/rdports.h +38 -0
  247. package/deps/librdkafka/src/rdposix.h +250 -0
  248. package/deps/librdkafka/src/rdrand.c +151 -0
  249. package/deps/librdkafka/src/rdrand.h +72 -0
  250. package/deps/librdkafka/src/rdregex.c +156 -0
  251. package/deps/librdkafka/src/rdregex.h +43 -0
  252. package/deps/librdkafka/src/rdsignal.h +57 -0
  253. package/deps/librdkafka/src/rdstring.c +645 -0
  254. package/deps/librdkafka/src/rdstring.h +98 -0
  255. package/deps/librdkafka/src/rdsysqueue.h +404 -0
  256. package/deps/librdkafka/src/rdtime.h +356 -0
  257. package/deps/librdkafka/src/rdtypes.h +86 -0
  258. package/deps/librdkafka/src/rdunittest.c +564 -0
  259. package/deps/librdkafka/src/rdunittest.h +232 -0
  260. package/deps/librdkafka/src/rdunittest_acknowledge.c +1177 -0
  261. package/deps/librdkafka/src/rdunittest_fetcher.c +1211 -0
  262. package/deps/librdkafka/src/rdunittest_msgset_errors.c +1521 -0
  263. package/deps/librdkafka/src/rdvarint.c +134 -0
  264. package/deps/librdkafka/src/rdvarint.h +165 -0
  265. package/deps/librdkafka/src/rdwin32.h +382 -0
  266. package/deps/librdkafka/src/rdxxhash.c +1030 -0
  267. package/deps/librdkafka/src/rdxxhash.h +328 -0
  268. package/deps/librdkafka/src/regexp.c +1352 -0
  269. package/deps/librdkafka/src/regexp.h +41 -0
  270. package/deps/librdkafka/src/snappy.c +1866 -0
  271. package/deps/librdkafka/src/snappy.h +62 -0
  272. package/deps/librdkafka/src/snappy_compat.h +138 -0
  273. package/deps/librdkafka/src/statistics_schema.json +444 -0
  274. package/deps/librdkafka/src/tinycthread.c +932 -0
  275. package/deps/librdkafka/src/tinycthread.h +503 -0
  276. package/deps/librdkafka/src/tinycthread_extra.c +210 -0
  277. package/deps/librdkafka/src/tinycthread_extra.h +218 -0
  278. package/deps/librdkafka/src/win32_config.h +58 -0
  279. package/deps/librdkafka/src-cpp/CMakeLists.txt +90 -0
  280. package/deps/librdkafka/src-cpp/ConfImpl.cpp +84 -0
  281. package/deps/librdkafka/src-cpp/ConsumerImpl.cpp +244 -0
  282. package/deps/librdkafka/src-cpp/HandleImpl.cpp +436 -0
  283. package/deps/librdkafka/src-cpp/HeadersImpl.cpp +48 -0
  284. package/deps/librdkafka/src-cpp/KafkaConsumerImpl.cpp +296 -0
  285. package/deps/librdkafka/src-cpp/Makefile +55 -0
  286. package/deps/librdkafka/src-cpp/MessageImpl.cpp +38 -0
  287. package/deps/librdkafka/src-cpp/MetadataImpl.cpp +170 -0
  288. package/deps/librdkafka/src-cpp/ProducerImpl.cpp +197 -0
  289. package/deps/librdkafka/src-cpp/QueueImpl.cpp +70 -0
  290. package/deps/librdkafka/src-cpp/README.md +16 -0
  291. package/deps/librdkafka/src-cpp/RdKafka.cpp +59 -0
  292. package/deps/librdkafka/src-cpp/TopicImpl.cpp +124 -0
  293. package/deps/librdkafka/src-cpp/TopicPartitionImpl.cpp +57 -0
  294. package/deps/librdkafka/src-cpp/rdkafkacpp.h +3797 -0
  295. package/deps/librdkafka/src-cpp/rdkafkacpp_int.h +1641 -0
  296. package/deps/librdkafka/tests/0000-unittests.c +72 -0
  297. package/deps/librdkafka/tests/0001-multiobj.c +102 -0
  298. package/deps/librdkafka/tests/0002-unkpart.c +244 -0
  299. package/deps/librdkafka/tests/0003-msgmaxsize.c +173 -0
  300. package/deps/librdkafka/tests/0004-conf.c +934 -0
  301. package/deps/librdkafka/tests/0005-order.c +133 -0
  302. package/deps/librdkafka/tests/0006-symbols.c +163 -0
  303. package/deps/librdkafka/tests/0007-autotopic.c +136 -0
  304. package/deps/librdkafka/tests/0008-reqacks.c +179 -0
  305. package/deps/librdkafka/tests/0009-mock_cluster.c +272 -0
  306. package/deps/librdkafka/tests/0011-produce_batch.c +753 -0
  307. package/deps/librdkafka/tests/0012-produce_consume.c +537 -0
  308. package/deps/librdkafka/tests/0013-null-msgs.c +473 -0
  309. package/deps/librdkafka/tests/0014-reconsume-191.c +512 -0
  310. package/deps/librdkafka/tests/0015-offset_seeks.c +172 -0
  311. package/deps/librdkafka/tests/0016-client_swname.c +181 -0
  312. package/deps/librdkafka/tests/0017-compression.c +140 -0
  313. package/deps/librdkafka/tests/0018-cgrp_term.c +444 -0
  314. package/deps/librdkafka/tests/0019-list_groups.c +289 -0
  315. package/deps/librdkafka/tests/0020-destroy_hang.c +162 -0
  316. package/deps/librdkafka/tests/0021-rkt_destroy.c +72 -0
  317. package/deps/librdkafka/tests/0022-consume_batch.c +331 -0
  318. package/deps/librdkafka/tests/0025-timers.c +147 -0
  319. package/deps/librdkafka/tests/0026-consume_pause.c +547 -0
  320. package/deps/librdkafka/tests/0028-long_topicnames.c +79 -0
  321. package/deps/librdkafka/tests/0029-assign_offset.c +202 -0
  322. package/deps/librdkafka/tests/0030-offset_commit.c +589 -0
  323. package/deps/librdkafka/tests/0031-get_offsets.c +235 -0
  324. package/deps/librdkafka/tests/0033-regex_subscribe.c +536 -0
  325. package/deps/librdkafka/tests/0034-offset_reset.c +398 -0
  326. package/deps/librdkafka/tests/0035-api_version.c +73 -0
  327. package/deps/librdkafka/tests/0036-partial_fetch.c +87 -0
  328. package/deps/librdkafka/tests/0037-destroy_hang_local.c +85 -0
  329. package/deps/librdkafka/tests/0038-performance.c +121 -0
  330. package/deps/librdkafka/tests/0039-event.c +284 -0
  331. package/deps/librdkafka/tests/0040-io_event.c +257 -0
  332. package/deps/librdkafka/tests/0041-fetch_max_bytes.c +97 -0
  333. package/deps/librdkafka/tests/0042-many_topics.c +252 -0
  334. package/deps/librdkafka/tests/0043-no_connection.c +77 -0
  335. package/deps/librdkafka/tests/0044-partition_cnt.c +94 -0
  336. package/deps/librdkafka/tests/0045-subscribe_update.c +1010 -0
  337. package/deps/librdkafka/tests/0046-rkt_cache.c +65 -0
  338. package/deps/librdkafka/tests/0047-partial_buf_tmout.c +98 -0
  339. package/deps/librdkafka/tests/0048-partitioner.c +283 -0
  340. package/deps/librdkafka/tests/0049-consume_conn_close.c +162 -0
  341. package/deps/librdkafka/tests/0050-subscribe_adds.c +145 -0
  342. package/deps/librdkafka/tests/0051-assign_adds.c +126 -0
  343. package/deps/librdkafka/tests/0052-msg_timestamps.c +238 -0
  344. package/deps/librdkafka/tests/0053-stats_cb.cpp +527 -0
  345. package/deps/librdkafka/tests/0054-offset_time.cpp +236 -0
  346. package/deps/librdkafka/tests/0055-producer_latency.c +539 -0
  347. package/deps/librdkafka/tests/0056-balanced_group_mt.c +315 -0
  348. package/deps/librdkafka/tests/0057-invalid_topic.cpp +112 -0
  349. package/deps/librdkafka/tests/0058-log.cpp +123 -0
  350. package/deps/librdkafka/tests/0059-bsearch.cpp +241 -0
  351. package/deps/librdkafka/tests/0060-op_prio.cpp +163 -0
  352. package/deps/librdkafka/tests/0061-consumer_lag.cpp +295 -0
  353. package/deps/librdkafka/tests/0062-stats_event.c +126 -0
  354. package/deps/librdkafka/tests/0063-clusterid.cpp +180 -0
  355. package/deps/librdkafka/tests/0064-interceptors.c +529 -0
  356. package/deps/librdkafka/tests/0065-yield.cpp +140 -0
  357. package/deps/librdkafka/tests/0066-plugins.cpp +143 -0
  358. package/deps/librdkafka/tests/0067-empty_topic.cpp +151 -0
  359. package/deps/librdkafka/tests/0068-produce_timeout.c +136 -0
  360. package/deps/librdkafka/tests/0069-consumer_add_parts.c +119 -0
  361. package/deps/librdkafka/tests/0070-null_empty.cpp +197 -0
  362. package/deps/librdkafka/tests/0072-headers_ut.c +448 -0
  363. package/deps/librdkafka/tests/0073-headers.c +381 -0
  364. package/deps/librdkafka/tests/0074-producev.c +87 -0
  365. package/deps/librdkafka/tests/0075-retry.c +290 -0
  366. package/deps/librdkafka/tests/0076-produce_retry.c +452 -0
  367. package/deps/librdkafka/tests/0077-compaction.c +366 -0
  368. package/deps/librdkafka/tests/0078-c_from_cpp.cpp +96 -0
  369. package/deps/librdkafka/tests/0079-fork.c +93 -0
  370. package/deps/librdkafka/tests/0080-admin_ut.c +3095 -0
  371. package/deps/librdkafka/tests/0081-admin.c +5633 -0
  372. package/deps/librdkafka/tests/0082-fetch_max_bytes.cpp +137 -0
  373. package/deps/librdkafka/tests/0083-cb_event.c +233 -0
  374. package/deps/librdkafka/tests/0084-destroy_flags.c +208 -0
  375. package/deps/librdkafka/tests/0085-headers.cpp +392 -0
  376. package/deps/librdkafka/tests/0086-purge.c +368 -0
  377. package/deps/librdkafka/tests/0088-produce_metadata_timeout.c +162 -0
  378. package/deps/librdkafka/tests/0089-max_poll_interval.c +511 -0
  379. package/deps/librdkafka/tests/0090-idempotence.c +171 -0
  380. package/deps/librdkafka/tests/0091-max_poll_interval_timeout.c +295 -0
  381. package/deps/librdkafka/tests/0092-mixed_msgver.c +103 -0
  382. package/deps/librdkafka/tests/0093-holb.c +200 -0
  383. package/deps/librdkafka/tests/0094-idempotence_msg_timeout.c +231 -0
  384. package/deps/librdkafka/tests/0095-all_brokers_down.cpp +122 -0
  385. package/deps/librdkafka/tests/0097-ssl_verify.cpp +674 -0
  386. package/deps/librdkafka/tests/0098-consumer-txn.cpp +1218 -0
  387. package/deps/librdkafka/tests/0099-commit_metadata.c +194 -0
  388. package/deps/librdkafka/tests/0100-thread_interceptors.cpp +195 -0
  389. package/deps/librdkafka/tests/0101-fetch-from-follower.cpp +446 -0
  390. package/deps/librdkafka/tests/0102-static_group_rebalance.c +836 -0
  391. package/deps/librdkafka/tests/0103-transactions.c +1383 -0
  392. package/deps/librdkafka/tests/0104-fetch_from_follower_mock.c +625 -0
  393. package/deps/librdkafka/tests/0105-transactions_mock.c +3930 -0
  394. package/deps/librdkafka/tests/0106-cgrp_sess_timeout.c +318 -0
  395. package/deps/librdkafka/tests/0107-topic_recreate.c +259 -0
  396. package/deps/librdkafka/tests/0109-auto_create_topics.cpp +278 -0
  397. package/deps/librdkafka/tests/0110-batch_size.cpp +182 -0
  398. package/deps/librdkafka/tests/0111-delay_create_topics.cpp +127 -0
  399. package/deps/librdkafka/tests/0112-assign_unknown_part.c +87 -0
  400. package/deps/librdkafka/tests/0113-cooperative_rebalance.cpp +3473 -0
  401. package/deps/librdkafka/tests/0114-sticky_partitioning.cpp +176 -0
  402. package/deps/librdkafka/tests/0115-producer_auth.cpp +182 -0
  403. package/deps/librdkafka/tests/0116-kafkaconsumer_close.cpp +216 -0
  404. package/deps/librdkafka/tests/0117-mock_errors.c +331 -0
  405. package/deps/librdkafka/tests/0118-commit_rebalance.c +154 -0
  406. package/deps/librdkafka/tests/0119-consumer_auth.cpp +167 -0
  407. package/deps/librdkafka/tests/0120-asymmetric_subscription.c +185 -0
  408. package/deps/librdkafka/tests/0121-clusterid.c +115 -0
  409. package/deps/librdkafka/tests/0122-buffer_cleaning_after_rebalance.c +227 -0
  410. package/deps/librdkafka/tests/0123-connections_max_idle.c +98 -0
  411. package/deps/librdkafka/tests/0124-openssl_invalid_engine.c +69 -0
  412. package/deps/librdkafka/tests/0125-immediate_flush.c +144 -0
  413. package/deps/librdkafka/tests/0126-oauthbearer_oidc.c +1164 -0
  414. package/deps/librdkafka/tests/0127-fetch_queue_backoff.cpp +165 -0
  415. package/deps/librdkafka/tests/0128-sasl_callback_queue.cpp +217 -0
  416. package/deps/librdkafka/tests/0129-fetch_aborted_msgs.c +79 -0
  417. package/deps/librdkafka/tests/0130-store_offsets.c +178 -0
  418. package/deps/librdkafka/tests/0131-connect_timeout.c +81 -0
  419. package/deps/librdkafka/tests/0132-strategy_ordering.c +179 -0
  420. package/deps/librdkafka/tests/0133-ssl_keys.c +150 -0
  421. package/deps/librdkafka/tests/0134-ssl_provider.c +92 -0
  422. package/deps/librdkafka/tests/0135-sasl_credentials.cpp +279 -0
  423. package/deps/librdkafka/tests/0136-resolve_cb.c +181 -0
  424. package/deps/librdkafka/tests/0137-barrier_batch_consume.c +752 -0
  425. package/deps/librdkafka/tests/0138-admin_mock.c +281 -0
  426. package/deps/librdkafka/tests/0139-offset_validation_mock.c +950 -0
  427. package/deps/librdkafka/tests/0140-commit_metadata.cpp +108 -0
  428. package/deps/librdkafka/tests/0142-reauthentication.c +931 -0
  429. package/deps/librdkafka/tests/0143-exponential_backoff_mock.c +552 -0
  430. package/deps/librdkafka/tests/0144-idempotence_mock.c +373 -0
  431. package/deps/librdkafka/tests/0145-pause_resume_mock.c +119 -0
  432. package/deps/librdkafka/tests/0146-metadata_mock.c +505 -0
  433. package/deps/librdkafka/tests/0147-consumer_group_consumer_mock.c +1210 -0
  434. package/deps/librdkafka/tests/0148-offset_fetch_commit_error_mock.c +569 -0
  435. package/deps/librdkafka/tests/0149-broker-same-host-port.c +140 -0
  436. package/deps/librdkafka/tests/0150-telemetry_mock.c +651 -0
  437. package/deps/librdkafka/tests/0151-purge-brokers.c +566 -0
  438. package/deps/librdkafka/tests/0152-rebootstrap.c +59 -0
  439. package/deps/librdkafka/tests/0153-memberid.c +128 -0
  440. package/deps/librdkafka/tests/0155-share_group_heartbeat_mock.c +2695 -0
  441. package/deps/librdkafka/tests/0156-share_consumer_fetch_mock.c +1551 -0
  442. package/deps/librdkafka/tests/0157-share_consumer_ack_mock.c +1788 -0
  443. package/deps/librdkafka/tests/0158-share_consumer_transactions_mock.c +467 -0
  444. package/deps/librdkafka/tests/0170-share_consumer_subscription.c +2192 -0
  445. package/deps/librdkafka/tests/0171-share_consumer_consume.c +2150 -0
  446. package/deps/librdkafka/tests/0172-share_consumer_acknowledge.c +1919 -0
  447. package/deps/librdkafka/tests/0173-share_consumer_commit_async.c +2735 -0
  448. package/deps/librdkafka/tests/0174-share_consumer_concurrency.c +1434 -0
  449. package/deps/librdkafka/tests/0175-share_consumer_groups.c +574 -0
  450. package/deps/librdkafka/tests/0176-share_consumer_commit_sync.c +2986 -0
  451. package/deps/librdkafka/tests/0177-share_consumer_transactions.c +1815 -0
  452. package/deps/librdkafka/tests/0178-share_consumer_close.c +2102 -0
  453. package/deps/librdkafka/tests/0179-share_consumer_destroy.c +2482 -0
  454. package/deps/librdkafka/tests/0180-share_consumer_config.c +1677 -0
  455. package/deps/librdkafka/tests/0181-share_consumer_topic_delete.c +354 -0
  456. package/deps/librdkafka/tests/0182-share_consumer_error_handling_mock.c +3358 -0
  457. package/deps/librdkafka/tests/0183-share_consumer_leader_change_mock.c +1234 -0
  458. package/deps/librdkafka/tests/0184-share_consumer_topic_recreate.c +1356 -0
  459. package/deps/librdkafka/tests/0185-share_consumer_max_poll_interval.c +557 -0
  460. package/deps/librdkafka/tests/0186-share_consumer_fatal_error.c +360 -0
  461. package/deps/librdkafka/tests/0190-share_consumer_telemetry.c +387 -0
  462. package/deps/librdkafka/tests/1000-unktopic.c +164 -0
  463. package/deps/librdkafka/tests/8000-idle.cpp +60 -0
  464. package/deps/librdkafka/tests/8001-fetch_from_follower_mock_manual.c +113 -0
  465. package/deps/librdkafka/tests/CMakeLists.txt +193 -0
  466. package/deps/librdkafka/tests/LibrdkafkaTestApp.py +291 -0
  467. package/deps/librdkafka/tests/Makefile +182 -0
  468. package/deps/librdkafka/tests/README.md +514 -0
  469. package/deps/librdkafka/tests/autotest.sh +33 -0
  470. package/deps/librdkafka/tests/backtrace.gdb +30 -0
  471. package/deps/librdkafka/tests/broker_version_tests.py +315 -0
  472. package/deps/librdkafka/tests/buildbox.sh +17 -0
  473. package/deps/librdkafka/tests/cleanup-checker-tests.sh +20 -0
  474. package/deps/librdkafka/tests/cluster_testing.py +203 -0
  475. package/deps/librdkafka/tests/delete-test-topics.sh +56 -0
  476. package/deps/librdkafka/tests/fixtures/oauthbearer/jwt_assertion_template.json +10 -0
  477. package/deps/librdkafka/tests/fixtures/ssl/Makefile +8 -0
  478. package/deps/librdkafka/tests/fixtures/ssl/README.md +13 -0
  479. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.intermediate.p12 +0 -0
  480. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.p12 +0 -0
  481. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.intermediate.pem +72 -0
  482. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.pem +50 -0
  483. package/deps/librdkafka/tests/fixtures/ssl/client2.intermediate.key +46 -0
  484. package/deps/librdkafka/tests/fixtures/ssl/client2.key +46 -0
  485. package/deps/librdkafka/tests/fixtures/ssl/create_keys.sh +168 -0
  486. package/deps/librdkafka/tests/fuzzers/Makefile +12 -0
  487. package/deps/librdkafka/tests/fuzzers/README.md +31 -0
  488. package/deps/librdkafka/tests/fuzzers/fuzz_regex.c +74 -0
  489. package/deps/librdkafka/tests/fuzzers/helpers.h +90 -0
  490. package/deps/librdkafka/tests/gen-ssl-certs.sh +165 -0
  491. package/deps/librdkafka/tests/interactive_broker_version.py +170 -0
  492. package/deps/librdkafka/tests/interceptor_test/CMakeLists.txt +16 -0
  493. package/deps/librdkafka/tests/interceptor_test/Makefile +22 -0
  494. package/deps/librdkafka/tests/interceptor_test/interceptor_test.c +314 -0
  495. package/deps/librdkafka/tests/interceptor_test/interceptor_test.h +54 -0
  496. package/deps/librdkafka/tests/java/IncrementalRebalanceCli.java +97 -0
  497. package/deps/librdkafka/tests/java/Makefile +13 -0
  498. package/deps/librdkafka/tests/java/Murmur2Cli.java +46 -0
  499. package/deps/librdkafka/tests/java/README.md +14 -0
  500. package/deps/librdkafka/tests/java/TransactionProducerCli.java +162 -0
  501. package/deps/librdkafka/tests/java/run-class.sh +11 -0
  502. package/deps/librdkafka/tests/librdkafka.suppressions +483 -0
  503. package/deps/librdkafka/tests/lz4_manual_test.sh +59 -0
  504. package/deps/librdkafka/tests/multi-broker-version-test.sh +50 -0
  505. package/deps/librdkafka/tests/parse-refcnt.sh +43 -0
  506. package/deps/librdkafka/tests/performance_plot.py +115 -0
  507. package/deps/librdkafka/tests/plugin_test/Makefile +19 -0
  508. package/deps/librdkafka/tests/plugin_test/plugin_test.c +58 -0
  509. package/deps/librdkafka/tests/requirements.txt +2 -0
  510. package/deps/librdkafka/tests/run-all-tests.sh +81 -0
  511. package/deps/librdkafka/tests/run-consumer-tests.sh +16 -0
  512. package/deps/librdkafka/tests/run-producer-tests.sh +16 -0
  513. package/deps/librdkafka/tests/run-test-batches.py +157 -0
  514. package/deps/librdkafka/tests/run-test.sh +141 -0
  515. package/deps/librdkafka/tests/rusage.c +249 -0
  516. package/deps/librdkafka/tests/sasl_test.py +289 -0
  517. package/deps/librdkafka/tests/scenarios/README.md +6 -0
  518. package/deps/librdkafka/tests/scenarios/ak23.json +6 -0
  519. package/deps/librdkafka/tests/scenarios/default.json +5 -0
  520. package/deps/librdkafka/tests/scenarios/noautocreate.json +5 -0
  521. package/deps/librdkafka/tests/share_telemetry_verify/share-otel-collector-config.yaml +28 -0
  522. package/deps/librdkafka/tests/sockem.c +801 -0
  523. package/deps/librdkafka/tests/sockem.h +85 -0
  524. package/deps/librdkafka/tests/sockem_ctrl.c +145 -0
  525. package/deps/librdkafka/tests/sockem_ctrl.h +61 -0
  526. package/deps/librdkafka/tests/test.c +8376 -0
  527. package/deps/librdkafka/tests/test.conf.example +27 -0
  528. package/deps/librdkafka/tests/test.h +1150 -0
  529. package/deps/librdkafka/tests/testcpp.cpp +131 -0
  530. package/deps/librdkafka/tests/testcpp.h +388 -0
  531. package/deps/librdkafka/tests/testshared.h +416 -0
  532. package/deps/librdkafka/tests/tools/README.md +4 -0
  533. package/deps/librdkafka/tests/tools/stats/README.md +21 -0
  534. package/deps/librdkafka/tests/tools/stats/filter.jq +42 -0
  535. package/deps/librdkafka/tests/tools/stats/graph.py +150 -0
  536. package/deps/librdkafka/tests/tools/stats/requirements.txt +3 -0
  537. package/deps/librdkafka/tests/tools/stats/to_csv.py +124 -0
  538. package/deps/librdkafka/tests/trivup/trivup-0.15.0.tar.gz +0 -0
  539. package/deps/librdkafka/tests/until-fail.sh +87 -0
  540. package/deps/librdkafka/tests/xxxx-assign_partition.c +122 -0
  541. package/deps/librdkafka/tests/xxxx-metadata.cpp +159 -0
  542. package/deps/librdkafka/vcpkg.json +23 -0
  543. package/deps/librdkafka/win32/README.md +5 -0
  544. package/deps/librdkafka/win32/build-package.bat +3 -0
  545. package/deps/librdkafka/win32/build.bat +19 -0
  546. package/deps/librdkafka/win32/common.vcxproj +84 -0
  547. package/deps/librdkafka/win32/interceptor_test/interceptor_test.vcxproj +87 -0
  548. package/deps/librdkafka/win32/librdkafka.autopkg.template +54 -0
  549. package/deps/librdkafka/win32/librdkafka.master.testing.targets +13 -0
  550. package/deps/librdkafka/win32/librdkafka.sln +226 -0
  551. package/deps/librdkafka/win32/librdkafka.vcxproj +282 -0
  552. package/deps/librdkafka/win32/librdkafkacpp/librdkafkacpp.vcxproj +104 -0
  553. package/deps/librdkafka/win32/msbuild.ps1 +58 -0
  554. package/deps/librdkafka/win32/openssl_engine_example/openssl_engine_example.vcxproj +132 -0
  555. package/deps/librdkafka/win32/package-zip.ps1 +46 -0
  556. package/deps/librdkafka/win32/packages/repositories.config +4 -0
  557. package/deps/librdkafka/win32/push-package.bat +4 -0
  558. package/deps/librdkafka/win32/rdkafka_complex_consumer_example_cpp/rdkafka_complex_consumer_example_cpp.vcxproj +67 -0
  559. package/deps/librdkafka/win32/rdkafka_example/rdkafka_example.vcxproj +97 -0
  560. package/deps/librdkafka/win32/rdkafka_performance/rdkafka_performance.vcxproj +97 -0
  561. package/deps/librdkafka/win32/setup-msys2.ps1 +47 -0
  562. package/deps/librdkafka/win32/setup-vcpkg.ps1 +34 -0
  563. package/deps/librdkafka/win32/tests/test.conf.example +25 -0
  564. package/deps/librdkafka/win32/tests/tests.vcxproj +278 -0
  565. package/deps/librdkafka/win32/win_ssl_cert_store/win_ssl_cert_store.vcxproj +132 -0
  566. package/deps/librdkafka/win32/wingetopt.c +564 -0
  567. package/deps/librdkafka/win32/wingetopt.h +101 -0
  568. package/deps/librdkafka/win32/wintime.h +33 -0
  569. package/deps/librdkafka.gyp +83 -0
  570. package/deps/windows-install.py +80 -0
  571. package/index.d.ts +3 -0
  572. package/lib/admin.js +732 -0
  573. package/lib/client.js +679 -0
  574. package/lib/error.js +501 -0
  575. package/lib/index.js +8 -0
  576. package/lib/kafka-consumer-stream.js +399 -0
  577. package/lib/kafka-consumer.js +798 -0
  578. package/lib/kafkajs/_admin.js +1052 -0
  579. package/lib/kafkajs/_common.js +887 -0
  580. package/lib/kafkajs/_consumer.js +2156 -0
  581. package/lib/kafkajs/_consumer_cache.js +310 -0
  582. package/lib/kafkajs/_error.js +298 -0
  583. package/lib/kafkajs/_kafka.js +125 -0
  584. package/lib/kafkajs/_linked-list.js +220 -0
  585. package/lib/kafkajs/_producer.js +863 -0
  586. package/lib/kafkajs/index.js +5 -0
  587. package/lib/producer/high-level-producer.js +400 -0
  588. package/lib/producer-stream.js +337 -0
  589. package/lib/producer.js +405 -0
  590. package/lib/rdkafka.js +44 -0
  591. package/lib/tools/ref-counter.js +53 -0
  592. package/lib/topic-partition.js +91 -0
  593. package/lib/topic.js +43 -0
  594. package/lib/util.js +55 -0
  595. package/librdkafka.js +12 -0
  596. package/package.json +85 -0
  597. package/shim/source_location +54 -0
  598. package/src/admin.cc +1597 -0
  599. package/src/admin.h +112 -0
  600. package/src/binding.cc +76 -0
  601. package/src/binding.h +25 -0
  602. package/src/callbacks.cc +676 -0
  603. package/src/callbacks.h +302 -0
  604. package/src/common.cc +1628 -0
  605. package/src/common.h +192 -0
  606. package/src/config.cc +219 -0
  607. package/src/config.h +61 -0
  608. package/src/connection.cc +703 -0
  609. package/src/connection.h +117 -0
  610. package/src/errors.cc +119 -0
  611. package/src/errors.h +60 -0
  612. package/src/kafka-consumer.cc +1539 -0
  613. package/src/kafka-consumer.h +147 -0
  614. package/src/producer.cc +917 -0
  615. package/src/producer.h +124 -0
  616. package/src/topic.cc +173 -0
  617. package/src/topic.h +54 -0
  618. package/src/workers.cc +1714 -0
  619. package/src/workers.h +690 -0
  620. package/types/config.d.ts +1269 -0
  621. package/types/errors.d.ts +373 -0
  622. package/types/kafkajs.d.ts +568 -0
  623. package/types/rdkafka.d.ts +571 -0
  624. package/util/configure.js +32 -0
  625. package/util/generate-docs.sh +18 -0
  626. package/util/get-env.js +6 -0
  627. package/util/test-compile.js +11 -0
  628. package/util/test-producer-delivery.js +100 -0
@@ -0,0 +1,1505 @@
1
+ /*
2
+ * librdkafka - Apache Kafka C library
3
+ *
4
+ * Copyright (c) 2012-2022, Magnus Edenhill
5
+ * 2023, Confluent Inc.
6
+ * All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions are met:
10
+ *
11
+ * 1. Redistributions of source code must retain the above copyright notice,
12
+ * this list of conditions and the following disclaimer.
13
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
14
+ * this list of conditions and the following disclaimer in the documentation
15
+ * and/or other materials provided with the distribution.
16
+ *
17
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
+ * POSSIBILITY OF SUCH DAMAGE.
28
+ */
29
+
30
+ #ifndef _RDKAFKA_INT_H_
31
+ #define _RDKAFKA_INT_H_
32
+
33
+ #ifndef _WIN32
34
+ #define _GNU_SOURCE /* for strndup() */
35
+ #endif
36
+
37
+ #ifdef _MSC_VER
38
+ typedef int mode_t;
39
+ #endif
40
+
41
+ #include <fcntl.h>
42
+
43
+
44
+ #include "rdsysqueue.h"
45
+
46
+ #include "rdkafka.h"
47
+ #include "rd.h"
48
+ #include "rdlog.h"
49
+ #include "rdtime.h"
50
+ #include "rdaddr.h"
51
+ #include "rdinterval.h"
52
+ #include "rdavg.h"
53
+ #include "rdlist.h"
54
+
55
+ #if WITH_SSL
56
+ #include <openssl/ssl.h>
57
+ #endif
58
+
59
+
60
+
61
+ #define rd_kafka_assert(rk, cond) \
62
+ do { \
63
+ if (unlikely(!(cond))) \
64
+ rd_kafka_crash(__FILE__, __LINE__, __FUNCTION__, (rk), \
65
+ "assert: " #cond); \
66
+ } while (0)
67
+
68
+
69
+ void RD_NORETURN rd_kafka_crash(const char *file,
70
+ int line,
71
+ const char *function,
72
+ rd_kafka_t *rk,
73
+ const char *reason);
74
+
75
+
76
+ /* Forward declarations */
77
+ struct rd_kafka_s;
78
+ struct rd_kafka_topic_s;
79
+ struct rd_kafka_msg_s;
80
+ struct rd_kafka_broker_s;
81
+ struct rd_kafka_toppar_s;
82
+ typedef struct rd_kafka_metadata_internal_s rd_kafka_metadata_internal_t;
83
+ typedef struct rd_kafka_toppar_s rd_kafka_toppar_t;
84
+ typedef struct rd_kafka_lwtopic_s rd_kafka_lwtopic_t;
85
+
86
+
87
+ /**
88
+ * Protocol level sanity
89
+ */
90
+ #define RD_KAFKAP_BROKERS_MAX 10000
91
+ #define RD_KAFKAP_TOPICS_MAX 1000000
92
+ #define RD_KAFKAP_PARTITIONS_MAX 100000
93
+
94
+
95
+ #define RD_KAFKA_OFFSET_IS_LOGICAL(OFF) ((OFF) < 0)
96
+
97
+ /**
98
+ * TODO KIP-932: Remove the check of RD_KAFKA_CONSUMER. Only
99
+ * checking for is_share_consumer should be sufficient.
100
+ */
101
+ #define RD_KAFKA_IS_SHARE_CONSUMER(rk) \
102
+ ((rk)->rk_type == RD_KAFKA_CONSUMER && \
103
+ (rk)->rk_conf.share.is_share_consumer)
104
+
105
+ /**
106
+ * @struct Represents a fetch position:
107
+ * an offset and an partition leader epoch (if known, else -1).
108
+ */
109
+ typedef struct rd_kafka_fetch_pos_s {
110
+ int64_t offset;
111
+ int32_t leader_epoch;
112
+ rd_bool_t validated;
113
+ } rd_kafka_fetch_pos_t;
114
+
115
+
116
+
117
+ #include "rdkafka_op.h"
118
+ #include "rdkafka_queue.h"
119
+ #include "rdkafka_msg.h"
120
+ #include "rdkafka_proto.h"
121
+ #include "rdkafka_buf.h"
122
+ #include "rdkafka_pattern.h"
123
+ #include "rdkafka_conf.h"
124
+ #include "rdkafka_transport.h"
125
+ #include "rdkafka_timer.h"
126
+ #include "rdkafka_assignor.h"
127
+ #include "rdkafka_metadata.h"
128
+ #include "rdkafka_mock.h"
129
+ #include "rdkafka_partition.h"
130
+ #include "rdkafka_assignment.h"
131
+ #include "rdkafka_coord.h"
132
+ #include "rdkafka_mock.h"
133
+
134
+ /**
135
+ * Protocol level sanity
136
+ */
137
+ #define RD_KAFKAP_BROKERS_MAX 10000
138
+ #define RD_KAFKAP_TOPICS_MAX 1000000
139
+ #define RD_KAFKAP_PARTITIONS_MAX 100000
140
+ #define RD_KAFKAP_GROUPS_MAX 100000
141
+ #define RD_KAFKAP_CONFIGS_MAX 10000
142
+ #define RD_KAFKAP_ABORTED_TRANSACTIONS_MAX 1000000
143
+
144
+ #define RD_KAFKA_OFFSET_IS_LOGICAL(OFF) ((OFF) < 0)
145
+
146
+
147
+
148
+ /**
149
+ * @enum Idempotent Producer state
150
+ */
151
+ typedef enum {
152
+ RD_KAFKA_IDEMP_STATE_INIT, /**< Initial state */
153
+ RD_KAFKA_IDEMP_STATE_TERM, /**< Instance is terminating */
154
+ RD_KAFKA_IDEMP_STATE_FATAL_ERROR, /**< A fatal error has been raised */
155
+ RD_KAFKA_IDEMP_STATE_REQ_PID, /**< Request new PID */
156
+ RD_KAFKA_IDEMP_STATE_WAIT_TRANSPORT, /**< Waiting for coordinator to
157
+ * become available. */
158
+ RD_KAFKA_IDEMP_STATE_WAIT_PID, /**< PID requested, waiting for reply */
159
+ RD_KAFKA_IDEMP_STATE_ASSIGNED, /**< New PID assigned */
160
+ RD_KAFKA_IDEMP_STATE_DRAIN_RESET, /**< Wait for outstanding
161
+ * ProduceRequests to finish
162
+ * before resetting and
163
+ * re-requesting a new PID. */
164
+ RD_KAFKA_IDEMP_STATE_DRAIN_BUMP, /**< Wait for outstanding
165
+ * ProduceRequests to finish
166
+ * before bumping the current
167
+ * epoch. */
168
+ RD_KAFKA_IDEMP_STATE_WAIT_TXN_ABORT, /**< Wait for transaction abort
169
+ * to finish and trigger a
170
+ * drain and reset or bump. */
171
+ } rd_kafka_idemp_state_t;
172
+
173
+ /**
174
+ * @returns the idemp_state_t string representation
175
+ */
176
+ static RD_UNUSED const char *
177
+ rd_kafka_idemp_state2str(rd_kafka_idemp_state_t state) {
178
+ static const char *names[] = {
179
+ "Init", "Terminate", "FatalError", "RequestPID", "WaitTransport",
180
+ "WaitPID", "Assigned", "DrainReset", "DrainBump", "WaitTxnAbort"};
181
+ return names[state];
182
+ }
183
+
184
+
185
+
186
+ /**
187
+ * @enum Transactional Producer state
188
+ */
189
+ typedef enum {
190
+ /**< Initial state */
191
+ RD_KAFKA_TXN_STATE_INIT,
192
+ /**< Awaiting PID to be acquired by rdkafka_idempotence.c */
193
+ RD_KAFKA_TXN_STATE_WAIT_PID,
194
+ /**< PID acquired, but application has not made a successful
195
+ * init_transactions() call. */
196
+ RD_KAFKA_TXN_STATE_READY_NOT_ACKED,
197
+ /**< PID acquired, no active transaction. */
198
+ RD_KAFKA_TXN_STATE_READY,
199
+ /**< begin_transaction() has been called. */
200
+ RD_KAFKA_TXN_STATE_IN_TRANSACTION,
201
+ /**< commit_transaction() has been called. */
202
+ RD_KAFKA_TXN_STATE_BEGIN_COMMIT,
203
+ /**< commit_transaction() has been called and all outstanding
204
+ * messages, partitions, and offsets have been sent. */
205
+ RD_KAFKA_TXN_STATE_COMMITTING_TRANSACTION,
206
+ /**< Transaction successfully committed but application has not made
207
+ * a successful commit_transaction() call yet. */
208
+ RD_KAFKA_TXN_STATE_COMMIT_NOT_ACKED,
209
+ /**< begin_transaction() has been called. */
210
+ RD_KAFKA_TXN_STATE_BEGIN_ABORT,
211
+ /**< abort_transaction() has been called. */
212
+ RD_KAFKA_TXN_STATE_ABORTING_TRANSACTION,
213
+ /**< Transaction successfully aborted but application has not made
214
+ * a successful abort_transaction() call yet. */
215
+ RD_KAFKA_TXN_STATE_ABORT_NOT_ACKED,
216
+ /**< An abortable error has occurred. */
217
+ RD_KAFKA_TXN_STATE_ABORTABLE_ERROR,
218
+ /* A fatal error has occured. */
219
+ RD_KAFKA_TXN_STATE_FATAL_ERROR
220
+ } rd_kafka_txn_state_t;
221
+
222
+
223
+ /**
224
+ * @returns the txn_state_t string representation
225
+ */
226
+ static RD_UNUSED const char *
227
+ rd_kafka_txn_state2str(rd_kafka_txn_state_t state) {
228
+ static const char *names[] = {"Init",
229
+ "WaitPID",
230
+ "ReadyNotAcked",
231
+ "Ready",
232
+ "InTransaction",
233
+ "BeginCommit",
234
+ "CommittingTransaction",
235
+ "CommitNotAcked",
236
+ "BeginAbort",
237
+ "AbortingTransaction",
238
+ "AbortedNotAcked",
239
+ "AbortableError",
240
+ "FatalError"};
241
+ return names[state];
242
+ }
243
+
244
+ /**
245
+ * @enum Telemetry States
246
+ */
247
+ typedef enum {
248
+ /** Initial state, awaiting telemetry broker to be assigned */
249
+ RD_KAFKA_TELEMETRY_AWAIT_BROKER,
250
+ /** Telemetry broker assigned and GetSubscriptions scheduled */
251
+ RD_KAFKA_TELEMETRY_GET_SUBSCRIPTIONS_SCHEDULED,
252
+ /** GetSubscriptions request sent to the assigned broker */
253
+ RD_KAFKA_TELEMETRY_GET_SUBSCRIPTIONS_SENT,
254
+ /** PushTelemetry scheduled to send */
255
+ RD_KAFKA_TELEMETRY_PUSH_SCHEDULED,
256
+ /** PushTelemetry sent to the assigned broker */
257
+ RD_KAFKA_TELEMETRY_PUSH_SENT,
258
+ /** Client is being terminated and last PushTelemetry is scheduled to
259
+ * send */
260
+ RD_KAFKA_TELEMETRY_TERMINATING_PUSH_SCHEDULED,
261
+ /** Client is being terminated and last PushTelemetry is sent */
262
+ RD_KAFKA_TELEMETRY_TERMINATING_PUSH_SENT,
263
+ /** Telemetry is terminated */
264
+ RD_KAFKA_TELEMETRY_TERMINATED,
265
+ } rd_kafka_telemetry_state_t;
266
+
267
+
268
+ static RD_UNUSED const char *
269
+ rd_kafka_telemetry_state2str(rd_kafka_telemetry_state_t state) {
270
+ static const char *names[] = {"AwaitBroker",
271
+ "GetSubscriptionsScheduled",
272
+ "GetSubscriptionsSent",
273
+ "PushScheduled",
274
+ "PushSent",
275
+ "TerminatingPushScheduled",
276
+ "TerminatingPushSent",
277
+ "Terminated"};
278
+ return names[state];
279
+ }
280
+
281
+ static RD_UNUSED const char *rd_kafka_type2str(rd_kafka_type_t type) {
282
+ static const char *types[] = {
283
+ [RD_KAFKA_PRODUCER] = "producer",
284
+ [RD_KAFKA_CONSUMER] = "consumer",
285
+ };
286
+ return types[type];
287
+ }
288
+
289
+ /**
290
+ * Kafka handle, internal representation of the application's rd_kafka_t.
291
+ */
292
+
293
+ struct rd_kafka_s {
294
+ rd_kafka_q_t *rk_rep; /* kafka -> application reply queue */
295
+ rd_kafka_q_t *rk_ops; /* any -> rdkafka main thread ops */
296
+
297
+ TAILQ_HEAD(, rd_kafka_broker_s) rk_brokers;
298
+ rd_list_t rk_broker_by_id; /* Fast id lookups. */
299
+ rd_atomic32_t rk_broker_cnt;
300
+ /** Logical brokers count.
301
+ * Used for calculating ERR__ALL_BROKERS_DOWN. */
302
+ rd_atomic32_t rk_logical_broker_cnt;
303
+ /** Number of configured or learned brokers in state >= UP */
304
+ rd_atomic32_t rk_broker_up_cnt;
305
+ /** Number of brokers that are down, only includes brokers
306
+ * that have had at least one connection attempt
307
+ * and are configured or learned. */
308
+ rd_atomic32_t rk_broker_down_cnt;
309
+ /** Set to 1 when there's a re-bootstrap in progress.
310
+ * Set to 0 when the re-bootstrap is done.
311
+ * Accessed from the main thread and the broker threads. */
312
+ rd_atomic32_t rk_rebootstrap_in_progress;
313
+
314
+ /**< Additional bootstrap servers list.
315
+ * contains all brokers added through rd_kafka_brokers_add().
316
+ * Doesn't contain the initially configured bootstrap brokers. */
317
+ rd_list_t additional_brokerlists;
318
+
319
+ /** Decommissioned threads to await */
320
+ rd_list_t wait_decommissioned_thrds;
321
+ /** Decommissioned brokers to await */
322
+ rd_list_t wait_decommissioned_brokers;
323
+
324
+ mtx_t rk_internal_rkb_lock;
325
+ rd_kafka_broker_t *rk_internal_rkb;
326
+
327
+ /* Broadcasting of broker state changes to wake up
328
+ * functions waiting for a state change. */
329
+ cnd_t rk_broker_state_change_cnd;
330
+ mtx_t rk_broker_state_change_lock;
331
+ int rk_broker_state_change_version;
332
+ /* List of (rd_kafka_enq_once_t*) objects waiting for broker
333
+ * state changes. Protected by rk_broker_state_change_lock. */
334
+ rd_list_t rk_broker_state_change_waiters; /**< (rd_kafka_enq_once_t*) */
335
+
336
+ TAILQ_HEAD(, rd_kafka_topic_s) rk_topics;
337
+ int rk_topic_cnt;
338
+
339
+ struct rd_kafka_cgrp_s *rk_cgrp;
340
+
341
+ rd_kafka_share_t
342
+ *rk_rkshare; /**< Share consumer handle (if share
343
+ * consumer), NULL otherwise.
344
+ * Set when rd_kafka_share_consumer_new()
345
+ * is called, used to access inflight
346
+ * acks for building ack batches. */
347
+
348
+ /** Share consumer state. Only used when this rd_kafka_t handle
349
+ * is a share consumer (rk_rkshare != NULL). */
350
+ /**
351
+ * TODO KIP-932: Change to rk_share when interface is finalized.
352
+ */
353
+ struct {
354
+ /** Runtime acknowledgement callback set via
355
+ * rd_kafka_share_set_acknowledgement_commit_cb().
356
+ * @locality APP THREAD ONLY (set in
357
+ * set_share_acknowledgement_commit_cb).
358
+ */
359
+ void (*share_acknowledgement_commit_cb)(
360
+ rd_kafka_share_t *rkshare,
361
+ rd_kafka_share_partition_offsets_list_t *partitions,
362
+ rd_kafka_resp_err_t err,
363
+ void *opaque);
364
+
365
+ /** Application opaque for acknowledgement callback.
366
+ * @locality APP THREAD ONLY. */
367
+ void *acknowledgement_commit_cb_opaque;
368
+
369
+ /** Reentrancy protection flag - set to true when inside
370
+ * callback.
371
+ * @locality APP THREAD ONLY. */
372
+ rd_bool_t in_callback;
373
+
374
+ /** Registration flag - whether callback is currently
375
+ * registered.
376
+ * Written via RD_KAFKA_OP_SHARE_ACK_COMMIT_CB_REGISTER op
377
+ * handler. Used by main thread to decide whether to
378
+ * enqueue callback ops.
379
+ * @locality MAIN THREAD ONLY. */
380
+ rd_bool_t acknowledgement_commit_cb_registered;
381
+
382
+ /** Single-thread access gate with re-entrant ownership.
383
+ *
384
+ * Every public share consumer API calls
385
+ * rd_kafka_share_acquire() on entry and
386
+ * rd_kafka_share_release() before returning.
387
+ * The owning thread is recorded in
388
+ * @c current_owner_thread; concurrent entry from a
389
+ * different thread is rejected with
390
+ * RD_KAFKA_RESP_ERR__CONFLICT. The owning thread may
391
+ * re-enter (e.g. nested share calls), with @c ref_count
392
+ * tracking the nesting level — ownership is released
393
+ * only when @c ref_count returns to 0.
394
+ *
395
+ * @c current_owner_thread holds a real per-thread
396
+ * identifier from thrd_current_id()
397
+ * (GetCurrentThreadId() on Windows, pthread_self()
398
+ * elsewhere); the unowned sentinel is
399
+ * RD_KAFKA_SHARE_NO_CURRENT_THREAD (-1) — a value no real
400
+ * thread id can take on any supported platform. 0 is
401
+ * deliberately *not* the sentinel so a missing init
402
+ * doesn't silently look "unowned" (a zero-initialised
403
+ * struct will fail acquire with __CONFLICT instead of
404
+ * letting two threads both pass through). The acquire
405
+ * path uses rd_atomic64_cas() so the
406
+ * first-caller-wins transition is race-free. */
407
+ rd_atomic64_t current_owner_thread; /**< Owning thread id; -1 =
408
+ unowned. */
409
+ rd_atomic32_t
410
+ ref_count; /**< Re-entrancy count for the owner. */
411
+ } rk_share_consumer;
412
+
413
+ rd_kafka_conf_t rk_conf;
414
+ rd_kafka_q_t *rk_logq; /* Log queue if `log.queue` set */
415
+ char rk_name[128];
416
+ rd_kafkap_str_t *rk_client_id;
417
+ rd_kafkap_str_t *rk_group_id; /* Consumer group id */
418
+
419
+ rd_atomic32_t rk_terminate; /**< Set to RD_KAFKA_DESTROY_F_..
420
+ * flags instance
421
+ * is being destroyed.
422
+ * The value set is the
423
+ * destroy flags from
424
+ * rd_kafka_destroy*() and
425
+ * the two internal flags shown
426
+ * below.
427
+ *
428
+ * Order:
429
+ * 1. user_flags | .._F_DESTROY_CALLED
430
+ * is set in rd_kafka_destroy*().
431
+ * 2. consumer_close() is called
432
+ * for consumers.
433
+ * 3. .._F_TERMINATE is set to
434
+ * signal all background threads
435
+ * to terminate.
436
+ */
437
+
438
+ #define RD_KAFKA_DESTROY_F_TERMINATE \
439
+ 0x1 /**< Internal flag to make sure \
440
+ * rk_terminate is set to non-zero \
441
+ * value even if user passed \
442
+ * no destroy flags. */
443
+ #define RD_KAFKA_DESTROY_F_DESTROY_CALLED \
444
+ 0x2 /**< Application has called \
445
+ * ..destroy*() and we've \
446
+ * begun the termination \
447
+ * process. \
448
+ * This flag is needed to avoid \
449
+ * rk_terminate from being \
450
+ * 0 when destroy_flags() \
451
+ * is called with flags=0 \
452
+ * and prior to _F_TERMINATE \
453
+ * has been set. */
454
+ #define RD_KAFKA_DESTROY_F_IMMEDIATE \
455
+ 0x4 /**< Immediate non-blocking \
456
+ * destruction without waiting \
457
+ * for all resources \
458
+ * to be cleaned up. \
459
+ * WARNING: Memory and resource \
460
+ * leaks possible. \
461
+ * This flag automatically sets \
462
+ * .._NO_CONSUMER_CLOSE. */
463
+
464
+
465
+ rwlock_t rk_lock;
466
+ rd_kafka_type_t rk_type;
467
+ struct timeval rk_tv_state_change;
468
+
469
+ rd_atomic64_t rk_ts_last_poll; /**< Timestamp of last application
470
+ * consumer_poll() call
471
+ * (or equivalent).
472
+ * Used to enforce
473
+ * max.poll.interval.ms.
474
+ * Set to INT64_MAX while polling
475
+ * to avoid reaching
476
+ * max.poll.interval.ms. during that time
477
+ * frame. Only relevant for consumer. */
478
+
479
+ /* First fatal error. */
480
+ struct {
481
+ rd_atomic32_t err; /**< rd_kafka_resp_err_t */
482
+ char *errstr; /**< Protected by rk_lock */
483
+ int cnt; /**< Number of errors raised, only
484
+ * the first one is stored. */
485
+ } rk_fatal;
486
+
487
+ rd_atomic32_t rk_last_throttle; /* Last throttle_time_ms value
488
+ * from broker. */
489
+
490
+ /* Locks: rd_kafka_*lock() */
491
+ rd_ts_t rk_ts_metadata; /* Timestamp of most recent
492
+ * metadata. */
493
+
494
+ rd_ts_t rk_ts_full_metadata; /* Timestamp of most
495
+ * recent full
496
+ * metadata */
497
+ struct rd_kafka_metadata_cache rk_metadata_cache; /* Metadata cache */
498
+
499
+ char *rk_clusterid; /* ClusterId from metadata */
500
+ int32_t rk_controllerid; /* ControllerId from metadata */
501
+
502
+ /**< Producer: Delivery report mode */
503
+ enum {
504
+ RD_KAFKA_DR_MODE_NONE, /**< No delivery reports */
505
+ RD_KAFKA_DR_MODE_CB, /**< Delivery reports through callback */
506
+ RD_KAFKA_DR_MODE_EVENT, /**< Delivery reports through event
507
+ API*/
508
+ } rk_drmode;
509
+
510
+ /* Simple consumer count:
511
+ * >0: Running in legacy / Simple Consumer mode,
512
+ * 0: No consumers running
513
+ * <0: Running in High level consumer mode */
514
+ rd_atomic32_t rk_simple_cnt;
515
+
516
+ /**
517
+ * Exactly Once Semantics and Idempotent Producer
518
+ *
519
+ * @locks rk_lock
520
+ */
521
+ struct {
522
+ /*
523
+ * Idempotence
524
+ */
525
+ rd_kafka_idemp_state_t idemp_state; /**< Idempotent Producer
526
+ * state */
527
+ rd_ts_t ts_idemp_state; /**< Last state change */
528
+ rd_kafka_pid_t pid; /**< Current Producer ID and Epoch */
529
+ int epoch_cnt; /**< Number of times pid/epoch changed */
530
+ rd_atomic32_t inflight_toppar_cnt; /**< Current number of
531
+ * toppars with inflight
532
+ * requests. */
533
+ rd_kafka_timer_t pid_tmr; /**< PID FSM timer */
534
+
535
+ /*
536
+ * Transactions
537
+ *
538
+ * All field access is from the rdkafka main thread,
539
+ * unless a specific lock is mentioned in the doc string.
540
+ *
541
+ */
542
+ rd_atomic32_t txn_may_enq; /**< Transaction state allows
543
+ * application to enqueue
544
+ * (produce) messages. */
545
+
546
+ rd_kafkap_str_t *transactional_id; /**< transactional.id */
547
+ rd_kafka_txn_state_t txn_state; /**< Transactional state.
548
+ * @locks rk_lock */
549
+ rd_ts_t ts_txn_state; /**< Last state change.
550
+ * @locks rk_lock */
551
+ rd_kafka_broker_t *txn_coord; /**< Transaction coordinator,
552
+ * this is a logical broker.*/
553
+ rd_kafka_broker_t *txn_curr_coord; /**< Current actual coord
554
+ * broker.
555
+ * This is only used to
556
+ * check if the coord
557
+ * changes. */
558
+ rd_kafka_broker_monitor_t txn_coord_mon; /**< Monitor for
559
+ * coordinator to
560
+ * take action when
561
+ * the broker state
562
+ * changes. */
563
+ rd_bool_t txn_requires_epoch_bump; /**< Coordinator epoch bump
564
+ * required to recover from
565
+ * idempotent producer
566
+ * fatal error. */
567
+
568
+ /**< Blocking transactional API application call
569
+ * currently being handled, its state, reply queue and how
570
+ * to handle timeout.
571
+ * Only one transactional API call is allowed at any time.
572
+ * Protected by the rk_lock. */
573
+ struct {
574
+ char name[64]; /**< API name, e.g.,
575
+ * send_offsets_to_transaction.
576
+ * This is used to make sure
577
+ * conflicting APIs are not
578
+ * called simultaneously. */
579
+ rd_bool_t calling; /**< API is being actively called.
580
+ * I.e., application is blocking
581
+ * on a txn API call.
582
+ * This is used to make sure
583
+ * no concurrent API calls are
584
+ * being made. */
585
+ rd_kafka_error_t *error; /**< Last error from background
586
+ * processing. This is only
587
+ * set if the application's
588
+ * API call timed out.
589
+ * It will be returned on
590
+ * the next call. */
591
+ rd_bool_t has_result; /**< Indicates whether an API
592
+ * result (possibly
593
+ * intermediate) has been set.
594
+ */
595
+ cnd_t cnd; /**< Application thread will
596
+ * block on this cnd waiting
597
+ * for a result to be set. */
598
+ mtx_t lock; /**< Protects all fields of
599
+ * txn_curr_api. */
600
+ } txn_curr_api;
601
+
602
+
603
+ int txn_req_cnt; /**< Number of transaction
604
+ * requests sent.
605
+ * This is incremented when a
606
+ * AddPartitionsToTxn or
607
+ * AddOffsetsToTxn request
608
+ * has been sent for the
609
+ * current transaction,
610
+ * to keep track of
611
+ * whether the broker is
612
+ * aware of the current
613
+ * transaction and thus
614
+ * requires an EndTxn request
615
+ * on abort or not. */
616
+
617
+ /**< Timer to trigger registration of pending partitions */
618
+ rd_kafka_timer_t txn_register_parts_tmr;
619
+
620
+ /**< Lock for txn_pending_rktps and txn_waitresp_rktps */
621
+ mtx_t txn_pending_lock;
622
+
623
+ /**< Partitions pending being added to transaction. */
624
+ rd_kafka_toppar_tqhead_t txn_pending_rktps;
625
+
626
+ /**< Partitions in-flight added to transaction. */
627
+ rd_kafka_toppar_tqhead_t txn_waitresp_rktps;
628
+
629
+ /**< Partitions added and registered to transaction. */
630
+ rd_kafka_toppar_tqhead_t txn_rktps;
631
+
632
+ /**< Number of messages that failed delivery.
633
+ * If this number is >0 on transaction_commit then an
634
+ * abortable transaction error will be raised.
635
+ * Is reset to zero on each begin_transaction(). */
636
+ rd_atomic64_t txn_dr_fails;
637
+
638
+ /**< Current transaction error. */
639
+ rd_kafka_resp_err_t txn_err;
640
+
641
+ /**< Current transaction error string, if any. */
642
+ char *txn_errstr;
643
+
644
+ /**< Last InitProducerIdRequest error. */
645
+ rd_kafka_resp_err_t txn_init_err;
646
+
647
+ /**< Waiting for transaction coordinator query response */
648
+ rd_bool_t txn_wait_coord;
649
+
650
+ /**< Transaction coordinator query timer */
651
+ rd_kafka_timer_t txn_coord_tmr;
652
+ } rk_eos;
653
+
654
+ rd_atomic32_t rk_flushing; /**< Application is calling flush(). */
655
+
656
+ /**
657
+ * Consumer state
658
+ *
659
+ * @locality rdkafka main thread
660
+ * @locks_required none
661
+ */
662
+ struct {
663
+ /** Application consumer queue for messages, events and errors.
664
+ * (typically points to rkcg_q) */
665
+ rd_kafka_q_t *q;
666
+ /** Current assigned partitions through assign() et.al. */
667
+ rd_kafka_assignment_t assignment;
668
+ /** Waiting for this number of commits to finish. */
669
+ int wait_commit_cnt;
670
+ } rk_consumer;
671
+
672
+ /**<
673
+ * Coordinator cache.
674
+ *
675
+ * @locks none
676
+ * @locality rdkafka main thread
677
+ */
678
+ rd_kafka_coord_cache_t rk_coord_cache; /**< Coordinator cache */
679
+
680
+ TAILQ_HEAD(, rd_kafka_coord_req_s)
681
+ rk_coord_reqs; /**< Coordinator
682
+ * requests */
683
+
684
+
685
+ struct {
686
+ mtx_t lock; /* Protects acces to this struct */
687
+ cnd_t cnd; /* For waking up blocking injectors */
688
+ unsigned int cnt; /* Current message count */
689
+ size_t size; /* Current message size sum */
690
+ unsigned int max_cnt; /* Max limit */
691
+ size_t max_size; /* Max limit */
692
+ } rk_curr_msgs;
693
+
694
+ rd_kafka_timers_t rk_timers;
695
+
696
+ /** Metadata refresh timer */
697
+ rd_kafka_timer_t metadata_refresh_tmr;
698
+ /** 1s interval timer */
699
+ rd_kafka_timer_t one_s_tmr;
700
+ /** Rebootstrap timer.
701
+ * Will add bootstrap brokers again
702
+ * when it's fired. */
703
+ rd_kafka_timer_t rebootstrap_tmr;
704
+
705
+ thrd_t rk_thread;
706
+
707
+ int rk_initialized; /**< Will be > 0 when the rd_kafka_t
708
+ * instance has been fully initialized. */
709
+
710
+ int rk_init_wait_cnt; /**< Number of background threads that
711
+ * need to finish initialization. */
712
+ cnd_t rk_init_cnd; /**< Cond-var used to wait for main thread
713
+ * to finish its initialization before
714
+ * before rd_kafka_new() returns. */
715
+ mtx_t rk_init_lock; /**< Lock for rk_init_wait and _cmd */
716
+
717
+ rd_ts_t rk_ts_created; /**< Timestamp (monotonic clock) of
718
+ * rd_kafka_t creation. */
719
+
720
+ /**
721
+ * Background thread and queue,
722
+ * enabled by setting `background_event_cb()`.
723
+ */
724
+ struct {
725
+ rd_kafka_q_t *q; /**< Queue served by background thread. */
726
+ thrd_t thread; /**< Background thread. */
727
+ int calling; /**< Indicates whether the event callback
728
+ * is being called, reset back to 0
729
+ * when the callback returns.
730
+ * This can be used for troubleshooting
731
+ * purposes. */
732
+ } rk_background;
733
+
734
+
735
+ /*
736
+ * Logs, events or actions to rate limit / suppress
737
+ */
738
+ struct {
739
+ /**< Log: No brokers support Idempotent Producer */
740
+ rd_interval_t no_idemp_brokers;
741
+
742
+ /**< Sparse connections: randomly select broker
743
+ * to bring up. This interval should allow
744
+ * for a previous connection to be established,
745
+ * which varies between different environments:
746
+ * Use 10 < reconnect.backoff.jitter.ms / 2 < 1000.
747
+ */
748
+ rd_interval_t sparse_connect_random;
749
+
750
+ /** Sparse connection timer: fires after remaining time of
751
+ * `sparse_connect_random` interval + 1ms.
752
+ */
753
+ rd_kafka_timer_t sparse_connect_random_tmr;
754
+
755
+ /**< Lock for sparse_connect_random */
756
+ mtx_t sparse_connect_lock;
757
+
758
+ /**< Broker metadata refresh interval:
759
+ * this is rate-limiting the number of topic-less
760
+ * broker/cluster metadata refreshes when there are no
761
+ * topics to refresh.
762
+ * Will be refreshed every topic.metadata.refresh.interval.ms
763
+ * but no more often than every 10s.
764
+ * No locks: only accessed by rdkafka main thread. */
765
+ rd_interval_t broker_metadata_refresh;
766
+
767
+ /**< Suppression for allow.auto.create.topics=false not being
768
+ * supported by the broker. */
769
+ rd_interval_t allow_auto_create_topics;
770
+ } rk_suppress;
771
+
772
+ struct {
773
+ void *handle; /**< Provider-specific handle struct pointer.
774
+ * Typically assigned in provider's .init() */
775
+ rd_kafka_q_t *callback_q; /**< SASL callback queue, if any. */
776
+ } rk_sasl;
777
+
778
+ struct {
779
+ /* Fields for the control flow - unless guarded by lock, only
780
+ * accessed from main thread. */
781
+ /**< Current state of the telemetry state machine. */
782
+ rd_kafka_telemetry_state_t state;
783
+ /**< Preferred broker for sending telemetry (Lock protected). */
784
+ rd_kafka_broker_t *preferred_broker;
785
+ /**< Timer for all the requests we schedule. */
786
+ rd_kafka_timer_t request_timer;
787
+ /**< Lock for preferred telemetry broker and state. */
788
+ mtx_t lock;
789
+ /**< Used to wait for termination (Lock protected). */
790
+ cnd_t termination_cnd;
791
+
792
+ /* Fields obtained from broker as a result of GetSubscriptions -
793
+ * only accessed from main thread.
794
+ */
795
+ rd_kafka_Uuid_t client_instance_id;
796
+ int32_t subscription_id;
797
+ rd_kafka_compression_t *accepted_compression_types;
798
+ size_t accepted_compression_types_cnt;
799
+ int32_t push_interval_ms;
800
+ int32_t telemetry_max_bytes;
801
+ rd_bool_t delta_temporality;
802
+ char **requested_metrics;
803
+ size_t requested_metrics_cnt;
804
+ /* TODO: Use rd_list_t to store the metrics */
805
+ int *matched_metrics;
806
+ size_t matched_metrics_cnt;
807
+
808
+ struct {
809
+ rd_ts_t ts_last; /**< Timestamp of last push */
810
+ rd_ts_t ts_start; /**< Timestamp from when collection
811
+ * started */
812
+ /** Total rebalance latency (ms) up to previous push */
813
+ uint64_t rebalance_latency_total;
814
+ /** Total share fetch requests up to previous push */
815
+ int64_t share_fetch_total;
816
+ /** Total share bytes consumed up to previous push */
817
+ int64_t share_bytes_consumed_total;
818
+ /** Total acknowledgements sent up to previous push */
819
+ int64_t acknowledgements_send_total;
820
+ /** Total ShareGroupHeartbeat responses up to previous
821
+ * push */
822
+ int64_t heartbeat_total;
823
+ } rk_historic_c;
824
+
825
+ struct {
826
+ rd_avg_t rk_avg_poll_idle_ratio;
827
+ rd_avg_t rk_avg_commit_latency; /**< Current commit
828
+ * latency avg */
829
+ rd_avg_t
830
+ rk_avg_rebalance_latency; /**< Current rebalance
831
+ * latency avg */
832
+ rd_avg_t rk_avg_share_poll_idle_ratio;
833
+ rd_avg_t
834
+ rk_avg_share_time_between_poll; /**< Current time
835
+ between two
836
+ share_consume_batch
837
+ */
838
+ } rd_avg_current;
839
+
840
+ struct {
841
+ rd_avg_t rk_avg_poll_idle_ratio;
842
+ rd_avg_t rk_avg_commit_latency; /**< Rolled over commit
843
+ * latency avg */
844
+ rd_avg_t
845
+ rk_avg_rebalance_latency; /**< Rolled over rebalance
846
+ * latency avg */
847
+ rd_avg_t rk_avg_share_poll_idle_ratio;
848
+ rd_avg_t
849
+ rk_avg_share_time_between_poll; /**< Rolled over
850
+ time between two
851
+ share_consume_batch
852
+ */
853
+ } rd_avg_rollover;
854
+
855
+ /* Share consumer poll/batch tracking */
856
+ struct {
857
+ rd_ts_t ts_last_poll_start;
858
+ rd_ts_t ts_poll_start;
859
+ rd_ts_t time_since_last_poll;
860
+ } rk_share_poll;
861
+
862
+ /* Share consumer fetch-RPC counter */
863
+ rd_atomic64_t share_fetch_total;
864
+
865
+ /* Share consumer total bytes consumed */
866
+ rd_atomic64_t share_bytes_consumed_total;
867
+
868
+ /* Share consumer record-level acknowledgements sent counter */
869
+ rd_atomic64_t acknowledgements_send_total;
870
+
871
+ /* Share consumer ShareGroupHeartbeat response counter */
872
+ rd_atomic64_t heartbeat_total;
873
+ } rk_telemetry;
874
+
875
+ /* Test mocks */
876
+ struct {
877
+ rd_kafka_mock_cluster_t *cluster; /**< Mock cluster, created
878
+ * by test.mock.num.brokers
879
+ */
880
+ rd_atomic32_t cluster_cnt; /**< Total number of mock
881
+ * clusters, created either
882
+ * through
883
+ * test.mock.num.brokers
884
+ * or mock_cluster_new().
885
+ */
886
+
887
+ } rk_mock;
888
+ };
889
+
890
+ /**
891
+ * @brief Map type for tracking inflight share acknowledgements.
892
+ * Key: topic-partition, Value: ack batches for that partition.
893
+ */
894
+ typedef RD_MAP_TYPE(const rd_kafka_topic_partition_t *,
895
+ rd_kafka_share_ack_batches_t *)
896
+ rd_kafka_share_inflight_map_t;
897
+
898
+ struct rd_kafka_share_s {
899
+ rd_kafka_t *rkshare_rk; /**< The shared rd_kafka_t instance */
900
+
901
+ /**
902
+ * TODO KIP-932: Decide whether we want to keep this here
903
+ * or move it in rd_kafka_t.
904
+ */
905
+ /** Map of inflight acknowledgements per topic-partition.
906
+ * Key: rd_kafka_topic_partition_t*
907
+ * Value: rd_kafka_share_ack_batches_t*
908
+ */
909
+ rd_kafka_share_inflight_map_t rkshare_inflight_acks;
910
+
911
+ /** Total number of unacknowledged messages across all partitions. */
912
+ int64_t rkshare_unacked_cnt;
913
+
914
+ /** Set when a FANOUT with fetch_more_records=true is sent.
915
+ * Reset when records are received in the consumer queue.
916
+ * Prevents duplicate fetch FANOUTs while one is in flight. */
917
+ rd_bool_t rkshare_fetch_more_records_requested;
918
+
919
+ /**
920
+ * Set to true when the consumer is closing. Will be used to:
921
+ * * prevent any new API call from the app.
922
+ * * check if SHARE_FETCH_RESPONSE is received to poll_cb only
923
+ * while closing
924
+ */
925
+ rd_bool_t rkshare_consumer_closing;
926
+
927
+ /** True when the consumer has an active subscription (i.e.
928
+ * rd_kafka_share_subscribe() succeeded with a non-empty list
929
+ * and rd_kafka_share_unsubscribe() has not been called since).
930
+ * Written only on the app thread under rkshare_acquire/release;
931
+ * read only in consume_batch while the same lock is held.
932
+ * @locality app thread */
933
+ rd_bool_t rkshare_subscribed;
934
+ };
935
+
936
+ /**
937
+ * @brief Opaque message list returned by rd_kafka_share_poll().
938
+ *
939
+ * The struct is allocated as a flexible array sized to the exact message
940
+ * count returned by a single poll. The caller releases the list and all
941
+ * contained messages via rd_kafka_messages_destroy().
942
+ */
943
+ /**
944
+ * TODO KIP-932: GA: Fix this to use FAM with message struct not
945
+ * pointer to messages.
946
+ */
947
+ struct rd_kafka_messages_s {
948
+ size_t cnt; /**< Number of messages. */
949
+ rd_kafka_message_t *elems[]; /**< Message pointer array. */
950
+ };
951
+
952
+ rd_kafka_messages_t *rd_kafka_messages_new(size_t cnt);
953
+
954
+ #define rd_kafka_wrlock(rk) rwlock_wrlock(&(rk)->rk_lock)
955
+ #define rd_kafka_rdlock(rk) rwlock_rdlock(&(rk)->rk_lock)
956
+ #define rd_kafka_rdunlock(rk) rwlock_rdunlock(&(rk)->rk_lock)
957
+ #define rd_kafka_wrunlock(rk) rwlock_wrunlock(&(rk)->rk_lock)
958
+
959
+
960
+ /**
961
+ * @brief Add \p cnt messages and of total size \p size bytes to the
962
+ * internal bookkeeping of current message counts.
963
+ * If the total message count or size after add would exceed the
964
+ * configured limits \c queue.buffering.max.messages and
965
+ * \c queue.buffering.max.kbytes then depending on the value of
966
+ * \p block the function either blocks until enough space is available
967
+ * if \p block is 1, else immediately returns
968
+ * RD_KAFKA_RESP_ERR__QUEUE_FULL.
969
+ *
970
+ * @param rdmtx If non-null and \p block is set and blocking is to ensue,
971
+ * then unlock this mutex for the duration of the blocking
972
+ * and then reacquire with a read-lock.
973
+ */
974
+ static RD_INLINE RD_UNUSED rd_kafka_resp_err_t
975
+ rd_kafka_curr_msgs_add(rd_kafka_t *rk,
976
+ unsigned int cnt,
977
+ size_t size,
978
+ int block,
979
+ rwlock_t *rdlock) {
980
+
981
+ if (rk->rk_type != RD_KAFKA_PRODUCER)
982
+ return RD_KAFKA_RESP_ERR_NO_ERROR;
983
+
984
+ mtx_lock(&rk->rk_curr_msgs.lock);
985
+ while (
986
+ unlikely((rk->rk_curr_msgs.max_cnt > 0 &&
987
+ rk->rk_curr_msgs.cnt + cnt > rk->rk_curr_msgs.max_cnt) ||
988
+ (unsigned long long)(rk->rk_curr_msgs.size + size) >
989
+ (unsigned long long)rk->rk_curr_msgs.max_size)) {
990
+ if (!block) {
991
+ mtx_unlock(&rk->rk_curr_msgs.lock);
992
+ return RD_KAFKA_RESP_ERR__QUEUE_FULL;
993
+ }
994
+
995
+ if (rdlock)
996
+ rwlock_rdunlock(rdlock);
997
+
998
+ cnd_wait(&rk->rk_curr_msgs.cnd, &rk->rk_curr_msgs.lock);
999
+
1000
+ if (rdlock)
1001
+ rwlock_rdlock(rdlock);
1002
+ }
1003
+
1004
+ rk->rk_curr_msgs.cnt += cnt;
1005
+ rk->rk_curr_msgs.size += size;
1006
+ mtx_unlock(&rk->rk_curr_msgs.lock);
1007
+
1008
+ return RD_KAFKA_RESP_ERR_NO_ERROR;
1009
+ }
1010
+
1011
+
1012
+ /**
1013
+ * @brief Subtract \p cnt messages of total size \p size from the
1014
+ * current bookkeeping and broadcast a wakeup on the condvar
1015
+ * for any waiting & blocking threads.
1016
+ */
1017
+ static RD_INLINE RD_UNUSED void
1018
+ rd_kafka_curr_msgs_sub(rd_kafka_t *rk, unsigned int cnt, size_t size) {
1019
+ int broadcast = 0;
1020
+
1021
+ if (rk->rk_type != RD_KAFKA_PRODUCER)
1022
+ return;
1023
+
1024
+ mtx_lock(&rk->rk_curr_msgs.lock);
1025
+ rd_kafka_assert(NULL, rk->rk_curr_msgs.cnt >= cnt &&
1026
+ rk->rk_curr_msgs.size >= size);
1027
+
1028
+ /* If the subtraction would pass one of the thresholds
1029
+ * broadcast a wake-up to any waiting listeners. */
1030
+ if ((rk->rk_curr_msgs.cnt - cnt == 0) ||
1031
+ (rk->rk_curr_msgs.cnt >= rk->rk_curr_msgs.max_cnt &&
1032
+ rk->rk_curr_msgs.cnt - cnt < rk->rk_curr_msgs.max_cnt) ||
1033
+ (rk->rk_curr_msgs.size >= rk->rk_curr_msgs.max_size &&
1034
+ rk->rk_curr_msgs.size - size < rk->rk_curr_msgs.max_size))
1035
+ broadcast = 1;
1036
+
1037
+ rk->rk_curr_msgs.cnt -= cnt;
1038
+ rk->rk_curr_msgs.size -= size;
1039
+
1040
+ if (unlikely(broadcast))
1041
+ cnd_broadcast(&rk->rk_curr_msgs.cnd);
1042
+
1043
+ mtx_unlock(&rk->rk_curr_msgs.lock);
1044
+ }
1045
+
1046
+ static RD_INLINE RD_UNUSED void
1047
+ rd_kafka_curr_msgs_get(rd_kafka_t *rk, unsigned int *cntp, size_t *sizep) {
1048
+ if (rk->rk_type != RD_KAFKA_PRODUCER) {
1049
+ *cntp = 0;
1050
+ *sizep = 0;
1051
+ return;
1052
+ }
1053
+
1054
+ mtx_lock(&rk->rk_curr_msgs.lock);
1055
+ *cntp = rk->rk_curr_msgs.cnt;
1056
+ *sizep = rk->rk_curr_msgs.size;
1057
+ mtx_unlock(&rk->rk_curr_msgs.lock);
1058
+ }
1059
+
1060
+ static RD_INLINE RD_UNUSED int rd_kafka_curr_msgs_cnt(rd_kafka_t *rk) {
1061
+ int cnt;
1062
+ if (rk->rk_type != RD_KAFKA_PRODUCER)
1063
+ return 0;
1064
+
1065
+ mtx_lock(&rk->rk_curr_msgs.lock);
1066
+ cnt = rk->rk_curr_msgs.cnt;
1067
+ mtx_unlock(&rk->rk_curr_msgs.lock);
1068
+
1069
+ return cnt;
1070
+ }
1071
+
1072
+ /**
1073
+ * @brief Wait until \p tspec for curr_msgs to reach 0.
1074
+ *
1075
+ * @returns rd_true if zero is reached, or rd_false on timeout.
1076
+ * The remaining messages are returned in \p *curr_msgsp
1077
+ */
1078
+ static RD_INLINE RD_UNUSED rd_bool_t
1079
+ rd_kafka_curr_msgs_wait_zero(rd_kafka_t *rk,
1080
+ int timeout_ms,
1081
+ unsigned int *curr_msgsp) {
1082
+ unsigned int cnt;
1083
+ rd_ts_t abs_timeout = rd_timeout_init(timeout_ms);
1084
+
1085
+ mtx_lock(&rk->rk_curr_msgs.lock);
1086
+ while ((cnt = rk->rk_curr_msgs.cnt) > 0) {
1087
+ if (cnd_timedwait_abs(&rk->rk_curr_msgs.cnd,
1088
+ &rk->rk_curr_msgs.lock,
1089
+ abs_timeout) == thrd_timedout)
1090
+ break;
1091
+ }
1092
+ mtx_unlock(&rk->rk_curr_msgs.lock);
1093
+
1094
+ *curr_msgsp = cnt;
1095
+ return cnt == 0;
1096
+ }
1097
+
1098
+ void rd_kafka_decommissioned_broker_thread_join(rd_kafka_t *rk,
1099
+ void *rkb_decommissioned);
1100
+
1101
+ void rd_kafka_destroy_final(rd_kafka_t *rk);
1102
+
1103
+ void rd_kafka_global_init(void);
1104
+
1105
+ /**
1106
+ * @returns true if \p rk handle is terminating.
1107
+ *
1108
+ * @remark If consumer_close() is called from destroy*() it will be
1109
+ * called prior to _F_TERMINATE being set and will thus not
1110
+ * be able to use rd_kafka_terminating() to know it is shutting down.
1111
+ * That code should instead just check that rk_terminate is non-zero
1112
+ * (the _F_DESTROY_CALLED flag will be set).
1113
+ */
1114
+ #define rd_kafka_terminating(rk) \
1115
+ (rd_atomic32_get(&(rk)->rk_terminate) & RD_KAFKA_DESTROY_F_TERMINATE)
1116
+
1117
+ /**
1118
+ * @returns the destroy flags set matching \p flags, which might be
1119
+ * a subset of the flags.
1120
+ */
1121
+ #define rd_kafka_destroy_flags_check(rk, flags) \
1122
+ (rd_atomic32_get(&(rk)->rk_terminate) & (flags))
1123
+
1124
+ /**
1125
+ * @returns true if no consumer callbacks, or standard consumer_close
1126
+ * behaviour, should be triggered. */
1127
+ #define rd_kafka_destroy_flags_no_consumer_close(rk) \
1128
+ rd_kafka_destroy_flags_check(rk, RD_KAFKA_DESTROY_F_NO_CONSUMER_CLOSE)
1129
+
1130
+ #define rd_kafka_is_simple_consumer(rk) \
1131
+ (rd_atomic32_get(&(rk)->rk_simple_cnt) > 0)
1132
+ int rd_kafka_simple_consumer_add(rd_kafka_t *rk);
1133
+
1134
+
1135
+ /**
1136
+ * @returns true if idempotency is enabled (producer only).
1137
+ */
1138
+ #define rd_kafka_is_idempotent(rk) ((rk)->rk_conf.eos.idempotence)
1139
+
1140
+ /**
1141
+ * @returns true if the producer is transactional (producer only).
1142
+ */
1143
+ #define rd_kafka_is_transactional(rk) \
1144
+ ((rk)->rk_conf.eos.transactional_id != NULL)
1145
+
1146
+
1147
+ #define RD_KAFKA_PURGE_F_ABORT_TXN \
1148
+ 0x100 /**< Internal flag used when \
1149
+ * aborting transaction */
1150
+ #define RD_KAFKA_PURGE_F_MASK 0x107
1151
+ const char *rd_kafka_purge_flags2str(int flags);
1152
+
1153
+
1154
+ #include "rdkafka_topic.h"
1155
+ #include "rdkafka_partition.h"
1156
+
1157
+
1158
+
1159
+ /**
1160
+ * Debug contexts
1161
+ */
1162
+ #define RD_KAFKA_DBG_GENERIC 0x1
1163
+ #define RD_KAFKA_DBG_BROKER 0x2
1164
+ #define RD_KAFKA_DBG_TOPIC 0x4
1165
+ #define RD_KAFKA_DBG_METADATA 0x8
1166
+ #define RD_KAFKA_DBG_FEATURE 0x10
1167
+ #define RD_KAFKA_DBG_QUEUE 0x20
1168
+ #define RD_KAFKA_DBG_MSG 0x40
1169
+ #define RD_KAFKA_DBG_PROTOCOL 0x80
1170
+ #define RD_KAFKA_DBG_CGRP 0x100
1171
+ #define RD_KAFKA_DBG_SECURITY 0x200
1172
+ #define RD_KAFKA_DBG_FETCH 0x400
1173
+ #define RD_KAFKA_DBG_INTERCEPTOR 0x800
1174
+ #define RD_KAFKA_DBG_PLUGIN 0x1000
1175
+ #define RD_KAFKA_DBG_CONSUMER 0x2000
1176
+ #define RD_KAFKA_DBG_ADMIN 0x4000
1177
+ #define RD_KAFKA_DBG_EOS 0x8000
1178
+ #define RD_KAFKA_DBG_MOCK 0x10000
1179
+ #define RD_KAFKA_DBG_ASSIGNOR 0x20000
1180
+ #define RD_KAFKA_DBG_CONF 0x40000
1181
+ #define RD_KAFKA_DBG_TELEMETRY 0x80000
1182
+ #define RD_KAFKA_DBG_ALL 0xfffff
1183
+ #define RD_KAFKA_DBG_NONE 0x0
1184
+
1185
+ /* Jitter Percent for exponential retry backoff */
1186
+ #define RD_KAFKA_RETRY_JITTER_PERCENT 20
1187
+
1188
+ void rd_kafka_log0(const rd_kafka_conf_t *conf,
1189
+ const rd_kafka_t *rk,
1190
+ const char *extra,
1191
+ int level,
1192
+ int ctx,
1193
+ const char *fac,
1194
+ const char *fmt,
1195
+ ...) RD_FORMAT(printf, 7, 8);
1196
+
1197
+ #define rd_kafka_log(rk, level, fac, ...) \
1198
+ rd_kafka_log0(&rk->rk_conf, rk, NULL, level, RD_KAFKA_DBG_NONE, fac, \
1199
+ __VA_ARGS__)
1200
+
1201
+ #define rd_kafka_conf_is_dbg(conf, ctx) \
1202
+ unlikely((conf).debug &(RD_KAFKA_DBG_##ctx))
1203
+
1204
+ #define rd_kafka_is_dbg(rk, ctx) (rd_kafka_conf_is_dbg(rk->rk_conf, ctx))
1205
+
1206
+ #define rd_kafka_dbg(rk, ctx, fac, ...) \
1207
+ do { \
1208
+ if (rd_kafka_is_dbg(rk, ctx)) \
1209
+ rd_kafka_log0(&rk->rk_conf, rk, NULL, LOG_DEBUG, \
1210
+ (RD_KAFKA_DBG_##ctx), fac, __VA_ARGS__); \
1211
+ } while (0)
1212
+
1213
+ /* dbg() not requiring an rk, just the conf object, for early logging */
1214
+ #define rd_kafka_dbg0(conf, ctx, fac, ...) \
1215
+ do { \
1216
+ if (rd_kafka_conf_is_dbg(*conf, ctx)) \
1217
+ rd_kafka_log0(conf, NULL, NULL, LOG_DEBUG, \
1218
+ (RD_KAFKA_DBG_##ctx), fac, __VA_ARGS__); \
1219
+ } while (0)
1220
+
1221
+ /* NOTE: The local copy of _logname is needed due rkb_logname_lock lock-ordering
1222
+ * when logging another broker's name in the message. */
1223
+ #define rd_rkb_log0(rkb, level, ctx, fac, ...) \
1224
+ do { \
1225
+ char _logname[RD_KAFKA_NODENAME_SIZE]; \
1226
+ mtx_lock(&(rkb)->rkb_logname_lock); \
1227
+ rd_strlcpy(_logname, rkb->rkb_logname, sizeof(_logname)); \
1228
+ mtx_unlock(&(rkb)->rkb_logname_lock); \
1229
+ rd_kafka_log0(&(rkb)->rkb_rk->rk_conf, (rkb)->rkb_rk, \
1230
+ _logname, level, ctx, fac, __VA_ARGS__); \
1231
+ } while (0)
1232
+
1233
+ #define rd_rkb_log(rkb, level, fac, ...) \
1234
+ rd_rkb_log0(rkb, level, RD_KAFKA_DBG_NONE, fac, __VA_ARGS__)
1235
+
1236
+ #define rd_rkb_is_dbg(rkb, ctx) rd_kafka_is_dbg((rkb)->rkb_rk, ctx)
1237
+
1238
+ #define rd_rkb_dbg(rkb, ctx, fac, ...) \
1239
+ do { \
1240
+ if (rd_rkb_is_dbg(rkb, ctx)) { \
1241
+ rd_rkb_log0(rkb, LOG_DEBUG, (RD_KAFKA_DBG_##ctx), fac, \
1242
+ __VA_ARGS__); \
1243
+ } \
1244
+ } while (0)
1245
+
1246
+
1247
+
1248
+ extern rd_kafka_resp_err_t RD_TLS rd_kafka_last_error_code;
1249
+
1250
+ static RD_UNUSED RD_INLINE rd_kafka_resp_err_t
1251
+ rd_kafka_set_last_error(rd_kafka_resp_err_t err, int errnox) {
1252
+ if (errnox) {
1253
+ /* MSVC:
1254
+ * This is the correct way to set errno on Windows,
1255
+ * but it is still pointless due to different errnos in
1256
+ * in different runtimes:
1257
+ * https://social.msdn.microsoft.com/Forums/vstudio/en-US/b4500c0d-1b69-40c7-9ef5-08da1025b5bf/setting-errno-from-within-a-dll?forum=vclanguage/
1258
+ * errno is thus highly deprecated, and buggy, on Windows
1259
+ * when using librdkafka as a dynamically loaded DLL. */
1260
+ rd_set_errno(errnox);
1261
+ }
1262
+ rd_kafka_last_error_code = err;
1263
+ return err;
1264
+ }
1265
+
1266
+
1267
+ int rd_kafka_set_fatal_error0(rd_kafka_t *rk,
1268
+ rd_dolock_t do_lock,
1269
+ rd_kafka_resp_err_t err,
1270
+ const char *fmt,
1271
+ ...) RD_FORMAT(printf, 4, 5);
1272
+ #define rd_kafka_set_fatal_error(rk, err, fmt, ...) \
1273
+ rd_kafka_set_fatal_error0(rk, RD_DO_LOCK, err, fmt, __VA_ARGS__)
1274
+
1275
+ rd_kafka_error_t *rd_kafka_get_fatal_error(rd_kafka_t *rk);
1276
+
1277
+ #define rd_kafka_producer_can_have_fatal_errors(rk) \
1278
+ (rk->rk_type == RD_KAFKA_PRODUCER && rk->rk_conf.eos.idempotence)
1279
+
1280
+ #define rd_kafka_consumer_can_have_fatal_errors(rk) \
1281
+ (rk->rk_type == RD_KAFKA_CONSUMER && \
1282
+ (rk->rk_conf.group_instance_id || \
1283
+ rk->rk_conf.group_protocol == RD_KAFKA_GROUP_PROTOCOL_CONSUMER))
1284
+
1285
+ static RD_INLINE RD_UNUSED rd_kafka_resp_err_t
1286
+ rd_kafka_fatal_error_code(rd_kafka_t *rk) {
1287
+ /* This is an optimization to avoid an atomic read which are costly
1288
+ * on some platforms:
1289
+ * Fatal errors are currently raised by:
1290
+ * 1) the idempotent producer
1291
+ * 2) static consumers (group.instance.id)
1292
+ * 3) Group using consumer protocol (Introduced in KIP-848). See exact
1293
+ * errors in rd_kafka_cgrp_handle_ConsumerGroupHeartbeat() */
1294
+ if (rd_kafka_producer_can_have_fatal_errors(rk) ||
1295
+ rd_kafka_consumer_can_have_fatal_errors(rk))
1296
+ return rd_atomic32_get(&rk->rk_fatal.err);
1297
+
1298
+ return RD_KAFKA_RESP_ERR_NO_ERROR;
1299
+ }
1300
+
1301
+
1302
+ extern rd_atomic32_t rd_kafka_thread_cnt_curr;
1303
+ extern char RD_TLS rd_kafka_thread_name[64];
1304
+
1305
+ void rd_kafka_set_thread_name(const char *fmt, ...) RD_FORMAT(printf, 1, 2);
1306
+ void rd_kafka_set_thread_sysname(const char *fmt, ...) RD_FORMAT(printf, 1, 2);
1307
+ void rd_kafka_thread_srand(rd_kafka_t *rk, rd_bool_t internal_thread);
1308
+
1309
+ int rd_kafka_path_is_dir(const char *path);
1310
+ rd_bool_t rd_kafka_dir_is_empty(const char *path);
1311
+
1312
+ rd_kafka_op_res_t rd_kafka_poll_cb(rd_kafka_t *rk,
1313
+ rd_kafka_q_t *rkq,
1314
+ rd_kafka_op_t *rko,
1315
+ rd_kafka_q_cb_type_t cb_type,
1316
+ void *opaque);
1317
+
1318
+ rd_kafka_resp_err_t rd_kafka_subscribe_rkt(rd_kafka_topic_t *rkt);
1319
+
1320
+
1321
+ /**
1322
+ * @returns the number of milliseconds the maximum poll interval
1323
+ * was exceeded, or 0 if not exceeded.
1324
+ *
1325
+ * @remark Only relevant for high-level consumer.
1326
+ *
1327
+ * @locality any
1328
+ * @locks none
1329
+ */
1330
+ static RD_INLINE RD_UNUSED int rd_kafka_max_poll_exceeded(rd_kafka_t *rk) {
1331
+ rd_ts_t last_poll;
1332
+ int exceeded;
1333
+
1334
+ if (rk->rk_type != RD_KAFKA_CONSUMER)
1335
+ return 0;
1336
+
1337
+ last_poll = rd_atomic64_get(&rk->rk_ts_last_poll);
1338
+
1339
+ /* Application is blocked in librdkafka function, see
1340
+ * rd_kafka_app_poll_start(). */
1341
+ if (last_poll == INT64_MAX)
1342
+ return 0;
1343
+
1344
+ exceeded = (int)((rd_clock() - last_poll) / 1000ll) -
1345
+ rk->rk_conf.max_poll_interval_ms;
1346
+
1347
+ if (unlikely(exceeded > 0))
1348
+ return exceeded;
1349
+
1350
+ return 0;
1351
+ }
1352
+
1353
+ /**
1354
+ * @brief Call on entry to blocking polling function to indicate
1355
+ * that the application is blocked waiting for librdkafka
1356
+ * and that max.poll.interval.ms should not be enforced.
1357
+ *
1358
+ * Call app_polled() Upon return from the function calling
1359
+ * this function to register the application's last time of poll.
1360
+ *
1361
+ * @remark Only relevant for high-level consumer.
1362
+ *
1363
+ * @locality any
1364
+ * @locks none
1365
+ */
1366
+ static RD_INLINE RD_UNUSED void rd_kafka_app_poll_start(rd_kafka_t *rk,
1367
+ rd_kafka_q_t *rkq,
1368
+ rd_ts_t now,
1369
+ rd_bool_t is_blocking) {
1370
+ if (rk->rk_type != RD_KAFKA_CONSUMER || RD_KAFKA_IS_SHARE_CONSUMER(rk))
1371
+ return;
1372
+
1373
+ if (!now)
1374
+ now = rd_clock();
1375
+ if (is_blocking)
1376
+ rd_atomic64_set(&rk->rk_ts_last_poll, INT64_MAX);
1377
+ if (rkq->rkq_ts_last_poll_end) {
1378
+ int64_t poll_idle_ratio = 0;
1379
+ rd_ts_t poll_interval = now - rkq->rkq_ts_last_poll_start;
1380
+ if (poll_interval) {
1381
+ rd_ts_t idle_interval = rkq->rkq_ts_last_poll_end -
1382
+ rkq->rkq_ts_last_poll_start;
1383
+ poll_idle_ratio =
1384
+ idle_interval * 1000000 / poll_interval;
1385
+ }
1386
+ rd_avg_add(
1387
+ &rk->rk_telemetry.rd_avg_current.rk_avg_poll_idle_ratio,
1388
+ poll_idle_ratio);
1389
+ rkq->rkq_ts_last_poll_start = now;
1390
+ rkq->rkq_ts_last_poll_end = 0;
1391
+ }
1392
+ }
1393
+
1394
+ /**
1395
+ * @brief Set the last application poll time to now.
1396
+ *
1397
+ * @remark Only relevant for high-level consumer.
1398
+ *
1399
+ * @locality any
1400
+ * @locks none
1401
+ */
1402
+ static RD_INLINE RD_UNUSED void rd_kafka_app_polled(rd_kafka_t *rk,
1403
+ rd_kafka_q_t *rkq) {
1404
+ if (rk->rk_type == RD_KAFKA_CONSUMER &&
1405
+ !RD_KAFKA_IS_SHARE_CONSUMER(rk)) {
1406
+ rd_ts_t now = rd_clock();
1407
+ rd_atomic64_set(&rk->rk_ts_last_poll, now);
1408
+ if (unlikely(rk->rk_cgrp &&
1409
+ rk->rk_cgrp->rkcg_group_protocol ==
1410
+ RD_KAFKA_GROUP_PROTOCOL_CONSUMER &&
1411
+ rk->rk_cgrp->rkcg_flags &
1412
+ RD_KAFKA_CGRP_F_MAX_POLL_EXCEEDED)) {
1413
+ rd_kafka_cgrp_consumer_expedite_next_heartbeat(
1414
+ rk->rk_cgrp,
1415
+ "app polled after poll interval exceeded");
1416
+ }
1417
+ if (!rkq->rkq_ts_last_poll_end)
1418
+ rkq->rkq_ts_last_poll_end = now;
1419
+ rd_dassert(rkq->rkq_ts_last_poll_end >=
1420
+ rkq->rkq_ts_last_poll_start);
1421
+ }
1422
+ }
1423
+
1424
+
1425
+
1426
+ void rd_kafka_term_sig_handler(int sig);
1427
+
1428
+ /**
1429
+ * rdkafka_background.c
1430
+ */
1431
+ int rd_kafka_background_thread_main(void *arg);
1432
+ rd_kafka_resp_err_t rd_kafka_background_thread_create(rd_kafka_t *rk,
1433
+ char *errstr,
1434
+ size_t errstr_size);
1435
+
1436
+ void rd_kafka_rebootstrap(rd_kafka_t *rk);
1437
+
1438
+ void rd_kafka_rebootstrap_tmr_start_maybe(rd_kafka_t *rk);
1439
+
1440
+ int rd_kafka_rebootstrap_tmr_stop(rd_kafka_t *rk);
1441
+
1442
+ void rd_kafka_reset_any_broker_down_reported(rd_kafka_t *rk);
1443
+
1444
+ rd_kafka_op_res_t rd_kafka_share_fetch_fanout_op(rd_kafka_t *rk,
1445
+ rd_kafka_q_t *rkq,
1446
+ rd_kafka_op_t *rko);
1447
+
1448
+ /**
1449
+ * @brief Return an error object if the share consumer is closed or closing.
1450
+ * @returns a newly-allocated error (owned by caller) or NULL if usable.
1451
+ */
1452
+ rd_kafka_error_t *
1453
+ rd_kafka_share_consumer_closed_error(rd_kafka_share_t *rkshare);
1454
+
1455
+ /**
1456
+ * @brief Return a response-error code if the share consumer is closed or
1457
+ * closing.
1458
+ * @returns RD_KAFKA_RESP_ERR__STATE if closed/closing, else
1459
+ * RD_KAFKA_RESP_ERR_NO_ERROR.
1460
+ */
1461
+ rd_kafka_resp_err_t
1462
+ rd_kafka_share_consumer_closed_err(rd_kafka_share_t *rkshare);
1463
+
1464
+ /**
1465
+ * @brief Sentinel value stored in rk_share_consumer.current_owner_thread
1466
+ * when the gate is unowned. Chosen to never collide with a real
1467
+ * thread id on any supported platform. A zero-initialised struct
1468
+ * does NOT look unowned, which is intentional: a missing
1469
+ * init causes acquire to fail with __CONFLICT rather than
1470
+ * silently letting two threads pass.
1471
+ */
1472
+ #define RD_KAFKA_SHARE_NO_CURRENT_THREAD ((int64_t)(-1))
1473
+
1474
+ /**
1475
+ * @brief Acquire single-thread ownership of the share consumer.
1476
+ *
1477
+ * Every public share consumer API must call this on entry and pair
1478
+ * it with rd_kafka_share_release() on every return path. The owning
1479
+ * thread may re-enter (nested share calls bump the ref_count counter
1480
+ * and release decrements it).
1481
+ *
1482
+ * @returns NULL on success, or a newly-allocated rd_kafka_error_t (owned
1483
+ * by the caller) on rejection:
1484
+ * - RD_KAFKA_RESP_ERR__STATE on NULL rkshare, or when called
1485
+ * from inside the user-defined acknowledgement commit
1486
+ * callback.
1487
+ * - RD_KAFKA_RESP_ERR__CONFLICT on concurrent entry from a
1488
+ * different application thread.
1489
+ */
1490
+ rd_kafka_error_t *rd_kafka_share_acquire(rd_kafka_share_t *rkshare);
1491
+
1492
+ /**
1493
+ * @brief Release ownership acquired by rd_kafka_share_acquire().
1494
+ *
1495
+ * Tolerates NULL rkshare (no-op) so error paths can call it
1496
+ * unconditionally.
1497
+ */
1498
+ void rd_kafka_share_release(rd_kafka_share_t *rkshare);
1499
+
1500
+ void rd_kafka_share_enqueue_fetch_op(rd_kafka_t *rk,
1501
+ rd_kafka_broker_t *rkb,
1502
+ rd_bool_t should_fetch,
1503
+ rd_bool_t should_leave);
1504
+
1505
+ #endif /* _RDKAFKA_INT_H_ */