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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/ext/tb_client/extconf.rb +13 -13
- data/ext/tb_client/tigerbeetle/LICENSE +177 -0
- data/ext/tb_client/tigerbeetle/build.zig +2327 -0
- data/ext/tb_client/tigerbeetle/src/aof.zig +1000 -0
- data/ext/tb_client/tigerbeetle/src/build_multiversion.zig +808 -0
- data/ext/tb_client/tigerbeetle/src/cdc/amqp/protocol.zig +1283 -0
- data/ext/tb_client/tigerbeetle/src/cdc/amqp/spec.zig +1704 -0
- data/ext/tb_client/tigerbeetle/src/cdc/amqp/types.zig +341 -0
- data/ext/tb_client/tigerbeetle/src/cdc/amqp.zig +1450 -0
- data/ext/tb_client/tigerbeetle/src/cdc/runner.zig +1659 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/samples/main.c +406 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/context.zig +1084 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/echo_client.zig +286 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/packet.zig +158 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/signal.zig +229 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/signal_fuzz.zig +110 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client.h +386 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client.zig +34 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_exports.zig +281 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_header.zig +312 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_header_test.zig +138 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/test.zig +466 -0
- data/ext/tb_client/tigerbeetle/src/clients/docs_samples.zig +157 -0
- data/ext/tb_client/tigerbeetle/src/clients/docs_types.zig +90 -0
- data/ext/tb_client/tigerbeetle/src/clients/dotnet/ci.zig +203 -0
- data/ext/tb_client/tigerbeetle/src/clients/dotnet/docs.zig +79 -0
- data/ext/tb_client/tigerbeetle/src/clients/dotnet/dotnet_bindings.zig +542 -0
- data/ext/tb_client/tigerbeetle/src/clients/go/ci.zig +109 -0
- data/ext/tb_client/tigerbeetle/src/clients/go/docs.zig +86 -0
- data/ext/tb_client/tigerbeetle/src/clients/go/go_bindings.zig +370 -0
- data/ext/tb_client/tigerbeetle/src/clients/go/pkg/native/tb_client.h +386 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/ci.zig +167 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/docs.zig +126 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/java_bindings.zig +996 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/src/client.zig +748 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/src/jni.zig +3238 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/src/jni_tests.zig +1718 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/src/jni_thread_cleaner.zig +190 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/ci.zig +104 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/docs.zig +75 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/node.zig +522 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/node_bindings.zig +267 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/src/c.zig +3 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/src/translate.zig +379 -0
- data/ext/tb_client/tigerbeetle/src/clients/python/ci.zig +131 -0
- data/ext/tb_client/tigerbeetle/src/clients/python/docs.zig +63 -0
- data/ext/tb_client/tigerbeetle/src/clients/python/python_bindings.zig +588 -0
- data/ext/tb_client/tigerbeetle/src/clients/rust/assets/tb_client.h +386 -0
- data/ext/tb_client/tigerbeetle/src/clients/rust/ci.zig +73 -0
- data/ext/tb_client/tigerbeetle/src/clients/rust/docs.zig +106 -0
- data/ext/tb_client/tigerbeetle/src/clients/rust/rust_bindings.zig +305 -0
- data/ext/tb_client/tigerbeetle/src/config.zig +296 -0
- data/ext/tb_client/tigerbeetle/src/constants.zig +790 -0
- data/ext/tb_client/tigerbeetle/src/copyhound.zig +202 -0
- data/ext/tb_client/tigerbeetle/src/counting_allocator.zig +72 -0
- data/ext/tb_client/tigerbeetle/src/direction.zig +11 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/build.zig +158 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/content.zig +156 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/docs.zig +252 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/file_checker.zig +313 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/html.zig +87 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/page_writer.zig +63 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/redirects.zig +47 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/search_index_writer.zig +28 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/service_worker_writer.zig +61 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/single_page_writer.zig +169 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/website.zig +46 -0
- data/ext/tb_client/tigerbeetle/src/ewah.zig +445 -0
- data/ext/tb_client/tigerbeetle/src/ewah_benchmark.zig +128 -0
- data/ext/tb_client/tigerbeetle/src/ewah_fuzz.zig +171 -0
- data/ext/tb_client/tigerbeetle/src/fuzz_tests.zig +179 -0
- data/ext/tb_client/tigerbeetle/src/integration_tests.zig +662 -0
- data/ext/tb_client/tigerbeetle/src/io/common.zig +155 -0
- data/ext/tb_client/tigerbeetle/src/io/darwin.zig +1093 -0
- data/ext/tb_client/tigerbeetle/src/io/linux.zig +1880 -0
- data/ext/tb_client/tigerbeetle/src/io/test.zig +1005 -0
- data/ext/tb_client/tigerbeetle/src/io/windows.zig +1598 -0
- data/ext/tb_client/tigerbeetle/src/io.zig +34 -0
- data/ext/tb_client/tigerbeetle/src/iops.zig +134 -0
- data/ext/tb_client/tigerbeetle/src/list.zig +236 -0
- data/ext/tb_client/tigerbeetle/src/lsm/binary_search.zig +848 -0
- data/ext/tb_client/tigerbeetle/src/lsm/binary_search_benchmark.zig +179 -0
- data/ext/tb_client/tigerbeetle/src/lsm/cache_map.zig +424 -0
- data/ext/tb_client/tigerbeetle/src/lsm/cache_map_fuzz.zig +420 -0
- data/ext/tb_client/tigerbeetle/src/lsm/compaction.zig +2117 -0
- data/ext/tb_client/tigerbeetle/src/lsm/composite_key.zig +182 -0
- data/ext/tb_client/tigerbeetle/src/lsm/forest.zig +1119 -0
- data/ext/tb_client/tigerbeetle/src/lsm/forest_fuzz.zig +1102 -0
- data/ext/tb_client/tigerbeetle/src/lsm/forest_table_iterator.zig +200 -0
- data/ext/tb_client/tigerbeetle/src/lsm/groove.zig +1495 -0
- data/ext/tb_client/tigerbeetle/src/lsm/k_way_merge.zig +739 -0
- data/ext/tb_client/tigerbeetle/src/lsm/k_way_merge_benchmark.zig +166 -0
- data/ext/tb_client/tigerbeetle/src/lsm/manifest.zig +754 -0
- data/ext/tb_client/tigerbeetle/src/lsm/manifest_level.zig +1294 -0
- data/ext/tb_client/tigerbeetle/src/lsm/manifest_level_fuzz.zig +510 -0
- data/ext/tb_client/tigerbeetle/src/lsm/manifest_log.zig +1263 -0
- data/ext/tb_client/tigerbeetle/src/lsm/manifest_log_fuzz.zig +628 -0
- data/ext/tb_client/tigerbeetle/src/lsm/node_pool.zig +247 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_buffer.zig +116 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_builder.zig +543 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_fuzz.zig +938 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_lookup.zig +293 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_merge.zig +362 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_range.zig +99 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_state.zig +17 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_tree.zig +1036 -0
- data/ext/tb_client/tigerbeetle/src/lsm/schema.zig +617 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scratch_memory.zig +84 -0
- data/ext/tb_client/tigerbeetle/src/lsm/segmented_array.zig +1500 -0
- data/ext/tb_client/tigerbeetle/src/lsm/segmented_array_benchmark.zig +149 -0
- data/ext/tb_client/tigerbeetle/src/lsm/segmented_array_fuzz.zig +7 -0
- data/ext/tb_client/tigerbeetle/src/lsm/set_associative_cache.zig +865 -0
- data/ext/tb_client/tigerbeetle/src/lsm/table.zig +607 -0
- data/ext/tb_client/tigerbeetle/src/lsm/table_memory.zig +843 -0
- data/ext/tb_client/tigerbeetle/src/lsm/table_value_iterator.zig +105 -0
- data/ext/tb_client/tigerbeetle/src/lsm/timestamp_range.zig +40 -0
- data/ext/tb_client/tigerbeetle/src/lsm/tree.zig +630 -0
- data/ext/tb_client/tigerbeetle/src/lsm/tree_fuzz.zig +933 -0
- data/ext/tb_client/tigerbeetle/src/lsm/zig_zag_merge.zig +557 -0
- data/ext/tb_client/tigerbeetle/src/message_buffer.zig +469 -0
- data/ext/tb_client/tigerbeetle/src/message_bus.zig +1214 -0
- data/ext/tb_client/tigerbeetle/src/message_bus_fuzz.zig +936 -0
- data/ext/tb_client/tigerbeetle/src/message_pool.zig +343 -0
- data/ext/tb_client/tigerbeetle/src/multiversion.zig +2195 -0
- data/ext/tb_client/tigerbeetle/src/queue.zig +390 -0
- data/ext/tb_client/tigerbeetle/src/repl/completion.zig +201 -0
- data/ext/tb_client/tigerbeetle/src/repl/parser.zig +1356 -0
- data/ext/tb_client/tigerbeetle/src/repl/terminal.zig +496 -0
- data/ext/tb_client/tigerbeetle/src/repl.zig +1034 -0
- data/ext/tb_client/tigerbeetle/src/scripts/amqp.zig +973 -0
- data/ext/tb_client/tigerbeetle/src/scripts/cfo.zig +1866 -0
- data/ext/tb_client/tigerbeetle/src/scripts/changelog.zig +304 -0
- data/ext/tb_client/tigerbeetle/src/scripts/ci.zig +227 -0
- data/ext/tb_client/tigerbeetle/src/scripts/client_readmes.zig +658 -0
- data/ext/tb_client/tigerbeetle/src/scripts/devhub.zig +466 -0
- data/ext/tb_client/tigerbeetle/src/scripts/release.zig +1058 -0
- data/ext/tb_client/tigerbeetle/src/scripts.zig +105 -0
- data/ext/tb_client/tigerbeetle/src/shell.zig +1195 -0
- data/ext/tb_client/tigerbeetle/src/stack.zig +260 -0
- data/ext/tb_client/tigerbeetle/src/state_machine/auditor.zig +911 -0
- data/ext/tb_client/tigerbeetle/src/state_machine/workload.zig +2079 -0
- data/ext/tb_client/tigerbeetle/src/state_machine.zig +4872 -0
- data/ext/tb_client/tigerbeetle/src/state_machine_fuzz.zig +288 -0
- data/ext/tb_client/tigerbeetle/src/state_machine_tests.zig +3128 -0
- data/ext/tb_client/tigerbeetle/src/static_allocator.zig +82 -0
- data/ext/tb_client/tigerbeetle/src/stdx/bit_set.zig +157 -0
- data/ext/tb_client/tigerbeetle/src/stdx/bounded_array.zig +292 -0
- data/ext/tb_client/tigerbeetle/src/stdx/debug.zig +65 -0
- data/ext/tb_client/tigerbeetle/src/stdx/flags.zig +1414 -0
- data/ext/tb_client/tigerbeetle/src/stdx/mlock.zig +92 -0
- data/ext/tb_client/tigerbeetle/src/stdx/prng.zig +677 -0
- data/ext/tb_client/tigerbeetle/src/stdx/radix.zig +336 -0
- data/ext/tb_client/tigerbeetle/src/stdx/ring_buffer.zig +511 -0
- data/ext/tb_client/tigerbeetle/src/stdx/sort_test.zig +112 -0
- data/ext/tb_client/tigerbeetle/src/stdx/stdx.zig +1160 -0
- data/ext/tb_client/tigerbeetle/src/stdx/testing/low_level_hash_vectors.zig +142 -0
- data/ext/tb_client/tigerbeetle/src/stdx/testing/snaptest.zig +361 -0
- data/ext/tb_client/tigerbeetle/src/stdx/time_units.zig +275 -0
- data/ext/tb_client/tigerbeetle/src/stdx/unshare.zig +295 -0
- data/ext/tb_client/tigerbeetle/src/stdx/vendored/aegis.zig +436 -0
- data/ext/tb_client/tigerbeetle/src/stdx/windows.zig +48 -0
- data/ext/tb_client/tigerbeetle/src/stdx/zipfian.zig +402 -0
- data/ext/tb_client/tigerbeetle/src/storage.zig +489 -0
- data/ext/tb_client/tigerbeetle/src/storage_fuzz.zig +180 -0
- data/ext/tb_client/tigerbeetle/src/testing/bench.zig +146 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/grid_checker.zig +53 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/journal_checker.zig +61 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/manifest_checker.zig +76 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/message_bus.zig +110 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/network.zig +412 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/state_checker.zig +331 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/storage_checker.zig +458 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster.zig +1198 -0
- data/ext/tb_client/tigerbeetle/src/testing/exhaustigen.zig +128 -0
- data/ext/tb_client/tigerbeetle/src/testing/fixtures.zig +181 -0
- data/ext/tb_client/tigerbeetle/src/testing/fuzz.zig +144 -0
- data/ext/tb_client/tigerbeetle/src/testing/id.zig +97 -0
- data/ext/tb_client/tigerbeetle/src/testing/io.zig +317 -0
- data/ext/tb_client/tigerbeetle/src/testing/marks.zig +126 -0
- data/ext/tb_client/tigerbeetle/src/testing/packet_simulator.zig +533 -0
- data/ext/tb_client/tigerbeetle/src/testing/reply_sequence.zig +154 -0
- data/ext/tb_client/tigerbeetle/src/testing/state_machine.zig +389 -0
- data/ext/tb_client/tigerbeetle/src/testing/storage.zig +1247 -0
- data/ext/tb_client/tigerbeetle/src/testing/table.zig +249 -0
- data/ext/tb_client/tigerbeetle/src/testing/time.zig +98 -0
- data/ext/tb_client/tigerbeetle/src/testing/tmp_tigerbeetle.zig +212 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/constants.zig +26 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/faulty_network.zig +580 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/java_driver/ci.zig +39 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/logged_process.zig +214 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/rust_driver/ci.zig +34 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/supervisor.zig +766 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/workload.zig +543 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/zig_driver.zig +181 -0
- data/ext/tb_client/tigerbeetle/src/tidy.zig +1448 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/benchmark_driver.zig +227 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/benchmark_load.zig +1069 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/cli.zig +1422 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/inspect.zig +1658 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/inspect_integrity.zig +518 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/libtb_client.zig +36 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/main.zig +646 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle.zig +958 -0
- data/ext/tb_client/tigerbeetle/src/time.zig +236 -0
- data/ext/tb_client/tigerbeetle/src/trace/event.zig +745 -0
- data/ext/tb_client/tigerbeetle/src/trace/statsd.zig +462 -0
- data/ext/tb_client/tigerbeetle/src/trace.zig +556 -0
- data/ext/tb_client/tigerbeetle/src/unit_tests.zig +321 -0
- data/ext/tb_client/tigerbeetle/src/vopr.zig +1785 -0
- data/ext/tb_client/tigerbeetle/src/vortex.zig +101 -0
- data/ext/tb_client/tigerbeetle/src/vsr/checkpoint_trailer.zig +473 -0
- data/ext/tb_client/tigerbeetle/src/vsr/checksum.zig +208 -0
- data/ext/tb_client/tigerbeetle/src/vsr/checksum_benchmark.zig +43 -0
- data/ext/tb_client/tigerbeetle/src/vsr/client.zig +768 -0
- data/ext/tb_client/tigerbeetle/src/vsr/client_replies.zig +532 -0
- data/ext/tb_client/tigerbeetle/src/vsr/client_sessions.zig +338 -0
- data/ext/tb_client/tigerbeetle/src/vsr/clock.zig +1019 -0
- data/ext/tb_client/tigerbeetle/src/vsr/fault_detector.zig +279 -0
- data/ext/tb_client/tigerbeetle/src/vsr/free_set.zig +1381 -0
- data/ext/tb_client/tigerbeetle/src/vsr/free_set_fuzz.zig +315 -0
- data/ext/tb_client/tigerbeetle/src/vsr/grid.zig +1460 -0
- data/ext/tb_client/tigerbeetle/src/vsr/grid_blocks_missing.zig +757 -0
- data/ext/tb_client/tigerbeetle/src/vsr/grid_scrubber.zig +797 -0
- data/ext/tb_client/tigerbeetle/src/vsr/journal.zig +2586 -0
- data/ext/tb_client/tigerbeetle/src/vsr/marzullo.zig +308 -0
- data/ext/tb_client/tigerbeetle/src/vsr/message_header.zig +1777 -0
- data/ext/tb_client/tigerbeetle/src/vsr/multi_batch.zig +715 -0
- data/ext/tb_client/tigerbeetle/src/vsr/multi_batch_fuzz.zig +185 -0
- data/ext/tb_client/tigerbeetle/src/vsr/repair_budget.zig +333 -0
- data/ext/tb_client/tigerbeetle/src/vsr/replica.zig +12355 -0
- data/ext/tb_client/tigerbeetle/src/vsr/replica_format.zig +416 -0
- data/ext/tb_client/tigerbeetle/src/vsr/replica_reformat.zig +165 -0
- data/ext/tb_client/tigerbeetle/src/vsr/replica_test.zig +2910 -0
- data/ext/tb_client/tigerbeetle/src/vsr/routing.zig +1075 -0
- data/ext/tb_client/tigerbeetle/src/vsr/superblock.zig +1603 -0
- data/ext/tb_client/tigerbeetle/src/vsr/superblock_fuzz.zig +484 -0
- data/ext/tb_client/tigerbeetle/src/vsr/superblock_quorums.zig +405 -0
- data/ext/tb_client/tigerbeetle/src/vsr/superblock_quorums_fuzz.zig +355 -0
- data/ext/tb_client/tigerbeetle/src/vsr/sync.zig +29 -0
- data/ext/tb_client/tigerbeetle/src/vsr.zig +1727 -0
- data/lib/tb_client/shared_lib.rb +12 -5
- data/lib/tigerbeetle/client.rb +1 -1
- data/lib/tigerbeetle/platforms.rb +9 -0
- data/lib/tigerbeetle/version.rb +2 -2
- data/tigerbeetle.gemspec +22 -5
- metadata +242 -3
- 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
|
+
}
|