@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,721 @@
1
+ /*
2
+ * This license covers this C port of
3
+ * Coda Hale's Golang HdrHistogram https://github.com/codahale/hdrhistogram
4
+ * at revision 3a0bb77429bd3a61596f5e8a3172445844342120
5
+ *
6
+ * ----------------------------------------------------------------------------
7
+ *
8
+ * The MIT License (MIT)
9
+ *
10
+ * Copyright (c) 2014 Coda Hale
11
+ *
12
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
13
+ * of this software and associated documentation files (the "Software"), to deal
14
+ * in the Software without restriction, including without limitation the rights
15
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
16
+ * copies of the Software, and to permit persons to whom the Software is
17
+ * furnished to do so, subject to the following conditions:
18
+ *
19
+ * The above copyright notice and this permission notice shall be included in
20
+ * all copies or substantial portions of the Software.
21
+ *
22
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
25
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
28
+ * THE SOFTWARE.
29
+ */
30
+
31
+ /*
32
+ * librdkafka - Apache Kafka C library
33
+ *
34
+ * Copyright (c) 2018-2022, Magnus Edenhill
35
+ * All rights reserved.
36
+ *
37
+ * Redistribution and use in source and binary forms, with or without
38
+ * modification, are permitted provided that the following conditions are met:
39
+ *
40
+ * 1. Redistributions of source code must retain the above copyright notice,
41
+ * this list of conditions and the following disclaimer.
42
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
43
+ * this list of conditions and the following disclaimer in the documentation
44
+ * and/or other materials provided with the distribution.
45
+ *
46
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
47
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
48
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
49
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
50
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
51
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
52
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
53
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
54
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
55
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
56
+ * POSSIBILITY OF SUCH DAMAGE.
57
+ */
58
+
59
+ /**
60
+ * Minimal C Hdr_Histogram based on Coda Hale's Golang implementation.
61
+ * https://github.com/codahale/hdr_histogram
62
+ *
63
+ *
64
+ * A Histogram is a lossy data structure used to record the distribution of
65
+ * non-normally distributed data (like latency) with a high degree of accuracy
66
+ * and a bounded degree of precision.
67
+ *
68
+ *
69
+ */
70
+
71
+ #include "rd.h"
72
+
73
+ #include <stdlib.h>
74
+ #include <string.h>
75
+ #include <math.h>
76
+
77
+ #include "rdhdrhistogram.h"
78
+ #include "rdunittest.h"
79
+ #include "rdfloat.h"
80
+
81
+ void rd_hdr_histogram_destroy(rd_hdr_histogram_t *hdr) {
82
+ rd_free(hdr);
83
+ }
84
+
85
+ rd_hdr_histogram_t *rd_hdr_histogram_new(int64_t minValue,
86
+ int64_t maxValue,
87
+ int significantFigures) {
88
+ rd_hdr_histogram_t *hdr;
89
+ int64_t largestValueWithSingleUnitResolution;
90
+ int32_t subBucketCountMagnitude;
91
+ int32_t subBucketHalfCountMagnitude;
92
+ int32_t unitMagnitude;
93
+ int32_t subBucketCount;
94
+ int32_t subBucketHalfCount;
95
+ int64_t subBucketMask;
96
+ int64_t smallestUntrackableValue;
97
+ int32_t bucketsNeeded = 1;
98
+ int32_t bucketCount;
99
+ int32_t countsLen;
100
+
101
+ if (significantFigures < 1 || significantFigures > 5)
102
+ return NULL;
103
+
104
+ largestValueWithSingleUnitResolution =
105
+ (int64_t)(2.0 * pow(10.0, (double)significantFigures));
106
+
107
+ subBucketCountMagnitude =
108
+ (int32_t)ceil(log2((double)largestValueWithSingleUnitResolution));
109
+
110
+ subBucketHalfCountMagnitude = RD_MAX(subBucketCountMagnitude, 1) - 1;
111
+
112
+ unitMagnitude = (int32_t)RD_MAX(floor(log2((double)minValue)), 0);
113
+
114
+ subBucketCount =
115
+ (int32_t)pow(2, (double)subBucketHalfCountMagnitude + 1.0);
116
+
117
+ subBucketHalfCount = subBucketCount / 2;
118
+
119
+ subBucketMask = (int64_t)(subBucketCount - 1) << unitMagnitude;
120
+
121
+ /* Determine exponent range needed to support the trackable
122
+ * value with no overflow: */
123
+ smallestUntrackableValue = (int64_t)subBucketCount << unitMagnitude;
124
+ while (smallestUntrackableValue < maxValue) {
125
+ smallestUntrackableValue <<= 1;
126
+ bucketsNeeded++;
127
+ }
128
+
129
+ bucketCount = bucketsNeeded;
130
+ countsLen = (bucketCount + 1) * (subBucketCount / 2);
131
+ hdr = rd_calloc(1, sizeof(*hdr) + (sizeof(*hdr->counts) * countsLen));
132
+ hdr->counts = (int64_t *)(hdr + 1);
133
+ hdr->allocatedSize = sizeof(*hdr) + (sizeof(*hdr->counts) * countsLen);
134
+
135
+ hdr->lowestTrackableValue = minValue;
136
+ hdr->highestTrackableValue = maxValue;
137
+ hdr->unitMagnitude = unitMagnitude;
138
+ hdr->significantFigures = significantFigures;
139
+ hdr->subBucketHalfCountMagnitude = subBucketHalfCountMagnitude;
140
+ hdr->subBucketHalfCount = subBucketHalfCount;
141
+ hdr->subBucketMask = subBucketMask;
142
+ hdr->subBucketCount = subBucketCount;
143
+ hdr->bucketCount = bucketCount;
144
+ hdr->countsLen = countsLen;
145
+ hdr->totalCount = 0;
146
+ hdr->lowestOutOfRange = minValue;
147
+ hdr->highestOutOfRange = maxValue;
148
+
149
+ return hdr;
150
+ }
151
+
152
+ /**
153
+ * @brief Deletes all recorded values and resets histogram.
154
+ */
155
+ void rd_hdr_histogram_reset(rd_hdr_histogram_t *hdr) {
156
+ int32_t i;
157
+ hdr->totalCount = 0;
158
+ for (i = 0; i < hdr->countsLen; i++)
159
+ hdr->counts[i] = 0;
160
+ }
161
+
162
+
163
+
164
+ static RD_INLINE int32_t rd_hdr_countsIndex(const rd_hdr_histogram_t *hdr,
165
+ int32_t bucketIdx,
166
+ int32_t subBucketIdx) {
167
+ int32_t bucketBaseIdx = (bucketIdx + 1)
168
+ << hdr->subBucketHalfCountMagnitude;
169
+ int32_t offsetInBucket = subBucketIdx - hdr->subBucketHalfCount;
170
+ return bucketBaseIdx + offsetInBucket;
171
+ }
172
+
173
+ static RD_INLINE int64_t rd_hdr_getCountAtIndex(const rd_hdr_histogram_t *hdr,
174
+ int32_t bucketIdx,
175
+ int32_t subBucketIdx) {
176
+ return hdr->counts[rd_hdr_countsIndex(hdr, bucketIdx, subBucketIdx)];
177
+ }
178
+
179
+
180
+ static RD_INLINE int64_t bitLen(int64_t x) {
181
+ int64_t n = 0;
182
+ for (; x >= 0x8000; x >>= 16)
183
+ n += 16;
184
+ if (x >= 0x80) {
185
+ x >>= 8;
186
+ n += 8;
187
+ }
188
+ if (x >= 0x8) {
189
+ x >>= 4;
190
+ n += 4;
191
+ }
192
+ if (x >= 0x2) {
193
+ x >>= 2;
194
+ n += 2;
195
+ }
196
+ if (x >= 0x1)
197
+ n++;
198
+ return n;
199
+ }
200
+
201
+
202
+ static RD_INLINE int32_t rd_hdr_getBucketIndex(const rd_hdr_histogram_t *hdr,
203
+ int64_t v) {
204
+ int64_t pow2Ceiling = bitLen(v | hdr->subBucketMask);
205
+ return (int32_t)(pow2Ceiling - (int64_t)hdr->unitMagnitude -
206
+ (int64_t)(hdr->subBucketHalfCountMagnitude + 1));
207
+ }
208
+
209
+ static RD_INLINE int32_t rd_hdr_getSubBucketIdx(const rd_hdr_histogram_t *hdr,
210
+ int64_t v,
211
+ int32_t idx) {
212
+ return (int32_t)(v >> ((int64_t)idx + (int64_t)hdr->unitMagnitude));
213
+ }
214
+
215
+ static RD_INLINE int64_t rd_hdr_valueFromIndex(const rd_hdr_histogram_t *hdr,
216
+ int32_t bucketIdx,
217
+ int32_t subBucketIdx) {
218
+ return (int64_t)subBucketIdx
219
+ << ((int64_t)bucketIdx + hdr->unitMagnitude);
220
+ }
221
+
222
+ static RD_INLINE int64_t
223
+ rd_hdr_sizeOfEquivalentValueRange(const rd_hdr_histogram_t *hdr, int64_t v) {
224
+ int32_t bucketIdx = rd_hdr_getBucketIndex(hdr, v);
225
+ int32_t subBucketIdx = rd_hdr_getSubBucketIdx(hdr, v, bucketIdx);
226
+ int32_t adjustedBucket = bucketIdx;
227
+ if (unlikely(subBucketIdx >= hdr->subBucketCount))
228
+ adjustedBucket++;
229
+ return (int64_t)1 << (hdr->unitMagnitude + (int64_t)adjustedBucket);
230
+ }
231
+
232
+ static RD_INLINE int64_t
233
+ rd_hdr_lowestEquivalentValue(const rd_hdr_histogram_t *hdr, int64_t v) {
234
+ int32_t bucketIdx = rd_hdr_getBucketIndex(hdr, v);
235
+ int32_t subBucketIdx = rd_hdr_getSubBucketIdx(hdr, v, bucketIdx);
236
+ return rd_hdr_valueFromIndex(hdr, bucketIdx, subBucketIdx);
237
+ }
238
+
239
+
240
+ static RD_INLINE int64_t
241
+ rd_hdr_nextNonEquivalentValue(const rd_hdr_histogram_t *hdr, int64_t v) {
242
+ return rd_hdr_lowestEquivalentValue(hdr, v) +
243
+ rd_hdr_sizeOfEquivalentValueRange(hdr, v);
244
+ }
245
+
246
+
247
+ static RD_INLINE int64_t
248
+ rd_hdr_highestEquivalentValue(const rd_hdr_histogram_t *hdr, int64_t v) {
249
+ return rd_hdr_nextNonEquivalentValue(hdr, v) - 1;
250
+ }
251
+
252
+ static RD_INLINE int64_t
253
+ rd_hdr_medianEquivalentValue(const rd_hdr_histogram_t *hdr, int64_t v) {
254
+ return rd_hdr_lowestEquivalentValue(hdr, v) +
255
+ (rd_hdr_sizeOfEquivalentValueRange(hdr, v) >> 1);
256
+ }
257
+
258
+
259
+ static RD_INLINE int32_t rd_hdr_countsIndexFor(const rd_hdr_histogram_t *hdr,
260
+ int64_t v) {
261
+ int32_t bucketIdx = rd_hdr_getBucketIndex(hdr, v);
262
+ int32_t subBucketIdx = rd_hdr_getSubBucketIdx(hdr, v, bucketIdx);
263
+ return rd_hdr_countsIndex(hdr, bucketIdx, subBucketIdx);
264
+ }
265
+
266
+
267
+
268
+ typedef struct rd_hdr_iter_s {
269
+ const rd_hdr_histogram_t *hdr;
270
+ int bucketIdx;
271
+ int subBucketIdx;
272
+ int64_t countAtIdx;
273
+ int64_t countToIdx;
274
+ int64_t valueFromIdx;
275
+ int64_t highestEquivalentValue;
276
+ } rd_hdr_iter_t;
277
+
278
+ #define RD_HDR_ITER_INIT(hdr) \
279
+ { .hdr = hdr, .subBucketIdx = -1 }
280
+
281
+ static int rd_hdr_iter_next(rd_hdr_iter_t *it) {
282
+ const rd_hdr_histogram_t *hdr = it->hdr;
283
+
284
+ if (unlikely(it->countToIdx >= hdr->totalCount))
285
+ return 0;
286
+
287
+ it->subBucketIdx++;
288
+ if (unlikely(it->subBucketIdx >= hdr->subBucketCount)) {
289
+ it->subBucketIdx = hdr->subBucketHalfCount;
290
+ it->bucketIdx++;
291
+ }
292
+
293
+ if (unlikely(it->bucketIdx >= hdr->bucketCount))
294
+ return 0;
295
+
296
+ it->countAtIdx =
297
+ rd_hdr_getCountAtIndex(hdr, it->bucketIdx, it->subBucketIdx);
298
+ it->countToIdx += it->countAtIdx;
299
+ it->valueFromIdx =
300
+ rd_hdr_valueFromIndex(hdr, it->bucketIdx, it->subBucketIdx);
301
+ it->highestEquivalentValue =
302
+ rd_hdr_highestEquivalentValue(hdr, it->valueFromIdx);
303
+
304
+ return 1;
305
+ }
306
+
307
+
308
+ double rd_hdr_histogram_stddev(rd_hdr_histogram_t *hdr) {
309
+ double mean;
310
+ double geometricDevTotal = 0.0;
311
+ rd_hdr_iter_t it = RD_HDR_ITER_INIT(hdr);
312
+
313
+ if (hdr->totalCount == 0)
314
+ return 0;
315
+
316
+ mean = rd_hdr_histogram_mean(hdr);
317
+
318
+
319
+ while (rd_hdr_iter_next(&it)) {
320
+ double dev;
321
+
322
+ if (it.countAtIdx == 0)
323
+ continue;
324
+
325
+ dev =
326
+ (double)rd_hdr_medianEquivalentValue(hdr, it.valueFromIdx) -
327
+ mean;
328
+ geometricDevTotal += (dev * dev) * (double)it.countAtIdx;
329
+ }
330
+
331
+ return sqrt(geometricDevTotal / (double)hdr->totalCount);
332
+ }
333
+
334
+
335
+ /**
336
+ * @returns the approximate maximum recorded value.
337
+ */
338
+ int64_t rd_hdr_histogram_max(const rd_hdr_histogram_t *hdr) {
339
+ int64_t vmax = 0;
340
+ rd_hdr_iter_t it = RD_HDR_ITER_INIT(hdr);
341
+
342
+ while (rd_hdr_iter_next(&it)) {
343
+ if (it.countAtIdx != 0)
344
+ vmax = it.highestEquivalentValue;
345
+ }
346
+ return rd_hdr_highestEquivalentValue(hdr, vmax);
347
+ }
348
+
349
+ /**
350
+ * @returns the approximate minimum recorded value.
351
+ */
352
+ int64_t rd_hdr_histogram_min(const rd_hdr_histogram_t *hdr) {
353
+ int64_t vmin = 0;
354
+ rd_hdr_iter_t it = RD_HDR_ITER_INIT(hdr);
355
+
356
+ while (rd_hdr_iter_next(&it)) {
357
+ if (it.countAtIdx != 0 && vmin == 0) {
358
+ vmin = it.highestEquivalentValue;
359
+ break;
360
+ }
361
+ }
362
+ return rd_hdr_lowestEquivalentValue(hdr, vmin);
363
+ }
364
+
365
+ /**
366
+ * @returns the approximate arithmetic mean of the recorded values.
367
+ */
368
+ double rd_hdr_histogram_mean(const rd_hdr_histogram_t *hdr) {
369
+ int64_t total = 0;
370
+ rd_hdr_iter_t it = RD_HDR_ITER_INIT(hdr);
371
+
372
+ if (hdr->totalCount == 0)
373
+ return 0.0;
374
+
375
+ while (rd_hdr_iter_next(&it)) {
376
+ if (it.countAtIdx != 0)
377
+ total += it.countAtIdx * rd_hdr_medianEquivalentValue(
378
+ hdr, it.valueFromIdx);
379
+ }
380
+ return (double)total / (double)hdr->totalCount;
381
+ }
382
+
383
+
384
+
385
+ /**
386
+ * @brief Records the given value.
387
+ *
388
+ * @returns 1 if value was recorded or 0 if value is out of range.
389
+ */
390
+
391
+ int rd_hdr_histogram_record(rd_hdr_histogram_t *hdr, int64_t v) {
392
+ int32_t idx = rd_hdr_countsIndexFor(hdr, v);
393
+
394
+ if (idx < 0 || hdr->countsLen <= idx) {
395
+ hdr->outOfRangeCount++;
396
+ if (v > hdr->highestOutOfRange)
397
+ hdr->highestOutOfRange = v;
398
+ if (v < hdr->lowestOutOfRange)
399
+ hdr->lowestOutOfRange = v;
400
+ return 0;
401
+ }
402
+
403
+ hdr->counts[idx]++;
404
+ hdr->totalCount++;
405
+
406
+ return 1;
407
+ }
408
+
409
+
410
+ /**
411
+ * @returns the recorded value at the given quantile (0..100).
412
+ */
413
+ int64_t rd_hdr_histogram_quantile(const rd_hdr_histogram_t *hdr, double q) {
414
+ int64_t total = 0;
415
+ int64_t countAtPercentile;
416
+ rd_hdr_iter_t it = RD_HDR_ITER_INIT(hdr);
417
+
418
+ if (q > 100.0)
419
+ q = 100.0;
420
+
421
+ countAtPercentile =
422
+ (int64_t)(((q / 100.0) * (double)hdr->totalCount) + 0.5);
423
+
424
+ while (rd_hdr_iter_next(&it)) {
425
+ total += it.countAtIdx;
426
+ if (total >= countAtPercentile)
427
+ return rd_hdr_highestEquivalentValue(hdr,
428
+ it.valueFromIdx);
429
+ }
430
+
431
+ return 0;
432
+ }
433
+
434
+
435
+
436
+ /**
437
+ * @name Unit tests
438
+ * @{
439
+ *
440
+ *
441
+ *
442
+ */
443
+
444
+ /**
445
+ * @returns 0 on success or 1 on failure.
446
+ */
447
+ static int ut_high_sigfig(void) {
448
+ rd_hdr_histogram_t *hdr;
449
+ const int64_t input[] = {
450
+ 459876, 669187, 711612, 816326, 931423,
451
+ 1033197, 1131895, 2477317, 3964974, 12718782,
452
+ };
453
+ size_t i;
454
+ int64_t v;
455
+ const int64_t exp = 1048575;
456
+
457
+ hdr = rd_hdr_histogram_new(459876, 12718782, 5);
458
+ for (i = 0; i < RD_ARRAYSIZE(input); i++) {
459
+ /* Ignore errors (some should fail) */
460
+ rd_hdr_histogram_record(hdr, input[i]);
461
+ }
462
+
463
+ v = rd_hdr_histogram_quantile(hdr, 50);
464
+ RD_UT_ASSERT(v == exp, "Median is %" PRId64 ", expected %" PRId64, v,
465
+ exp);
466
+
467
+ rd_hdr_histogram_destroy(hdr);
468
+ RD_UT_PASS();
469
+ }
470
+
471
+ static int ut_quantile(void) {
472
+ rd_hdr_histogram_t *hdr = rd_hdr_histogram_new(1, 10000000, 3);
473
+ size_t i;
474
+ const struct {
475
+ double q;
476
+ int64_t v;
477
+ } exp[] = {
478
+ {50, 500223}, {75, 750079}, {90, 900095}, {95, 950271},
479
+ {99, 990207}, {99.9, 999423}, {99.99, 999935},
480
+ };
481
+
482
+ for (i = 0; i < 1000000; i++) {
483
+ int r = rd_hdr_histogram_record(hdr, (int64_t)i);
484
+ RD_UT_ASSERT(r, "record(%" PRId64 ") failed\n", (int64_t)i);
485
+ }
486
+
487
+ for (i = 0; i < RD_ARRAYSIZE(exp); i++) {
488
+ int64_t v = rd_hdr_histogram_quantile(hdr, exp[i].q);
489
+ RD_UT_ASSERT(v == exp[i].v,
490
+ "P%.2f is %" PRId64 ", expected %" PRId64,
491
+ exp[i].q, v, exp[i].v);
492
+ }
493
+
494
+ rd_hdr_histogram_destroy(hdr);
495
+ RD_UT_PASS();
496
+ }
497
+
498
+ static int ut_mean(void) {
499
+ rd_hdr_histogram_t *hdr = rd_hdr_histogram_new(1, 10000000, 3);
500
+ size_t i;
501
+ const double exp = 500000.013312;
502
+ double v;
503
+
504
+ for (i = 0; i < 1000000; i++) {
505
+ int r = rd_hdr_histogram_record(hdr, (int64_t)i);
506
+ RD_UT_ASSERT(r, "record(%" PRId64 ") failed\n", (int64_t)i);
507
+ }
508
+
509
+ v = rd_hdr_histogram_mean(hdr);
510
+ RD_UT_ASSERT(rd_dbl_eq0(v, exp, 0.0000001), "Mean is %f, expected %f",
511
+ v, exp);
512
+
513
+ rd_hdr_histogram_destroy(hdr);
514
+ RD_UT_PASS();
515
+ }
516
+
517
+
518
+ static int ut_stddev(void) {
519
+ rd_hdr_histogram_t *hdr = rd_hdr_histogram_new(1, 10000000, 3);
520
+ size_t i;
521
+ const double exp = 288675.140368;
522
+ const double epsilon = 0.000001;
523
+ double v;
524
+
525
+ for (i = 0; i < 1000000; i++) {
526
+ int r = rd_hdr_histogram_record(hdr, (int64_t)i);
527
+ RD_UT_ASSERT(r, "record(%" PRId64 ") failed\n", (int64_t)i);
528
+ }
529
+
530
+ v = rd_hdr_histogram_stddev(hdr);
531
+ RD_UT_ASSERT(rd_dbl_eq0(v, exp, epsilon),
532
+ "StdDev is %.6f, expected %.6f: diff %.6f vs epsilon %.6f",
533
+ v, exp, fabs(v - exp), epsilon);
534
+
535
+ rd_hdr_histogram_destroy(hdr);
536
+ RD_UT_PASS();
537
+ }
538
+
539
+ static int ut_totalcount(void) {
540
+ rd_hdr_histogram_t *hdr = rd_hdr_histogram_new(1, 10000000, 3);
541
+ int64_t i;
542
+
543
+ for (i = 0; i < 1000000; i++) {
544
+ int64_t v;
545
+ int r = rd_hdr_histogram_record(hdr, i);
546
+ RD_UT_ASSERT(r, "record(%" PRId64 ") failed\n", i);
547
+
548
+ v = hdr->totalCount;
549
+ RD_UT_ASSERT(v == i + 1,
550
+ "total_count is %" PRId64 ", expected %" PRId64, v,
551
+ i + 1);
552
+ }
553
+
554
+ rd_hdr_histogram_destroy(hdr);
555
+ RD_UT_PASS();
556
+ }
557
+
558
+
559
+ static int ut_max(void) {
560
+ rd_hdr_histogram_t *hdr = rd_hdr_histogram_new(1, 10000000, 3);
561
+ int64_t i, v;
562
+ const int64_t exp = 1000447;
563
+
564
+ for (i = 0; i < 1000000; i++) {
565
+ int r = rd_hdr_histogram_record(hdr, i);
566
+ RD_UT_ASSERT(r, "record(%" PRId64 ") failed\n", i);
567
+ }
568
+
569
+ v = rd_hdr_histogram_max(hdr);
570
+ RD_UT_ASSERT(v == exp, "Max is %" PRId64 ", expected %" PRId64, v, exp);
571
+
572
+ rd_hdr_histogram_destroy(hdr);
573
+ RD_UT_PASS();
574
+ }
575
+
576
+ static int ut_min(void) {
577
+ rd_hdr_histogram_t *hdr = rd_hdr_histogram_new(1, 10000000, 3);
578
+ int64_t i, v;
579
+ const int64_t exp = 0;
580
+
581
+ for (i = 0; i < 1000000; i++) {
582
+ int r = rd_hdr_histogram_record(hdr, i);
583
+ RD_UT_ASSERT(r, "record(%" PRId64 ") failed\n", i);
584
+ }
585
+
586
+ v = rd_hdr_histogram_min(hdr);
587
+ RD_UT_ASSERT(v == exp, "Min is %" PRId64 ", expected %" PRId64, v, exp);
588
+
589
+ rd_hdr_histogram_destroy(hdr);
590
+ RD_UT_PASS();
591
+ }
592
+
593
+ static int ut_reset(void) {
594
+ rd_hdr_histogram_t *hdr = rd_hdr_histogram_new(1, 10000000, 3);
595
+ int64_t i, v;
596
+ const int64_t exp = 0;
597
+
598
+ for (i = 0; i < 1000000; i++) {
599
+ int r = rd_hdr_histogram_record(hdr, i);
600
+ RD_UT_ASSERT(r, "record(%" PRId64 ") failed\n", i);
601
+ }
602
+
603
+ rd_hdr_histogram_reset(hdr);
604
+
605
+ v = rd_hdr_histogram_max(hdr);
606
+ RD_UT_ASSERT(v == exp, "Max is %" PRId64 ", expected %" PRId64, v, exp);
607
+
608
+ rd_hdr_histogram_destroy(hdr);
609
+ RD_UT_PASS();
610
+ }
611
+
612
+
613
+ static int ut_nan(void) {
614
+ rd_hdr_histogram_t *hdr = rd_hdr_histogram_new(1, 100000, 3);
615
+ double v;
616
+
617
+ v = rd_hdr_histogram_mean(hdr);
618
+ RD_UT_ASSERT(!isnan(v), "Mean is %f, expected NaN", v);
619
+ v = rd_hdr_histogram_stddev(hdr);
620
+ RD_UT_ASSERT(!isnan(v), "StdDev is %f, expected NaN", v);
621
+
622
+ rd_hdr_histogram_destroy(hdr);
623
+ RD_UT_PASS();
624
+ }
625
+
626
+
627
+ static int ut_sigfigs(void) {
628
+ int sigfigs;
629
+
630
+ for (sigfigs = 1; sigfigs <= 5; sigfigs++) {
631
+ rd_hdr_histogram_t *hdr = rd_hdr_histogram_new(1, 10, sigfigs);
632
+ RD_UT_ASSERT(hdr->significantFigures == sigfigs,
633
+ "Significant figures is %" PRId64 ", expected %d",
634
+ hdr->significantFigures, sigfigs);
635
+ rd_hdr_histogram_destroy(hdr);
636
+ }
637
+
638
+ RD_UT_PASS();
639
+ }
640
+
641
+ static int ut_minmax_trackable(void) {
642
+ const int64_t minval = 2;
643
+ const int64_t maxval = 11;
644
+ rd_hdr_histogram_t *hdr = rd_hdr_histogram_new(minval, maxval, 3);
645
+
646
+ RD_UT_ASSERT(hdr->lowestTrackableValue == minval,
647
+ "lowestTrackableValue is %" PRId64 ", expected %" PRId64,
648
+ hdr->lowestTrackableValue, minval);
649
+ RD_UT_ASSERT(hdr->highestTrackableValue == maxval,
650
+ "highestTrackableValue is %" PRId64 ", expected %" PRId64,
651
+ hdr->highestTrackableValue, maxval);
652
+
653
+ rd_hdr_histogram_destroy(hdr);
654
+ RD_UT_PASS();
655
+ }
656
+
657
+
658
+ static int ut_unitmagnitude_overflow(void) {
659
+ rd_hdr_histogram_t *hdr = rd_hdr_histogram_new(0, 200, 4);
660
+ int r = rd_hdr_histogram_record(hdr, 11);
661
+ RD_UT_ASSERT(r, "record(11) failed\n");
662
+
663
+ rd_hdr_histogram_destroy(hdr);
664
+ RD_UT_PASS();
665
+ }
666
+
667
+ static int ut_subbucketmask_overflow(void) {
668
+ rd_hdr_histogram_t *hdr;
669
+ const int64_t input[] = {(int64_t)1e8, (int64_t)2e7, (int64_t)3e7};
670
+ const struct {
671
+ double q;
672
+ int64_t v;
673
+ } exp[] = {
674
+ {50, 33554431},
675
+ {83.33, 33554431},
676
+ {83.34, 100663295},
677
+ {99, 100663295},
678
+ };
679
+ size_t i;
680
+
681
+ hdr = rd_hdr_histogram_new((int64_t)2e7, (int64_t)1e8, 5);
682
+
683
+ for (i = 0; i < RD_ARRAYSIZE(input); i++) {
684
+ /* Ignore errors (some should fail) */
685
+ int r = rd_hdr_histogram_record(hdr, input[i]);
686
+ RD_UT_ASSERT(r, "record(%" PRId64 ") failed\n", input[i]);
687
+ }
688
+
689
+ for (i = 0; i < RD_ARRAYSIZE(exp); i++) {
690
+ int64_t v = rd_hdr_histogram_quantile(hdr, exp[i].q);
691
+ RD_UT_ASSERT(v == exp[i].v,
692
+ "P%.2f is %" PRId64 ", expected %" PRId64,
693
+ exp[i].q, v, exp[i].v);
694
+ }
695
+
696
+ rd_hdr_histogram_destroy(hdr);
697
+ RD_UT_PASS();
698
+ }
699
+
700
+
701
+ int unittest_rdhdrhistogram(void) {
702
+ int fails = 0;
703
+
704
+ fails += ut_high_sigfig();
705
+ fails += ut_quantile();
706
+ fails += ut_mean();
707
+ fails += ut_stddev();
708
+ fails += ut_totalcount();
709
+ fails += ut_max();
710
+ fails += ut_min();
711
+ fails += ut_reset();
712
+ fails += ut_nan();
713
+ fails += ut_sigfigs();
714
+ fails += ut_minmax_trackable();
715
+ fails += ut_unitmagnitude_overflow();
716
+ fails += ut_subbucketmask_overflow();
717
+
718
+ return fails;
719
+ }
720
+
721
+ /**@}*/