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,406 @@
|
|
|
1
|
+
#define IS_POSIX __unix__ || __APPLE__ || !_WIN32
|
|
2
|
+
|
|
3
|
+
#include <stdlib.h>
|
|
4
|
+
#include <stdio.h>
|
|
5
|
+
#include <stdbool.h>
|
|
6
|
+
#include <string.h>
|
|
7
|
+
|
|
8
|
+
#if IS_POSIX
|
|
9
|
+
#include <pthread.h>
|
|
10
|
+
#include <time.h>
|
|
11
|
+
#elif _WIN32
|
|
12
|
+
#include <windows.h>
|
|
13
|
+
#endif
|
|
14
|
+
|
|
15
|
+
#include "../tb_client.h"
|
|
16
|
+
|
|
17
|
+
// config.message_size_max - @sizeOf(vsr.Header):
|
|
18
|
+
#define MAX_MESSAGE_SIZE (1024 * 1024) - 256
|
|
19
|
+
|
|
20
|
+
// Synchronization context between the callback and the main thread.
|
|
21
|
+
typedef struct completion_context {
|
|
22
|
+
uint8_t reply[MAX_MESSAGE_SIZE];
|
|
23
|
+
int size;
|
|
24
|
+
bool completed;
|
|
25
|
+
|
|
26
|
+
// In this example we synchronize using a condition variable:
|
|
27
|
+
#if IS_POSIX
|
|
28
|
+
pthread_mutex_t lock;
|
|
29
|
+
pthread_cond_t cv;
|
|
30
|
+
#elif _WIN32
|
|
31
|
+
CRITICAL_SECTION lock;
|
|
32
|
+
CONDITION_VARIABLE cv;
|
|
33
|
+
#endif
|
|
34
|
+
|
|
35
|
+
} completion_context_t;
|
|
36
|
+
|
|
37
|
+
void completion_context_init(completion_context_t *ctx);
|
|
38
|
+
void completion_context_destroy(completion_context_t *ctx);
|
|
39
|
+
|
|
40
|
+
// Sends and blocks the current thread until the reply arrives.
|
|
41
|
+
TB_CLIENT_STATUS send_request(
|
|
42
|
+
tb_client_t *client,
|
|
43
|
+
tb_packet_t *packet,
|
|
44
|
+
completion_context_t *ctx
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
// For benchmarking purposes.
|
|
48
|
+
long long get_time_ms(void);
|
|
49
|
+
|
|
50
|
+
// Completion function, called by tb_client no notify that a request as completed.
|
|
51
|
+
void on_completion(
|
|
52
|
+
uintptr_t context,
|
|
53
|
+
tb_packet_t *packet,
|
|
54
|
+
uint64_t timestamp,
|
|
55
|
+
const uint8_t *data,
|
|
56
|
+
uint32_t size
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
int main(int argc, char **argv) {
|
|
60
|
+
printf("TigerBeetle C Sample\n");
|
|
61
|
+
printf("Connecting...\n");
|
|
62
|
+
tb_client_t client;
|
|
63
|
+
|
|
64
|
+
const char *address = getenv("TB_ADDRESS");
|
|
65
|
+
if (address == NULL) address = "3000";
|
|
66
|
+
|
|
67
|
+
uint8_t cluster_id[16];
|
|
68
|
+
memset(&cluster_id, 0, 16);
|
|
69
|
+
|
|
70
|
+
TB_INIT_STATUS init_status = tb_client_init(
|
|
71
|
+
&client, // Output client.
|
|
72
|
+
cluster_id, // Cluster ID.
|
|
73
|
+
address, // Cluster addresses.
|
|
74
|
+
strlen(address), //
|
|
75
|
+
(uintptr_t)NULL, // No need for a global context.
|
|
76
|
+
&on_completion // Completion callback.
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
if (init_status != TB_INIT_SUCCESS) {
|
|
80
|
+
printf("Failed to initialize tb_client\n");
|
|
81
|
+
exit(-1);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
completion_context_t ctx;
|
|
85
|
+
completion_context_init(&ctx);
|
|
86
|
+
|
|
87
|
+
tb_packet_t packet;
|
|
88
|
+
|
|
89
|
+
////////////////////////////////////////////////////////////
|
|
90
|
+
// Submitting a batch of accounts: //
|
|
91
|
+
////////////////////////////////////////////////////////////
|
|
92
|
+
|
|
93
|
+
#define ACCOUNTS_LEN 2
|
|
94
|
+
#define ACCOUNTS_SIZE sizeof(tb_account_t) * ACCOUNTS_LEN
|
|
95
|
+
tb_account_t accounts[ACCOUNTS_LEN];
|
|
96
|
+
|
|
97
|
+
// Zeroing the memory, so we don't have to initialize every field.
|
|
98
|
+
memset(&accounts, 0, ACCOUNTS_SIZE);
|
|
99
|
+
|
|
100
|
+
accounts[0].id = 1;
|
|
101
|
+
accounts[0].code = 2;
|
|
102
|
+
accounts[0].ledger = 777;
|
|
103
|
+
|
|
104
|
+
accounts[1].id = 2;
|
|
105
|
+
accounts[1].code = 2;
|
|
106
|
+
accounts[1].ledger = 777;
|
|
107
|
+
|
|
108
|
+
packet.operation = TB_OPERATION_CREATE_ACCOUNTS; // The operation to be performed.
|
|
109
|
+
packet.data = accounts; // The data to be sent.
|
|
110
|
+
packet.data_size = ACCOUNTS_SIZE; //
|
|
111
|
+
packet.user_data = &ctx; // User-defined context.
|
|
112
|
+
packet.status = TB_PACKET_OK; // Will be set when the reply arrives.
|
|
113
|
+
|
|
114
|
+
printf("Creating accounts...\n");
|
|
115
|
+
|
|
116
|
+
TB_CLIENT_STATUS client_status = send_request(&client, &packet, &ctx);
|
|
117
|
+
if (client_status != TB_CLIENT_OK) {
|
|
118
|
+
printf("Failed to send the request\n");
|
|
119
|
+
exit(-1);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (packet.status != TB_PACKET_OK) {
|
|
123
|
+
// Checking if the request failed:
|
|
124
|
+
printf("Error calling create_accounts (ret=%d)\n", packet.status);
|
|
125
|
+
exit(-1);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (ctx.size != 0) {
|
|
129
|
+
// Checking for errors creating the accounts:
|
|
130
|
+
tb_create_accounts_result_t *results = (tb_create_accounts_result_t*)ctx.reply;
|
|
131
|
+
int results_len = ctx.size / sizeof(tb_create_accounts_result_t);
|
|
132
|
+
printf("create_account results:\n");
|
|
133
|
+
for(int i=0;i<results_len;i++) {
|
|
134
|
+
printf("index=%d, ret=%d\n", results[i].index, results[i].result);
|
|
135
|
+
}
|
|
136
|
+
exit(-1);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
printf("Accounts created successfully\n");
|
|
140
|
+
|
|
141
|
+
////////////////////////////////////////////////////////////
|
|
142
|
+
// Submitting multiple batches of transfers: //
|
|
143
|
+
////////////////////////////////////////////////////////////
|
|
144
|
+
|
|
145
|
+
printf("Creating transfers...\n");
|
|
146
|
+
#define MAX_BATCHES 100
|
|
147
|
+
#define TRANSFERS_PER_BATCH ((MAX_MESSAGE_SIZE) / sizeof(tb_transfer_t))
|
|
148
|
+
#define TRANSFERS_SIZE (sizeof(tb_transfer_t) * TRANSFERS_PER_BATCH)
|
|
149
|
+
long max_latency_ms = 0;
|
|
150
|
+
long total_time_ms = 0;
|
|
151
|
+
for (int i=0; i< MAX_BATCHES;i++) {
|
|
152
|
+
tb_transfer_t transfers[TRANSFERS_PER_BATCH];
|
|
153
|
+
|
|
154
|
+
// Zeroing the memory, so we don't have to initialize every field.
|
|
155
|
+
memset(transfers, 0, TRANSFERS_SIZE);
|
|
156
|
+
|
|
157
|
+
for (int j=0; j<TRANSFERS_PER_BATCH; j++) {
|
|
158
|
+
transfers[j].id = j + 1 + (i * TRANSFERS_PER_BATCH);
|
|
159
|
+
transfers[j].debit_account_id = accounts[0].id;
|
|
160
|
+
transfers[j].credit_account_id = accounts[1].id;
|
|
161
|
+
transfers[j].code = 2;
|
|
162
|
+
transfers[j].ledger = 777;
|
|
163
|
+
transfers[j].amount = 1;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
packet.operation = TB_OPERATION_CREATE_TRANSFERS; // The operation to be performed.
|
|
167
|
+
packet.data = transfers; // The data to be sent.
|
|
168
|
+
packet.data_size = MAX_MESSAGE_SIZE; //
|
|
169
|
+
packet.user_data = &ctx; // User-defined context.
|
|
170
|
+
packet.status = TB_PACKET_OK; // Will be set when the reply arrives.
|
|
171
|
+
|
|
172
|
+
long long now = get_time_ms();
|
|
173
|
+
|
|
174
|
+
client_status = send_request(&client, &packet, &ctx);
|
|
175
|
+
if (client_status != TB_CLIENT_OK) {
|
|
176
|
+
printf("Failed to send the request\n");
|
|
177
|
+
exit(-1);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
long elapsed_ms = get_time_ms() - now;
|
|
182
|
+
if (elapsed_ms > max_latency_ms) max_latency_ms = elapsed_ms;
|
|
183
|
+
total_time_ms += elapsed_ms;
|
|
184
|
+
|
|
185
|
+
if (packet.status != TB_PACKET_OK) {
|
|
186
|
+
// Checking if the request failed:
|
|
187
|
+
printf("Error calling create_transfers (ret=%d)\n", packet.status);
|
|
188
|
+
exit(-1);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
if (ctx.size != 0) {
|
|
192
|
+
// Checking for errors creating the accounts:
|
|
193
|
+
tb_create_transfers_result_t *results = (tb_create_transfers_result_t*)ctx.reply;
|
|
194
|
+
int results_len = ctx.size / sizeof(tb_create_transfers_result_t);
|
|
195
|
+
printf("create_transfers results:\n");
|
|
196
|
+
for(int i=0;i<results_len;i++) {
|
|
197
|
+
printf("index=%d, ret=%d\n", results[i].index, results[i].result);
|
|
198
|
+
}
|
|
199
|
+
exit(-1);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
printf("Transfers created successfully\n");
|
|
204
|
+
printf("============================================\n");
|
|
205
|
+
|
|
206
|
+
printf("%llu transfers per second\n", (MAX_BATCHES * TRANSFERS_PER_BATCH * 1000) / total_time_ms);
|
|
207
|
+
printf("create_transfers max p100 latency per %llu transfers = %ldms\n", TRANSFERS_PER_BATCH, max_latency_ms);
|
|
208
|
+
printf("total %llu transfers in %ldms\n", MAX_BATCHES * TRANSFERS_PER_BATCH, total_time_ms);
|
|
209
|
+
printf("\n");
|
|
210
|
+
|
|
211
|
+
////////////////////////////////////////////////////////////
|
|
212
|
+
// Looking up accounts: //
|
|
213
|
+
////////////////////////////////////////////////////////////
|
|
214
|
+
|
|
215
|
+
printf("Looking up accounts ...\n");
|
|
216
|
+
tb_uint128_t ids[ACCOUNTS_LEN] = { accounts[0].id, accounts[1].id };
|
|
217
|
+
|
|
218
|
+
packet.operation = TB_OPERATION_LOOKUP_ACCOUNTS;
|
|
219
|
+
packet.data = ids;
|
|
220
|
+
packet.data_size = sizeof(tb_uint128_t) * ACCOUNTS_LEN;
|
|
221
|
+
packet.user_data = &ctx;
|
|
222
|
+
packet.status = TB_PACKET_OK;
|
|
223
|
+
|
|
224
|
+
client_status = send_request(&client, &packet, &ctx);
|
|
225
|
+
if (client_status != TB_CLIENT_OK) {
|
|
226
|
+
printf("Failed to send the request\n");
|
|
227
|
+
exit(-1);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
if (packet.status != TB_PACKET_OK) {
|
|
232
|
+
// Checking if the request failed:
|
|
233
|
+
printf("Error calling lookup_accounts (ret=%d)", packet.status);
|
|
234
|
+
exit(-1);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
if (ctx.size == 0) {
|
|
238
|
+
printf("No accounts found");
|
|
239
|
+
exit(-1);
|
|
240
|
+
} else {
|
|
241
|
+
// Printing the account's balance:
|
|
242
|
+
tb_account_t *results = (tb_account_t*)ctx.reply;
|
|
243
|
+
int results_len = ctx.size / sizeof(tb_account_t);
|
|
244
|
+
printf("%d Account(s) found\n", results_len);
|
|
245
|
+
printf("============================================\n");
|
|
246
|
+
|
|
247
|
+
for(int i=0;i<results_len;i++) {
|
|
248
|
+
printf("id=%ld\n", (long)results[i].id);
|
|
249
|
+
printf("debits_posted=%ld\n", (long)results[i].debits_posted);
|
|
250
|
+
printf("credits_posted=%ld\n", (long)results[i].credits_posted);
|
|
251
|
+
printf("\n");
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// Cleanup:
|
|
256
|
+
completion_context_destroy(&ctx);
|
|
257
|
+
client_status = tb_client_deinit(&client);
|
|
258
|
+
if (client_status != TB_CLIENT_OK) {
|
|
259
|
+
printf("Failed to deinit the client\n");
|
|
260
|
+
exit(-1);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
#if IS_POSIX
|
|
265
|
+
|
|
266
|
+
void on_completion(
|
|
267
|
+
uintptr_t context,
|
|
268
|
+
tb_packet_t *packet,
|
|
269
|
+
uint64_t timestamp,
|
|
270
|
+
const uint8_t *data,
|
|
271
|
+
uint32_t size
|
|
272
|
+
) {
|
|
273
|
+
(void)timestamp; // Not used.
|
|
274
|
+
|
|
275
|
+
// The user_data gives context to a request:
|
|
276
|
+
completion_context_t *ctx = (completion_context_t*)packet->user_data;
|
|
277
|
+
|
|
278
|
+
// Signaling the main thread we received the reply:
|
|
279
|
+
pthread_mutex_lock(&ctx->lock);
|
|
280
|
+
|
|
281
|
+
memcpy (ctx->reply, data, size);
|
|
282
|
+
ctx->size = size;
|
|
283
|
+
ctx->completed = true;
|
|
284
|
+
|
|
285
|
+
pthread_cond_signal(&ctx->cv);
|
|
286
|
+
pthread_mutex_unlock(&ctx->lock);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
TB_CLIENT_STATUS send_request(
|
|
290
|
+
tb_client_t *client,
|
|
291
|
+
tb_packet_t *packet,
|
|
292
|
+
completion_context_t *ctx
|
|
293
|
+
) {
|
|
294
|
+
// Locks the mutex:
|
|
295
|
+
if (pthread_mutex_lock(&ctx->lock) != 0) {
|
|
296
|
+
printf("Failed to lock mutex\n");
|
|
297
|
+
exit(-1);
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// Submits the request asynchronously:
|
|
301
|
+
ctx->completed = false;
|
|
302
|
+
TB_CLIENT_STATUS client_status = tb_client_submit(client, packet);
|
|
303
|
+
if (client_status == TB_CLIENT_OK) {
|
|
304
|
+
// Uses a condvar to sync this thread with the callback:
|
|
305
|
+
while (!ctx->completed) {
|
|
306
|
+
if (pthread_cond_wait(&ctx->cv, &ctx->lock) != 0) {
|
|
307
|
+
printf("Failed to wait condvar\n");
|
|
308
|
+
exit(-1);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
if (pthread_mutex_unlock(&ctx->lock) != 0) {
|
|
314
|
+
printf("Failed to unlock mutex\n");
|
|
315
|
+
exit(-1);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
return client_status;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
void completion_context_init(completion_context_t *ctx) {
|
|
322
|
+
if (pthread_mutex_init(&ctx->lock, NULL) != 0) {
|
|
323
|
+
printf("Failed to initialize mutex\n");
|
|
324
|
+
exit(-1);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
if (pthread_cond_init(&ctx->cv, NULL) != 0) {
|
|
328
|
+
printf("Failed to initialize condition var\n");
|
|
329
|
+
exit(-1);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
void completion_context_destroy(completion_context_t *ctx) {
|
|
334
|
+
pthread_cond_destroy(&ctx->cv);
|
|
335
|
+
pthread_mutex_destroy(&ctx->lock);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
long long get_time_ms(void) {
|
|
339
|
+
struct timespec ts;
|
|
340
|
+
if (clock_gettime(CLOCK_MONOTONIC, &ts) != 0) {
|
|
341
|
+
printf("Failed to call clock_gettime\n");
|
|
342
|
+
exit(-1);
|
|
343
|
+
}
|
|
344
|
+
return (ts.tv_sec*1000)+(ts.tv_nsec/1000000);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
#elif _WIN32
|
|
348
|
+
|
|
349
|
+
void on_completion(
|
|
350
|
+
uintptr_t context,
|
|
351
|
+
tb_packet_t *packet,
|
|
352
|
+
uint64_t timestamp,
|
|
353
|
+
const uint8_t *data,
|
|
354
|
+
uint32_t size
|
|
355
|
+
) {
|
|
356
|
+
(void)timestamp; // Not used.
|
|
357
|
+
// The user_data gives context to a request:
|
|
358
|
+
completion_context_t *ctx = (completion_context_t*)packet->user_data;
|
|
359
|
+
|
|
360
|
+
// Signaling the main thread we received the reply:
|
|
361
|
+
EnterCriticalSection(&ctx->lock);
|
|
362
|
+
|
|
363
|
+
memcpy (ctx->reply, data, size);
|
|
364
|
+
ctx->size = size;
|
|
365
|
+
ctx->completed = true;
|
|
366
|
+
|
|
367
|
+
WakeConditionVariable(&ctx->cv);
|
|
368
|
+
LeaveCriticalSection(&ctx->lock);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
TB_CLIENT_STATUS send_request(
|
|
372
|
+
tb_client_t *client,
|
|
373
|
+
tb_packet_t *packet,
|
|
374
|
+
completion_context_t *ctx
|
|
375
|
+
) {
|
|
376
|
+
// Locks the mutex:
|
|
377
|
+
EnterCriticalSection(&ctx->lock);
|
|
378
|
+
|
|
379
|
+
// Submits the request asynchronously:
|
|
380
|
+
ctx->completed = false;
|
|
381
|
+
TB_CLIENT_STATUS client_status = tb_client_submit(client, packet);
|
|
382
|
+
if (client_status == TB_CLIENT_OK) {
|
|
383
|
+
// Uses a condvar to sync this thread with the callback:
|
|
384
|
+
while (!ctx->completed) {
|
|
385
|
+
SleepConditionVariableCS (&ctx->cv, &ctx->lock, INFINITE);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
LeaveCriticalSection(&ctx->lock);
|
|
390
|
+
return client_status;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
void completion_context_init(completion_context_t *ctx) {
|
|
394
|
+
InitializeCriticalSection(&ctx->lock);
|
|
395
|
+
InitializeConditionVariable(&ctx->cv);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
void completion_context_destroy(completion_context_t *ctx) {
|
|
399
|
+
DeleteCriticalSection(&ctx->lock);
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
long long get_time_ms(void) {
|
|
403
|
+
return GetTickCount64();
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
#endif
|