tigerbeetle 0.0.34 → 0.0.37

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 (249) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +10 -0
  3. data/ext/tb_client/extconf.rb +13 -13
  4. data/ext/tb_client/tigerbeetle/LICENSE +177 -0
  5. data/ext/tb_client/tigerbeetle/build.zig +2327 -0
  6. data/ext/tb_client/tigerbeetle/src/aof.zig +1000 -0
  7. data/ext/tb_client/tigerbeetle/src/build_multiversion.zig +808 -0
  8. data/ext/tb_client/tigerbeetle/src/cdc/amqp/protocol.zig +1283 -0
  9. data/ext/tb_client/tigerbeetle/src/cdc/amqp/spec.zig +1704 -0
  10. data/ext/tb_client/tigerbeetle/src/cdc/amqp/types.zig +341 -0
  11. data/ext/tb_client/tigerbeetle/src/cdc/amqp.zig +1450 -0
  12. data/ext/tb_client/tigerbeetle/src/cdc/runner.zig +1659 -0
  13. data/ext/tb_client/tigerbeetle/src/clients/c/samples/main.c +406 -0
  14. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/context.zig +1084 -0
  15. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/echo_client.zig +286 -0
  16. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/packet.zig +158 -0
  17. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/signal.zig +229 -0
  18. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/signal_fuzz.zig +110 -0
  19. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client.h +386 -0
  20. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client.zig +34 -0
  21. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_exports.zig +281 -0
  22. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_header.zig +312 -0
  23. data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_header_test.zig +138 -0
  24. data/ext/tb_client/tigerbeetle/src/clients/c/test.zig +466 -0
  25. data/ext/tb_client/tigerbeetle/src/clients/docs_samples.zig +157 -0
  26. data/ext/tb_client/tigerbeetle/src/clients/docs_types.zig +90 -0
  27. data/ext/tb_client/tigerbeetle/src/clients/dotnet/ci.zig +203 -0
  28. data/ext/tb_client/tigerbeetle/src/clients/dotnet/docs.zig +79 -0
  29. data/ext/tb_client/tigerbeetle/src/clients/dotnet/dotnet_bindings.zig +542 -0
  30. data/ext/tb_client/tigerbeetle/src/clients/go/ci.zig +109 -0
  31. data/ext/tb_client/tigerbeetle/src/clients/go/docs.zig +86 -0
  32. data/ext/tb_client/tigerbeetle/src/clients/go/go_bindings.zig +370 -0
  33. data/ext/tb_client/tigerbeetle/src/clients/go/pkg/native/tb_client.h +386 -0
  34. data/ext/tb_client/tigerbeetle/src/clients/java/ci.zig +167 -0
  35. data/ext/tb_client/tigerbeetle/src/clients/java/docs.zig +126 -0
  36. data/ext/tb_client/tigerbeetle/src/clients/java/java_bindings.zig +996 -0
  37. data/ext/tb_client/tigerbeetle/src/clients/java/src/client.zig +748 -0
  38. data/ext/tb_client/tigerbeetle/src/clients/java/src/jni.zig +3238 -0
  39. data/ext/tb_client/tigerbeetle/src/clients/java/src/jni_tests.zig +1718 -0
  40. data/ext/tb_client/tigerbeetle/src/clients/java/src/jni_thread_cleaner.zig +190 -0
  41. data/ext/tb_client/tigerbeetle/src/clients/node/ci.zig +104 -0
  42. data/ext/tb_client/tigerbeetle/src/clients/node/docs.zig +75 -0
  43. data/ext/tb_client/tigerbeetle/src/clients/node/node.zig +522 -0
  44. data/ext/tb_client/tigerbeetle/src/clients/node/node_bindings.zig +267 -0
  45. data/ext/tb_client/tigerbeetle/src/clients/node/src/c.zig +3 -0
  46. data/ext/tb_client/tigerbeetle/src/clients/node/src/translate.zig +379 -0
  47. data/ext/tb_client/tigerbeetle/src/clients/python/ci.zig +131 -0
  48. data/ext/tb_client/tigerbeetle/src/clients/python/docs.zig +63 -0
  49. data/ext/tb_client/tigerbeetle/src/clients/python/python_bindings.zig +588 -0
  50. data/ext/tb_client/tigerbeetle/src/clients/rust/assets/tb_client.h +386 -0
  51. data/ext/tb_client/tigerbeetle/src/clients/rust/ci.zig +73 -0
  52. data/ext/tb_client/tigerbeetle/src/clients/rust/docs.zig +106 -0
  53. data/ext/tb_client/tigerbeetle/src/clients/rust/rust_bindings.zig +305 -0
  54. data/ext/tb_client/tigerbeetle/src/config.zig +296 -0
  55. data/ext/tb_client/tigerbeetle/src/constants.zig +790 -0
  56. data/ext/tb_client/tigerbeetle/src/copyhound.zig +202 -0
  57. data/ext/tb_client/tigerbeetle/src/counting_allocator.zig +72 -0
  58. data/ext/tb_client/tigerbeetle/src/direction.zig +11 -0
  59. data/ext/tb_client/tigerbeetle/src/docs_website/build.zig +158 -0
  60. data/ext/tb_client/tigerbeetle/src/docs_website/src/content.zig +156 -0
  61. data/ext/tb_client/tigerbeetle/src/docs_website/src/docs.zig +252 -0
  62. data/ext/tb_client/tigerbeetle/src/docs_website/src/file_checker.zig +313 -0
  63. data/ext/tb_client/tigerbeetle/src/docs_website/src/html.zig +87 -0
  64. data/ext/tb_client/tigerbeetle/src/docs_website/src/page_writer.zig +63 -0
  65. data/ext/tb_client/tigerbeetle/src/docs_website/src/redirects.zig +47 -0
  66. data/ext/tb_client/tigerbeetle/src/docs_website/src/search_index_writer.zig +28 -0
  67. data/ext/tb_client/tigerbeetle/src/docs_website/src/service_worker_writer.zig +61 -0
  68. data/ext/tb_client/tigerbeetle/src/docs_website/src/single_page_writer.zig +169 -0
  69. data/ext/tb_client/tigerbeetle/src/docs_website/src/website.zig +46 -0
  70. data/ext/tb_client/tigerbeetle/src/ewah.zig +445 -0
  71. data/ext/tb_client/tigerbeetle/src/ewah_benchmark.zig +128 -0
  72. data/ext/tb_client/tigerbeetle/src/ewah_fuzz.zig +171 -0
  73. data/ext/tb_client/tigerbeetle/src/fuzz_tests.zig +179 -0
  74. data/ext/tb_client/tigerbeetle/src/integration_tests.zig +662 -0
  75. data/ext/tb_client/tigerbeetle/src/io/common.zig +155 -0
  76. data/ext/tb_client/tigerbeetle/src/io/darwin.zig +1093 -0
  77. data/ext/tb_client/tigerbeetle/src/io/linux.zig +1880 -0
  78. data/ext/tb_client/tigerbeetle/src/io/test.zig +1005 -0
  79. data/ext/tb_client/tigerbeetle/src/io/windows.zig +1598 -0
  80. data/ext/tb_client/tigerbeetle/src/io.zig +34 -0
  81. data/ext/tb_client/tigerbeetle/src/iops.zig +134 -0
  82. data/ext/tb_client/tigerbeetle/src/list.zig +236 -0
  83. data/ext/tb_client/tigerbeetle/src/lsm/binary_search.zig +848 -0
  84. data/ext/tb_client/tigerbeetle/src/lsm/binary_search_benchmark.zig +179 -0
  85. data/ext/tb_client/tigerbeetle/src/lsm/cache_map.zig +424 -0
  86. data/ext/tb_client/tigerbeetle/src/lsm/cache_map_fuzz.zig +420 -0
  87. data/ext/tb_client/tigerbeetle/src/lsm/compaction.zig +2117 -0
  88. data/ext/tb_client/tigerbeetle/src/lsm/composite_key.zig +182 -0
  89. data/ext/tb_client/tigerbeetle/src/lsm/forest.zig +1119 -0
  90. data/ext/tb_client/tigerbeetle/src/lsm/forest_fuzz.zig +1102 -0
  91. data/ext/tb_client/tigerbeetle/src/lsm/forest_table_iterator.zig +200 -0
  92. data/ext/tb_client/tigerbeetle/src/lsm/groove.zig +1495 -0
  93. data/ext/tb_client/tigerbeetle/src/lsm/k_way_merge.zig +739 -0
  94. data/ext/tb_client/tigerbeetle/src/lsm/k_way_merge_benchmark.zig +166 -0
  95. data/ext/tb_client/tigerbeetle/src/lsm/manifest.zig +754 -0
  96. data/ext/tb_client/tigerbeetle/src/lsm/manifest_level.zig +1294 -0
  97. data/ext/tb_client/tigerbeetle/src/lsm/manifest_level_fuzz.zig +510 -0
  98. data/ext/tb_client/tigerbeetle/src/lsm/manifest_log.zig +1263 -0
  99. data/ext/tb_client/tigerbeetle/src/lsm/manifest_log_fuzz.zig +628 -0
  100. data/ext/tb_client/tigerbeetle/src/lsm/node_pool.zig +247 -0
  101. data/ext/tb_client/tigerbeetle/src/lsm/scan_buffer.zig +116 -0
  102. data/ext/tb_client/tigerbeetle/src/lsm/scan_builder.zig +543 -0
  103. data/ext/tb_client/tigerbeetle/src/lsm/scan_fuzz.zig +938 -0
  104. data/ext/tb_client/tigerbeetle/src/lsm/scan_lookup.zig +293 -0
  105. data/ext/tb_client/tigerbeetle/src/lsm/scan_merge.zig +362 -0
  106. data/ext/tb_client/tigerbeetle/src/lsm/scan_range.zig +99 -0
  107. data/ext/tb_client/tigerbeetle/src/lsm/scan_state.zig +17 -0
  108. data/ext/tb_client/tigerbeetle/src/lsm/scan_tree.zig +1036 -0
  109. data/ext/tb_client/tigerbeetle/src/lsm/schema.zig +617 -0
  110. data/ext/tb_client/tigerbeetle/src/lsm/scratch_memory.zig +84 -0
  111. data/ext/tb_client/tigerbeetle/src/lsm/segmented_array.zig +1500 -0
  112. data/ext/tb_client/tigerbeetle/src/lsm/segmented_array_benchmark.zig +149 -0
  113. data/ext/tb_client/tigerbeetle/src/lsm/segmented_array_fuzz.zig +7 -0
  114. data/ext/tb_client/tigerbeetle/src/lsm/set_associative_cache.zig +865 -0
  115. data/ext/tb_client/tigerbeetle/src/lsm/table.zig +607 -0
  116. data/ext/tb_client/tigerbeetle/src/lsm/table_memory.zig +843 -0
  117. data/ext/tb_client/tigerbeetle/src/lsm/table_value_iterator.zig +105 -0
  118. data/ext/tb_client/tigerbeetle/src/lsm/timestamp_range.zig +40 -0
  119. data/ext/tb_client/tigerbeetle/src/lsm/tree.zig +630 -0
  120. data/ext/tb_client/tigerbeetle/src/lsm/tree_fuzz.zig +933 -0
  121. data/ext/tb_client/tigerbeetle/src/lsm/zig_zag_merge.zig +557 -0
  122. data/ext/tb_client/tigerbeetle/src/message_buffer.zig +469 -0
  123. data/ext/tb_client/tigerbeetle/src/message_bus.zig +1214 -0
  124. data/ext/tb_client/tigerbeetle/src/message_bus_fuzz.zig +936 -0
  125. data/ext/tb_client/tigerbeetle/src/message_pool.zig +343 -0
  126. data/ext/tb_client/tigerbeetle/src/multiversion.zig +2195 -0
  127. data/ext/tb_client/tigerbeetle/src/queue.zig +390 -0
  128. data/ext/tb_client/tigerbeetle/src/repl/completion.zig +201 -0
  129. data/ext/tb_client/tigerbeetle/src/repl/parser.zig +1356 -0
  130. data/ext/tb_client/tigerbeetle/src/repl/terminal.zig +496 -0
  131. data/ext/tb_client/tigerbeetle/src/repl.zig +1034 -0
  132. data/ext/tb_client/tigerbeetle/src/scripts/amqp.zig +973 -0
  133. data/ext/tb_client/tigerbeetle/src/scripts/cfo.zig +1866 -0
  134. data/ext/tb_client/tigerbeetle/src/scripts/changelog.zig +304 -0
  135. data/ext/tb_client/tigerbeetle/src/scripts/ci.zig +227 -0
  136. data/ext/tb_client/tigerbeetle/src/scripts/client_readmes.zig +658 -0
  137. data/ext/tb_client/tigerbeetle/src/scripts/devhub.zig +466 -0
  138. data/ext/tb_client/tigerbeetle/src/scripts/release.zig +1058 -0
  139. data/ext/tb_client/tigerbeetle/src/scripts.zig +105 -0
  140. data/ext/tb_client/tigerbeetle/src/shell.zig +1195 -0
  141. data/ext/tb_client/tigerbeetle/src/stack.zig +260 -0
  142. data/ext/tb_client/tigerbeetle/src/state_machine/auditor.zig +911 -0
  143. data/ext/tb_client/tigerbeetle/src/state_machine/workload.zig +2079 -0
  144. data/ext/tb_client/tigerbeetle/src/state_machine.zig +4872 -0
  145. data/ext/tb_client/tigerbeetle/src/state_machine_fuzz.zig +288 -0
  146. data/ext/tb_client/tigerbeetle/src/state_machine_tests.zig +3128 -0
  147. data/ext/tb_client/tigerbeetle/src/static_allocator.zig +82 -0
  148. data/ext/tb_client/tigerbeetle/src/stdx/bit_set.zig +157 -0
  149. data/ext/tb_client/tigerbeetle/src/stdx/bounded_array.zig +292 -0
  150. data/ext/tb_client/tigerbeetle/src/stdx/debug.zig +65 -0
  151. data/ext/tb_client/tigerbeetle/src/stdx/flags.zig +1414 -0
  152. data/ext/tb_client/tigerbeetle/src/stdx/mlock.zig +92 -0
  153. data/ext/tb_client/tigerbeetle/src/stdx/prng.zig +677 -0
  154. data/ext/tb_client/tigerbeetle/src/stdx/radix.zig +336 -0
  155. data/ext/tb_client/tigerbeetle/src/stdx/ring_buffer.zig +511 -0
  156. data/ext/tb_client/tigerbeetle/src/stdx/sort_test.zig +112 -0
  157. data/ext/tb_client/tigerbeetle/src/stdx/stdx.zig +1160 -0
  158. data/ext/tb_client/tigerbeetle/src/stdx/testing/low_level_hash_vectors.zig +142 -0
  159. data/ext/tb_client/tigerbeetle/src/stdx/testing/snaptest.zig +361 -0
  160. data/ext/tb_client/tigerbeetle/src/stdx/time_units.zig +275 -0
  161. data/ext/tb_client/tigerbeetle/src/stdx/unshare.zig +295 -0
  162. data/ext/tb_client/tigerbeetle/src/stdx/vendored/aegis.zig +436 -0
  163. data/ext/tb_client/tigerbeetle/src/stdx/windows.zig +48 -0
  164. data/ext/tb_client/tigerbeetle/src/stdx/zipfian.zig +402 -0
  165. data/ext/tb_client/tigerbeetle/src/storage.zig +489 -0
  166. data/ext/tb_client/tigerbeetle/src/storage_fuzz.zig +180 -0
  167. data/ext/tb_client/tigerbeetle/src/testing/bench.zig +146 -0
  168. data/ext/tb_client/tigerbeetle/src/testing/cluster/grid_checker.zig +53 -0
  169. data/ext/tb_client/tigerbeetle/src/testing/cluster/journal_checker.zig +61 -0
  170. data/ext/tb_client/tigerbeetle/src/testing/cluster/manifest_checker.zig +76 -0
  171. data/ext/tb_client/tigerbeetle/src/testing/cluster/message_bus.zig +110 -0
  172. data/ext/tb_client/tigerbeetle/src/testing/cluster/network.zig +412 -0
  173. data/ext/tb_client/tigerbeetle/src/testing/cluster/state_checker.zig +331 -0
  174. data/ext/tb_client/tigerbeetle/src/testing/cluster/storage_checker.zig +458 -0
  175. data/ext/tb_client/tigerbeetle/src/testing/cluster.zig +1198 -0
  176. data/ext/tb_client/tigerbeetle/src/testing/exhaustigen.zig +128 -0
  177. data/ext/tb_client/tigerbeetle/src/testing/fixtures.zig +181 -0
  178. data/ext/tb_client/tigerbeetle/src/testing/fuzz.zig +144 -0
  179. data/ext/tb_client/tigerbeetle/src/testing/id.zig +97 -0
  180. data/ext/tb_client/tigerbeetle/src/testing/io.zig +317 -0
  181. data/ext/tb_client/tigerbeetle/src/testing/marks.zig +126 -0
  182. data/ext/tb_client/tigerbeetle/src/testing/packet_simulator.zig +533 -0
  183. data/ext/tb_client/tigerbeetle/src/testing/reply_sequence.zig +154 -0
  184. data/ext/tb_client/tigerbeetle/src/testing/state_machine.zig +389 -0
  185. data/ext/tb_client/tigerbeetle/src/testing/storage.zig +1247 -0
  186. data/ext/tb_client/tigerbeetle/src/testing/table.zig +249 -0
  187. data/ext/tb_client/tigerbeetle/src/testing/time.zig +98 -0
  188. data/ext/tb_client/tigerbeetle/src/testing/tmp_tigerbeetle.zig +212 -0
  189. data/ext/tb_client/tigerbeetle/src/testing/vortex/constants.zig +26 -0
  190. data/ext/tb_client/tigerbeetle/src/testing/vortex/faulty_network.zig +580 -0
  191. data/ext/tb_client/tigerbeetle/src/testing/vortex/java_driver/ci.zig +39 -0
  192. data/ext/tb_client/tigerbeetle/src/testing/vortex/logged_process.zig +214 -0
  193. data/ext/tb_client/tigerbeetle/src/testing/vortex/rust_driver/ci.zig +34 -0
  194. data/ext/tb_client/tigerbeetle/src/testing/vortex/supervisor.zig +766 -0
  195. data/ext/tb_client/tigerbeetle/src/testing/vortex/workload.zig +543 -0
  196. data/ext/tb_client/tigerbeetle/src/testing/vortex/zig_driver.zig +181 -0
  197. data/ext/tb_client/tigerbeetle/src/tidy.zig +1448 -0
  198. data/ext/tb_client/tigerbeetle/src/tigerbeetle/benchmark_driver.zig +227 -0
  199. data/ext/tb_client/tigerbeetle/src/tigerbeetle/benchmark_load.zig +1069 -0
  200. data/ext/tb_client/tigerbeetle/src/tigerbeetle/cli.zig +1422 -0
  201. data/ext/tb_client/tigerbeetle/src/tigerbeetle/inspect.zig +1658 -0
  202. data/ext/tb_client/tigerbeetle/src/tigerbeetle/inspect_integrity.zig +518 -0
  203. data/ext/tb_client/tigerbeetle/src/tigerbeetle/libtb_client.zig +36 -0
  204. data/ext/tb_client/tigerbeetle/src/tigerbeetle/main.zig +646 -0
  205. data/ext/tb_client/tigerbeetle/src/tigerbeetle.zig +958 -0
  206. data/ext/tb_client/tigerbeetle/src/time.zig +236 -0
  207. data/ext/tb_client/tigerbeetle/src/trace/event.zig +745 -0
  208. data/ext/tb_client/tigerbeetle/src/trace/statsd.zig +462 -0
  209. data/ext/tb_client/tigerbeetle/src/trace.zig +556 -0
  210. data/ext/tb_client/tigerbeetle/src/unit_tests.zig +321 -0
  211. data/ext/tb_client/tigerbeetle/src/vopr.zig +1785 -0
  212. data/ext/tb_client/tigerbeetle/src/vortex.zig +101 -0
  213. data/ext/tb_client/tigerbeetle/src/vsr/checkpoint_trailer.zig +473 -0
  214. data/ext/tb_client/tigerbeetle/src/vsr/checksum.zig +208 -0
  215. data/ext/tb_client/tigerbeetle/src/vsr/checksum_benchmark.zig +43 -0
  216. data/ext/tb_client/tigerbeetle/src/vsr/client.zig +768 -0
  217. data/ext/tb_client/tigerbeetle/src/vsr/client_replies.zig +532 -0
  218. data/ext/tb_client/tigerbeetle/src/vsr/client_sessions.zig +338 -0
  219. data/ext/tb_client/tigerbeetle/src/vsr/clock.zig +1019 -0
  220. data/ext/tb_client/tigerbeetle/src/vsr/fault_detector.zig +279 -0
  221. data/ext/tb_client/tigerbeetle/src/vsr/free_set.zig +1381 -0
  222. data/ext/tb_client/tigerbeetle/src/vsr/free_set_fuzz.zig +315 -0
  223. data/ext/tb_client/tigerbeetle/src/vsr/grid.zig +1460 -0
  224. data/ext/tb_client/tigerbeetle/src/vsr/grid_blocks_missing.zig +757 -0
  225. data/ext/tb_client/tigerbeetle/src/vsr/grid_scrubber.zig +797 -0
  226. data/ext/tb_client/tigerbeetle/src/vsr/journal.zig +2586 -0
  227. data/ext/tb_client/tigerbeetle/src/vsr/marzullo.zig +308 -0
  228. data/ext/tb_client/tigerbeetle/src/vsr/message_header.zig +1777 -0
  229. data/ext/tb_client/tigerbeetle/src/vsr/multi_batch.zig +715 -0
  230. data/ext/tb_client/tigerbeetle/src/vsr/multi_batch_fuzz.zig +185 -0
  231. data/ext/tb_client/tigerbeetle/src/vsr/repair_budget.zig +333 -0
  232. data/ext/tb_client/tigerbeetle/src/vsr/replica.zig +12355 -0
  233. data/ext/tb_client/tigerbeetle/src/vsr/replica_format.zig +416 -0
  234. data/ext/tb_client/tigerbeetle/src/vsr/replica_reformat.zig +165 -0
  235. data/ext/tb_client/tigerbeetle/src/vsr/replica_test.zig +2910 -0
  236. data/ext/tb_client/tigerbeetle/src/vsr/routing.zig +1075 -0
  237. data/ext/tb_client/tigerbeetle/src/vsr/superblock.zig +1603 -0
  238. data/ext/tb_client/tigerbeetle/src/vsr/superblock_fuzz.zig +484 -0
  239. data/ext/tb_client/tigerbeetle/src/vsr/superblock_quorums.zig +405 -0
  240. data/ext/tb_client/tigerbeetle/src/vsr/superblock_quorums_fuzz.zig +355 -0
  241. data/ext/tb_client/tigerbeetle/src/vsr/sync.zig +29 -0
  242. data/ext/tb_client/tigerbeetle/src/vsr.zig +1727 -0
  243. data/lib/tb_client/shared_lib.rb +12 -5
  244. data/lib/tigerbeetle/client.rb +1 -1
  245. data/lib/tigerbeetle/platforms.rb +9 -0
  246. data/lib/tigerbeetle/version.rb +2 -2
  247. data/tigerbeetle.gemspec +22 -5
  248. metadata +242 -3
  249. data/ext/tb_client/pkg.tar.gz +0 -0
@@ -0,0 +1,343 @@
1
+ const std = @import("std");
2
+ const assert = std.debug.assert;
3
+ const mem = std.mem;
4
+
5
+ const stdx = @import("stdx");
6
+ const constants = @import("constants.zig");
7
+
8
+ const vsr = @import("vsr.zig");
9
+ const Header = vsr.Header;
10
+ const StackType = @import("./stack.zig").StackType;
11
+
12
+ comptime {
13
+ // message_size_max must be a multiple of sector_size for Direct I/O
14
+ assert(constants.message_size_max % constants.sector_size == 0);
15
+ }
16
+
17
+ pub const Options = union(vsr.ProcessType) {
18
+ replica: struct {
19
+ members_count: u8,
20
+ pipeline_requests_limit: u32,
21
+ message_bus: enum { tcp, testing },
22
+ },
23
+ client,
24
+
25
+ /// The number of messages allocated at initialization by the message pool.
26
+ fn messages_max(options: *const Options) u32 {
27
+ return switch (options.*) {
28
+ .client => messages_max: {
29
+ var sum: u32 = 0;
30
+
31
+ sum += constants.replicas_max; // Connection.recv_buffer
32
+ // Connection.send_queue:
33
+ sum += constants.replicas_max * constants.connection_send_queue_max_client;
34
+ sum += 1; // Client.request_inflight
35
+ // Handle bursts.
36
+ // (e.g. Connection.parse_message(), or sending a ping when the send queue is full).
37
+ sum += 1;
38
+
39
+ // This conditions is necessary (but not sufficient) to prevent deadlocks.
40
+ assert(sum > 1);
41
+ break :messages_max sum;
42
+ },
43
+
44
+ // The number of full-sized messages allocated at initialization by the replica message
45
+ // pool. There must be enough messages to ensure that the replica can always progress,
46
+ // to avoid deadlock.
47
+ .replica => |*replica| messages_max: {
48
+ assert(replica.members_count > 0);
49
+ assert(replica.members_count <= constants.members_max);
50
+ assert(replica.pipeline_requests_limit >= 0);
51
+ assert(replica.pipeline_requests_limit <= constants.pipeline_request_queue_max);
52
+
53
+ var sum: u32 = 0;
54
+
55
+ const pipeline_limit =
56
+ constants.pipeline_prepare_queue_max + replica.pipeline_requests_limit;
57
+
58
+ sum += constants.journal_iops_read_max; // Journal reads
59
+ sum += constants.journal_iops_write_max; // Journal writes
60
+ sum += constants.client_replies_iops_read_max; // Client-reply reads
61
+ sum += constants.client_replies_iops_write_max; // Client-reply writes
62
+ // Replica.grid_reads (Replica.BlockRead)
63
+ sum += constants.grid_repair_reads_max;
64
+ sum += 1; // Replica.loopback_queue
65
+ sum += pipeline_limit; // Replica.Pipeline{Queue|Cache}
66
+ sum += 1; // Replica.commit_prepare
67
+ sum += 1; // Replica.sync_start_view
68
+ // Replica.do_view_change_from_all_replicas quorum:
69
+ // All other quorums are bitsets.
70
+ //
71
+ // This should be set to the runtime replica_count, but we don't know that precisely
72
+ // yet, so we may guess high. (We can't differentiate between replicas and
73
+ // standbys.)
74
+ sum += @min(replica.members_count, constants.replicas_max);
75
+ sum += 1; // Handle bursts (e.g. Connection.parse_message)
76
+ // Handle Replica.commit_op's reply:
77
+ // (This is separate from the burst +1 because they may occur concurrently).
78
+ sum += 1;
79
+
80
+ switch (replica.message_bus) {
81
+ .tcp => {
82
+ // The maximum number of simultaneous open connections on the server.
83
+ // -1 since we never connect to ourself.
84
+ const connections_max = replica.members_count + pipeline_limit - 1;
85
+ sum += connections_max; // Connection.recv_buffer
86
+ // Connection.send_queue:
87
+ sum += connections_max * constants.connection_send_queue_max_replica;
88
+ },
89
+ .testing => {},
90
+ }
91
+
92
+ // This conditions is necessary (but not sufficient) to prevent deadlocks.
93
+ assert(sum > constants.replicas_max);
94
+ break :messages_max sum;
95
+ },
96
+ };
97
+ }
98
+ };
99
+
100
+ /// A pool of reference-counted Messages, memory for which is allocated only once during
101
+ /// initialization and reused thereafter. The messages_max values determine the size of this pool.
102
+ pub const MessagePool = struct {
103
+ pub const Message = extern struct {
104
+ pub const Reserved = CommandMessageType(.reserved);
105
+ pub const Ping = CommandMessageType(.ping);
106
+ pub const Pong = CommandMessageType(.pong);
107
+ pub const PingClient = CommandMessageType(.ping_client);
108
+ pub const PongClient = CommandMessageType(.pong_client);
109
+ pub const Request = CommandMessageType(.request);
110
+ pub const Prepare = CommandMessageType(.prepare);
111
+ pub const PrepareOk = CommandMessageType(.prepare_ok);
112
+ pub const Reply = CommandMessageType(.reply);
113
+ pub const Commit = CommandMessageType(.commit);
114
+ pub const StartViewChange = CommandMessageType(.start_view_change);
115
+ pub const DoViewChange = CommandMessageType(.do_view_change);
116
+ pub const StartView = CommandMessageType(.start_view);
117
+ pub const RequestStartView = CommandMessageType(.request_start_view);
118
+ pub const RequestHeaders = CommandMessageType(.request_headers);
119
+ pub const RequestPrepare = CommandMessageType(.request_prepare);
120
+ pub const RequestReply = CommandMessageType(.request_reply);
121
+ pub const Headers = CommandMessageType(.headers);
122
+ pub const Eviction = CommandMessageType(.eviction);
123
+ pub const RequestBlocks = CommandMessageType(.request_blocks);
124
+ pub const Block = CommandMessageType(.block);
125
+
126
+ // TODO Avoid the extra level of indirection.
127
+ // (https://github.com/tigerbeetle/tigerbeetle/pull/1295#discussion_r1394265250)
128
+ header: *Header,
129
+ buffer: *align(constants.sector_size) [constants.message_size_max]u8,
130
+ references: u32 = 0,
131
+ link: FreeList.Link,
132
+
133
+ /// Increment the reference count of the message and return the same pointer passed.
134
+ pub fn ref(message: *Message) *Message {
135
+ assert(message.references > 0);
136
+ assert(message.link.next == null);
137
+
138
+ message.references += 1;
139
+ return message;
140
+ }
141
+
142
+ pub fn body_used(message: *const Message) []align(@sizeOf(Header)) u8 {
143
+ return message.buffer[@sizeOf(Header)..message.header.size];
144
+ }
145
+
146
+ /// NOTE:
147
+ /// - Does *not* alter the reference count.
148
+ /// - Does *not* verify the command. (Use this function for constructing the message.)
149
+ pub fn build(
150
+ message: *Message,
151
+ comptime command: vsr.Command,
152
+ ) *CommandMessageType(command) {
153
+ return @ptrCast(message);
154
+ }
155
+
156
+ /// NOTE: Does *not* alter the reference count.
157
+ pub fn into(
158
+ message: *Message,
159
+ comptime command: vsr.Command,
160
+ ) ?*CommandMessageType(command) {
161
+ if (message.header.command != command) return null;
162
+ return @ptrCast(message);
163
+ }
164
+
165
+ pub const AnyMessage = stdx.EnumUnionType(vsr.Command, MessagePointerType);
166
+
167
+ fn MessagePointerType(comptime command: vsr.Command) type {
168
+ return *CommandMessageType(command);
169
+ }
170
+
171
+ /// NOTE: Does *not* alter the reference count.
172
+ pub fn into_any(message: *Message) AnyMessage {
173
+ switch (message.header.command) {
174
+ inline else => |command| {
175
+ return @unionInit(AnyMessage, @tagName(command), message.into(command).?);
176
+ },
177
+ }
178
+ }
179
+ };
180
+
181
+ const FreeList = StackType(Message);
182
+ /// List of currently unused messages.
183
+ free_list: StackType(Message),
184
+
185
+ messages_max: usize,
186
+ messages: []Message,
187
+ buffers: []align(constants.sector_size) [constants.message_size_max]u8,
188
+
189
+ pub fn init(
190
+ allocator: mem.Allocator,
191
+ options: Options,
192
+ ) error{OutOfMemory}!MessagePool {
193
+ return MessagePool.init_capacity(allocator, options.messages_max());
194
+ }
195
+
196
+ pub fn init_capacity(
197
+ allocator: mem.Allocator,
198
+ messages_max: u32,
199
+ ) error{OutOfMemory}!MessagePool {
200
+ const buffers = try allocator.alignedAlloc(
201
+ [constants.message_size_max]u8,
202
+ constants.sector_size,
203
+ messages_max,
204
+ );
205
+ errdefer allocator.free(buffers);
206
+
207
+ const messages = try allocator.alloc(Message, messages_max);
208
+ errdefer allocator.free(messages);
209
+
210
+ var free_list = FreeList.init(.{
211
+ .capacity = messages_max,
212
+ .verify_push = false,
213
+ });
214
+ for (messages, buffers) |*message, *buffer| {
215
+ message.* = .{ .header = undefined, .buffer = buffer, .link = .{} };
216
+ free_list.push(message);
217
+ }
218
+
219
+ return .{
220
+ .free_list = free_list,
221
+ .messages_max = messages_max,
222
+ .messages = messages,
223
+ .buffers = buffers,
224
+ };
225
+ }
226
+
227
+ /// Frees all messages that were unused or returned to the pool via unref().
228
+ pub fn deinit(pool: *MessagePool, allocator: mem.Allocator) void {
229
+ // If the MessagePool is being deinitialized, all messages should have already been
230
+ // released to the pool.
231
+ assert(pool.free_list.count() == pool.messages_max);
232
+ assert(pool.messages.len == pool.messages_max);
233
+ assert(pool.buffers.len == pool.messages_max);
234
+ allocator.free(pool.messages);
235
+ allocator.free(pool.buffers);
236
+ pool.* = undefined;
237
+ }
238
+
239
+ pub fn GetMessageType(comptime command: ?vsr.Command) type {
240
+ if (command) |c| {
241
+ return *CommandMessageType(c);
242
+ } else {
243
+ return *Message;
244
+ }
245
+ }
246
+
247
+ /// Get an unused message with a buffer of constants.message_size_max.
248
+ /// The returned message has exactly one reference.
249
+ pub fn get_message(pool: *MessagePool, comptime command: ?vsr.Command) GetMessageType(command) {
250
+ if (command) |c| {
251
+ return pool.get_message_base().build(c);
252
+ } else {
253
+ return pool.get_message_base();
254
+ }
255
+ }
256
+
257
+ fn get_message_base(pool: *MessagePool) *Message {
258
+ const message = pool.free_list.pop().?;
259
+ assert(message.link.next == null);
260
+ message.header = mem.bytesAsValue(Header, message.buffer[0..@sizeOf(Header)]);
261
+ assert(message.references == 0);
262
+
263
+ message.references = 1;
264
+ return message;
265
+ }
266
+
267
+ /// Decrement the reference count of the message, possibly freeing it.
268
+ ///
269
+ /// `@TypeOf(message)` is one of:
270
+ /// - `*Message`
271
+ /// - `*MessageType(command)` for any `command`.
272
+ pub fn unref(pool: *MessagePool, message: anytype) void {
273
+ assert(@typeInfo(@TypeOf(message)) == .pointer);
274
+ assert(!@typeInfo(@TypeOf(message)).pointer.is_const);
275
+
276
+ if (@TypeOf(message) == *Message) {
277
+ pool.unref_base(message);
278
+ } else {
279
+ pool.unref_base(message.base());
280
+ }
281
+ }
282
+
283
+ fn unref_base(pool: *MessagePool, message: *Message) void {
284
+ assert(message.link.next == null);
285
+
286
+ message.references -= 1;
287
+ if (message.references == 0) {
288
+ message.header = undefined;
289
+ if (constants.verify) {
290
+ @memset(message.buffer, undefined);
291
+ }
292
+ pool.free_list.push(message);
293
+ }
294
+ }
295
+ };
296
+
297
+ fn CommandMessageType(comptime command: vsr.Command) type {
298
+ const CommandHeaderUnified = Header.Type(command);
299
+
300
+ return extern struct {
301
+ const CommandMessage = @This();
302
+ const CommandHeader = CommandHeaderUnified;
303
+ const Message = MessagePool.Message;
304
+
305
+ // The underlying structure of Message and CommandMessage should be identical, so that their
306
+ // memory can be cast back-and-forth.
307
+ comptime {
308
+ assert(@sizeOf(Message) == @sizeOf(CommandMessage));
309
+
310
+ for (
311
+ std.meta.fields(Message),
312
+ std.meta.fields(CommandMessage),
313
+ ) |message_field, command_message_field| {
314
+ assert(std.mem.eql(u8, message_field.name, command_message_field.name));
315
+ assert(@sizeOf(message_field.type) == @sizeOf(command_message_field.type));
316
+ assert(@offsetOf(Message, message_field.name) ==
317
+ @offsetOf(CommandMessage, command_message_field.name));
318
+ }
319
+ }
320
+
321
+ /// Points into `buffer`.
322
+ header: *CommandHeader,
323
+ buffer: *align(constants.sector_size) [constants.message_size_max]u8,
324
+ references: u32,
325
+ link: MessagePool.FreeList.Link,
326
+
327
+ pub fn base(message: *CommandMessage) *Message {
328
+ return @ptrCast(message);
329
+ }
330
+
331
+ pub fn base_const(message: *const CommandMessage) *const Message {
332
+ return @ptrCast(message);
333
+ }
334
+
335
+ pub fn ref(message: *CommandMessage) *CommandMessage {
336
+ return @ptrCast(message.base().ref());
337
+ }
338
+
339
+ pub fn body_used(message: *const CommandMessage) []align(@sizeOf(Header)) u8 {
340
+ return message.base_const().body_used();
341
+ }
342
+ };
343
+ }