@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,1219 @@
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
+ #include <stdarg.h>
31
+
32
+ #include "rdkafka_int.h"
33
+ #include "rdkafka_op.h"
34
+ #include "rdkafka_topic.h"
35
+ #include "rdkafka_partition.h"
36
+ #include "rdkafka_proto.h"
37
+ #include "rdkafka_offset.h"
38
+ #include "rdkafka_error.h"
39
+ #include "rdkafka_share_acknowledgement.h"
40
+
41
+ /* Current number of rd_kafka_op_t */
42
+ rd_atomic32_t rd_kafka_op_cnt;
43
+
44
+
45
+ const char *rd_kafka_op2str(rd_kafka_op_type_t type) {
46
+ int skiplen = 6;
47
+ static const char *names[RD_KAFKA_OP__END] = {
48
+ [RD_KAFKA_OP_NONE] = "REPLY:NONE",
49
+ [RD_KAFKA_OP_FETCH] = "REPLY:FETCH",
50
+ [RD_KAFKA_OP_ERR] = "REPLY:ERR",
51
+ [RD_KAFKA_OP_CONSUMER_ERR] = "REPLY:CONSUMER_ERR",
52
+ [RD_KAFKA_OP_DR] = "REPLY:DR",
53
+ [RD_KAFKA_OP_STATS] = "REPLY:STATS",
54
+ [RD_KAFKA_OP_OFFSET_COMMIT] = "REPLY:OFFSET_COMMIT",
55
+ [RD_KAFKA_OP_NODE_UPDATE] = "REPLY:NODE_UPDATE",
56
+ [RD_KAFKA_OP_XMIT_BUF] = "REPLY:XMIT_BUF",
57
+ [RD_KAFKA_OP_RECV_BUF] = "REPLY:RECV_BUF",
58
+ [RD_KAFKA_OP_XMIT_RETRY] = "REPLY:XMIT_RETRY",
59
+ [RD_KAFKA_OP_FETCH_START] = "REPLY:FETCH_START",
60
+ [RD_KAFKA_OP_FETCH_STOP] = "REPLY:FETCH_STOP",
61
+ [RD_KAFKA_OP_SEEK] = "REPLY:SEEK",
62
+ [RD_KAFKA_OP_PAUSE] = "REPLY:PAUSE",
63
+ [RD_KAFKA_OP_OFFSET_FETCH] = "REPLY:OFFSET_FETCH",
64
+ [RD_KAFKA_OP_PARTITION_JOIN] = "REPLY:PARTITION_JOIN",
65
+ [RD_KAFKA_OP_PARTITION_LEAVE] = "REPLY:PARTITION_LEAVE",
66
+ [RD_KAFKA_OP_REBALANCE] = "REPLY:REBALANCE",
67
+ [RD_KAFKA_OP_TERMINATE] = "REPLY:TERMINATE",
68
+ [RD_KAFKA_OP_COORD_QUERY] = "REPLY:COORD_QUERY",
69
+ [RD_KAFKA_OP_SUBSCRIBE] = "REPLY:SUBSCRIBE",
70
+ [RD_KAFKA_OP_ASSIGN] = "REPLY:ASSIGN",
71
+ [RD_KAFKA_OP_GET_SUBSCRIPTION] = "REPLY:GET_SUBSCRIPTION",
72
+ [RD_KAFKA_OP_GET_ASSIGNMENT] = "REPLY:GET_ASSIGNMENT",
73
+ [RD_KAFKA_OP_THROTTLE] = "REPLY:THROTTLE",
74
+ [RD_KAFKA_OP_NAME] = "REPLY:NAME",
75
+ [RD_KAFKA_OP_CG_METADATA] = "REPLY:CG_METADATA",
76
+ [RD_KAFKA_OP_OFFSET_RESET] = "REPLY:OFFSET_RESET",
77
+ [RD_KAFKA_OP_METADATA] = "REPLY:METADATA",
78
+ [RD_KAFKA_OP_LOG] = "REPLY:LOG",
79
+ [RD_KAFKA_OP_WAKEUP] = "REPLY:WAKEUP",
80
+ [RD_KAFKA_OP_CREATETOPICS] = "REPLY:CREATETOPICS",
81
+ [RD_KAFKA_OP_DELETETOPICS] = "REPLY:DELETETOPICS",
82
+ [RD_KAFKA_OP_CREATEPARTITIONS] = "REPLY:CREATEPARTITIONS",
83
+ [RD_KAFKA_OP_ALTERCONFIGS] = "REPLY:ALTERCONFIGS",
84
+ [RD_KAFKA_OP_INCREMENTALALTERCONFIGS] =
85
+ "REPLY:INCREMENTALALTERCONFIGS",
86
+ [RD_KAFKA_OP_DESCRIBECONFIGS] = "REPLY:DESCRIBECONFIGS",
87
+ [RD_KAFKA_OP_DELETERECORDS] = "REPLY:DELETERECORDS",
88
+ [RD_KAFKA_OP_LISTCONSUMERGROUPS] = "REPLY:LISTCONSUMERGROUPS",
89
+ [RD_KAFKA_OP_DESCRIBECONSUMERGROUPS] =
90
+ "REPLY:DESCRIBECONSUMERGROUPS",
91
+ [RD_KAFKA_OP_DESCRIBETOPICS] = "REPLY:DESCRIBETOPICS",
92
+ [RD_KAFKA_OP_DESCRIBECLUSTER] = "REPLY:DESCRIBECLUSTER",
93
+ [RD_KAFKA_OP_DELETEGROUPS] = "REPLY:DELETEGROUPS",
94
+ [RD_KAFKA_OP_DELETECONSUMERGROUPOFFSETS] =
95
+ "REPLY:DELETECONSUMERGROUPOFFSETS",
96
+ [RD_KAFKA_OP_CREATEACLS] = "REPLY:CREATEACLS",
97
+ [RD_KAFKA_OP_DESCRIBEACLS] = "REPLY:DESCRIBEACLS",
98
+ [RD_KAFKA_OP_DELETEACLS] = "REPLY:DELETEACLS",
99
+ [RD_KAFKA_OP_ALTERCONSUMERGROUPOFFSETS] =
100
+ "REPLY:ALTERCONSUMERGROUPOFFSETS",
101
+ [RD_KAFKA_OP_LISTCONSUMERGROUPOFFSETS] =
102
+ "REPLY:LISTCONSUMERGROUPOFFSETS",
103
+ [RD_KAFKA_OP_ADMIN_FANOUT] = "REPLY:ADMIN_FANOUT",
104
+ [RD_KAFKA_OP_ADMIN_RESULT] = "REPLY:ADMIN_RESULT",
105
+ [RD_KAFKA_OP_PURGE] = "REPLY:PURGE",
106
+ [RD_KAFKA_OP_CONNECT] = "REPLY:CONNECT",
107
+ [RD_KAFKA_OP_OAUTHBEARER_REFRESH] = "REPLY:OAUTHBEARER_REFRESH",
108
+ [RD_KAFKA_OP_MOCK] = "REPLY:MOCK",
109
+ [RD_KAFKA_OP_BROKER_MONITOR] = "REPLY:BROKER_MONITOR",
110
+ [RD_KAFKA_OP_TXN] = "REPLY:TXN",
111
+ [RD_KAFKA_OP_GET_REBALANCE_PROTOCOL] =
112
+ "REPLY:GET_REBALANCE_PROTOCOL",
113
+ [RD_KAFKA_OP_LEADERS] = "REPLY:LEADERS",
114
+ [RD_KAFKA_OP_BARRIER] = "REPLY:BARRIER",
115
+ [RD_KAFKA_OP_SASL_REAUTH] = "REPLY:SASL_REAUTH",
116
+ [RD_KAFKA_OP_ALTERUSERSCRAMCREDENTIALS] =
117
+ "REPLY:ALTERUSERSCRAMCREDENTIALS",
118
+ [RD_KAFKA_OP_DESCRIBEUSERSCRAMCREDENTIALS] =
119
+ "REPLY:DESCRIBEUSERSCRAMCREDENTIALS",
120
+ [RD_KAFKA_OP_LISTOFFSETS] = "REPLY:LISTOFFSETS",
121
+ [RD_KAFKA_OP_METADATA_UPDATE] = "REPLY:METADATA_UPDATE",
122
+ [RD_KAFKA_OP_SET_TELEMETRY_BROKER] =
123
+ "REPLY:RD_KAFKA_OP_SET_TELEMETRY_BROKER",
124
+ [RD_KAFKA_OP_TERMINATE_TELEMETRY] =
125
+ "REPLY:RD_KAFKA_OP_TERMINATE_TELEMETRY",
126
+ [RD_KAFKA_OP_ELECTLEADERS] = "REPLY:ELECTLEADERS",
127
+ [RD_KAFKA_OP_SHARE_FETCH] = "REPLY:SHARE_FETCH",
128
+ [RD_KAFKA_OP_SHARE_FETCH_FANOUT] = "REPLY:SHARE_FETCH_FANOUT",
129
+ [RD_KAFKA_OP_SHARE_SESSION_PARTITION_ADD] =
130
+ "REPLY:SHARE_SESSION_PARTITION_ADD",
131
+ [RD_KAFKA_OP_SHARE_SESSION_PARTITION_REMOVE] =
132
+ "REPLY:SHARE_SESSION_PARTITION_REMOVE",
133
+ [RD_KAFKA_OP_SHARE_FETCH_RESPONSE] = "REPLY:SHARE_FETCH_RESPONSE",
134
+ [RD_KAFKA_OP_SHARE_ACK_COMMIT_CB_EXECUTE] =
135
+ "REPLY:SHARE_ACK_COMMIT_CB_EXECUTE",
136
+ [RD_KAFKA_OP_SHARE_ACK_COMMIT_CB_REGISTER] =
137
+ "REPLY:SHARE_ACK_COMMIT_CB_REGISTER",
138
+ [RD_KAFKA_OP_SHARE_COMMIT_ASYNC_FANOUT] =
139
+ "REPLY:SHARE_COMMIT_ASYNC_FANOUT",
140
+ [RD_KAFKA_OP_SHARE_COMMIT_SYNC_FANOUT] =
141
+ "REPLY:SHARE_COMMIT_SYNC_FANOUT",
142
+ [RD_KAFKA_OP_SHARE_COMMIT_SYNC_FANOUT_REPLY] =
143
+ "REPLY:SHARE_COMMIT_SYNC_FANOUT_REPLY",
144
+ [RD_KAFKA_OP_SHARE_SESSION_CLEAR] = "REPLY:SHARE_SESSION_CLEAR",
145
+ };
146
+
147
+ if (type & RD_KAFKA_OP_REPLY)
148
+ skiplen = 0;
149
+
150
+ rd_assert((names[type & ~RD_KAFKA_OP_FLAGMASK] != NULL) ||
151
+ !*"add OP type to rd_kafka_op2str()");
152
+ return names[type & ~RD_KAFKA_OP_FLAGMASK] + skiplen;
153
+ }
154
+
155
+
156
+ void rd_kafka_op_print(FILE *fp, const char *prefix, rd_kafka_op_t *rko) {
157
+ fprintf(fp,
158
+ "%s((rd_kafka_op_t*)%p)\n"
159
+ "%s Type: %s (0x%x), Version: %" PRId32 "\n",
160
+ prefix, rko, prefix, rd_kafka_op2str(rko->rko_type),
161
+ rko->rko_type, rko->rko_version);
162
+ if (rko->rko_err)
163
+ fprintf(fp, "%s Error: %s\n", prefix,
164
+ rd_kafka_err2str(rko->rko_err));
165
+ if (rko->rko_replyq.q)
166
+ fprintf(fp, "%s Replyq %p v%d (%s)\n", prefix,
167
+ rko->rko_replyq.q, rko->rko_replyq.version,
168
+ #if ENABLE_DEVEL
169
+ rko->rko_replyq._id
170
+ #else
171
+ ""
172
+ #endif
173
+ );
174
+ if (rko->rko_rktp) {
175
+ fprintf(fp,
176
+ "%s ((rd_kafka_toppar_t*)%p) "
177
+ "%s [%" PRId32 "] v%d\n",
178
+ prefix, rko->rko_rktp,
179
+ rko->rko_rktp->rktp_rkt->rkt_topic->str,
180
+ rko->rko_rktp->rktp_partition,
181
+ rd_atomic32_get(&rko->rko_rktp->rktp_version));
182
+ }
183
+
184
+ switch (rko->rko_type & ~RD_KAFKA_OP_FLAGMASK) {
185
+ case RD_KAFKA_OP_FETCH:
186
+ fprintf(fp, "%s Offset: %" PRId64 "\n", prefix,
187
+ rko->rko_u.fetch.rkm.rkm_offset);
188
+ break;
189
+ case RD_KAFKA_OP_CONSUMER_ERR:
190
+ fprintf(fp, "%s Offset: %" PRId64 "\n", prefix,
191
+ rko->rko_u.err.offset);
192
+ /* FALLTHRU */
193
+ case RD_KAFKA_OP_ERR:
194
+ fprintf(fp, "%s Reason: %s\n", prefix, rko->rko_u.err.errstr);
195
+ break;
196
+ case RD_KAFKA_OP_DR:
197
+ fprintf(fp, "%s %" PRId32 " messages on %s\n", prefix,
198
+ rko->rko_u.dr.msgq.rkmq_msg_cnt,
199
+ rko->rko_u.dr.rkt ? rko->rko_u.dr.rkt->rkt_topic->str
200
+ : "(n/a)");
201
+ break;
202
+ case RD_KAFKA_OP_OFFSET_COMMIT:
203
+ fprintf(fp, "%s Callback: %p (opaque %p)\n", prefix,
204
+ rko->rko_u.offset_commit.cb,
205
+ rko->rko_u.offset_commit.opaque);
206
+ fprintf(fp, "%s %d partitions\n", prefix,
207
+ rko->rko_u.offset_commit.partitions
208
+ ? rko->rko_u.offset_commit.partitions->cnt
209
+ : 0);
210
+ break;
211
+
212
+ case RD_KAFKA_OP_LOG:
213
+ fprintf(fp, "%s Log: %%%d %s: %s\n", prefix,
214
+ rko->rko_u.log.level, rko->rko_u.log.fac,
215
+ rko->rko_u.log.str);
216
+ break;
217
+
218
+ default:
219
+ break;
220
+ }
221
+ }
222
+
223
+
224
+ rd_kafka_op_t *rd_kafka_op_new0(const char *source, rd_kafka_op_type_t type) {
225
+ rd_kafka_op_t *rko;
226
+ #define _RD_KAFKA_OP_EMPTY \
227
+ 1234567 /* Special value to be able to assert \
228
+ * on default-initialized (0) sizes \
229
+ * if we forgot to add an op type to \
230
+ * this list. */
231
+ static const size_t op2size[RD_KAFKA_OP__END] = {
232
+ [RD_KAFKA_OP_FETCH] = sizeof(rko->rko_u.fetch),
233
+ [RD_KAFKA_OP_ERR] = sizeof(rko->rko_u.err),
234
+ [RD_KAFKA_OP_CONSUMER_ERR] = sizeof(rko->rko_u.err),
235
+ [RD_KAFKA_OP_DR] = sizeof(rko->rko_u.dr),
236
+ [RD_KAFKA_OP_STATS] = sizeof(rko->rko_u.stats),
237
+ [RD_KAFKA_OP_OFFSET_COMMIT] = sizeof(rko->rko_u.offset_commit),
238
+ [RD_KAFKA_OP_NODE_UPDATE] = sizeof(rko->rko_u.node),
239
+ [RD_KAFKA_OP_XMIT_BUF] = sizeof(rko->rko_u.xbuf),
240
+ [RD_KAFKA_OP_RECV_BUF] = sizeof(rko->rko_u.xbuf),
241
+ [RD_KAFKA_OP_XMIT_RETRY] = sizeof(rko->rko_u.xbuf),
242
+ [RD_KAFKA_OP_FETCH_START] = sizeof(rko->rko_u.fetch_start),
243
+ [RD_KAFKA_OP_FETCH_STOP] = _RD_KAFKA_OP_EMPTY,
244
+ [RD_KAFKA_OP_SEEK] = sizeof(rko->rko_u.fetch_start),
245
+ [RD_KAFKA_OP_PAUSE] = sizeof(rko->rko_u.pause),
246
+ [RD_KAFKA_OP_OFFSET_FETCH] = sizeof(rko->rko_u.offset_fetch),
247
+ [RD_KAFKA_OP_PARTITION_JOIN] = _RD_KAFKA_OP_EMPTY,
248
+ [RD_KAFKA_OP_PARTITION_LEAVE] = _RD_KAFKA_OP_EMPTY,
249
+ [RD_KAFKA_OP_REBALANCE] = sizeof(rko->rko_u.rebalance),
250
+ [RD_KAFKA_OP_TERMINATE] = sizeof(rko->rko_u.terminated),
251
+ [RD_KAFKA_OP_COORD_QUERY] = _RD_KAFKA_OP_EMPTY,
252
+ [RD_KAFKA_OP_SUBSCRIBE] = sizeof(rko->rko_u.subscribe),
253
+ [RD_KAFKA_OP_ASSIGN] = sizeof(rko->rko_u.assign),
254
+ [RD_KAFKA_OP_GET_SUBSCRIPTION] = sizeof(rko->rko_u.subscribe),
255
+ [RD_KAFKA_OP_GET_ASSIGNMENT] = sizeof(rko->rko_u.assign),
256
+ [RD_KAFKA_OP_THROTTLE] = sizeof(rko->rko_u.throttle),
257
+ [RD_KAFKA_OP_NAME] = sizeof(rko->rko_u.name),
258
+ [RD_KAFKA_OP_CG_METADATA] = sizeof(rko->rko_u.cg_metadata),
259
+ [RD_KAFKA_OP_OFFSET_RESET] = sizeof(rko->rko_u.offset_reset),
260
+ [RD_KAFKA_OP_METADATA] = sizeof(rko->rko_u.metadata),
261
+ [RD_KAFKA_OP_LOG] = sizeof(rko->rko_u.log),
262
+ [RD_KAFKA_OP_WAKEUP] = _RD_KAFKA_OP_EMPTY,
263
+ [RD_KAFKA_OP_CREATETOPICS] = sizeof(rko->rko_u.admin_request),
264
+ [RD_KAFKA_OP_DELETETOPICS] = sizeof(rko->rko_u.admin_request),
265
+ [RD_KAFKA_OP_CREATEPARTITIONS] = sizeof(rko->rko_u.admin_request),
266
+ [RD_KAFKA_OP_ALTERCONFIGS] = sizeof(rko->rko_u.admin_request),
267
+ [RD_KAFKA_OP_INCREMENTALALTERCONFIGS] =
268
+ sizeof(rko->rko_u.admin_request),
269
+ [RD_KAFKA_OP_DESCRIBECONFIGS] = sizeof(rko->rko_u.admin_request),
270
+ [RD_KAFKA_OP_DELETERECORDS] = sizeof(rko->rko_u.admin_request),
271
+ [RD_KAFKA_OP_LISTCONSUMERGROUPS] = sizeof(rko->rko_u.admin_request),
272
+ [RD_KAFKA_OP_DESCRIBECONSUMERGROUPS] =
273
+ sizeof(rko->rko_u.admin_request),
274
+ [RD_KAFKA_OP_DESCRIBETOPICS] = sizeof(rko->rko_u.admin_request),
275
+ [RD_KAFKA_OP_DESCRIBECLUSTER] = sizeof(rko->rko_u.admin_request),
276
+ [RD_KAFKA_OP_DELETEGROUPS] = sizeof(rko->rko_u.admin_request),
277
+ [RD_KAFKA_OP_DELETECONSUMERGROUPOFFSETS] =
278
+ sizeof(rko->rko_u.admin_request),
279
+ [RD_KAFKA_OP_CREATEACLS] = sizeof(rko->rko_u.admin_request),
280
+ [RD_KAFKA_OP_DESCRIBEACLS] = sizeof(rko->rko_u.admin_request),
281
+ [RD_KAFKA_OP_DELETEACLS] = sizeof(rko->rko_u.admin_request),
282
+ [RD_KAFKA_OP_ALTERCONSUMERGROUPOFFSETS] =
283
+ sizeof(rko->rko_u.admin_request),
284
+ [RD_KAFKA_OP_LISTCONSUMERGROUPOFFSETS] =
285
+ sizeof(rko->rko_u.admin_request),
286
+ [RD_KAFKA_OP_ADMIN_FANOUT] = sizeof(rko->rko_u.admin_request),
287
+ [RD_KAFKA_OP_ADMIN_RESULT] = sizeof(rko->rko_u.admin_result),
288
+ [RD_KAFKA_OP_PURGE] = sizeof(rko->rko_u.purge),
289
+ [RD_KAFKA_OP_CONNECT] = _RD_KAFKA_OP_EMPTY,
290
+ [RD_KAFKA_OP_OAUTHBEARER_REFRESH] = _RD_KAFKA_OP_EMPTY,
291
+ [RD_KAFKA_OP_MOCK] = sizeof(rko->rko_u.mock),
292
+ [RD_KAFKA_OP_BROKER_MONITOR] = sizeof(rko->rko_u.broker_monitor),
293
+ [RD_KAFKA_OP_TXN] = sizeof(rko->rko_u.txn),
294
+ [RD_KAFKA_OP_GET_REBALANCE_PROTOCOL] =
295
+ sizeof(rko->rko_u.rebalance_protocol),
296
+ [RD_KAFKA_OP_LEADERS] = sizeof(rko->rko_u.leaders),
297
+ [RD_KAFKA_OP_BARRIER] = _RD_KAFKA_OP_EMPTY,
298
+ [RD_KAFKA_OP_SASL_REAUTH] = _RD_KAFKA_OP_EMPTY,
299
+ [RD_KAFKA_OP_ALTERUSERSCRAMCREDENTIALS] =
300
+ sizeof(rko->rko_u.admin_request),
301
+ [RD_KAFKA_OP_DESCRIBEUSERSCRAMCREDENTIALS] =
302
+ sizeof(rko->rko_u.admin_request),
303
+ [RD_KAFKA_OP_LISTOFFSETS] = sizeof(rko->rko_u.admin_request),
304
+ [RD_KAFKA_OP_METADATA_UPDATE] = sizeof(rko->rko_u.metadata),
305
+ [RD_KAFKA_OP_SET_TELEMETRY_BROKER] =
306
+ sizeof(rko->rko_u.telemetry_broker),
307
+ [RD_KAFKA_OP_TERMINATE_TELEMETRY] = _RD_KAFKA_OP_EMPTY,
308
+ [RD_KAFKA_OP_ELECTLEADERS] = sizeof(rko->rko_u.admin_request),
309
+ [RD_KAFKA_OP_SHARE_FETCH] = sizeof(rko->rko_u.share_fetch),
310
+ [RD_KAFKA_OP_SHARE_FETCH_FANOUT] =
311
+ sizeof(rko->rko_u.share_fetch_fanout),
312
+ [RD_KAFKA_OP_SHARE_SESSION_PARTITION_ADD] = _RD_KAFKA_OP_EMPTY,
313
+ [RD_KAFKA_OP_SHARE_SESSION_PARTITION_REMOVE] = _RD_KAFKA_OP_EMPTY,
314
+ [RD_KAFKA_OP_SHARE_FETCH_RESPONSE] =
315
+ sizeof(rko->rko_u.share_fetch_response),
316
+ [RD_KAFKA_OP_SHARE_ACK_COMMIT_CB_EXECUTE] =
317
+ sizeof(rko->rko_u.share_ack_commit_cb_execute),
318
+ [RD_KAFKA_OP_SHARE_ACK_COMMIT_CB_REGISTER] =
319
+ sizeof(rko->rko_u.share_ack_commit_cb_register),
320
+ [RD_KAFKA_OP_SHARE_COMMIT_ASYNC_FANOUT] =
321
+ sizeof(rko->rko_u.share_commit_async_fanout),
322
+ [RD_KAFKA_OP_SHARE_COMMIT_SYNC_FANOUT] =
323
+ sizeof(rko->rko_u.share_commit_sync_fanout),
324
+ [RD_KAFKA_OP_SHARE_COMMIT_SYNC_FANOUT_REPLY] =
325
+ sizeof(rko->rko_u.share_commit_sync_fanout_reply),
326
+ [RD_KAFKA_OP_SHARE_SESSION_CLEAR] = _RD_KAFKA_OP_EMPTY,
327
+ };
328
+ size_t tsize = op2size[type & ~RD_KAFKA_OP_FLAGMASK];
329
+
330
+ rd_assert(tsize > 0 || !*"add OP type to rd_kafka_op_new0()");
331
+ if (tsize == _RD_KAFKA_OP_EMPTY)
332
+ tsize = 0;
333
+
334
+ rko = rd_calloc(1, sizeof(*rko) - sizeof(rko->rko_u) + tsize);
335
+ rko->rko_type = type;
336
+
337
+ #if ENABLE_DEVEL
338
+ rko->rko_source = source;
339
+ rd_atomic32_add(&rd_kafka_op_cnt, 1);
340
+ #endif
341
+ return rko;
342
+ }
343
+
344
+
345
+ void rd_kafka_op_destroy(rd_kafka_op_t *rko) {
346
+
347
+ /* Call ops callback with ERR__DESTROY to let it
348
+ * clean up its resources. */
349
+ if ((rko->rko_type & RD_KAFKA_OP_CB) && rko->rko_op_cb) {
350
+ rd_kafka_op_res_t res;
351
+ rko->rko_err = RD_KAFKA_RESP_ERR__DESTROY;
352
+ res = rko->rko_op_cb(rko->rko_rk, NULL, rko);
353
+ rd_assert(res != RD_KAFKA_OP_RES_YIELD);
354
+ rd_assert(res != RD_KAFKA_OP_RES_KEEP);
355
+ }
356
+
357
+
358
+ switch (rko->rko_type & ~RD_KAFKA_OP_FLAGMASK) {
359
+ case RD_KAFKA_OP_FETCH:
360
+ rd_kafka_msg_destroy(NULL, &rko->rko_u.fetch.rkm);
361
+ /* Decrease refcount on rkbuf to eventually rd_free shared buf*/
362
+ if (rko->rko_u.fetch.rkbuf)
363
+ rd_kafka_buf_handle_op(rko, RD_KAFKA_RESP_ERR__DESTROY);
364
+
365
+ break;
366
+
367
+ case RD_KAFKA_OP_OFFSET_FETCH:
368
+ if (rko->rko_u.offset_fetch.partitions &&
369
+ rko->rko_u.offset_fetch.do_free)
370
+ rd_kafka_topic_partition_list_destroy(
371
+ rko->rko_u.offset_fetch.partitions);
372
+ break;
373
+
374
+ case RD_KAFKA_OP_OFFSET_COMMIT:
375
+ RD_IF_FREE(rko->rko_u.offset_commit.partitions,
376
+ rd_kafka_topic_partition_list_destroy);
377
+ RD_IF_FREE(rko->rko_u.offset_commit.reason, rd_free);
378
+ break;
379
+
380
+ case RD_KAFKA_OP_SUBSCRIBE:
381
+ case RD_KAFKA_OP_GET_SUBSCRIPTION:
382
+ RD_IF_FREE(rko->rko_u.subscribe.topics,
383
+ rd_kafka_topic_partition_list_destroy);
384
+ break;
385
+
386
+ case RD_KAFKA_OP_ASSIGN:
387
+ case RD_KAFKA_OP_GET_ASSIGNMENT:
388
+ RD_IF_FREE(rko->rko_u.assign.partitions,
389
+ rd_kafka_topic_partition_list_destroy);
390
+ break;
391
+
392
+ case RD_KAFKA_OP_REBALANCE:
393
+ RD_IF_FREE(rko->rko_u.rebalance.partitions,
394
+ rd_kafka_topic_partition_list_destroy);
395
+ break;
396
+
397
+ case RD_KAFKA_OP_NAME:
398
+ RD_IF_FREE(rko->rko_u.name.str, rd_free);
399
+ break;
400
+
401
+ case RD_KAFKA_OP_CG_METADATA:
402
+ RD_IF_FREE(rko->rko_u.cg_metadata,
403
+ rd_kafka_consumer_group_metadata_destroy);
404
+ break;
405
+
406
+ case RD_KAFKA_OP_ERR:
407
+ case RD_KAFKA_OP_CONSUMER_ERR:
408
+ RD_IF_FREE(rko->rko_u.err.errstr, rd_free);
409
+ rd_kafka_msg_destroy(NULL, &rko->rko_u.err.rkm);
410
+ break;
411
+
412
+ break;
413
+
414
+ case RD_KAFKA_OP_THROTTLE:
415
+ RD_IF_FREE(rko->rko_u.throttle.nodename, rd_free);
416
+ break;
417
+
418
+ case RD_KAFKA_OP_STATS:
419
+ RD_IF_FREE(rko->rko_u.stats.json, rd_free);
420
+ break;
421
+
422
+ case RD_KAFKA_OP_XMIT_RETRY:
423
+ case RD_KAFKA_OP_XMIT_BUF:
424
+ case RD_KAFKA_OP_RECV_BUF:
425
+ if (rko->rko_u.xbuf.rkbuf)
426
+ rd_kafka_buf_handle_op(rko, RD_KAFKA_RESP_ERR__DESTROY);
427
+
428
+ RD_IF_FREE(rko->rko_u.xbuf.rkbuf, rd_kafka_buf_destroy);
429
+ break;
430
+
431
+ case RD_KAFKA_OP_DR:
432
+ rd_kafka_msgq_purge(rko->rko_rk, &rko->rko_u.dr.msgq);
433
+ if (rko->rko_u.dr.do_purge2)
434
+ rd_kafka_msgq_purge(rko->rko_rk, &rko->rko_u.dr.msgq2);
435
+
436
+ if (rko->rko_u.dr.rkt)
437
+ rd_kafka_topic_destroy0(rko->rko_u.dr.rkt);
438
+ if (rko->rko_u.dr.presult)
439
+ rd_kafka_Produce_result_destroy(rko->rko_u.dr.presult);
440
+ break;
441
+
442
+ case RD_KAFKA_OP_OFFSET_RESET:
443
+ RD_IF_FREE(rko->rko_u.offset_reset.reason, rd_free);
444
+ break;
445
+
446
+ case RD_KAFKA_OP_METADATA:
447
+ RD_IF_FREE(rko->rko_u.metadata.md, rd_kafka_metadata_destroy);
448
+ /* It's not needed to free metadata.mdi because they
449
+ are the in the same memory allocation. */
450
+ break;
451
+
452
+ case RD_KAFKA_OP_LOG:
453
+ rd_free(rko->rko_u.log.str);
454
+ break;
455
+
456
+ case RD_KAFKA_OP_ADMIN_FANOUT:
457
+ rd_assert(rko->rko_u.admin_request.fanout.outstanding == 0);
458
+ rd_list_destroy(&rko->rko_u.admin_request.fanout.results);
459
+ case RD_KAFKA_OP_CREATETOPICS:
460
+ case RD_KAFKA_OP_DELETETOPICS:
461
+ case RD_KAFKA_OP_CREATEPARTITIONS:
462
+ case RD_KAFKA_OP_ALTERCONFIGS:
463
+ case RD_KAFKA_OP_INCREMENTALALTERCONFIGS:
464
+ case RD_KAFKA_OP_DESCRIBECONFIGS:
465
+ case RD_KAFKA_OP_DELETERECORDS:
466
+ case RD_KAFKA_OP_LISTCONSUMERGROUPS:
467
+ case RD_KAFKA_OP_DESCRIBECONSUMERGROUPS:
468
+ case RD_KAFKA_OP_DELETEGROUPS:
469
+ case RD_KAFKA_OP_DELETECONSUMERGROUPOFFSETS:
470
+ case RD_KAFKA_OP_CREATEACLS:
471
+ case RD_KAFKA_OP_DESCRIBEACLS:
472
+ case RD_KAFKA_OP_DELETEACLS:
473
+ case RD_KAFKA_OP_ALTERCONSUMERGROUPOFFSETS:
474
+ case RD_KAFKA_OP_DESCRIBETOPICS:
475
+ case RD_KAFKA_OP_DESCRIBECLUSTER:
476
+ case RD_KAFKA_OP_LISTCONSUMERGROUPOFFSETS:
477
+ case RD_KAFKA_OP_ALTERUSERSCRAMCREDENTIALS:
478
+ case RD_KAFKA_OP_DESCRIBEUSERSCRAMCREDENTIALS:
479
+ case RD_KAFKA_OP_LISTOFFSETS:
480
+ case RD_KAFKA_OP_ELECTLEADERS:
481
+ rd_kafka_replyq_destroy(&rko->rko_u.admin_request.replyq);
482
+ rd_list_destroy(&rko->rko_u.admin_request.args);
483
+ if (rko->rko_u.admin_request.options.match_consumer_group_states
484
+ .u.PTR) {
485
+ rd_list_destroy(rko->rko_u.admin_request.options
486
+ .match_consumer_group_states.u.PTR);
487
+ }
488
+ if (rko->rko_u.admin_request.options.match_consumer_group_types
489
+ .u.PTR) {
490
+ rd_list_destroy(rko->rko_u.admin_request.options
491
+ .match_consumer_group_types.u.PTR);
492
+ }
493
+ rd_assert(!rko->rko_u.admin_request.fanout_parent);
494
+ RD_IF_FREE(rko->rko_u.admin_request.coordkey, rd_free);
495
+ break;
496
+
497
+ case RD_KAFKA_OP_ADMIN_RESULT:
498
+ rd_list_destroy(&rko->rko_u.admin_result.args);
499
+ rd_list_destroy(&rko->rko_u.admin_result.results);
500
+ RD_IF_FREE(rko->rko_u.admin_result.errstr, rd_free);
501
+ rd_assert(!rko->rko_u.admin_result.fanout_parent);
502
+ ;
503
+ break;
504
+
505
+ case RD_KAFKA_OP_MOCK:
506
+ RD_IF_FREE(rko->rko_u.mock.name, rd_free);
507
+ RD_IF_FREE(rko->rko_u.mock.str, rd_free);
508
+ RD_IF_FREE(rko->rko_u.mock.errs, rd_free);
509
+ if (rko->rko_u.mock.metrics) {
510
+ int64_t i;
511
+ for (i = 0; i < rko->rko_u.mock.hi; i++)
512
+ rd_free(rko->rko_u.mock.metrics[i]);
513
+ rd_free(rko->rko_u.mock.metrics);
514
+ }
515
+ break;
516
+
517
+ case RD_KAFKA_OP_BROKER_MONITOR:
518
+ rd_kafka_broker_destroy(rko->rko_u.broker_monitor.rkb);
519
+ break;
520
+
521
+ case RD_KAFKA_OP_TXN:
522
+ RD_IF_FREE(rko->rko_u.txn.group_id, rd_free);
523
+ RD_IF_FREE(rko->rko_u.txn.offsets,
524
+ rd_kafka_topic_partition_list_destroy);
525
+ RD_IF_FREE(rko->rko_u.txn.cgmetadata,
526
+ rd_kafka_consumer_group_metadata_destroy);
527
+ break;
528
+
529
+ case RD_KAFKA_OP_LEADERS:
530
+ rd_assert(!rko->rko_u.leaders.eonce);
531
+ rd_assert(!rko->rko_u.leaders.replyq.q);
532
+ RD_IF_FREE(rko->rko_u.leaders.leaders, rd_list_destroy);
533
+ RD_IF_FREE(rko->rko_u.leaders.partitions,
534
+ rd_kafka_topic_partition_list_destroy);
535
+ break;
536
+
537
+ case RD_KAFKA_OP_METADATA_UPDATE:
538
+ RD_IF_FREE(rko->rko_u.metadata.md, rd_kafka_metadata_destroy);
539
+ /* It's not needed to free metadata.mdi because they
540
+ are the in the same memory allocation. */
541
+ break;
542
+
543
+ case RD_KAFKA_OP_SET_TELEMETRY_BROKER:
544
+ RD_IF_FREE(rko->rko_u.telemetry_broker.rkb,
545
+ rd_kafka_broker_destroy);
546
+ break;
547
+
548
+ case RD_KAFKA_OP_SHARE_FETCH: {
549
+ RD_IF_FREE(rko->rko_u.share_fetch.target_broker,
550
+ rd_kafka_broker_destroy);
551
+ RD_IF_FREE(rko->rko_u.share_fetch.ack_details, rd_list_destroy);
552
+ break;
553
+ }
554
+
555
+ case RD_KAFKA_OP_TERMINATE:
556
+ RD_IF_FREE(rko->rko_u.terminated.ack_batches, rd_list_destroy);
557
+ break;
558
+
559
+ case RD_KAFKA_OP_SHARE_FETCH_FANOUT:
560
+ RD_IF_FREE(rko->rko_u.share_fetch_fanout.ack_batches,
561
+ rd_list_destroy);
562
+ break;
563
+
564
+ case RD_KAFKA_OP_SHARE_COMMIT_ASYNC_FANOUT:
565
+ RD_IF_FREE(rko->rko_u.share_commit_async_fanout.ack_batches,
566
+ rd_list_destroy);
567
+ break;
568
+
569
+ case RD_KAFKA_OP_SHARE_COMMIT_SYNC_FANOUT:
570
+ RD_IF_FREE(rko->rko_u.share_commit_sync_fanout.ack_batches,
571
+ rd_list_destroy);
572
+ RD_IF_FREE(rko->rko_u.share_commit_sync_fanout.results,
573
+ rd_kafka_topic_partition_list_destroy);
574
+ break;
575
+
576
+ case RD_KAFKA_OP_SHARE_COMMIT_SYNC_FANOUT_REPLY:
577
+ RD_IF_FREE(rko->rko_u.share_commit_sync_fanout_reply.results,
578
+ rd_kafka_topic_partition_list_destroy);
579
+ break;
580
+
581
+ case RD_KAFKA_OP_SHARE_FETCH_RESPONSE: {
582
+ if (rko->rko_u.share_fetch_response.message_rkos) {
583
+ /* Messages not handed to app, destroy them. */
584
+ rd_kafka_op_t *msg_rko;
585
+ int mi;
586
+ RD_LIST_FOREACH(
587
+ msg_rko,
588
+ rko->rko_u.share_fetch_response.message_rkos, mi) {
589
+ rd_kafka_op_destroy(msg_rko);
590
+ }
591
+ rd_list_destroy(
592
+ rko->rko_u.share_fetch_response.message_rkos);
593
+ }
594
+ RD_IF_FREE(rko->rko_u.share_fetch_response.inflight_acks,
595
+ rd_list_destroy);
596
+ break;
597
+ }
598
+
599
+ case RD_KAFKA_OP_SHARE_ACK_COMMIT_CB_EXECUTE:
600
+ RD_IF_FREE(rko->rko_u.share_ack_commit_cb_execute.partitions,
601
+ rd_kafka_share_partition_offsets_list_destroy);
602
+ break;
603
+
604
+ default:
605
+ break;
606
+ }
607
+
608
+ RD_IF_FREE(rko->rko_rktp, rd_kafka_toppar_destroy);
609
+
610
+ RD_IF_FREE(rko->rko_error, rd_kafka_error_destroy);
611
+
612
+ rd_kafka_replyq_destroy(&rko->rko_replyq);
613
+
614
+ #if ENABLE_DEVEL
615
+ if (rd_atomic32_sub(&rd_kafka_op_cnt, 1) < 0)
616
+ rd_kafka_assert(NULL, !*"rd_kafka_op_cnt < 0");
617
+ #endif
618
+
619
+ rd_free(rko);
620
+ }
621
+
622
+
623
+
624
+ /**
625
+ * Propagate an error event to the application on a specific queue.
626
+ */
627
+ void rd_kafka_q_op_err(rd_kafka_q_t *rkq,
628
+ rd_kafka_resp_err_t err,
629
+ const char *fmt,
630
+ ...) {
631
+ va_list ap;
632
+ char buf[2048];
633
+ rd_kafka_op_t *rko;
634
+
635
+ va_start(ap, fmt);
636
+ rd_vsnprintf(buf, sizeof(buf), fmt, ap);
637
+ va_end(ap);
638
+
639
+ rko = rd_kafka_op_new(RD_KAFKA_OP_ERR);
640
+ rko->rko_err = err;
641
+ rko->rko_u.err.errstr = rd_strdup(buf);
642
+
643
+ rd_kafka_q_enq(rkq, rko);
644
+ }
645
+
646
+
647
+
648
+ /**
649
+ * @brief Enqueue RD_KAFKA_OP_CONSUMER_ERR on \p rkq.
650
+ *
651
+ * @param broker_id Is the relevant broker id, or RD_KAFKA_NODEID_UA (-1)
652
+ * if not applicable.
653
+ * @param err Error code.
654
+ * @param version Queue version barrier, or 0 if not applicable.
655
+ * @param topic May be NULL.
656
+ * @param rktp May be NULL. Takes precedence over \p topic.
657
+ * @param offset RD_KAFKA_OFFSET_INVALID if not applicable.
658
+ *
659
+ * @sa rd_kafka_q_op_err()
660
+ */
661
+ /**
662
+ * TODO KIP-932: GA: Improve handling of this particular function
663
+ * as we dont need most information available here.
664
+ */
665
+ void rd_kafka_consumer_err(rd_kafka_q_t *rkq,
666
+ int32_t broker_id,
667
+ rd_kafka_resp_err_t err,
668
+ int32_t version,
669
+ const char *topic,
670
+ rd_kafka_toppar_t *rktp,
671
+ int64_t offset,
672
+ const char *fmt,
673
+ ...) {
674
+ va_list ap;
675
+ char buf[2048];
676
+ rd_kafka_op_t *rko;
677
+
678
+ va_start(ap, fmt);
679
+ rd_vsnprintf(buf, sizeof(buf), fmt, ap);
680
+ va_end(ap);
681
+
682
+ rko = rd_kafka_op_new(RD_KAFKA_OP_CONSUMER_ERR);
683
+ rko->rko_version = version;
684
+ rko->rko_err = err;
685
+ rko->rko_u.err.offset = offset;
686
+ rko->rko_u.err.errstr = rd_strdup(buf);
687
+ rko->rko_u.err.rkm.rkm_broker_id = broker_id;
688
+
689
+ if (rktp)
690
+ rko->rko_rktp = rd_kafka_toppar_keep(rktp);
691
+ else if (topic)
692
+ rko->rko_u.err.rkm.rkm_rkmessage.rkt =
693
+ (rd_kafka_topic_t *)rd_kafka_lwtopic_new(rkq->rkq_rk,
694
+ topic);
695
+
696
+
697
+ rd_kafka_q_enq(rkq, rko);
698
+ }
699
+
700
+
701
+ /**
702
+ * @brief Enqueue multiple RD_KAFKA_OP_CONSUMER_ERR ops on \p rkq for
703
+ * a range of offsets, used for share consumer MessageSet-level errors.
704
+ *
705
+ * @param broker_id Is the relevant broker id, or RD_KAFKA_NODEID_UA (-1)
706
+ * if not applicable.
707
+ * @param err Error code.
708
+ * @param version Queue version barrier, or 0 if not applicable.
709
+ * @param rktp Toppar reference (required for share consumers).
710
+ * @param start_offset First offset in the error range (inclusive).
711
+ * @param end_offset Last offset in the error range (inclusive).
712
+ * @param ack_type Acknowledgement type for share consumer
713
+ * (REJECT for permanent errors, RELEASE for retryable).
714
+ *
715
+ * Creates one error op per offset in the range [start_offset, end_offset].
716
+ * Each op has ack_type pre-set for share consumer acknowledgement tracking.
717
+ *
718
+ * @sa rd_kafka_consumer_err()
719
+ */
720
+ void rd_kafka_share_msgset_err_ops(
721
+ rd_kafka_q_t *rkq,
722
+ int32_t broker_id,
723
+ rd_kafka_resp_err_t err,
724
+ int32_t version,
725
+ rd_kafka_toppar_t *rktp,
726
+ int64_t start_offset,
727
+ int64_t end_offset,
728
+ rd_kafka_share_internal_acknowledgement_type ack_type,
729
+ const char *fmt,
730
+ ...) {
731
+ va_list ap;
732
+ char buf[2048];
733
+ int64_t offset;
734
+
735
+ /* Format error message once for all offsets */
736
+ va_start(ap, fmt);
737
+ rd_vsnprintf(buf, sizeof(buf), fmt, ap);
738
+ va_end(ap);
739
+
740
+ /* Create one error op per offset in the range */
741
+ for (offset = start_offset; offset <= end_offset; offset++) {
742
+ rd_kafka_op_t *rko;
743
+
744
+ rko = rd_kafka_op_new(RD_KAFKA_OP_CONSUMER_ERR);
745
+ rko->rko_version = version;
746
+ rko->rko_err = err;
747
+ rko->rko_u.err.offset = offset;
748
+ rko->rko_u.err.errstr = rd_strdup(buf);
749
+ rko->rko_u.err.rkm.rkm_broker_id = broker_id;
750
+
751
+ /* Set acknowledgement type for share consumer */
752
+ rko->rko_u.err.rkm.rkm_u.consumer.ack_type = ack_type;
753
+
754
+ if (rktp)
755
+ rko->rko_rktp = rd_kafka_toppar_keep(rktp);
756
+
757
+ rd_kafka_q_enq(rkq, rko);
758
+ }
759
+ }
760
+
761
+
762
+ /**
763
+ * Creates a reply op based on 'rko_orig'.
764
+ * If 'rko_orig' has rko_op_cb set the reply op will be OR:ed with
765
+ * RD_KAFKA_OP_CB, else the reply type will be the original rko_type OR:ed
766
+ * with RD_KAFKA_OP_REPLY.
767
+ */
768
+ rd_kafka_op_t *rd_kafka_op_new_reply(rd_kafka_op_t *rko_orig,
769
+ rd_kafka_resp_err_t err) {
770
+ rd_kafka_op_t *rko;
771
+
772
+ rko = rd_kafka_op_new(rko_orig->rko_type | RD_KAFKA_OP_REPLY);
773
+ rd_kafka_op_get_reply_version(rko, rko_orig);
774
+ rko->rko_err = err;
775
+ if (rko_orig->rko_rktp)
776
+ rko->rko_rktp = rd_kafka_toppar_keep(rko_orig->rko_rktp);
777
+
778
+ return rko;
779
+ }
780
+
781
+
782
+ /**
783
+ * @brief Create new callback op for type \p type
784
+ */
785
+ rd_kafka_op_t *rd_kafka_op_new_cb(rd_kafka_t *rk,
786
+ rd_kafka_op_type_t type,
787
+ rd_kafka_op_cb_t *cb) {
788
+ rd_kafka_op_t *rko;
789
+ rko = rd_kafka_op_new(type | RD_KAFKA_OP_CB);
790
+ rko->rko_op_cb = cb;
791
+ rko->rko_rk = rk;
792
+ return rko;
793
+ }
794
+
795
+
796
+ /**
797
+ * @brief Reply to 'rko' re-using the same rko with rko_err
798
+ * specified by \p err. rko_error is set to NULL.
799
+ *
800
+ * If there is no replyq the rko is destroyed.
801
+ *
802
+ * @returns 1 if op was enqueued, else 0 and rko is destroyed.
803
+ */
804
+ int rd_kafka_op_reply(rd_kafka_op_t *rko, rd_kafka_resp_err_t err) {
805
+
806
+ if (!rko->rko_replyq.q) {
807
+ rd_kafka_op_destroy(rko);
808
+ return 0;
809
+ }
810
+
811
+ rko->rko_type |= (rko->rko_op_cb ? RD_KAFKA_OP_CB : RD_KAFKA_OP_REPLY);
812
+ rko->rko_err = err;
813
+ rko->rko_error = NULL;
814
+
815
+ return rd_kafka_replyq_enq(&rko->rko_replyq, rko, 0);
816
+ }
817
+
818
+
819
+ /**
820
+ * @brief Reply to 'rko' re-using the same rko with rko_error specified
821
+ * by \p error (may be NULL) and rko_err set to the corresponding
822
+ * error code. Assumes ownership of \p error.
823
+ *
824
+ * If there is no replyq the rko is destroyed.
825
+ *
826
+ * @returns 1 if op was enqueued, else 0 and rko is destroyed.
827
+ */
828
+ int rd_kafka_op_error_reply(rd_kafka_op_t *rko, rd_kafka_error_t *error) {
829
+
830
+ if (!rko->rko_replyq.q) {
831
+ RD_IF_FREE(error, rd_kafka_error_destroy);
832
+ rd_kafka_op_destroy(rko);
833
+ return 0;
834
+ }
835
+
836
+ rko->rko_type |= (rko->rko_op_cb ? RD_KAFKA_OP_CB : RD_KAFKA_OP_REPLY);
837
+ rko->rko_err =
838
+ error ? rd_kafka_error_code(error) : RD_KAFKA_RESP_ERR_NO_ERROR;
839
+ rko->rko_error = error;
840
+
841
+ return rd_kafka_replyq_enq(&rko->rko_replyq, rko, 0);
842
+ }
843
+
844
+
845
+ /**
846
+ * @brief Send request to queue, wait for response.
847
+ *
848
+ * @returns response on success or NULL if destq is disabled.
849
+ */
850
+ rd_kafka_op_t *rd_kafka_op_req0(rd_kafka_q_t *destq,
851
+ rd_kafka_q_t *recvq,
852
+ rd_kafka_op_t *rko,
853
+ int timeout_ms) {
854
+ rd_kafka_op_t *reply;
855
+
856
+ /* Indicate to destination where to send reply. */
857
+ rd_kafka_op_set_replyq(rko, recvq, NULL);
858
+
859
+ /* Enqueue op */
860
+ if (!rd_kafka_q_enq(destq, rko))
861
+ return NULL;
862
+
863
+ /* Wait for reply */
864
+ reply = rd_kafka_q_pop(recvq, rd_timeout_us(timeout_ms), 0);
865
+
866
+ /* May be NULL for timeout */
867
+ return reply;
868
+ }
869
+
870
+ /**
871
+ * Send request to queue, wait for response.
872
+ * Creates a temporary reply queue.
873
+ */
874
+ rd_kafka_op_t *
875
+ rd_kafka_op_req(rd_kafka_q_t *destq, rd_kafka_op_t *rko, int timeout_ms) {
876
+ rd_kafka_q_t *recvq;
877
+ rd_kafka_op_t *reply;
878
+
879
+ recvq = rd_kafka_q_new(destq->rkq_rk);
880
+
881
+ reply = rd_kafka_op_req0(destq, recvq, rko, timeout_ms);
882
+
883
+ rd_kafka_q_destroy_owner(recvq);
884
+
885
+ return reply;
886
+ }
887
+
888
+
889
+ /**
890
+ * Send simple type-only request to queue, wait for response.
891
+ */
892
+ rd_kafka_op_t *rd_kafka_op_req2(rd_kafka_q_t *destq, rd_kafka_op_type_t type) {
893
+ rd_kafka_op_t *rko;
894
+
895
+ rko = rd_kafka_op_new(type);
896
+ return rd_kafka_op_req(destq, rko, RD_POLL_INFINITE);
897
+ }
898
+
899
+
900
+ /**
901
+ * Destroys the rko and returns its err.
902
+ */
903
+ rd_kafka_resp_err_t rd_kafka_op_err_destroy(rd_kafka_op_t *rko) {
904
+ rd_kafka_resp_err_t err = RD_KAFKA_RESP_ERR__TIMED_OUT;
905
+
906
+ if (rko) {
907
+ err = rko->rko_err;
908
+ rd_kafka_op_destroy(rko);
909
+ }
910
+ return err;
911
+ }
912
+
913
+
914
+ /**
915
+ * Destroys the rko and returns its error object or NULL if no error.
916
+ */
917
+ rd_kafka_error_t *rd_kafka_op_error_destroy(rd_kafka_op_t *rko) {
918
+ if (rko) {
919
+ rd_kafka_error_t *error = rko->rko_error;
920
+ rko->rko_error = NULL;
921
+ rd_kafka_op_destroy(rko);
922
+ return error;
923
+ }
924
+
925
+ return rd_kafka_error_new(RD_KAFKA_RESP_ERR__TIMED_OUT,
926
+ "Operation timed out");
927
+ }
928
+
929
+
930
+ /**
931
+ * Call op callback
932
+ */
933
+ rd_kafka_op_res_t
934
+ rd_kafka_op_call(rd_kafka_t *rk, rd_kafka_q_t *rkq, rd_kafka_op_t *rko) {
935
+ rd_kafka_op_res_t res;
936
+ rd_assert(rko->rko_op_cb);
937
+ res = rko->rko_op_cb(rk, rkq, rko);
938
+ if (unlikely(res == RD_KAFKA_OP_RES_YIELD || rd_kafka_yield_thread))
939
+ return RD_KAFKA_OP_RES_YIELD;
940
+ if (res != RD_KAFKA_OP_RES_KEEP)
941
+ rko->rko_op_cb = NULL;
942
+ return res;
943
+ }
944
+
945
+
946
+ /**
947
+ * @brief Creates a new RD_KAFKA_OP_FETCH op representing a
948
+ * control message. The rkm_flags property is set to
949
+ * RD_KAFKA_MSG_F_CONTROL.
950
+ */
951
+ rd_kafka_op_t *rd_kafka_op_new_ctrl_msg(rd_kafka_toppar_t *rktp,
952
+ int32_t version,
953
+ rd_kafka_buf_t *rkbuf,
954
+ rd_kafka_fetch_pos_t pos) {
955
+ rd_kafka_msg_t *rkm;
956
+ rd_kafka_op_t *rko;
957
+
958
+ rko = rd_kafka_op_new_fetch_msg(&rkm, rktp, version, rkbuf, pos, 0,
959
+ NULL, 0, NULL);
960
+
961
+ rkm->rkm_flags |= RD_KAFKA_MSG_F_CONTROL;
962
+
963
+ return rko;
964
+ }
965
+
966
+ /**
967
+ * @brief Creates a new RD_KAFKA_OP_FETCH op and sets up the
968
+ * embedded message according to the parameters.
969
+ *
970
+ * @param rkmp will be set to the embedded rkm in the rko (for convenience)
971
+ * @param offset may be updated later if relative offset.
972
+ */
973
+ rd_kafka_op_t *rd_kafka_op_new_fetch_msg(rd_kafka_msg_t **rkmp,
974
+ rd_kafka_toppar_t *rktp,
975
+ int32_t version,
976
+ rd_kafka_buf_t *rkbuf,
977
+ rd_kafka_fetch_pos_t pos,
978
+ size_t key_len,
979
+ const void *key,
980
+ size_t val_len,
981
+ const void *val) {
982
+ rd_kafka_msg_t *rkm;
983
+ rd_kafka_op_t *rko;
984
+
985
+ rko = rd_kafka_op_new(RD_KAFKA_OP_FETCH);
986
+ rko->rko_rktp = rd_kafka_toppar_keep(rktp);
987
+ rko->rko_version = version;
988
+ rkm = &rko->rko_u.fetch.rkm;
989
+ *rkmp = rkm;
990
+
991
+ /* Since all the ops share the same payload buffer
992
+ * a refcnt is used on the rkbuf that makes sure all
993
+ * consume_cb() will have been
994
+ * called for each of these ops before the rkbuf
995
+ * and its memory backing buffers are freed. */
996
+ rko->rko_u.fetch.rkbuf = rkbuf;
997
+ rd_kafka_buf_keep(rkbuf);
998
+
999
+ rkm->rkm_offset = pos.offset;
1000
+ rkm->rkm_u.consumer.leader_epoch = pos.leader_epoch;
1001
+
1002
+ rkm->rkm_key = (void *)key;
1003
+ rkm->rkm_key_len = key_len;
1004
+
1005
+ rkm->rkm_payload = (void *)val;
1006
+ rkm->rkm_len = val_len;
1007
+ rko->rko_len = (int32_t)rkm->rkm_len;
1008
+
1009
+ rkm->rkm_partition = rktp->rktp_partition;
1010
+
1011
+ /* Persistence status is always PERSISTED for consumed messages
1012
+ * since we managed to read the message. */
1013
+ rkm->rkm_status = RD_KAFKA_MSG_STATUS_PERSISTED;
1014
+
1015
+ return rko;
1016
+ }
1017
+
1018
+
1019
+ /**
1020
+ * Enqueue ERR__THROTTLE op, if desired.
1021
+ */
1022
+ void rd_kafka_op_throttle_time(rd_kafka_broker_t *rkb,
1023
+ rd_kafka_q_t *rkq,
1024
+ int throttle_time) {
1025
+ rd_kafka_op_t *rko;
1026
+
1027
+ if (unlikely(throttle_time > 0)) {
1028
+ rd_avg_add(&rkb->rkb_avg_throttle, throttle_time);
1029
+ rd_avg_add(&rkb->rkb_telemetry.rd_avg_current.rkb_avg_throttle,
1030
+ throttle_time);
1031
+ }
1032
+
1033
+ /* We send throttle events when:
1034
+ * - throttle_time > 0
1035
+ * - throttle_time == 0 and last throttle_time > 0
1036
+ */
1037
+ if (!rkb->rkb_rk->rk_conf.throttle_cb ||
1038
+ (!throttle_time &&
1039
+ !rd_atomic32_get(&rkb->rkb_rk->rk_last_throttle)))
1040
+ return;
1041
+
1042
+ rd_atomic32_set(&rkb->rkb_rk->rk_last_throttle, throttle_time);
1043
+
1044
+ rko = rd_kafka_op_new(RD_KAFKA_OP_THROTTLE);
1045
+ rd_kafka_op_set_prio(rko, RD_KAFKA_PRIO_HIGH);
1046
+ rko->rko_u.throttle.nodename = rd_strdup(rkb->rkb_nodename);
1047
+ rko->rko_u.throttle.nodeid = rkb->rkb_nodeid;
1048
+ rko->rko_u.throttle.throttle_time = throttle_time;
1049
+ rd_kafka_q_enq(rkq, rko);
1050
+ }
1051
+
1052
+
1053
+ /**
1054
+ * @brief Handle standard op types.
1055
+ */
1056
+ rd_kafka_op_res_t rd_kafka_op_handle_std(rd_kafka_t *rk,
1057
+ rd_kafka_q_t *rkq,
1058
+ rd_kafka_op_t *rko,
1059
+ int cb_type) {
1060
+ if (cb_type == RD_KAFKA_Q_CB_FORCE_RETURN)
1061
+ return RD_KAFKA_OP_RES_PASS;
1062
+ else if (unlikely(rd_kafka_op_is_ctrl_msg(rko))) {
1063
+ /* Control messages must not be exposed to the application
1064
+ * but we need to store their offsets. */
1065
+ rd_kafka_fetch_op_app_prepare(rk, rko);
1066
+ return RD_KAFKA_OP_RES_HANDLED;
1067
+ } else if (cb_type != RD_KAFKA_Q_CB_EVENT &&
1068
+ rko->rko_type & RD_KAFKA_OP_CB)
1069
+ return rd_kafka_op_call(rk, rkq, rko);
1070
+ else if (rko->rko_type == RD_KAFKA_OP_RECV_BUF) /* Handle Response */
1071
+ rd_kafka_buf_handle_op(rko, rko->rko_err);
1072
+ else if (cb_type != RD_KAFKA_Q_CB_RETURN &&
1073
+ rko->rko_type & RD_KAFKA_OP_REPLY &&
1074
+ rko->rko_err == RD_KAFKA_RESP_ERR__DESTROY)
1075
+ return RD_KAFKA_OP_RES_HANDLED; /* dest queue was
1076
+ * probably disabled. */
1077
+ else
1078
+ return RD_KAFKA_OP_RES_PASS;
1079
+
1080
+ return RD_KAFKA_OP_RES_HANDLED;
1081
+ }
1082
+
1083
+
1084
+ /**
1085
+ * @brief Attempt to handle op using its queue's serve callback,
1086
+ * or the passed callback, or op_handle_std(), else do nothing.
1087
+ *
1088
+ * @param rkq is \p rko's queue (which it was unlinked from) with rkq_lock
1089
+ * being held. Callback may re-enqueue the op on this queue
1090
+ * and return YIELD.
1091
+ *
1092
+ * @returns HANDLED if op was handled (and destroyed), PASS if not,
1093
+ * or YIELD if op was handled (maybe destroyed or re-enqueued)
1094
+ * and caller must propagate yield upwards (cancel and return).
1095
+ */
1096
+ rd_kafka_op_res_t rd_kafka_op_handle(rd_kafka_t *rk,
1097
+ rd_kafka_q_t *rkq,
1098
+ rd_kafka_op_t *rko,
1099
+ rd_kafka_q_cb_type_t cb_type,
1100
+ void *opaque,
1101
+ rd_kafka_q_serve_cb_t *callback) {
1102
+ rd_kafka_op_res_t res;
1103
+
1104
+ if (rko->rko_serve) {
1105
+ callback = rko->rko_serve;
1106
+ opaque = rko->rko_serve_opaque;
1107
+ rko->rko_serve = NULL;
1108
+ rko->rko_serve_opaque = NULL;
1109
+ }
1110
+
1111
+ res = rd_kafka_op_handle_std(rk, rkq, rko, cb_type);
1112
+ if (res == RD_KAFKA_OP_RES_KEEP) {
1113
+ /* Op was handled but must not be destroyed. */
1114
+ return res;
1115
+ }
1116
+ if (res == RD_KAFKA_OP_RES_HANDLED) {
1117
+ rd_kafka_op_destroy(rko);
1118
+ return res;
1119
+ } else if (unlikely(res == RD_KAFKA_OP_RES_YIELD))
1120
+ return res;
1121
+
1122
+ if (callback)
1123
+ res = callback(rk, rkq, rko, cb_type, opaque);
1124
+
1125
+ return res;
1126
+ }
1127
+
1128
+
1129
+ /**
1130
+ * @brief Prepare passing message to application.
1131
+ * This must be called just prior to passing/returning a consumed
1132
+ * message to the application.
1133
+ *
1134
+ * Performs:
1135
+ * - Store offset for fetched message + 1.
1136
+ * - Updates the application offset (rktp_app_offset).
1137
+ *
1138
+ * @locks rktp_lock and rk_lock MUST NOT be held
1139
+ */
1140
+ void rd_kafka_fetch_op_app_prepare(rd_kafka_t *rk, rd_kafka_op_t *rko) {
1141
+ rd_kafka_toppar_t *rktp;
1142
+ rd_kafka_fetch_pos_t pos;
1143
+
1144
+ if (unlikely(rko->rko_type != RD_KAFKA_OP_FETCH || rko->rko_err))
1145
+ return;
1146
+
1147
+ rktp = rko->rko_rktp;
1148
+
1149
+ if (unlikely(!rk))
1150
+ rk = rktp->rktp_rkt->rkt_rk;
1151
+
1152
+ pos.offset = rko->rko_u.fetch.rkm.rkm_rkmessage.offset + 1;
1153
+ pos.leader_epoch = rko->rko_u.fetch.rkm.rkm_u.consumer.leader_epoch;
1154
+
1155
+ rd_kafka_update_app_pos(rk, rktp, pos, RD_DO_LOCK);
1156
+ }
1157
+
1158
+ /**
1159
+ * @brief Get offset from an op (FETCH or CONSUMER_ERR).
1160
+ *
1161
+ * @param rko The op to get offset from.
1162
+ * @returns The offset, or RD_KAFKA_OFFSET_INVALID if not applicable.
1163
+ */
1164
+ int64_t rd_kafka_op_get_offset(const rd_kafka_op_t *rko) {
1165
+ if (!rko)
1166
+ return RD_KAFKA_OFFSET_INVALID;
1167
+ if (rko->rko_type == RD_KAFKA_OP_FETCH)
1168
+ return rko->rko_u.fetch.rkm.rkm_rkmessage.offset;
1169
+ if (rko->rko_type == RD_KAFKA_OP_CONSUMER_ERR)
1170
+ return rko->rko_u.err.offset;
1171
+ return RD_KAFKA_OFFSET_INVALID;
1172
+ }
1173
+
1174
+ /**
1175
+ * @brief Process a share fetch response op and deliver messages.
1176
+ *
1177
+ * @param rko The share fetch response op
1178
+ * @param rkshare The share consumer handle
1179
+ * @param rkmessages Output array for messages
1180
+ * @param cnt Current count of messages in array
1181
+ *
1182
+ * @returns Updated count of messages in array
1183
+ */
1184
+ unsigned int
1185
+ rd_kafka_op_process_share_fetch_response(rd_kafka_op_t *rko,
1186
+ rd_kafka_share_t *rkshare,
1187
+ rd_kafka_message_t **rkmessages,
1188
+ unsigned int cnt) {
1189
+ /*
1190
+ *TODO KIP-932: send messages from the fetcher.c directly.
1191
+ */
1192
+ rd_kafka_op_t *msg_rko;
1193
+ int i;
1194
+ int total_msgs =
1195
+ rd_list_cnt(rko->rko_u.share_fetch_response.message_rkos);
1196
+
1197
+ /* Build acknowledgement mapping from inflight_acks */
1198
+ rd_kafka_share_build_inflight_acks_map(rkshare, rko);
1199
+
1200
+ /* Process all messages from the list. */
1201
+ for (i = 0; i < total_msgs; i++) {
1202
+ msg_rko = rd_list_elem(
1203
+ rko->rko_u.share_fetch_response.message_rkos, i);
1204
+
1205
+ /* Return message to application */
1206
+ /**
1207
+ * TODO KIP-932: We need to expose the error string maybe
1208
+ * as rd_kafka_error_t in the message op.
1209
+ */
1210
+ rkmessages[cnt++] = rd_kafka_message_get(msg_rko);
1211
+ }
1212
+
1213
+ /* Messages handed to app; clear list so op destructor
1214
+ * knows not to free the message ops individually. */
1215
+ rd_list_destroy(rko->rko_u.share_fetch_response.message_rkos);
1216
+ rko->rko_u.share_fetch_response.message_rkos = NULL;
1217
+
1218
+ return cnt;
1219
+ }