tigerbeetle 0.0.40 → 0.17.8
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/LICENSE +0 -25
- data/README.md +670 -80
- data/docs/migration.md +201 -0
- data/sig/tigerbeetle.rbs +271 -0
- data/src/ext/tigerbeetle/extconf.rb +47 -0
- data/src/ext/tigerbeetle/lib/aarch64-linux-gnu.2.27/libtb_client.so +0 -0
- data/src/ext/tigerbeetle/lib/aarch64-linux-musl/libtb_client.so +0 -0
- data/src/ext/tigerbeetle/lib/aarch64-macos/libtb_client.dylib +0 -0
- data/src/ext/tigerbeetle/lib/x86_64-linux-gnu.2.27/libtb_client.so +0 -0
- data/src/ext/tigerbeetle/lib/x86_64-linux-musl/libtb_client.so +0 -0
- data/src/ext/tigerbeetle/lib/x86_64-macos/libtb_client.dylib +0 -0
- data/src/ext/tigerbeetle/lib/x86_64-windows/tb_client.dll +0 -0
- data/src/ext/tigerbeetle/rb_tb_gen.h +458 -0
- data/{ext/tb_client/tigerbeetle/src/clients/rust/assets → src/ext/tigerbeetle}/tb_client.h +18 -16
- data/src/ext/tigerbeetle/tigerbeetle.c +310 -0
- data/src/tigerbeetle/bindings.rb +347 -0
- data/src/tigerbeetle/client.rb +129 -0
- data/src/tigerbeetle/completion_dispatcher.rb +108 -0
- data/src/tigerbeetle/id.rb +40 -0
- data/src/tigerbeetle/tb.rb +3 -0
- data/src/tigerbeetle/version.rb +3 -0
- data/src/tigerbeetle.rb +39 -0
- metadata +33 -350
- data/CHANGELOG.md +0 -162
- data/ext/tb_client/extconf.rb +0 -41
- data/ext/tb_client/tigerbeetle/LICENSE +0 -177
- data/ext/tb_client/tigerbeetle/build.zig +0 -2296
- data/ext/tb_client/tigerbeetle/src/aof.zig +0 -1000
- data/ext/tb_client/tigerbeetle/src/build/fetch.zig +0 -112
- data/ext/tb_client/tigerbeetle/src/build_multiversion.zig +0 -808
- data/ext/tb_client/tigerbeetle/src/cdc/amqp/protocol.zig +0 -1283
- data/ext/tb_client/tigerbeetle/src/cdc/amqp/spec.zig +0 -1704
- data/ext/tb_client/tigerbeetle/src/cdc/amqp/types.zig +0 -341
- data/ext/tb_client/tigerbeetle/src/cdc/amqp.zig +0 -1450
- data/ext/tb_client/tigerbeetle/src/cdc/runner.zig +0 -1659
- data/ext/tb_client/tigerbeetle/src/clients/c/samples/main.c +0 -406
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/context.zig +0 -1092
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/echo_client.zig +0 -286
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/packet.zig +0 -158
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/signal.zig +0 -229
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/signal_fuzz.zig +0 -110
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client.h +0 -386
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client.zig +0 -34
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_exports.zig +0 -281
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_header.zig +0 -312
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_header_test.zig +0 -138
- data/ext/tb_client/tigerbeetle/src/clients/c/test.zig +0 -466
- data/ext/tb_client/tigerbeetle/src/clients/docs_samples.zig +0 -157
- data/ext/tb_client/tigerbeetle/src/clients/docs_types.zig +0 -90
- data/ext/tb_client/tigerbeetle/src/clients/dotnet/ci.zig +0 -203
- data/ext/tb_client/tigerbeetle/src/clients/dotnet/docs.zig +0 -79
- data/ext/tb_client/tigerbeetle/src/clients/dotnet/dotnet_bindings.zig +0 -542
- data/ext/tb_client/tigerbeetle/src/clients/go/ci.zig +0 -109
- data/ext/tb_client/tigerbeetle/src/clients/go/docs.zig +0 -86
- data/ext/tb_client/tigerbeetle/src/clients/go/go_bindings.zig +0 -370
- data/ext/tb_client/tigerbeetle/src/clients/go/pkg/native/tb_client.h +0 -386
- data/ext/tb_client/tigerbeetle/src/clients/java/ci.zig +0 -167
- data/ext/tb_client/tigerbeetle/src/clients/java/docs.zig +0 -126
- data/ext/tb_client/tigerbeetle/src/clients/java/java_bindings.zig +0 -996
- data/ext/tb_client/tigerbeetle/src/clients/java/src/client.zig +0 -748
- data/ext/tb_client/tigerbeetle/src/clients/java/src/jni.zig +0 -3238
- data/ext/tb_client/tigerbeetle/src/clients/java/src/jni_tests.zig +0 -1718
- data/ext/tb_client/tigerbeetle/src/clients/java/src/jni_thread_cleaner.zig +0 -190
- data/ext/tb_client/tigerbeetle/src/clients/node/ci.zig +0 -104
- data/ext/tb_client/tigerbeetle/src/clients/node/docs.zig +0 -75
- data/ext/tb_client/tigerbeetle/src/clients/node/node.zig +0 -522
- data/ext/tb_client/tigerbeetle/src/clients/node/node_bindings.zig +0 -267
- data/ext/tb_client/tigerbeetle/src/clients/node/src/c.zig +0 -3
- data/ext/tb_client/tigerbeetle/src/clients/node/src/translate.zig +0 -379
- data/ext/tb_client/tigerbeetle/src/clients/python/ci.zig +0 -131
- data/ext/tb_client/tigerbeetle/src/clients/python/docs.zig +0 -63
- data/ext/tb_client/tigerbeetle/src/clients/python/python_bindings.zig +0 -588
- data/ext/tb_client/tigerbeetle/src/clients/rust/ci.zig +0 -73
- data/ext/tb_client/tigerbeetle/src/clients/rust/docs.zig +0 -106
- data/ext/tb_client/tigerbeetle/src/clients/rust/rust_bindings.zig +0 -305
- data/ext/tb_client/tigerbeetle/src/config.zig +0 -296
- data/ext/tb_client/tigerbeetle/src/constants.zig +0 -790
- data/ext/tb_client/tigerbeetle/src/copyhound.zig +0 -202
- data/ext/tb_client/tigerbeetle/src/counting_allocator.zig +0 -72
- data/ext/tb_client/tigerbeetle/src/direction.zig +0 -120
- data/ext/tb_client/tigerbeetle/src/docs_website/build.zig +0 -158
- data/ext/tb_client/tigerbeetle/src/docs_website/src/content.zig +0 -156
- data/ext/tb_client/tigerbeetle/src/docs_website/src/docs.zig +0 -252
- data/ext/tb_client/tigerbeetle/src/docs_website/src/file_checker.zig +0 -313
- data/ext/tb_client/tigerbeetle/src/docs_website/src/html.zig +0 -87
- data/ext/tb_client/tigerbeetle/src/docs_website/src/page_writer.zig +0 -63
- data/ext/tb_client/tigerbeetle/src/docs_website/src/redirects.zig +0 -47
- data/ext/tb_client/tigerbeetle/src/docs_website/src/search_index_writer.zig +0 -28
- data/ext/tb_client/tigerbeetle/src/docs_website/src/service_worker_writer.zig +0 -61
- data/ext/tb_client/tigerbeetle/src/docs_website/src/single_page_writer.zig +0 -169
- data/ext/tb_client/tigerbeetle/src/docs_website/src/website.zig +0 -46
- data/ext/tb_client/tigerbeetle/src/ewah.zig +0 -445
- data/ext/tb_client/tigerbeetle/src/ewah_benchmark.zig +0 -128
- data/ext/tb_client/tigerbeetle/src/ewah_fuzz.zig +0 -171
- data/ext/tb_client/tigerbeetle/src/fuzz_tests.zig +0 -179
- data/ext/tb_client/tigerbeetle/src/integration_tests.zig +0 -662
- data/ext/tb_client/tigerbeetle/src/io/common.zig +0 -155
- data/ext/tb_client/tigerbeetle/src/io/darwin.zig +0 -1093
- data/ext/tb_client/tigerbeetle/src/io/linux.zig +0 -1880
- data/ext/tb_client/tigerbeetle/src/io/test.zig +0 -1005
- data/ext/tb_client/tigerbeetle/src/io/windows.zig +0 -1598
- data/ext/tb_client/tigerbeetle/src/io.zig +0 -34
- data/ext/tb_client/tigerbeetle/src/iops.zig +0 -134
- data/ext/tb_client/tigerbeetle/src/list.zig +0 -236
- data/ext/tb_client/tigerbeetle/src/lsm/binary_search.zig +0 -848
- data/ext/tb_client/tigerbeetle/src/lsm/binary_search_benchmark.zig +0 -179
- data/ext/tb_client/tigerbeetle/src/lsm/cache_map.zig +0 -424
- data/ext/tb_client/tigerbeetle/src/lsm/cache_map_fuzz.zig +0 -420
- data/ext/tb_client/tigerbeetle/src/lsm/compaction.zig +0 -2114
- data/ext/tb_client/tigerbeetle/src/lsm/composite_key.zig +0 -185
- data/ext/tb_client/tigerbeetle/src/lsm/forest.zig +0 -1146
- data/ext/tb_client/tigerbeetle/src/lsm/forest_fuzz.zig +0 -1102
- data/ext/tb_client/tigerbeetle/src/lsm/forest_table_iterator.zig +0 -200
- data/ext/tb_client/tigerbeetle/src/lsm/groove.zig +0 -1495
- data/ext/tb_client/tigerbeetle/src/lsm/k_way_merge.zig +0 -739
- data/ext/tb_client/tigerbeetle/src/lsm/k_way_merge_benchmark.zig +0 -166
- data/ext/tb_client/tigerbeetle/src/lsm/manifest.zig +0 -754
- data/ext/tb_client/tigerbeetle/src/lsm/manifest_level.zig +0 -1294
- data/ext/tb_client/tigerbeetle/src/lsm/manifest_level_fuzz.zig +0 -510
- data/ext/tb_client/tigerbeetle/src/lsm/manifest_log.zig +0 -1241
- data/ext/tb_client/tigerbeetle/src/lsm/manifest_log_fuzz.zig +0 -628
- data/ext/tb_client/tigerbeetle/src/lsm/node_pool.zig +0 -247
- data/ext/tb_client/tigerbeetle/src/lsm/scan_buffer.zig +0 -116
- data/ext/tb_client/tigerbeetle/src/lsm/scan_builder.zig +0 -543
- data/ext/tb_client/tigerbeetle/src/lsm/scan_fuzz.zig +0 -938
- data/ext/tb_client/tigerbeetle/src/lsm/scan_lookup.zig +0 -293
- data/ext/tb_client/tigerbeetle/src/lsm/scan_merge.zig +0 -359
- data/ext/tb_client/tigerbeetle/src/lsm/scan_range.zig +0 -99
- data/ext/tb_client/tigerbeetle/src/lsm/scan_state.zig +0 -17
- data/ext/tb_client/tigerbeetle/src/lsm/scan_tree.zig +0 -962
- data/ext/tb_client/tigerbeetle/src/lsm/schema.zig +0 -617
- data/ext/tb_client/tigerbeetle/src/lsm/scratch_memory.zig +0 -84
- data/ext/tb_client/tigerbeetle/src/lsm/segmented_array.zig +0 -1500
- data/ext/tb_client/tigerbeetle/src/lsm/segmented_array_benchmark.zig +0 -149
- data/ext/tb_client/tigerbeetle/src/lsm/segmented_array_fuzz.zig +0 -7
- data/ext/tb_client/tigerbeetle/src/lsm/set_associative_cache.zig +0 -865
- data/ext/tb_client/tigerbeetle/src/lsm/table.zig +0 -607
- data/ext/tb_client/tigerbeetle/src/lsm/table_memory.zig +0 -843
- data/ext/tb_client/tigerbeetle/src/lsm/table_value_iterator.zig +0 -90
- data/ext/tb_client/tigerbeetle/src/lsm/timestamp_range.zig +0 -40
- data/ext/tb_client/tigerbeetle/src/lsm/tree.zig +0 -629
- data/ext/tb_client/tigerbeetle/src/lsm/tree_fuzz.zig +0 -933
- data/ext/tb_client/tigerbeetle/src/lsm/zig_zag_merge.zig +0 -534
- data/ext/tb_client/tigerbeetle/src/message_buffer.zig +0 -469
- data/ext/tb_client/tigerbeetle/src/message_bus.zig +0 -1219
- data/ext/tb_client/tigerbeetle/src/message_bus_fuzz.zig +0 -936
- data/ext/tb_client/tigerbeetle/src/message_pool.zig +0 -343
- data/ext/tb_client/tigerbeetle/src/multiversion.zig +0 -2195
- data/ext/tb_client/tigerbeetle/src/queue.zig +0 -390
- data/ext/tb_client/tigerbeetle/src/repl/completion.zig +0 -201
- data/ext/tb_client/tigerbeetle/src/repl/parser.zig +0 -1356
- data/ext/tb_client/tigerbeetle/src/repl/terminal.zig +0 -496
- data/ext/tb_client/tigerbeetle/src/repl.zig +0 -1034
- data/ext/tb_client/tigerbeetle/src/scripts/amqp.zig +0 -973
- data/ext/tb_client/tigerbeetle/src/scripts/cfo.zig +0 -1866
- data/ext/tb_client/tigerbeetle/src/scripts/changelog.zig +0 -304
- data/ext/tb_client/tigerbeetle/src/scripts/ci.zig +0 -227
- data/ext/tb_client/tigerbeetle/src/scripts/client_readmes.zig +0 -658
- data/ext/tb_client/tigerbeetle/src/scripts/devhub.zig +0 -466
- data/ext/tb_client/tigerbeetle/src/scripts/release.zig +0 -1058
- data/ext/tb_client/tigerbeetle/src/scripts.zig +0 -105
- data/ext/tb_client/tigerbeetle/src/shell.zig +0 -1195
- data/ext/tb_client/tigerbeetle/src/stack.zig +0 -260
- data/ext/tb_client/tigerbeetle/src/state_machine/auditor.zig +0 -911
- data/ext/tb_client/tigerbeetle/src/state_machine/workload.zig +0 -2079
- data/ext/tb_client/tigerbeetle/src/state_machine.zig +0 -4872
- data/ext/tb_client/tigerbeetle/src/state_machine_fuzz.zig +0 -288
- data/ext/tb_client/tigerbeetle/src/state_machine_tests.zig +0 -3128
- data/ext/tb_client/tigerbeetle/src/static_allocator.zig +0 -82
- data/ext/tb_client/tigerbeetle/src/stdx/bit_set.zig +0 -157
- data/ext/tb_client/tigerbeetle/src/stdx/bounded_array.zig +0 -292
- data/ext/tb_client/tigerbeetle/src/stdx/debug.zig +0 -65
- data/ext/tb_client/tigerbeetle/src/stdx/flags.zig +0 -1414
- data/ext/tb_client/tigerbeetle/src/stdx/huge_page_allocator.zig +0 -115
- data/ext/tb_client/tigerbeetle/src/stdx/mlock.zig +0 -92
- data/ext/tb_client/tigerbeetle/src/stdx/prng.zig +0 -677
- data/ext/tb_client/tigerbeetle/src/stdx/radix.zig +0 -336
- data/ext/tb_client/tigerbeetle/src/stdx/ring_buffer.zig +0 -511
- data/ext/tb_client/tigerbeetle/src/stdx/sort_test.zig +0 -112
- data/ext/tb_client/tigerbeetle/src/stdx/stdx.zig +0 -1163
- data/ext/tb_client/tigerbeetle/src/stdx/testing/low_level_hash_vectors.zig +0 -142
- data/ext/tb_client/tigerbeetle/src/stdx/testing/snaptest.zig +0 -361
- data/ext/tb_client/tigerbeetle/src/stdx/time_units.zig +0 -275
- data/ext/tb_client/tigerbeetle/src/stdx/unshare.zig +0 -295
- data/ext/tb_client/tigerbeetle/src/stdx/vendored/aegis.zig +0 -436
- data/ext/tb_client/tigerbeetle/src/stdx/windows.zig +0 -48
- data/ext/tb_client/tigerbeetle/src/stdx/zipfian.zig +0 -402
- data/ext/tb_client/tigerbeetle/src/storage.zig +0 -489
- data/ext/tb_client/tigerbeetle/src/storage_fuzz.zig +0 -180
- data/ext/tb_client/tigerbeetle/src/testing/bench.zig +0 -146
- data/ext/tb_client/tigerbeetle/src/testing/cluster/grid_checker.zig +0 -53
- data/ext/tb_client/tigerbeetle/src/testing/cluster/journal_checker.zig +0 -61
- data/ext/tb_client/tigerbeetle/src/testing/cluster/manifest_checker.zig +0 -76
- data/ext/tb_client/tigerbeetle/src/testing/cluster/message_bus.zig +0 -110
- data/ext/tb_client/tigerbeetle/src/testing/cluster/network.zig +0 -412
- data/ext/tb_client/tigerbeetle/src/testing/cluster/state_checker.zig +0 -331
- data/ext/tb_client/tigerbeetle/src/testing/cluster/storage_checker.zig +0 -458
- data/ext/tb_client/tigerbeetle/src/testing/cluster.zig +0 -1198
- data/ext/tb_client/tigerbeetle/src/testing/exhaustigen.zig +0 -128
- data/ext/tb_client/tigerbeetle/src/testing/fixtures.zig +0 -181
- data/ext/tb_client/tigerbeetle/src/testing/fuzz.zig +0 -144
- data/ext/tb_client/tigerbeetle/src/testing/id.zig +0 -97
- data/ext/tb_client/tigerbeetle/src/testing/io.zig +0 -317
- data/ext/tb_client/tigerbeetle/src/testing/marks.zig +0 -126
- data/ext/tb_client/tigerbeetle/src/testing/packet_simulator.zig +0 -533
- data/ext/tb_client/tigerbeetle/src/testing/reply_sequence.zig +0 -154
- data/ext/tb_client/tigerbeetle/src/testing/state_machine.zig +0 -389
- data/ext/tb_client/tigerbeetle/src/testing/storage.zig +0 -1247
- data/ext/tb_client/tigerbeetle/src/testing/table.zig +0 -249
- data/ext/tb_client/tigerbeetle/src/testing/time.zig +0 -98
- data/ext/tb_client/tigerbeetle/src/testing/tmp_tigerbeetle.zig +0 -212
- data/ext/tb_client/tigerbeetle/src/testing/vortex/constants.zig +0 -26
- data/ext/tb_client/tigerbeetle/src/testing/vortex/faulty_network.zig +0 -579
- data/ext/tb_client/tigerbeetle/src/testing/vortex/java_driver/ci.zig +0 -39
- data/ext/tb_client/tigerbeetle/src/testing/vortex/logged_process.zig +0 -214
- data/ext/tb_client/tigerbeetle/src/testing/vortex/rust_driver/ci.zig +0 -34
- data/ext/tb_client/tigerbeetle/src/testing/vortex/supervisor.zig +0 -785
- data/ext/tb_client/tigerbeetle/src/testing/vortex/workload.zig +0 -543
- data/ext/tb_client/tigerbeetle/src/testing/vortex/zig_driver.zig +0 -181
- data/ext/tb_client/tigerbeetle/src/tidy.zig +0 -1449
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/benchmark_driver.zig +0 -227
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/benchmark_load.zig +0 -1069
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/cli.zig +0 -1422
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/inspect.zig +0 -1658
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/inspect_integrity.zig +0 -518
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/libtb_client.zig +0 -36
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/main.zig +0 -646
- data/ext/tb_client/tigerbeetle/src/tigerbeetle.zig +0 -958
- data/ext/tb_client/tigerbeetle/src/time.zig +0 -236
- data/ext/tb_client/tigerbeetle/src/trace/event.zig +0 -745
- data/ext/tb_client/tigerbeetle/src/trace/statsd.zig +0 -462
- data/ext/tb_client/tigerbeetle/src/trace.zig +0 -556
- data/ext/tb_client/tigerbeetle/src/unit_tests.zig +0 -321
- data/ext/tb_client/tigerbeetle/src/vopr.zig +0 -1785
- data/ext/tb_client/tigerbeetle/src/vortex.zig +0 -101
- data/ext/tb_client/tigerbeetle/src/vsr/checkpoint_trailer.zig +0 -473
- data/ext/tb_client/tigerbeetle/src/vsr/checksum.zig +0 -208
- data/ext/tb_client/tigerbeetle/src/vsr/checksum_benchmark.zig +0 -43
- data/ext/tb_client/tigerbeetle/src/vsr/client.zig +0 -768
- data/ext/tb_client/tigerbeetle/src/vsr/client_replies.zig +0 -532
- data/ext/tb_client/tigerbeetle/src/vsr/client_sessions.zig +0 -338
- data/ext/tb_client/tigerbeetle/src/vsr/clock.zig +0 -1019
- data/ext/tb_client/tigerbeetle/src/vsr/fault_detector.zig +0 -279
- data/ext/tb_client/tigerbeetle/src/vsr/free_set.zig +0 -1381
- data/ext/tb_client/tigerbeetle/src/vsr/free_set_fuzz.zig +0 -315
- data/ext/tb_client/tigerbeetle/src/vsr/grid.zig +0 -1460
- data/ext/tb_client/tigerbeetle/src/vsr/grid_blocks_missing.zig +0 -757
- data/ext/tb_client/tigerbeetle/src/vsr/grid_scrubber.zig +0 -797
- data/ext/tb_client/tigerbeetle/src/vsr/journal.zig +0 -2586
- data/ext/tb_client/tigerbeetle/src/vsr/marzullo.zig +0 -308
- data/ext/tb_client/tigerbeetle/src/vsr/message_header.zig +0 -1777
- data/ext/tb_client/tigerbeetle/src/vsr/multi_batch.zig +0 -715
- data/ext/tb_client/tigerbeetle/src/vsr/multi_batch_fuzz.zig +0 -185
- data/ext/tb_client/tigerbeetle/src/vsr/repair_budget.zig +0 -333
- data/ext/tb_client/tigerbeetle/src/vsr/replica.zig +0 -12356
- data/ext/tb_client/tigerbeetle/src/vsr/replica_format.zig +0 -416
- data/ext/tb_client/tigerbeetle/src/vsr/replica_reformat.zig +0 -165
- data/ext/tb_client/tigerbeetle/src/vsr/replica_test.zig +0 -2928
- data/ext/tb_client/tigerbeetle/src/vsr/routing.zig +0 -1075
- data/ext/tb_client/tigerbeetle/src/vsr/superblock.zig +0 -1603
- data/ext/tb_client/tigerbeetle/src/vsr/superblock_fuzz.zig +0 -484
- data/ext/tb_client/tigerbeetle/src/vsr/superblock_quorums.zig +0 -405
- data/ext/tb_client/tigerbeetle/src/vsr/superblock_quorums_fuzz.zig +0 -355
- data/ext/tb_client/tigerbeetle/src/vsr/sync.zig +0 -29
- data/ext/tb_client/tigerbeetle/src/vsr.zig +0 -1727
- data/lib/tb_client/shared_lib.rb +0 -66
- data/lib/tb_client.rb +0 -282
- data/lib/tigerbeetle/account.rb +0 -38
- data/lib/tigerbeetle/account_balance.rb +0 -23
- data/lib/tigerbeetle/account_filter.rb +0 -31
- data/lib/tigerbeetle/atomic_counter.rb +0 -14
- data/lib/tigerbeetle/client.rb +0 -214
- data/lib/tigerbeetle/converters/account.rb +0 -63
- data/lib/tigerbeetle/converters/account_balance.rb +0 -31
- data/lib/tigerbeetle/converters/account_filter.rb +0 -32
- data/lib/tigerbeetle/converters/base.rb +0 -35
- data/lib/tigerbeetle/converters/create_accounts_result.rb +0 -21
- data/lib/tigerbeetle/converters/create_transfers_result.rb +0 -21
- data/lib/tigerbeetle/converters/query_filter.rb +0 -33
- data/lib/tigerbeetle/converters/time.rb +0 -23
- data/lib/tigerbeetle/converters/transfer.rb +0 -64
- data/lib/tigerbeetle/converters/uint_128.rb +0 -24
- data/lib/tigerbeetle/converters.rb +0 -12
- data/lib/tigerbeetle/error.rb +0 -4
- data/lib/tigerbeetle/id.rb +0 -30
- data/lib/tigerbeetle/platforms.rb +0 -9
- data/lib/tigerbeetle/query_filter.rb +0 -31
- data/lib/tigerbeetle/request.rb +0 -7
- data/lib/tigerbeetle/transfer.rb +0 -40
- data/lib/tigerbeetle/version.rb +0 -4
- data/lib/tigerbeetle.rb +0 -13
- data/tigerbeetle.gemspec +0 -60
|
@@ -1,518 +0,0 @@
|
|
|
1
|
-
const std = @import("std");
|
|
2
|
-
const stdx = vsr.stdx;
|
|
3
|
-
const assert = std.debug.assert;
|
|
4
|
-
const log = std.log.scoped(.integrity);
|
|
5
|
-
|
|
6
|
-
const cli = @import("cli.zig");
|
|
7
|
-
const vsr = @import("vsr");
|
|
8
|
-
const constants = vsr.constants;
|
|
9
|
-
const IO = vsr.io.IO;
|
|
10
|
-
const StateMachine = @import("main.zig").StateMachine;
|
|
11
|
-
const Replica = @import("main.zig").Replica;
|
|
12
|
-
const Storage = @import("main.zig").Storage;
|
|
13
|
-
const Grid = @import("main.zig").Grid;
|
|
14
|
-
const Tracer = vsr.trace.Tracer;
|
|
15
|
-
|
|
16
|
-
const Forest = StateMachine.Forest;
|
|
17
|
-
const CheckpointTrailer = vsr.CheckpointTrailerType(Storage);
|
|
18
|
-
const SuperBlock = Replica.SuperBlock;
|
|
19
|
-
|
|
20
|
-
/// Special offline GridScrubber type - uses constants.grid_iops_read_max rather than
|
|
21
|
-
/// constants.grid_scrubber_reads_max.
|
|
22
|
-
const GridScrubber = vsr.GridScrubberType(Forest, constants.grid_iops_read_max);
|
|
23
|
-
|
|
24
|
-
pub fn command_inspect_integrity(
|
|
25
|
-
gpa: std.mem.Allocator,
|
|
26
|
-
io: *IO,
|
|
27
|
-
tracer: *Tracer,
|
|
28
|
-
args: *const cli.Command.Inspect.Integrity,
|
|
29
|
-
) !void {
|
|
30
|
-
var integrity: Integrity = undefined;
|
|
31
|
-
var checked_bytes: u64 = 0;
|
|
32
|
-
|
|
33
|
-
try Integrity.init(
|
|
34
|
-
&integrity,
|
|
35
|
-
gpa,
|
|
36
|
-
io,
|
|
37
|
-
tracer,
|
|
38
|
-
args.path,
|
|
39
|
-
args.lsm_forest_node_count,
|
|
40
|
-
);
|
|
41
|
-
defer integrity.deinit(gpa);
|
|
42
|
-
|
|
43
|
-
// The superblock is checked as part of initializing and opening the checker - it cannot be
|
|
44
|
-
// skipped. A fully corrupt superblock stops any further scrubbing.
|
|
45
|
-
const checked_bytes_superblock = try integrity.open();
|
|
46
|
-
checked_bytes += checked_bytes_superblock;
|
|
47
|
-
|
|
48
|
-
if (!args.skip_wal) {
|
|
49
|
-
const checked_bytes_wal = try integrity.check_wal();
|
|
50
|
-
assert(
|
|
51
|
-
checked_bytes_wal == vsr.Zone.wal_headers.size().? + vsr.Zone.wal_prepares.size().?,
|
|
52
|
-
);
|
|
53
|
-
|
|
54
|
-
checked_bytes += checked_bytes_wal;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
if (!args.skip_client_replies) {
|
|
58
|
-
const checked_bytes_client_replies = try integrity.check_client_replies();
|
|
59
|
-
assert(checked_bytes_client_replies == vsr.Zone.client_replies.size().?);
|
|
60
|
-
|
|
61
|
-
checked_bytes += checked_bytes_client_replies;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const grid_blocks_expected_count =
|
|
65
|
-
(integrity.grid.free_set.count_acquired() - integrity.grid.free_set.count_released()) +
|
|
66
|
-
integrity.grid.free_set_checkpoint_blocks_acquired.block_count() +
|
|
67
|
-
integrity.grid.free_set_checkpoint_blocks_released.block_count();
|
|
68
|
-
|
|
69
|
-
if (!args.skip_grid) {
|
|
70
|
-
// If no seed was given, use a random seed for better coverage.
|
|
71
|
-
const seed: u64 = seed_from_arg: {
|
|
72
|
-
const seed_argument = args.seed orelse
|
|
73
|
-
break :seed_from_arg @truncate(stdx.unique_u128());
|
|
74
|
-
break :seed_from_arg vsr.testing.parse_seed(seed_argument);
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
const checked_bytes_grid = try integrity.check_grid(seed);
|
|
78
|
-
assert(checked_bytes_grid == grid_blocks_expected_count * constants.block_size);
|
|
79
|
-
|
|
80
|
-
checked_bytes += checked_bytes_grid;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const checked_bytes_target: u64 = blk: {
|
|
84
|
-
var checked_bytes_target: u64 = 0;
|
|
85
|
-
|
|
86
|
-
for (std.enums.values(vsr.Zone)) |zone| {
|
|
87
|
-
if (vsr.Zone.size(zone)) |size| {
|
|
88
|
-
checked_bytes_target += size;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
checked_bytes_target += grid_blocks_expected_count * constants.block_size;
|
|
92
|
-
checked_bytes_target -= vsr.Zone.grid_padding.size().?;
|
|
93
|
-
|
|
94
|
-
// At this point, checked_bytes_target is the highest it will ever be if everything were
|
|
95
|
-
// checked. Then, subtract off the skipped items explicitly.
|
|
96
|
-
|
|
97
|
-
if (args.skip_wal) {
|
|
98
|
-
checked_bytes_target -= vsr.Zone.wal_headers.size().? + vsr.Zone.wal_prepares.size().?;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
if (args.skip_client_replies) {
|
|
102
|
-
checked_bytes_target -= vsr.Zone.client_replies.size().?;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
if (args.skip_grid) {
|
|
106
|
-
checked_bytes_target -= grid_blocks_expected_count * constants.block_size;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
break :blk checked_bytes_target;
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
assert(checked_bytes == checked_bytes_target);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
const Integrity = @This();
|
|
116
|
-
|
|
117
|
-
io: *IO,
|
|
118
|
-
storage: Storage,
|
|
119
|
-
|
|
120
|
-
superblock: SuperBlock,
|
|
121
|
-
client_sessions_checkpoint: CheckpointTrailer,
|
|
122
|
-
grid: Grid,
|
|
123
|
-
forest: Forest,
|
|
124
|
-
grid_scrubber: GridScrubber,
|
|
125
|
-
grid_blocks_scrubbed: std.bit_set.DynamicBitSetUnmanaged,
|
|
126
|
-
|
|
127
|
-
buffer_headers: []align(constants.sector_size) u8,
|
|
128
|
-
buffer_prepare: []align(constants.sector_size) u8,
|
|
129
|
-
|
|
130
|
-
fn init(
|
|
131
|
-
integrity: *Integrity,
|
|
132
|
-
gpa: std.mem.Allocator,
|
|
133
|
-
io: *IO,
|
|
134
|
-
tracer: *Tracer,
|
|
135
|
-
path: []const u8,
|
|
136
|
-
lsm_forest_node_count: u32,
|
|
137
|
-
) !void {
|
|
138
|
-
integrity.io = io;
|
|
139
|
-
|
|
140
|
-
integrity.storage = try Storage.init(io, tracer, .{
|
|
141
|
-
.path = path,
|
|
142
|
-
.size_min = vsr.superblock.data_file_size_min,
|
|
143
|
-
.purpose = .inspect,
|
|
144
|
-
.direct_io = .direct_io_optional,
|
|
145
|
-
});
|
|
146
|
-
errdefer integrity.storage.deinit();
|
|
147
|
-
|
|
148
|
-
const data_file_stat = try (std.fs.File{ .handle = integrity.storage.fd }).stat();
|
|
149
|
-
|
|
150
|
-
integrity.superblock = try SuperBlock.init(
|
|
151
|
-
gpa,
|
|
152
|
-
&integrity.storage,
|
|
153
|
-
.{
|
|
154
|
-
.storage_size_limit = std.mem.alignForward(
|
|
155
|
-
u64,
|
|
156
|
-
data_file_stat.size,
|
|
157
|
-
constants.block_size,
|
|
158
|
-
),
|
|
159
|
-
},
|
|
160
|
-
);
|
|
161
|
-
errdefer integrity.superblock.deinit(gpa);
|
|
162
|
-
|
|
163
|
-
// Opening the forest requires an open superblock, so this is done explicitly here and not in
|
|
164
|
-
// open() like the others.
|
|
165
|
-
var superblock_context: SuperBlock.Context = undefined;
|
|
166
|
-
integrity.superblock.open(struct {
|
|
167
|
-
fn superblock_open_callback(_: *SuperBlock.Context) void {}
|
|
168
|
-
}.superblock_open_callback, &superblock_context);
|
|
169
|
-
while (!integrity.superblock.opened) integrity.superblock.storage.run();
|
|
170
|
-
|
|
171
|
-
// Unlike the other zones, the superblock has redundant copies internally. Consider the
|
|
172
|
-
// superblock to be valid if it's valid as a whole, even if an individual copy might be corrupt.
|
|
173
|
-
integrity.superblock.working.vsr_state.assert_internally_consistent();
|
|
174
|
-
log.info("superblock opened and checked", .{});
|
|
175
|
-
|
|
176
|
-
integrity.client_sessions_checkpoint = try CheckpointTrailer.init(
|
|
177
|
-
gpa,
|
|
178
|
-
.client_sessions,
|
|
179
|
-
vsr.ClientSessions.encode_size,
|
|
180
|
-
);
|
|
181
|
-
errdefer integrity.client_sessions_checkpoint.deinit(gpa);
|
|
182
|
-
|
|
183
|
-
integrity.grid = try Grid.init(gpa, .{
|
|
184
|
-
.superblock = &integrity.superblock,
|
|
185
|
-
.trace = tracer,
|
|
186
|
-
.cache_blocks_count = Grid.Cache.value_count_max_multiple,
|
|
187
|
-
.missing_blocks_max = constants.grid_missing_blocks_max,
|
|
188
|
-
.missing_tables_max = constants.grid_missing_tables_max,
|
|
189
|
-
.blocks_released_prior_checkpoint_durability_max = Forest
|
|
190
|
-
.compaction_blocks_released_per_pipeline_max() +
|
|
191
|
-
vsr.checkpoint_trailer.block_count_for_trailer_size(vsr.ClientSessions.encode_size),
|
|
192
|
-
});
|
|
193
|
-
errdefer integrity.grid.deinit(gpa);
|
|
194
|
-
|
|
195
|
-
try integrity.forest.init(
|
|
196
|
-
gpa,
|
|
197
|
-
&integrity.grid,
|
|
198
|
-
.{
|
|
199
|
-
.compaction_block_count = Forest.Options.compaction_block_count_min,
|
|
200
|
-
.node_count = lsm_forest_node_count,
|
|
201
|
-
},
|
|
202
|
-
StateMachine.forest_options(.{
|
|
203
|
-
.batch_size_limit = constants.message_body_size_max,
|
|
204
|
-
.lsm_forest_compaction_block_count = Forest.Options.compaction_block_count_min,
|
|
205
|
-
.lsm_forest_node_count = lsm_forest_node_count,
|
|
206
|
-
|
|
207
|
-
.cache_entries_accounts = 0,
|
|
208
|
-
.cache_entries_transfers = 0,
|
|
209
|
-
.cache_entries_transfers_pending = 0,
|
|
210
|
-
|
|
211
|
-
.log_trace = false,
|
|
212
|
-
.aof_recovery = false,
|
|
213
|
-
}),
|
|
214
|
-
);
|
|
215
|
-
errdefer integrity.forest.deinit(gpa);
|
|
216
|
-
|
|
217
|
-
integrity.grid_scrubber = try GridScrubber.init(
|
|
218
|
-
gpa,
|
|
219
|
-
&integrity.forest,
|
|
220
|
-
&integrity.client_sessions_checkpoint,
|
|
221
|
-
);
|
|
222
|
-
errdefer integrity.grid_scrubber.deinit(gpa);
|
|
223
|
-
|
|
224
|
-
integrity.grid_blocks_scrubbed = try .initEmpty(
|
|
225
|
-
gpa,
|
|
226
|
-
// Safe estimation for the maximum number of grid blocks based on file size. Using
|
|
227
|
-
// storage_size_limit_max would increase the memory usage dramatically for small data files.
|
|
228
|
-
@divFloor(data_file_stat.size, constants.block_size),
|
|
229
|
-
);
|
|
230
|
-
errdefer integrity.grid_blocks_scrubbed.deinit(gpa);
|
|
231
|
-
|
|
232
|
-
integrity.buffer_headers = try gpa.alignedAlloc(
|
|
233
|
-
u8,
|
|
234
|
-
constants.sector_size,
|
|
235
|
-
constants.journal_size_headers,
|
|
236
|
-
);
|
|
237
|
-
errdefer gpa.free(integrity.buffer_headers);
|
|
238
|
-
|
|
239
|
-
integrity.buffer_prepare = try gpa.alignedAlloc(
|
|
240
|
-
u8,
|
|
241
|
-
constants.sector_size,
|
|
242
|
-
constants.message_size_max,
|
|
243
|
-
);
|
|
244
|
-
errdefer gpa.free(integrity.buffer_prepare);
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
fn open(integrity: *Integrity) !u64 {
|
|
248
|
-
var checked_bytes: u64 = 0;
|
|
249
|
-
|
|
250
|
-
assert(integrity.superblock.opened);
|
|
251
|
-
integrity.superblock.working.vsr_state.assert_internally_consistent();
|
|
252
|
-
for (integrity.superblock.reading) |_| {
|
|
253
|
-
checked_bytes += vsr.superblock.superblock_copy_size;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
integrity.client_sessions_checkpoint.open(
|
|
257
|
-
&integrity.grid,
|
|
258
|
-
integrity.superblock.working.client_sessions_reference(),
|
|
259
|
-
struct {
|
|
260
|
-
fn client_sessions_checkpoint_callback(_: *CheckpointTrailer) void {}
|
|
261
|
-
}.client_sessions_checkpoint_callback,
|
|
262
|
-
);
|
|
263
|
-
while (integrity.client_sessions_checkpoint.callback != .none) {
|
|
264
|
-
try integrity.io.run_for_ns(constants.tick_ms * std.time.ns_per_ms);
|
|
265
|
-
}
|
|
266
|
-
log.debug("client sessions checkpoint opened", .{});
|
|
267
|
-
|
|
268
|
-
integrity.grid.open(struct {
|
|
269
|
-
fn grid_open_callback(_: *Grid) void {}
|
|
270
|
-
}.grid_open_callback);
|
|
271
|
-
while (integrity.grid.callback != .none) {
|
|
272
|
-
try integrity.io.run_for_ns(constants.tick_ms * std.time.ns_per_ms);
|
|
273
|
-
}
|
|
274
|
-
log.debug("grid opened", .{});
|
|
275
|
-
|
|
276
|
-
integrity.forest.open(struct {
|
|
277
|
-
fn forest_open_callback(_: *Forest) void {}
|
|
278
|
-
}.forest_open_callback);
|
|
279
|
-
while (integrity.forest.progress != null) {
|
|
280
|
-
try integrity.io.run_for_ns(constants.tick_ms * std.time.ns_per_ms);
|
|
281
|
-
}
|
|
282
|
-
log.debug("forest opened", .{});
|
|
283
|
-
|
|
284
|
-
return checked_bytes;
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
fn deinit(integrity: *Integrity, gpa: std.mem.Allocator) void {
|
|
288
|
-
gpa.free(integrity.buffer_headers);
|
|
289
|
-
gpa.free(integrity.buffer_prepare);
|
|
290
|
-
|
|
291
|
-
integrity.grid_blocks_scrubbed.deinit(gpa);
|
|
292
|
-
integrity.grid_scrubber.deinit(gpa);
|
|
293
|
-
integrity.forest.deinit(gpa);
|
|
294
|
-
integrity.grid.deinit(gpa);
|
|
295
|
-
integrity.client_sessions_checkpoint.deinit(gpa);
|
|
296
|
-
integrity.superblock.deinit(gpa);
|
|
297
|
-
integrity.storage.deinit();
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
/// Checks the WAL headers and prepares, using sync IO.
|
|
301
|
-
fn check_wal(integrity: *Integrity) !u64 {
|
|
302
|
-
var checked_bytes: u64 = 0;
|
|
303
|
-
|
|
304
|
-
const headers_bytes_read = try integrity.sync_read_all(
|
|
305
|
-
integrity.buffer_headers,
|
|
306
|
-
vsr.Zone.wal_headers.start(),
|
|
307
|
-
);
|
|
308
|
-
assert(headers_bytes_read == integrity.buffer_headers.len);
|
|
309
|
-
|
|
310
|
-
const wal_headers: []vsr.Header.Prepare align(16) =
|
|
311
|
-
std.mem.bytesAsSlice(vsr.Header.Prepare, integrity.buffer_headers);
|
|
312
|
-
|
|
313
|
-
for (wal_headers, 0..) |*wal_header, slot| {
|
|
314
|
-
const offset = slot * constants.message_size_max;
|
|
315
|
-
|
|
316
|
-
const bytes_read = try integrity.sync_read_all(
|
|
317
|
-
integrity.buffer_prepare,
|
|
318
|
-
vsr.Zone.wal_prepares.start() + offset,
|
|
319
|
-
);
|
|
320
|
-
assert(bytes_read == integrity.buffer_prepare.len);
|
|
321
|
-
|
|
322
|
-
const wal_prepare: *align(16) vsr.Header.Prepare = std.mem.bytesAsValue(
|
|
323
|
-
vsr.Header.Prepare,
|
|
324
|
-
integrity.buffer_prepare[0..@sizeOf(vsr.Header)],
|
|
325
|
-
);
|
|
326
|
-
|
|
327
|
-
const wal_prepare_body_valid =
|
|
328
|
-
wal_prepare.valid_checksum() and
|
|
329
|
-
wal_prepare.valid_checksum_body(
|
|
330
|
-
integrity.buffer_prepare[@sizeOf(vsr.Header)..wal_prepare.size],
|
|
331
|
-
);
|
|
332
|
-
|
|
333
|
-
assert(wal_header.valid_checksum());
|
|
334
|
-
assert(wal_prepare_body_valid);
|
|
335
|
-
assert(wal_header.checksum == wal_prepare.checksum);
|
|
336
|
-
checked_bytes += bytes_read;
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
assert(wal_headers.len == constants.journal_slot_count);
|
|
340
|
-
checked_bytes += headers_bytes_read;
|
|
341
|
-
|
|
342
|
-
log.info("successfully checked {} wal headers and prepares", .{wal_headers.len});
|
|
343
|
-
return checked_bytes;
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
/// Checks the client replies, using sync IO.
|
|
347
|
-
fn check_client_replies(integrity: *Integrity) !u64 {
|
|
348
|
-
var checked_bytes: u64 = 0;
|
|
349
|
-
|
|
350
|
-
for (0..constants.clients_max) |slot| {
|
|
351
|
-
const offset = slot * constants.message_size_max;
|
|
352
|
-
|
|
353
|
-
const bytes_read = try integrity.sync_read_all(
|
|
354
|
-
integrity.buffer_prepare,
|
|
355
|
-
vsr.Zone.client_replies.start() + offset,
|
|
356
|
-
);
|
|
357
|
-
assert(bytes_read == integrity.buffer_prepare.len);
|
|
358
|
-
|
|
359
|
-
const reply: *align(16) vsr.Header.Reply = std.mem.bytesAsValue(
|
|
360
|
-
vsr.Header.Reply,
|
|
361
|
-
integrity.buffer_prepare[0..@sizeOf(vsr.Header)],
|
|
362
|
-
);
|
|
363
|
-
|
|
364
|
-
const reply_empty = reply.checksum == 0 and reply.checksum_body == 0;
|
|
365
|
-
const reply_valid = reply.valid_checksum() and
|
|
366
|
-
reply.valid_checksum_body(integrity.buffer_prepare[@sizeOf(vsr.Header)..reply.size]);
|
|
367
|
-
assert(reply_empty or reply_valid);
|
|
368
|
-
|
|
369
|
-
checked_bytes += bytes_read;
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
log.info("successfully checked {} client replies", .{constants.clients_max});
|
|
373
|
-
return checked_bytes;
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
/// Checks the grid, using the grid scrubber.
|
|
377
|
-
fn check_grid(integrity: *Integrity, seed: u64) !u64 {
|
|
378
|
-
var checked_bytes: u64 = 0;
|
|
379
|
-
const grid = &integrity.grid;
|
|
380
|
-
|
|
381
|
-
// The free set isn't included in the grid's acquired count, but is scrubbed.
|
|
382
|
-
// Ensure this is accounted for.
|
|
383
|
-
const blocks_expected_count =
|
|
384
|
-
(grid.free_set.count_acquired() - grid.free_set.count_released()) +
|
|
385
|
-
grid.free_set_checkpoint_blocks_acquired.block_count() +
|
|
386
|
-
grid.free_set_checkpoint_blocks_released.block_count();
|
|
387
|
-
|
|
388
|
-
log.info("checking {} grid blocks with seed {}...", .{
|
|
389
|
-
blocks_expected_count,
|
|
390
|
-
seed,
|
|
391
|
-
});
|
|
392
|
-
|
|
393
|
-
var prng = stdx.PRNG.from_seed(seed);
|
|
394
|
-
integrity.grid_scrubber.open(&prng);
|
|
395
|
-
|
|
396
|
-
const parent_progress_node = std.Progress.start(.{
|
|
397
|
-
.root_name = "checking grid blocks",
|
|
398
|
-
.estimated_total_items = blocks_expected_count,
|
|
399
|
-
});
|
|
400
|
-
defer parent_progress_node.end();
|
|
401
|
-
|
|
402
|
-
var timer = try std.time.Timer.start();
|
|
403
|
-
timer.reset();
|
|
404
|
-
|
|
405
|
-
while (true) {
|
|
406
|
-
for (0..integrity.grid_scrubber.reads.available() + 1) |_| {
|
|
407
|
-
if (integrity.grid_scrubber.tour == .done) break;
|
|
408
|
-
if (!integrity.grid_scrubber.read_next()) break;
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
while (integrity.grid_scrubber.read_result_next()) |result| {
|
|
412
|
-
assert(result.status == .ok);
|
|
413
|
-
|
|
414
|
-
// `read_result_next` returns addresses, starting from 1, but the free sets and such
|
|
415
|
-
// are zero indexed.
|
|
416
|
-
const block_set = integrity.grid_blocks_scrubbed.isSet(
|
|
417
|
-
result.block.block_address - 1,
|
|
418
|
-
);
|
|
419
|
-
|
|
420
|
-
// Only completeOne() if no existing entry was found, as the grid scrubber will
|
|
421
|
-
// run through index blocks multiple times.
|
|
422
|
-
if (!block_set) {
|
|
423
|
-
integrity.grid_blocks_scrubbed.set(result.block.block_address - 1);
|
|
424
|
-
checked_bytes += constants.block_size;
|
|
425
|
-
parent_progress_node.completeOne();
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
// When the .tour is .done, there might still be reads executing. Wait for those, too.
|
|
430
|
-
if (integrity.grid_scrubber.tour == .done and
|
|
431
|
-
integrity.grid_scrubber.reads.executing() == 0)
|
|
432
|
-
{
|
|
433
|
-
break;
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
try integrity.io.run_for_ns(constants.tick_ms * std.time.ns_per_ms);
|
|
437
|
-
}
|
|
438
|
-
const grid_duration_ms = stdx.div_ceil(timer.read(), std.time.ns_per_ms);
|
|
439
|
-
|
|
440
|
-
assert(integrity.grid_scrubber.tour == .done and
|
|
441
|
-
integrity.grid_scrubber.reads.executing() == 0);
|
|
442
|
-
|
|
443
|
-
// Verify that the blocks checked from the grid scrubber and the free set itself are
|
|
444
|
-
// identical.
|
|
445
|
-
assert(integrity.grid_blocks_scrubbed.count() == blocks_expected_count);
|
|
446
|
-
|
|
447
|
-
var acquired_iterator = grid.free_set.blocks_acquired.iterator(.{});
|
|
448
|
-
while (acquired_iterator.next()) |block| {
|
|
449
|
-
if (grid.free_set.blocks_released.isSet(block)) {
|
|
450
|
-
continue;
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
assert(integrity.grid_blocks_scrubbed.isSet(block));
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
// Check in reverse, too, that all the blocks we visited are listed in the free set.
|
|
457
|
-
var visisted_iterator = integrity.grid_blocks_scrubbed.iterator(.{});
|
|
458
|
-
while (visisted_iterator.next()) |entry| {
|
|
459
|
-
const in_free_set = grid.free_set.blocks_acquired.isSet(entry) and
|
|
460
|
-
!grid.free_set.blocks_released.isSet(entry);
|
|
461
|
-
|
|
462
|
-
assert(in_free_set);
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
const throughput = @divFloor(@divFloor(
|
|
466
|
-
blocks_expected_count * constants.block_size,
|
|
467
|
-
stdx.div_ceil(grid_duration_ms, std.time.ms_per_s),
|
|
468
|
-
), 1024 * 1024);
|
|
469
|
-
|
|
470
|
-
log.info("successfully checked {} grid blocks in {}ms. ({}MiB/s)", .{
|
|
471
|
-
blocks_expected_count,
|
|
472
|
-
grid_duration_ms,
|
|
473
|
-
throughput,
|
|
474
|
-
});
|
|
475
|
-
|
|
476
|
-
return checked_bytes;
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
/// Windows doesn't support using sync IO functions like preadAll on the handles IO opens.
|
|
480
|
-
fn sync_read_all(integrity: *Integrity, buffer: []u8, offset: u64) !u64 {
|
|
481
|
-
var completion: IO.Completion = undefined;
|
|
482
|
-
|
|
483
|
-
const Context = struct {
|
|
484
|
-
bytes_read: ?u64 = null,
|
|
485
|
-
|
|
486
|
-
fn read_callback(
|
|
487
|
-
context: *@This(),
|
|
488
|
-
_: *IO.Completion,
|
|
489
|
-
result: IO.ReadError!usize,
|
|
490
|
-
) void {
|
|
491
|
-
context.bytes_read = result catch unreachable;
|
|
492
|
-
}
|
|
493
|
-
};
|
|
494
|
-
var context: Context = .{};
|
|
495
|
-
var bytes_read: u64 = 0;
|
|
496
|
-
|
|
497
|
-
while (bytes_read < buffer.len) {
|
|
498
|
-
integrity.io.read(
|
|
499
|
-
*Context,
|
|
500
|
-
&context,
|
|
501
|
-
Context.read_callback,
|
|
502
|
-
&completion,
|
|
503
|
-
integrity.storage.fd,
|
|
504
|
-
buffer[bytes_read..],
|
|
505
|
-
offset,
|
|
506
|
-
);
|
|
507
|
-
|
|
508
|
-
while (context.bytes_read == null) {
|
|
509
|
-
try integrity.io.run();
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
if (context.bytes_read.? == 0) break;
|
|
513
|
-
bytes_read += context.bytes_read.?;
|
|
514
|
-
}
|
|
515
|
-
|
|
516
|
-
assert(bytes_read == buffer.len);
|
|
517
|
-
return bytes_read;
|
|
518
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
//! Entry point for exporting the `tb_client` library.
|
|
2
|
-
//! Used by language clients that rely on the shared or static library exposed by `tb_client.h`.
|
|
3
|
-
//! For an idiomatic Zig API, use `vsr.tb_client` directly instead.
|
|
4
|
-
const builtin = @import("builtin");
|
|
5
|
-
const std = @import("std");
|
|
6
|
-
|
|
7
|
-
pub const vsr = @import("vsr");
|
|
8
|
-
const exports = vsr.tb_client.exports;
|
|
9
|
-
|
|
10
|
-
pub const std_options: std.Options = .{
|
|
11
|
-
.log_level = .debug,
|
|
12
|
-
.logFn = exports.Logging.application_logger,
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
comptime {
|
|
16
|
-
if (!builtin.link_libc) {
|
|
17
|
-
@compileError("Must be built with libc to export tb_client symbols.");
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
@export(&exports.init, .{ .name = "tb_client_init", .linkage = .strong });
|
|
21
|
-
@export(&exports.init_echo, .{ .name = "tb_client_init_echo", .linkage = .strong });
|
|
22
|
-
@export(&exports.submit, .{ .name = "tb_client_submit", .linkage = .strong });
|
|
23
|
-
@export(&exports.deinit, .{ .name = "tb_client_deinit", .linkage = .strong });
|
|
24
|
-
@export(
|
|
25
|
-
&exports.completion_context,
|
|
26
|
-
.{ .name = "tb_client_completion_context", .linkage = .strong },
|
|
27
|
-
);
|
|
28
|
-
@export(
|
|
29
|
-
&exports.register_log_callback,
|
|
30
|
-
.{ .name = "tb_client_register_log_callback", .linkage = .strong },
|
|
31
|
-
);
|
|
32
|
-
@export(
|
|
33
|
-
&exports.init_parameters,
|
|
34
|
-
.{ .name = "tb_client_init_parameters", .linkage = .strong },
|
|
35
|
-
);
|
|
36
|
-
}
|