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,305 @@
1
+ const std = @import("std");
2
+ const vsr = @import("vsr");
3
+ const exports = vsr.tb_client.exports;
4
+ const assert = std.debug.assert;
5
+
6
+ const type_mappings = .{
7
+ .{ exports.tb_account_flags, "TB_ACCOUNT_FLAGS" },
8
+ .{ exports.tb_account_t, "tb_account_t" },
9
+ .{ exports.tb_transfer_flags, "TB_TRANSFER_FLAGS" },
10
+ .{ exports.tb_transfer_t, "tb_transfer_t" },
11
+ .{ exports.tb_create_account_result, "TB_CREATE_ACCOUNT_RESULT" },
12
+ .{ exports.tb_create_transfer_result, "TB_CREATE_TRANSFER_RESULT" },
13
+ .{ exports.tb_create_accounts_result_t, "tb_create_accounts_result_t" },
14
+ .{ exports.tb_create_transfers_result_t, "tb_create_transfers_result_t" },
15
+ .{ exports.tb_account_filter_t, "tb_account_filter_t" },
16
+ .{ exports.tb_account_filter_flags, "TB_ACCOUNT_FILTER_FLAGS" },
17
+ .{ exports.tb_account_balance_t, "tb_account_balance_t" },
18
+ .{ exports.tb_query_filter_t, "tb_query_filter_t" },
19
+ .{ exports.tb_query_filter_flags, "TB_QUERY_FILTER_FLAGS" },
20
+ .{
21
+ exports.tb_client_t, "tb_client_t",
22
+ \\// Opaque struct serving as a handle for the client instance.
23
+ \\// This struct must be "pinned" (not copyable or movable), as its address must remain stable
24
+ \\// throughout the lifetime of the client instance.
25
+ },
26
+ .{
27
+ exports.tb_packet_t, "tb_packet_t",
28
+ \\// Struct containing the state of a request submitted through the client.
29
+ \\// This struct must be "pinned" (not copyable or movable), as its address must remain stable
30
+ \\// throughout the lifetime of the request.
31
+ },
32
+ .{ exports.tb_operation, "TB_OPERATION" },
33
+ .{ exports.tb_packet_status, "TB_PACKET_STATUS" },
34
+ .{ exports.tb_init_status, "TB_INIT_STATUS" },
35
+ .{ exports.tb_client_status, "TB_CLIENT_STATUS" },
36
+ .{ exports.tb_register_log_callback_status, "TB_REGISTER_LOG_CALLBACK_STATUS" },
37
+ .{ exports.tb_log_level, "TB_LOG_LEVEL" },
38
+ };
39
+
40
+ fn resolve_rust_type(comptime Type: type) []const u8 {
41
+ switch (@typeInfo(Type)) {
42
+ .array => |info| return resolve_rust_type(info.child),
43
+ .@"enum" => |info| return resolve_rust_type(info.tag_type),
44
+ .@"struct" => return resolve_rust_type(std.meta.Int(.unsigned, @bitSizeOf(Type))),
45
+ .bool => return "u8", // todo "bool"
46
+ .int => |info| {
47
+ assert(info.signedness == .unsigned);
48
+ return switch (info.bits) {
49
+ 8 => "u8",
50
+ 16 => "u16",
51
+ 32 => "u32",
52
+ 64 => "u64",
53
+ 128 => "u128",
54
+ else => @compileError("invalid int type"),
55
+ };
56
+ },
57
+ .optional => |info| switch (@typeInfo(info.child)) {
58
+ .pointer => return resolve_rust_type(info.child),
59
+ else => @compileError("Unsupported optional type: " ++ @typeName(Type)),
60
+ },
61
+ .pointer => |info| {
62
+ assert(info.size != .slice);
63
+ assert(!info.is_allowzero);
64
+
65
+ inline for (type_mappings) |type_mapping| {
66
+ const ZigType = type_mapping[0];
67
+ const c_name = type_mapping[1];
68
+
69
+ if (info.child == ZigType) {
70
+ return "*mut " ++ c_name;
71
+ }
72
+ }
73
+
74
+ return comptime "*mut " ++ resolve_rust_type(info.child);
75
+ },
76
+ .void, .@"opaque" => return "::std::os::raw::c_void",
77
+ else => @compileError("Unhandled type: " ++ @typeName(Type)),
78
+ }
79
+ }
80
+
81
+ fn to_uppercase(comptime input: []const u8) [input.len]u8 {
82
+ comptime var output: [input.len]u8 = undefined;
83
+ inline for (&output, 0..) |*char, i| {
84
+ char.* = input[i];
85
+ char.* -= 32 * @as(u8, @intFromBool(char.* >= 'a' and char.* <= 'z'));
86
+ }
87
+ return output;
88
+ }
89
+
90
+ fn emit_enum(
91
+ buffer: *std.ArrayList(u8),
92
+ comptime Type: type,
93
+ comptime type_info: anytype,
94
+ comptime rust_name: []const u8,
95
+ comptime skip_fields: []const []const u8,
96
+ ) !void {
97
+ var suffix_pos = std.mem.lastIndexOf(u8, rust_name, "_").?;
98
+ if (std.mem.count(u8, rust_name, "_") == 1) suffix_pos = rust_name.len;
99
+
100
+ const backing_type = switch (@typeInfo(Type)) {
101
+ .@"struct" => |s| s.backing_integer.?,
102
+ .@"enum" => |e| e.tag_type,
103
+ else => @panic("unexpected"),
104
+ };
105
+ const rust_backing_type_str = switch (@typeInfo(backing_type)) {
106
+ .int => |i| brk: {
107
+ break :brk switch (i.bits) {
108
+ 32 => switch (i.signedness) {
109
+ .unsigned => "u32",
110
+ .signed => "i32",
111
+ },
112
+ 16 => "u16",
113
+ 8 => "u8",
114
+ else => @panic("unexpected"),
115
+ };
116
+ },
117
+ else => @panic("unexpected"),
118
+ };
119
+
120
+ try buffer.writer().print("pub type {s} = {s};\n", .{ rust_name, rust_backing_type_str });
121
+
122
+ inline for (type_info.fields, 0..) |field, i| {
123
+ if (comptime std.mem.startsWith(u8, field.name, "deprecated_")) continue;
124
+ comptime var skip = false;
125
+ inline for (skip_fields) |sf| {
126
+ skip = skip or comptime std.mem.eql(u8, sf, field.name);
127
+ }
128
+
129
+ if (!skip) {
130
+ const field_name = to_uppercase(field.name);
131
+ if (@typeInfo(Type) == .@"enum") {
132
+ try buffer.writer().print("pub const {s}_{s}_{s}: {s} = {};\n", .{
133
+ rust_name,
134
+ rust_name[0..suffix_pos],
135
+ @as([]const u8, &field_name),
136
+ rust_name,
137
+ @intFromEnum(@field(Type, field.name)),
138
+ });
139
+ } else {
140
+ // Packed structs.
141
+ try buffer.writer().print("pub const {s}_{s}_{s}: {s} = 1 << {};\n", .{
142
+ rust_name,
143
+ rust_name[0..suffix_pos],
144
+ @as([]const u8, &field_name),
145
+ rust_name,
146
+ i,
147
+ });
148
+ }
149
+ }
150
+ }
151
+
152
+ try buffer.writer().print("\n", .{});
153
+ }
154
+
155
+ fn emit_struct(
156
+ buffer: *std.ArrayList(u8),
157
+ comptime type_info: anytype,
158
+ comptime rust_name: []const u8,
159
+ ) !void {
160
+ try buffer.writer().print("#[repr(C)]\n", .{});
161
+ try buffer.writer().print("#[derive(Debug, Copy, Clone)]\n", .{});
162
+ try buffer.writer().print("pub struct {s} {{\n", .{rust_name});
163
+
164
+ inline for (type_info.fields) |field| {
165
+ switch (@typeInfo(field.type)) {
166
+ .array => |array| {
167
+ try buffer.writer().print(" pub {s}: [{s}; {}]", .{
168
+ field.name,
169
+ resolve_rust_type(field.type),
170
+ array.len,
171
+ });
172
+ },
173
+ else => {
174
+ try buffer.writer().print(" pub {s}: {s}", .{
175
+ field.name,
176
+ resolve_rust_type(field.type),
177
+ });
178
+ },
179
+ }
180
+
181
+ try buffer.writer().print(",\n", .{});
182
+ }
183
+
184
+ try buffer.writer().print("}}\n\n", .{});
185
+ }
186
+
187
+ pub fn main() !void {
188
+ var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
189
+ defer arena.deinit();
190
+ const allocator = arena.allocator();
191
+
192
+ var buffer = std.ArrayList(u8).init(allocator);
193
+ try buffer.writer().print(
194
+ \\ //////////////////////////////////////////////////////////
195
+ \\ // This file was auto-generated by tb_client_header.zig //
196
+ \\ // Do not manually modify. //
197
+ \\ //////////////////////////////////////////////////////////
198
+ \\
199
+ \\
200
+ , .{});
201
+
202
+ inline for (type_mappings) |type_mapping| {
203
+ const ZigType = type_mapping[0];
204
+ const rust_name = type_mapping[1];
205
+ if (type_mapping.len == 3) {
206
+ const comments: []const u8 = type_mapping[2];
207
+ try buffer.writer().print(comments, .{});
208
+ try buffer.writer().print("\n", .{});
209
+ }
210
+
211
+ switch (@typeInfo(ZigType)) {
212
+ .@"struct" => |info| switch (info.layout) {
213
+ .auto => @compileError("Invalid C struct type: " ++ @typeName(ZigType)),
214
+ .@"packed" => try emit_enum(&buffer, ZigType, info, rust_name, &.{"padding"}),
215
+ .@"extern" => try emit_struct(&buffer, info, rust_name),
216
+ },
217
+ .@"enum" => |info| {
218
+ try emit_enum(&buffer, ZigType, info, rust_name, &.{});
219
+ },
220
+ else => try buffer.writer().print("pub type {s} = {s};\n\n", .{
221
+ rust_name,
222
+ resolve_rust_type(ZigType),
223
+ }),
224
+ }
225
+ }
226
+
227
+ try buffer.writer().print(
228
+ \\extern "C" {{
229
+ \\ // Initialize a new TigerBeetle client which connects to the addresses provided and
230
+ \\ // completes submitted packets by invoking the callback with the given context.
231
+ \\ pub fn tb_client_init(
232
+ \\ client_out: *mut tb_client_t,
233
+ \\ // 128-bit unsigned integer represented as a 16-byte little-endian array.
234
+ \\ cluster_id: *const [u8; 16],
235
+ \\ address_ptr: *const ::std::os::raw::c_char,
236
+ \\ address_len: u32,
237
+ \\ completion_ctx: usize,
238
+ \\ completion_callback: ::std::option::Option<
239
+ \\ unsafe extern "C" fn(
240
+ \\ arg1: usize,
241
+ \\ arg3: *mut tb_packet_t,
242
+ \\ arg4: u64,
243
+ \\ arg5: *const u8,
244
+ \\ arg6: u32,
245
+ \\ ),
246
+ \\ >,
247
+ \\ ) -> TB_INIT_STATUS;
248
+ \\
249
+ \\ // Initialize a new TigerBeetle client which echos back any data submitted.
250
+ \\ pub fn tb_client_init_echo(
251
+ \\ client_out: *mut tb_client_t,
252
+ \\ // 128-bit unsigned integer represented as a 16-byte little-endian array.
253
+ \\ cluster_id: *const [u8; 16],
254
+ \\ address_ptr: *const ::std::os::raw::c_char,
255
+ \\ address_len: u32,
256
+ \\ completion_ctx: usize,
257
+ \\ completion_callback: ::std::option::Option<
258
+ \\ unsafe extern "C" fn(
259
+ \\ arg1: usize,
260
+ \\ arg3: *mut tb_packet_t,
261
+ \\ arg4: u64,
262
+ \\ arg5: *const u8,
263
+ \\ arg6: u32,
264
+ \\ ),
265
+ \\ >,
266
+ \\ ) -> TB_INIT_STATUS;
267
+ \\
268
+ \\ // Retrieve the callback context initially passed into `tb_client_init` or
269
+ \\ // `tb_client_init_echo`.
270
+ \\ pub fn tb_client_completion_context(
271
+ \\ client: *mut tb_client_t,
272
+ \\ completion_ctx_out: *mut usize,
273
+ \\ ) -> TB_CLIENT_STATUS;
274
+ \\
275
+ \\ // Submit a packet with its operation, data, and data_size fields set.
276
+ \\ // Once completed, `on_completion` will be invoked with `on_completion_ctx` and the given
277
+ \\ // packet on the `tb_client` thread (separate from caller's thread).
278
+ \\ pub fn tb_client_submit(
279
+ \\ client: *mut tb_client_t,
280
+ \\ packet: *mut tb_packet_t,
281
+ \\ ) -> TB_CLIENT_STATUS;
282
+ \\
283
+ \\ // Closes the client, causing any previously submitted packets to be completed with
284
+ \\ // `TB_PACKET_CLIENT_SHUTDOWN` before freeing any allocated client resources from init.
285
+ \\ // It is undefined behavior to use any functions on the client once deinit is called.
286
+ \\ pub fn tb_client_deinit(
287
+ \\ client: *mut tb_client_t,
288
+ \\ ) -> TB_CLIENT_STATUS;
289
+ \\
290
+ \\ // Registers or unregisters the application log callback.
291
+ \\ pub fn register_log_callback(
292
+ \\ callback: ::std::option::Option<
293
+ \\ unsafe extern "C" fn(
294
+ \\ TB_LOG_LEVEL,
295
+ \\ *const u8,
296
+ \\ u32,
297
+ \\ ),
298
+ \\ >,
299
+ \\ debug: bool,
300
+ \\ ) -> TB_REGISTER_LOG_CALLBACK_STATUS;
301
+ \\}}
302
+ , .{});
303
+
304
+ try std.io.getStdOut().writeAll(buffer.items);
305
+ }
@@ -0,0 +1,296 @@
1
+ //! Raw configuration values.
2
+ //!
3
+ //! Code which needs these values should use `constants.zig` instead.
4
+ //! Configuration values are set from a combination of:
5
+ //! - default values
6
+ //! - `root.tigerbeetle_config`
7
+ //! - `@import("tigerbeetle_options")`
8
+
9
+ const builtin = @import("builtin");
10
+ const std = @import("std");
11
+ const stdx = @import("stdx");
12
+ const assert = std.debug.assert;
13
+
14
+ const root = @import("root");
15
+
16
+ const KiB = stdx.KiB;
17
+ const MiB = stdx.MiB;
18
+ const GiB = stdx.GiB;
19
+ const TiB = stdx.TiB;
20
+
21
+ const BuildOptions = struct {
22
+ config_verify: bool,
23
+ git_commit: ?[40]u8,
24
+ release: []const u8,
25
+ release_client_min: []const u8,
26
+ };
27
+
28
+ // Allow setting build-time config either via `build.zig` `Options`, or via a struct in the root
29
+ // file.
30
+ const build_options: BuildOptions = blk: {
31
+ const vsr_options =
32
+ if (@hasDecl(root, "vsr_options"))
33
+ root.vsr_options
34
+ else
35
+ @import("vsr_options");
36
+
37
+ // Both the root file and Zig's `addOptions` expose the struct as identical structurally,
38
+ // but a different type from a nominal typing perspective.
39
+ var result: BuildOptions = undefined;
40
+ for (std.meta.fields(BuildOptions)) |field| {
41
+ @field(result, field.name) = launder_type(
42
+ field.type,
43
+ @field(vsr_options, field.name),
44
+ );
45
+ }
46
+ break :blk result;
47
+ };
48
+
49
+ fn launder_type(comptime T: type, comptime value: anytype) T {
50
+ if (T == bool or
51
+ T == []const u8 or
52
+ T == ?[]const u8 or
53
+ T == ?[40]u8)
54
+ {
55
+ return value;
56
+ }
57
+ if (@typeInfo(T) == .@"enum") {
58
+ assert(@typeInfo(@TypeOf(value)) == .@"enum" or @typeInfo(@TypeOf(value)) == .enum_literal);
59
+ return @field(T, @tagName(value));
60
+ }
61
+ unreachable;
62
+ }
63
+
64
+ const vsr = @import("vsr.zig");
65
+ const sector_size = @import("constants.zig").sector_size;
66
+
67
+ pub const Config = struct {
68
+ pub const Cluster = ConfigCluster;
69
+ pub const Process = ConfigProcess;
70
+
71
+ cluster: ConfigCluster,
72
+ process: ConfigProcess,
73
+
74
+ /// Returns true if the configuration is intended for "production".
75
+ /// Intended solely for extra sanity-checks: all meaningful decisions should be driven by
76
+ /// specific fields of the config.
77
+ pub fn is_production(config: *const Config) bool {
78
+ return config.cluster.journal_slot_count > ConfigCluster.journal_slot_count_min;
79
+ }
80
+ };
81
+
82
+ /// Configurations which are tunable per-replica (or per-client).
83
+ /// - Replica configs need not equal each other.
84
+ /// - Client configs need not equal each other.
85
+ /// - Client configs need not equal replica configs.
86
+ /// - Replica configs can change between restarts.
87
+ ///
88
+ /// Fields are documented within constants.zig.
89
+ // TODO: Some of these could be runtime parameters (e.g. grid_scrubber_cycle_ms).
90
+ const ConfigProcess = struct {
91
+ log_level: std.log.Level = .info,
92
+ verify: bool,
93
+ release: vsr.Release = vsr.Release.minimum,
94
+ release_client_min: vsr.Release = vsr.Release.minimum,
95
+ git_commit: ?[40]u8 = null,
96
+ port: u16 = 3001,
97
+ address: []const u8 = "127.0.0.1",
98
+ storage_size_limit_default: u64 = 16 * TiB,
99
+ storage_size_limit_max: u64 = 64 * TiB,
100
+ memory_size_max_default: u64 = GiB,
101
+ cache_accounts_size_default: u64,
102
+ cache_transfers_size_default: u64,
103
+ cache_transfers_pending_size_default: u64,
104
+ client_request_queue_max: u32 = 2,
105
+ lsm_manifest_node_size: u64 = 16 * KiB,
106
+ connection_delay_min_ms: u64 = 50,
107
+ connection_delay_max_ms: u64 = 1000,
108
+ tcp_backlog: u31 = 64,
109
+ tcp_rcvbuf: c_int = 4 * MiB,
110
+ tcp_keepalive: bool = true,
111
+ tcp_keepidle: c_int = 5,
112
+ tcp_keepintvl: c_int = 4,
113
+ tcp_keepcnt: c_int = 3,
114
+ tcp_nodelay: bool = true,
115
+ direct_io: bool,
116
+ journal_iops_read_max: u32 = 8,
117
+ journal_iops_write_max: u32 = 32,
118
+ client_replies_iops_read_max: u32 = 1,
119
+ client_replies_iops_write_max: u32 = 2,
120
+ client_request_completion_warn_ms: u64 = 200,
121
+ tick_ms: u63 = 10,
122
+ rtt_ms: u64 = 300,
123
+ rtt_max_ms: u64 = 1000 * 60,
124
+ rtt_multiple: u8 = 2,
125
+ backoff_min_ms: u64 = 10,
126
+ backoff_max_ms: u64 = 10000,
127
+ clock_offset_tolerance_max_ms: u64 = 10000,
128
+ clock_epoch_max_ms: u64 = 60000,
129
+ clock_synchronization_window_min_ms: u64 = 2000,
130
+ clock_synchronization_window_max_ms: u64 = 20000,
131
+ grid_iops_read_max: u64 = 32,
132
+ grid_iops_write_max: u64 = 32,
133
+ grid_cache_size_default: u64 = GiB,
134
+ grid_repair_request_max: u32 = 4,
135
+ grid_repair_reads_max: u32 = 4,
136
+ grid_missing_blocks_max: u32 = 30,
137
+ grid_missing_tables_max: u32 = 6,
138
+ grid_scrubber_reads_max: u32 = 1,
139
+ grid_scrubber_cycle_ms: u64 = std.time.ms_per_day * 180,
140
+ grid_scrubber_interval_ms_min: u64 = std.time.ms_per_s / 20,
141
+ grid_scrubber_interval_ms_max: u64 = std.time.ms_per_s * 10,
142
+ multiversion_binary_platform_size_max: u64 = 64 * MiB,
143
+ multiversion_poll_interval_ms: u64 = 1000,
144
+ };
145
+
146
+ /// Configurations which are tunable per-cluster.
147
+ /// - All replicas within a cluster must have the same configuration.
148
+ /// - Replicas must reuse the same configuration when the binary is upgraded — they do not change
149
+ /// over the cluster lifetime.
150
+ /// - The storage formats generated by different ConfigClusters are incompatible.
151
+ ///
152
+ /// Fields are documented within constants.zig.
153
+ const ConfigCluster = struct {
154
+ cache_line_size: comptime_int = 64,
155
+ clients_max: u32,
156
+ pipeline_prepare_queue_max: u32 = 8,
157
+ view_change_headers_suffix_max: u32 = 8 + 1,
158
+ quorum_replication_max: u8 = 3,
159
+ journal_slot_count: u32 = 1024,
160
+ message_size_max: u32 = 1 * MiB,
161
+ superblock_copies: comptime_int = 4,
162
+ block_size: comptime_int = 512 * KiB,
163
+ lsm_levels: u6 = 7,
164
+ lsm_growth_factor: u32 = 8,
165
+ lsm_compaction_ops: comptime_int = 32,
166
+ lsm_snapshots_max: u32 = 32,
167
+ lsm_manifest_compact_extra_blocks: comptime_int = 1,
168
+ lsm_table_coalescing_threshold_percent: comptime_int = 50,
169
+ vsr_releases_max: u32 = 64,
170
+
171
+ /// Minimal value.
172
+ // TODO(batiati): Maybe this constant should be derived from `grid_iops_read_max`,
173
+ // since each scan can read from `lsm_levels` in parallel.
174
+ lsm_scans_max: comptime_int = 6,
175
+
176
+ /// The WAL requires at least two sectors of redundant headers — otherwise we could lose them
177
+ /// all to a single torn write. A replica needs at least one valid redundant header to
178
+ /// determine an (untrusted) maximum op in recover_torn_prepare(), without which it cannot
179
+ /// truncate a torn prepare.
180
+ pub const journal_slot_count_min = 2 * @divExact(sector_size, @sizeOf(vsr.Header));
181
+
182
+ pub const clients_max_min = 1;
183
+
184
+ /// The smallest possible message_size_max (for use in the simulator to improve performance).
185
+ /// The message body must have room for pipeline_prepare_queue_max headers in the DVC.
186
+ pub fn message_size_max_min(clients_max: u32) u32 {
187
+ return @max(
188
+ sector_size,
189
+ std.mem.alignForward(
190
+ u32,
191
+ @sizeOf(vsr.Header) + clients_max * @sizeOf(vsr.Header),
192
+ sector_size,
193
+ ),
194
+ );
195
+ }
196
+
197
+ /// Fingerprint of the cluster-wide configuration.
198
+ /// It is used to assert that all cluster members share the same config.
199
+ pub fn checksum(comptime config: ConfigCluster) u128 {
200
+ @setEvalBranchQuota(10_000);
201
+ comptime var config_bytes: []const u8 = &.{};
202
+ comptime for (std.meta.fields(ConfigCluster)) |field| {
203
+ const value = @field(config, field.name);
204
+ const value_64 = @as(u64, value);
205
+ assert(builtin.target.cpu.arch.endian() == .little);
206
+ config_bytes = config_bytes ++ std.mem.asBytes(&value_64);
207
+ };
208
+ return vsr.checksum(config_bytes);
209
+ }
210
+ };
211
+
212
+ pub const ConfigBase = enum {
213
+ production,
214
+ test_min,
215
+ default,
216
+ };
217
+
218
+ pub const configs = struct {
219
+ /// A good default config for production.
220
+ pub const default_production = Config{
221
+ .process = .{
222
+ .direct_io = true,
223
+ .cache_accounts_size_default = @sizeOf(vsr.tigerbeetle.Account) * MiB,
224
+ .cache_transfers_size_default = 0,
225
+ .cache_transfers_pending_size_default = 0,
226
+ .verify = true,
227
+ },
228
+ .cluster = .{
229
+ .clients_max = 64,
230
+ },
231
+ };
232
+
233
+ /// Minimal test configuration — small WAL, small grid block size, etc.
234
+ /// Not suitable for production, but good for testing code that would be otherwise hard to
235
+ /// reach.
236
+ pub const test_min = Config{
237
+ .process = .{
238
+ .storage_size_limit_default = 1 * GiB,
239
+ .storage_size_limit_max = 1 * GiB,
240
+ .direct_io = false,
241
+ .cache_accounts_size_default = @sizeOf(vsr.tigerbeetle.Account) * 256,
242
+ .cache_transfers_size_default = 0,
243
+ .cache_transfers_pending_size_default = 0,
244
+ .journal_iops_read_max = 3,
245
+ .journal_iops_write_max = 2,
246
+ .grid_repair_request_max = 4,
247
+ .grid_repair_reads_max = 4,
248
+ .grid_missing_blocks_max = 3,
249
+ .grid_missing_tables_max = 2,
250
+ .grid_scrubber_reads_max = 2,
251
+ .grid_scrubber_cycle_ms = std.time.ms_per_hour,
252
+ .verify = true,
253
+ },
254
+ .cluster = .{
255
+ .clients_max = 4 + 3,
256
+ .pipeline_prepare_queue_max = 4,
257
+ .view_change_headers_suffix_max = 4 + 1,
258
+ .journal_slot_count = Config.Cluster.journal_slot_count_min,
259
+ .message_size_max = Config.Cluster.message_size_max_min(4),
260
+
261
+ .block_size = sector_size,
262
+ .lsm_compaction_ops = 4,
263
+ .lsm_growth_factor = 4,
264
+ // (This is higher than the production default value because the block size is smaller.)
265
+ .lsm_manifest_compact_extra_blocks = 5,
266
+ // (We need to fuzz more scans merge than in production.)
267
+ .lsm_scans_max = 12,
268
+ },
269
+ };
270
+
271
+ pub const current = current: {
272
+ var base = if (@hasDecl(root, "tigerbeetle_config"))
273
+ root.tigerbeetle_config
274
+ else if (builtin.is_test)
275
+ test_min
276
+ else
277
+ default_production;
278
+
279
+ const release = vsr.ReleaseTriple.parse(build_options.release) catch {
280
+ @compileError("invalid release version");
281
+ };
282
+
283
+ const release_client_min = vsr.ReleaseTriple.parse(build_options.release_client_min) catch {
284
+ @compileError("invalid release_client_min version");
285
+ };
286
+
287
+ base.process.release = vsr.Release.from(release);
288
+ base.process.release_client_min = vsr.Release.from(release_client_min);
289
+ base.process.git_commit = build_options.git_commit;
290
+ base.process.verify = build_options.config_verify;
291
+
292
+ assert(base.process.release.value >= base.process.release_client_min.value);
293
+
294
+ break :current base;
295
+ };
296
+ };