tigerbeetle-node 0.11.3 → 0.11.5
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.
- package/dist/.client.node.sha256 +1 -1
- package/package.json +1 -1
- package/src/node.zig +10 -5
- package/src/tigerbeetle/src/benchmark.zig +4 -4
- package/src/tigerbeetle/src/c/tb_client/context.zig +6 -6
- package/src/tigerbeetle/src/c/tb_client/echo_client.zig +2 -2
- package/src/tigerbeetle/src/c/tb_client/thread.zig +0 -1
- package/src/tigerbeetle/src/c/tb_client.h +97 -111
- package/src/tigerbeetle/src/c/tb_client.zig +30 -19
- package/src/tigerbeetle/src/c/tb_client_header.zig +218 -0
- package/src/tigerbeetle/src/c/test.zig +14 -14
- package/src/tigerbeetle/src/cli.zig +12 -12
- package/src/tigerbeetle/src/config.zig +183 -379
- package/src/tigerbeetle/src/constants.zig +394 -0
- package/src/tigerbeetle/src/demo.zig +4 -4
- package/src/tigerbeetle/src/ewah_fuzz.zig +2 -0
- package/src/tigerbeetle/src/io/darwin.zig +4 -4
- package/src/tigerbeetle/src/io/linux.zig +6 -6
- package/src/tigerbeetle/src/io/windows.zig +4 -4
- package/src/tigerbeetle/src/lsm/bloom_filter.zig +1 -1
- package/src/tigerbeetle/src/lsm/compaction.zig +15 -10
- package/src/tigerbeetle/src/lsm/forest.zig +2 -2
- package/src/tigerbeetle/src/lsm/forest_fuzz.zig +18 -15
- package/src/tigerbeetle/src/lsm/grid.zig +5 -5
- package/src/tigerbeetle/src/lsm/groove.zig +8 -42
- package/src/tigerbeetle/src/lsm/level_iterator.zig +2 -2
- package/src/tigerbeetle/src/lsm/manifest.zig +19 -23
- package/src/tigerbeetle/src/lsm/manifest_level.zig +2 -2
- package/src/tigerbeetle/src/lsm/manifest_log.zig +8 -8
- package/src/tigerbeetle/src/lsm/manifest_log_fuzz.zig +25 -12
- package/src/tigerbeetle/src/lsm/posted_groove.zig +4 -15
- package/src/tigerbeetle/src/lsm/segmented_array_benchmark.zig +13 -13
- package/src/tigerbeetle/src/lsm/set_associative_cache.zig +2 -2
- package/src/tigerbeetle/src/lsm/table.zig +43 -35
- package/src/tigerbeetle/src/lsm/table_immutable.zig +4 -4
- package/src/tigerbeetle/src/lsm/table_iterator.zig +17 -9
- package/src/tigerbeetle/src/lsm/table_mutable.zig +3 -3
- package/src/tigerbeetle/src/lsm/test.zig +6 -6
- package/src/tigerbeetle/src/lsm/tree.zig +75 -47
- package/src/tigerbeetle/src/lsm/tree_fuzz.zig +27 -28
- package/src/tigerbeetle/src/main.zig +32 -23
- package/src/tigerbeetle/src/message_bus.zig +25 -25
- package/src/tigerbeetle/src/message_pool.zig +17 -17
- package/src/tigerbeetle/src/simulator.zig +7 -12
- package/src/tigerbeetle/src/state_machine.zig +582 -1806
- package/src/tigerbeetle/src/storage.zig +12 -12
- package/src/tigerbeetle/src/test/accounting/auditor.zig +2 -2
- package/src/tigerbeetle/src/test/accounting/workload.zig +5 -5
- package/src/tigerbeetle/src/test/cluster.zig +8 -8
- package/src/tigerbeetle/src/test/conductor.zig +6 -5
- package/src/tigerbeetle/src/test/fuzz.zig +19 -0
- package/src/tigerbeetle/src/test/message_bus.zig +0 -2
- package/src/tigerbeetle/src/test/network.zig +5 -5
- package/src/tigerbeetle/src/test/state_checker.zig +2 -2
- package/src/tigerbeetle/src/test/storage.zig +54 -51
- package/src/tigerbeetle/src/test/storage_checker.zig +3 -3
- package/src/tigerbeetle/src/test/table.zig +226 -0
- package/src/tigerbeetle/src/time.zig +0 -1
- package/src/tigerbeetle/src/tracer.zig +402 -214
- package/src/tigerbeetle/src/unit_tests.zig +1 -0
- package/src/tigerbeetle/src/vsr/client.zig +5 -5
- package/src/tigerbeetle/src/vsr/clock.zig +9 -8
- package/src/tigerbeetle/src/vsr/journal.zig +47 -47
- package/src/tigerbeetle/src/vsr/journal_format_fuzz.zig +13 -11
- package/src/tigerbeetle/src/vsr/replica.zig +56 -54
- package/src/tigerbeetle/src/vsr/replica_format.zig +8 -8
- package/src/tigerbeetle/src/vsr/superblock.zig +55 -55
- package/src/tigerbeetle/src/vsr/superblock_client_table.zig +9 -9
- package/src/tigerbeetle/src/vsr/superblock_free_set.zig +4 -3
- package/src/tigerbeetle/src/vsr/superblock_free_set_fuzz.zig +2 -0
- package/src/tigerbeetle/src/vsr/superblock_fuzz.zig +9 -6
- package/src/tigerbeetle/src/vsr/superblock_manifest.zig +5 -5
- package/src/tigerbeetle/src/vsr/superblock_quorums_fuzz.zig +2 -0
- package/src/tigerbeetle/src/vsr.zig +20 -20
package/dist/.client.node.sha256
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
004fa5f957fa7933ae697abff26d8e6879ebef4257a380594a24c92d285b07d8 dist/client.node
|
package/package.json
CHANGED
package/src/node.zig
CHANGED
|
@@ -14,18 +14,23 @@ const CreateTransfersResult = tb.CreateTransfersResult;
|
|
|
14
14
|
|
|
15
15
|
const Storage = @import("tigerbeetle/src/storage.zig").Storage;
|
|
16
16
|
const StateMachine = @import("tigerbeetle/src/state_machine.zig").StateMachineType(Storage, .{
|
|
17
|
-
.message_body_size_max =
|
|
17
|
+
.message_body_size_max = constants.message_body_size_max,
|
|
18
18
|
});
|
|
19
19
|
const Operation = StateMachine.Operation;
|
|
20
20
|
const MessageBus = @import("tigerbeetle/src/message_bus.zig").MessageBusClient;
|
|
21
21
|
const MessagePool = @import("tigerbeetle/src/message_pool.zig").MessagePool;
|
|
22
22
|
const IO = @import("tigerbeetle/src/io.zig").IO;
|
|
23
|
-
const
|
|
23
|
+
const constants = @import("tigerbeetle/src/constants.zig");
|
|
24
24
|
|
|
25
25
|
const vsr = @import("tigerbeetle/src/vsr.zig");
|
|
26
26
|
const Header = vsr.Header;
|
|
27
27
|
const Client = vsr.Client(StateMachine, MessageBus);
|
|
28
28
|
|
|
29
|
+
// TODO(jamii)
|
|
30
|
+
// This is a hack used to work around the absence of tigerbeetle_build_options.
|
|
31
|
+
// This should be removed once the node client is built using `zig build`.
|
|
32
|
+
pub const tracer_backend: @import("tigerbeetle/src/config.zig").TracerBackend = .none;
|
|
33
|
+
|
|
29
34
|
// Since this is running in application space, log only critical messages to reduce noise.
|
|
30
35
|
pub const log_level: std.log.Level = .err;
|
|
31
36
|
|
|
@@ -41,7 +46,7 @@ export fn napi_register_module_v1(env: c.napi_env, exports: c.napi_value) c.napi
|
|
|
41
46
|
env,
|
|
42
47
|
exports,
|
|
43
48
|
"tick_ms",
|
|
44
|
-
|
|
49
|
+
constants.tick_ms,
|
|
45
50
|
"failed to add tick_ms to exports",
|
|
46
51
|
) catch return null;
|
|
47
52
|
|
|
@@ -140,7 +145,7 @@ const Context = struct {
|
|
|
140
145
|
context.message_pool = try MessagePool.init(allocator, .client);
|
|
141
146
|
errdefer context.message_pool.deinit(allocator);
|
|
142
147
|
|
|
143
|
-
context.addresses = try vsr.parse_addresses(allocator, addresses_raw,
|
|
148
|
+
context.addresses = try vsr.parse_addresses(allocator, addresses_raw, constants.replicas_max);
|
|
144
149
|
errdefer allocator.free(context.addresses);
|
|
145
150
|
assert(context.addresses.len > 0);
|
|
146
151
|
|
|
@@ -237,7 +242,7 @@ fn decode_events_from_array(
|
|
|
237
242
|
if (array_length < 1) return translate.throw(env, "Batch must contain at least one event.");
|
|
238
243
|
|
|
239
244
|
const body_length = @sizeOf(T) * array_length;
|
|
240
|
-
if (@sizeOf(Header) + body_length >
|
|
245
|
+
if (@sizeOf(Header) + body_length > constants.message_size_max) {
|
|
241
246
|
return translate.throw(env, "Batch is larger than the maximum message size.");
|
|
242
247
|
}
|
|
243
248
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const std = @import("std");
|
|
2
2
|
const builtin = @import("builtin");
|
|
3
3
|
const assert = std.debug.assert;
|
|
4
|
-
const
|
|
4
|
+
const constants = @import("constants.zig");
|
|
5
5
|
|
|
6
6
|
const log = std.log;
|
|
7
7
|
pub const log_level: std.log.Level = .err;
|
|
@@ -14,7 +14,7 @@ const Storage = @import("storage.zig").Storage;
|
|
|
14
14
|
const MessagePool = @import("message_pool.zig").MessagePool;
|
|
15
15
|
const MessageBus = @import("message_bus.zig").MessageBusClient;
|
|
16
16
|
const StateMachine = @import("state_machine.zig").StateMachineType(Storage, .{
|
|
17
|
-
.message_body_size_max =
|
|
17
|
+
.message_body_size_max = constants.message_body_size_max,
|
|
18
18
|
});
|
|
19
19
|
const RingBuffer = @import("ring_buffer.zig").RingBuffer;
|
|
20
20
|
|
|
@@ -26,7 +26,7 @@ const tb = @import("tigerbeetle.zig");
|
|
|
26
26
|
const batches_count = 100;
|
|
27
27
|
|
|
28
28
|
const transfers_per_batch: u32 = @divExact(
|
|
29
|
-
|
|
29
|
+
constants.message_size_max - @sizeOf(vsr.Header),
|
|
30
30
|
@sizeOf(tb.Transfer),
|
|
31
31
|
);
|
|
32
32
|
comptime {
|
|
@@ -78,7 +78,7 @@ pub fn main() !void {
|
|
|
78
78
|
|
|
79
79
|
const client_id = std.crypto.random.int(u128);
|
|
80
80
|
const cluster_id: u32 = 0;
|
|
81
|
-
var address = [_]std.net.Address{try std.net.Address.parseIp4("127.0.0.1",
|
|
81
|
+
var address = [_]std.net.Address{try std.net.Address.parseIp4("127.0.0.1", constants.port)};
|
|
82
82
|
|
|
83
83
|
var io = try IO.init(32, 0);
|
|
84
84
|
defer io.deinit();
|
|
@@ -2,7 +2,7 @@ const std = @import("std");
|
|
|
2
2
|
const os = std.os;
|
|
3
3
|
const assert = std.debug.assert;
|
|
4
4
|
|
|
5
|
-
const
|
|
5
|
+
const constants = @import("../../constants.zig");
|
|
6
6
|
const log = std.log.scoped(.tb_client_context);
|
|
7
7
|
|
|
8
8
|
const util = @import("../../util.zig");
|
|
@@ -122,7 +122,7 @@ pub fn ContextType(
|
|
|
122
122
|
context.addresses = vsr.parse_addresses(
|
|
123
123
|
context.allocator,
|
|
124
124
|
addresses,
|
|
125
|
-
|
|
125
|
+
constants.replicas_max,
|
|
126
126
|
) catch |err| return switch (err) {
|
|
127
127
|
error.AddressLimitExceeded => error.AddressLimitExceeded,
|
|
128
128
|
else => error.AddressInvalid,
|
|
@@ -165,7 +165,7 @@ pub fn ContextType(
|
|
|
165
165
|
);
|
|
166
166
|
errdefer context.client.deinit(context.allocator);
|
|
167
167
|
|
|
168
|
-
context.messages_available =
|
|
168
|
+
context.messages_available = constants.client_request_queue_max;
|
|
169
169
|
context.on_completion_ctx = on_completion_ctx;
|
|
170
170
|
context.on_completion_fn = on_completion_fn;
|
|
171
171
|
context.implementation = .{
|
|
@@ -199,7 +199,7 @@ pub fn ContextType(
|
|
|
199
199
|
pub fn run(self: *Context) void {
|
|
200
200
|
while (!self.thread.signal.is_shutdown()) {
|
|
201
201
|
self.tick();
|
|
202
|
-
self.io.run_for_ns(
|
|
202
|
+
self.io.run_for_ns(constants.tick_ms * std.time.ns_per_ms) catch |err| {
|
|
203
203
|
log.err("{}: IO.run() failed: {s}", .{
|
|
204
204
|
self.client_id,
|
|
205
205
|
@errorName(err),
|
|
@@ -226,7 +226,7 @@ pub fn ContextType(
|
|
|
226
226
|
}
|
|
227
227
|
|
|
228
228
|
// Make sure the packet.data wouldn't overflow a message:
|
|
229
|
-
const writable = message.buffer[@sizeOf(Header)..][0..
|
|
229
|
+
const writable = message.buffer[@sizeOf(Header)..][0..constants.message_body_size_max];
|
|
230
230
|
if (readable.len > writable.len) {
|
|
231
231
|
return self.on_complete(packet, error.TooMuchData);
|
|
232
232
|
}
|
|
@@ -267,7 +267,7 @@ pub fn ContextType(
|
|
|
267
267
|
result: PacketError![]const u8,
|
|
268
268
|
) void {
|
|
269
269
|
self.messages_available += 1;
|
|
270
|
-
assert(self.messages_available <=
|
|
270
|
+
assert(self.messages_available <= constants.client_request_queue_max);
|
|
271
271
|
|
|
272
272
|
// Signal to resume sending requests that was waiting for available messages.
|
|
273
273
|
if (self.messages_available == 1) self.thread.signal.notify();
|
|
@@ -2,7 +2,7 @@ const std = @import("std");
|
|
|
2
2
|
const assert = std.debug.assert;
|
|
3
3
|
const mem = std.mem;
|
|
4
4
|
|
|
5
|
-
const
|
|
5
|
+
const constants = @import("../../constants.zig");
|
|
6
6
|
const vsr = @import("../../vsr.zig");
|
|
7
7
|
const Header = vsr.Header;
|
|
8
8
|
|
|
@@ -24,7 +24,7 @@ pub fn EchoClient(comptime StateMachine_: type, comptime MessageBus: type) type
|
|
|
24
24
|
};
|
|
25
25
|
};
|
|
26
26
|
|
|
27
|
-
request_queue: RingBuffer(Self.Request,
|
|
27
|
+
request_queue: RingBuffer(Self.Request, constants.client_request_queue_max, .array) = .{},
|
|
28
28
|
message_pool: *MessagePool,
|
|
29
29
|
|
|
30
30
|
pub fn init(
|
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
//////////////////////////////////////////////////////////
|
|
2
|
+
// This file was auto-generated by tb_client_header.zig //
|
|
3
|
+
// Do not manually modify. //
|
|
4
|
+
//////////////////////////////////////////////////////////
|
|
5
|
+
|
|
6
|
+
#ifndef TB_CLIENT_H
|
|
7
|
+
#define TB_CLIENT_H
|
|
8
|
+
|
|
4
9
|
#include <stddef.h>
|
|
5
10
|
#include <stdint.h>
|
|
6
11
|
#include <stdbool.h>
|
|
@@ -50,104 +55,84 @@ typedef struct tb_transfer_t {
|
|
|
50
55
|
} tb_transfer_t;
|
|
51
56
|
|
|
52
57
|
typedef enum TB_CREATE_ACCOUNT_RESULT {
|
|
53
|
-
TB_CREATE_ACCOUNT_OK,
|
|
54
|
-
TB_CREATE_ACCOUNT_LINKED_EVENT_FAILED,
|
|
55
|
-
TB_CREATE_ACCOUNT_LINKED_EVENT_CHAIN_OPEN,
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_USER_DATA,
|
|
73
|
-
TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_LEDGER,
|
|
74
|
-
TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_CODE,
|
|
75
|
-
TB_CREATE_ACCOUNT_EXISTS
|
|
58
|
+
TB_CREATE_ACCOUNT_OK = 0,
|
|
59
|
+
TB_CREATE_ACCOUNT_LINKED_EVENT_FAILED = 1,
|
|
60
|
+
TB_CREATE_ACCOUNT_LINKED_EVENT_CHAIN_OPEN = 2,
|
|
61
|
+
TB_CREATE_ACCOUNT_RESERVED_FLAG = 3,
|
|
62
|
+
TB_CREATE_ACCOUNT_RESERVED_FIELD = 4,
|
|
63
|
+
TB_CREATE_ACCOUNT_ID_MUST_NOT_BE_ZERO = 5,
|
|
64
|
+
TB_CREATE_ACCOUNT_ID_MUST_NOT_BE_INT_MAX = 6,
|
|
65
|
+
TB_CREATE_ACCOUNT_LEDGER_MUST_NOT_BE_ZERO = 7,
|
|
66
|
+
TB_CREATE_ACCOUNT_CODE_MUST_NOT_BE_ZERO = 8,
|
|
67
|
+
TB_CREATE_ACCOUNT_DEBITS_PENDING_MUST_BE_ZERO = 9,
|
|
68
|
+
TB_CREATE_ACCOUNT_DEBITS_POSTED_MUST_BE_ZERO = 10,
|
|
69
|
+
TB_CREATE_ACCOUNT_CREDITS_PENDING_MUST_BE_ZERO = 11,
|
|
70
|
+
TB_CREATE_ACCOUNT_CREDITS_POSTED_MUST_BE_ZERO = 12,
|
|
71
|
+
TB_CREATE_ACCOUNT_MUTUALLY_EXCLUSIVE_FLAGS = 13,
|
|
72
|
+
TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_FLAGS = 14,
|
|
73
|
+
TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_USER_DATA = 15,
|
|
74
|
+
TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_LEDGER = 16,
|
|
75
|
+
TB_CREATE_ACCOUNT_EXISTS_WITH_DIFFERENT_CODE = 17,
|
|
76
|
+
TB_CREATE_ACCOUNT_EXISTS = 18,
|
|
76
77
|
} TB_CREATE_ACCOUNT_RESULT;
|
|
77
78
|
|
|
78
79
|
typedef enum TB_CREATE_TRANSFER_RESULT {
|
|
79
|
-
TB_CREATE_TRANSFER_OK,
|
|
80
|
-
TB_CREATE_TRANSFER_LINKED_EVENT_FAILED,
|
|
81
|
-
TB_CREATE_TRANSFER_LINKED_EVENT_CHAIN_OPEN,
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
TB_CREATE_TRANSFER_PENDING_TRANSFER_NOT_FOUND,
|
|
137
|
-
TB_CREATE_TRANSFER_PENDING_TRANSFER_NOT_PENDING,
|
|
138
|
-
|
|
139
|
-
TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_DEBIT_ACCOUNT_ID,
|
|
140
|
-
TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_CREDIT_ACCOUNT_ID,
|
|
141
|
-
TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_LEDGER,
|
|
142
|
-
TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_CODE,
|
|
143
|
-
|
|
144
|
-
TB_CREATE_TRANSFER_EXCEEDS_PENDING_TRANSFER_AMOUNT,
|
|
145
|
-
TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_AMOUNT,
|
|
146
|
-
|
|
147
|
-
TB_CREATE_TRANSFER_PENDING_TRANSFER_ALREADY_POSTED,
|
|
148
|
-
TB_CREATE_TRANSFER_PENDING_TRANSFER_ALREADY_VOIDED,
|
|
149
|
-
|
|
150
|
-
TB_CREATE_TRANSFER_PENDING_TRANSFER_EXPIRED,
|
|
80
|
+
TB_CREATE_TRANSFER_OK = 0,
|
|
81
|
+
TB_CREATE_TRANSFER_LINKED_EVENT_FAILED = 1,
|
|
82
|
+
TB_CREATE_TRANSFER_LINKED_EVENT_CHAIN_OPEN = 2,
|
|
83
|
+
TB_CREATE_TRANSFER_RESERVED_FLAG = 3,
|
|
84
|
+
TB_CREATE_TRANSFER_RESERVED_FIELD = 4,
|
|
85
|
+
TB_CREATE_TRANSFER_ID_MUST_NOT_BE_ZERO = 5,
|
|
86
|
+
TB_CREATE_TRANSFER_ID_MUST_NOT_BE_INT_MAX = 6,
|
|
87
|
+
TB_CREATE_TRANSFER_DEBIT_ACCOUNT_ID_MUST_NOT_BE_ZERO = 7,
|
|
88
|
+
TB_CREATE_TRANSFER_DEBIT_ACCOUNT_ID_MUST_NOT_BE_INT_MAX = 8,
|
|
89
|
+
TB_CREATE_TRANSFER_CREDIT_ACCOUNT_ID_MUST_NOT_BE_ZERO = 9,
|
|
90
|
+
TB_CREATE_TRANSFER_CREDIT_ACCOUNT_ID_MUST_NOT_BE_INT_MAX = 10,
|
|
91
|
+
TB_CREATE_TRANSFER_ACCOUNTS_MUST_BE_DIFFERENT = 11,
|
|
92
|
+
TB_CREATE_TRANSFER_PENDING_ID_MUST_BE_ZERO = 12,
|
|
93
|
+
TB_CREATE_TRANSFER_PENDING_TRANSFER_MUST_TIMEOUT = 13,
|
|
94
|
+
TB_CREATE_TRANSFER_LEDGER_MUST_NOT_BE_ZERO = 14,
|
|
95
|
+
TB_CREATE_TRANSFER_CODE_MUST_NOT_BE_ZERO = 15,
|
|
96
|
+
TB_CREATE_TRANSFER_AMOUNT_MUST_NOT_BE_ZERO = 16,
|
|
97
|
+
TB_CREATE_TRANSFER_DEBIT_ACCOUNT_NOT_FOUND = 17,
|
|
98
|
+
TB_CREATE_TRANSFER_CREDIT_ACCOUNT_NOT_FOUND = 18,
|
|
99
|
+
TB_CREATE_TRANSFER_ACCOUNTS_MUST_HAVE_THE_SAME_LEDGER = 19,
|
|
100
|
+
TB_CREATE_TRANSFER_TRANSFER_MUST_HAVE_THE_SAME_LEDGER_AS_ACCOUNTS = 20,
|
|
101
|
+
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_FLAGS = 21,
|
|
102
|
+
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_DEBIT_ACCOUNT_ID = 22,
|
|
103
|
+
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_CREDIT_ACCOUNT_ID = 23,
|
|
104
|
+
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_USER_DATA = 24,
|
|
105
|
+
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_PENDING_ID = 25,
|
|
106
|
+
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_TIMEOUT = 26,
|
|
107
|
+
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_CODE = 27,
|
|
108
|
+
TB_CREATE_TRANSFER_EXISTS_WITH_DIFFERENT_AMOUNT = 28,
|
|
109
|
+
TB_CREATE_TRANSFER_EXISTS = 29,
|
|
110
|
+
TB_CREATE_TRANSFER_OVERFLOWS_DEBITS_PENDING = 30,
|
|
111
|
+
TB_CREATE_TRANSFER_OVERFLOWS_CREDITS_PENDING = 31,
|
|
112
|
+
TB_CREATE_TRANSFER_OVERFLOWS_DEBITS_POSTED = 32,
|
|
113
|
+
TB_CREATE_TRANSFER_OVERFLOWS_CREDITS_POSTED = 33,
|
|
114
|
+
TB_CREATE_TRANSFER_OVERFLOWS_DEBITS = 34,
|
|
115
|
+
TB_CREATE_TRANSFER_OVERFLOWS_CREDITS = 35,
|
|
116
|
+
TB_CREATE_TRANSFER_OVERFLOWS_TIMEOUT = 36,
|
|
117
|
+
TB_CREATE_TRANSFER_EXCEEDS_CREDITS = 37,
|
|
118
|
+
TB_CREATE_TRANSFER_EXCEEDS_DEBITS = 38,
|
|
119
|
+
TB_CREATE_TRANSFER_CANNOT_POST_AND_VOID_PENDING_TRANSFER = 39,
|
|
120
|
+
TB_CREATE_TRANSFER_PENDING_TRANSFER_CANNOT_POST_OR_VOID_ANOTHER = 40,
|
|
121
|
+
TB_CREATE_TRANSFER_TIMEOUT_RESERVED_FOR_PENDING_TRANSFER = 41,
|
|
122
|
+
TB_CREATE_TRANSFER_PENDING_ID_MUST_NOT_BE_ZERO = 42,
|
|
123
|
+
TB_CREATE_TRANSFER_PENDING_ID_MUST_NOT_BE_INT_MAX = 43,
|
|
124
|
+
TB_CREATE_TRANSFER_PENDING_ID_MUST_BE_DIFFERENT = 44,
|
|
125
|
+
TB_CREATE_TRANSFER_PENDING_TRANSFER_NOT_FOUND = 45,
|
|
126
|
+
TB_CREATE_TRANSFER_PENDING_TRANSFER_NOT_PENDING = 46,
|
|
127
|
+
TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_DEBIT_ACCOUNT_ID = 47,
|
|
128
|
+
TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_CREDIT_ACCOUNT_ID = 48,
|
|
129
|
+
TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_LEDGER = 49,
|
|
130
|
+
TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_CODE = 50,
|
|
131
|
+
TB_CREATE_TRANSFER_EXCEEDS_PENDING_TRANSFER_AMOUNT = 51,
|
|
132
|
+
TB_CREATE_TRANSFER_PENDING_TRANSFER_HAS_DIFFERENT_AMOUNT = 52,
|
|
133
|
+
TB_CREATE_TRANSFER_PENDING_TRANSFER_ALREADY_POSTED = 53,
|
|
134
|
+
TB_CREATE_TRANSFER_PENDING_TRANSFER_ALREADY_VOIDED = 54,
|
|
135
|
+
TB_CREATE_TRANSFER_PENDING_TRANSFER_EXPIRED = 55,
|
|
151
136
|
} TB_CREATE_TRANSFER_RESULT;
|
|
152
137
|
|
|
153
138
|
typedef struct tb_create_accounts_result_t {
|
|
@@ -161,17 +146,17 @@ typedef struct tb_create_transfers_result_t {
|
|
|
161
146
|
} tb_create_transfers_result_t;
|
|
162
147
|
|
|
163
148
|
typedef enum TB_OPERATION {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
149
|
+
TB_OPERATION_CREATE_ACCOUNTS = 3,
|
|
150
|
+
TB_OPERATION_CREATE_TRANSFERS = 4,
|
|
151
|
+
TB_OPERATION_LOOKUP_ACCOUNTS = 5,
|
|
152
|
+
TB_OPERATION_LOOKUP_TRANSFERS = 6,
|
|
168
153
|
} TB_OPERATION;
|
|
169
154
|
|
|
170
155
|
typedef enum TB_PACKET_STATUS {
|
|
171
|
-
TB_PACKET_OK,
|
|
172
|
-
TB_PACKET_TOO_MUCH_DATA,
|
|
173
|
-
TB_PACKET_INVALID_OPERATION,
|
|
174
|
-
TB_PACKET_INVALID_DATA_SIZE
|
|
156
|
+
TB_PACKET_OK = 0,
|
|
157
|
+
TB_PACKET_TOO_MUCH_DATA = 1,
|
|
158
|
+
TB_PACKET_INVALID_OPERATION = 2,
|
|
159
|
+
TB_PACKET_INVALID_DATA_SIZE = 3,
|
|
175
160
|
} TB_PACKET_STATUS;
|
|
176
161
|
|
|
177
162
|
typedef struct tb_packet_t {
|
|
@@ -188,7 +173,7 @@ typedef struct tb_packet_list_t {
|
|
|
188
173
|
struct tb_packet_t* tail;
|
|
189
174
|
} tb_packet_list_t;
|
|
190
175
|
|
|
191
|
-
typedef void* tb_client_t;
|
|
176
|
+
typedef void* tb_client_t;
|
|
192
177
|
|
|
193
178
|
typedef enum TB_STATUS {
|
|
194
179
|
TB_STATUS_SUCCESS = 0,
|
|
@@ -203,7 +188,7 @@ typedef enum TB_STATUS {
|
|
|
203
188
|
|
|
204
189
|
TB_STATUS tb_client_init(
|
|
205
190
|
tb_client_t* out_client,
|
|
206
|
-
tb_packet_list_t* out_packets,
|
|
191
|
+
struct tb_packet_list_t* out_packets,
|
|
207
192
|
uint32_t cluster_id,
|
|
208
193
|
const char* address_ptr,
|
|
209
194
|
uint32_t address_len,
|
|
@@ -214,7 +199,7 @@ TB_STATUS tb_client_init(
|
|
|
214
199
|
|
|
215
200
|
TB_STATUS tb_client_init_echo(
|
|
216
201
|
tb_client_t* out_client,
|
|
217
|
-
tb_packet_list_t* out_packets,
|
|
202
|
+
struct tb_packet_list_t* out_packets,
|
|
218
203
|
uint32_t cluster_id,
|
|
219
204
|
const char* address_ptr,
|
|
220
205
|
uint32_t address_len,
|
|
@@ -225,11 +210,12 @@ TB_STATUS tb_client_init_echo(
|
|
|
225
210
|
|
|
226
211
|
void tb_client_submit(
|
|
227
212
|
tb_client_t client,
|
|
228
|
-
tb_packet_list_t* packets
|
|
213
|
+
struct tb_packet_list_t* packets
|
|
229
214
|
);
|
|
230
215
|
|
|
231
216
|
void tb_client_deinit(
|
|
232
217
|
tb_client_t client
|
|
233
218
|
);
|
|
234
219
|
|
|
235
|
-
#endif //
|
|
220
|
+
#endif // TB_CLIENT_H
|
|
221
|
+
|
|
@@ -17,6 +17,7 @@ pub const tb_status_t = enum(c_int) {
|
|
|
17
17
|
network_subsystem,
|
|
18
18
|
};
|
|
19
19
|
|
|
20
|
+
pub const tb_operation_t = StateMachine.Operation;
|
|
20
21
|
pub const tb_completion_t = fn (
|
|
21
22
|
context: usize,
|
|
22
23
|
client: tb_client_t,
|
|
@@ -25,11 +26,11 @@ pub const tb_completion_t = fn (
|
|
|
25
26
|
result_len: u32,
|
|
26
27
|
) callconv(.C) void;
|
|
27
28
|
|
|
28
|
-
const
|
|
29
|
+
const constants = @import("../constants.zig");
|
|
29
30
|
const Storage = @import("../storage.zig").Storage;
|
|
30
31
|
const MessageBus = @import("../message_bus.zig").MessageBusClient;
|
|
31
32
|
const StateMachine = @import("../state_machine.zig").StateMachineType(Storage, .{
|
|
32
|
-
.message_body_size_max =
|
|
33
|
+
.message_body_size_max = constants.message_body_size_max,
|
|
33
34
|
});
|
|
34
35
|
|
|
35
36
|
const ContextType = @import("tb_client/context.zig").ContextType;
|
|
@@ -53,19 +54,17 @@ fn client_to_context(tb_client: tb_client_t) *ContextImplementation {
|
|
|
53
54
|
return @ptrCast(*ContextImplementation, @alignCast(@alignOf(ContextImplementation), tb_client));
|
|
54
55
|
}
|
|
55
56
|
|
|
56
|
-
//
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
pub export fn tb_client_init(
|
|
57
|
+
// Only export the functions if we're compiling libtb_client.
|
|
58
|
+
// If it's only being imported by another zig file, then exporting the functions
|
|
59
|
+
// will force them to be evaluated/codegen/linked and trigger unexpected comptime paths.
|
|
60
|
+
comptime {
|
|
61
|
+
if (builtin.link_libc) {
|
|
62
|
+
@export(tb_client_init, .{ .name = "tb_client_init", .linkage = .Strong });
|
|
63
|
+
@export(tb_client_init_echo, .{ .name = "tb_client_init_echo", .linkage = .Strong });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
pub fn tb_client_init(
|
|
69
68
|
out_client: *tb_client_t,
|
|
70
69
|
out_packets: *tb_packet_list_t,
|
|
71
70
|
cluster_id: u32,
|
|
@@ -74,7 +73,7 @@ pub export fn tb_client_init(
|
|
|
74
73
|
packets_count: u32,
|
|
75
74
|
on_completion_ctx: usize,
|
|
76
75
|
on_completion_fn: tb_completion_t,
|
|
77
|
-
) tb_status_t {
|
|
76
|
+
) callconv(.C) tb_status_t {
|
|
78
77
|
return init(
|
|
79
78
|
DefaultContext,
|
|
80
79
|
out_client,
|
|
@@ -88,7 +87,7 @@ pub export fn tb_client_init(
|
|
|
88
87
|
);
|
|
89
88
|
}
|
|
90
89
|
|
|
91
|
-
pub
|
|
90
|
+
pub fn tb_client_init_echo(
|
|
92
91
|
out_client: *tb_client_t,
|
|
93
92
|
out_packets: *tb_packet_list_t,
|
|
94
93
|
cluster_id: u32,
|
|
@@ -97,7 +96,7 @@ pub export fn tb_client_init_echo(
|
|
|
97
96
|
packets_count: u32,
|
|
98
97
|
on_completion_ctx: usize,
|
|
99
98
|
on_completion_fn: tb_completion_t,
|
|
100
|
-
) tb_status_t {
|
|
99
|
+
) callconv(.C) tb_status_t {
|
|
101
100
|
return init(
|
|
102
101
|
TestingContext,
|
|
103
102
|
out_client,
|
|
@@ -122,9 +121,21 @@ fn init(
|
|
|
122
121
|
on_completion_ctx: usize,
|
|
123
122
|
on_completion_fn: tb_completion_t,
|
|
124
123
|
) tb_status_t {
|
|
124
|
+
// Pick the most suitable allocator for the platform.
|
|
125
|
+
const allocator = if (builtin.is_test)
|
|
126
|
+
std.testing.allocator
|
|
127
|
+
else if (builtin.link_libc)
|
|
128
|
+
std.heap.c_allocator
|
|
129
|
+
else if (builtin.target.os.tag == .windows)
|
|
130
|
+
(struct {
|
|
131
|
+
var gpa = std.heap.HeapAllocator.init();
|
|
132
|
+
}).gpa.allocator()
|
|
133
|
+
else
|
|
134
|
+
@compileError("tb_client must be built with libc");
|
|
135
|
+
|
|
125
136
|
const addresses = @ptrCast([*]const u8, addresses_ptr)[0..addresses_len];
|
|
126
137
|
const context = Context.init(
|
|
127
|
-
|
|
138
|
+
allocator,
|
|
128
139
|
cluster_id,
|
|
129
140
|
addresses,
|
|
130
141
|
packets_count,
|