tigerbeetle-node 0.11.3 → 0.11.4
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 +6 -1
- package/src/tigerbeetle/src/benchmark.zig +1 -1
- package/src/tigerbeetle/src/c/tb_client/context.zig +1 -1
- package/src/tigerbeetle/src/c/tb_client/echo_client.zig +1 -1
- package/src/tigerbeetle/src/c/tb_client/thread.zig +1 -1
- package/src/tigerbeetle/src/c/tb_client.h +97 -111
- package/src/tigerbeetle/src/c/tb_client.zig +29 -18
- package/src/tigerbeetle/src/c/tb_client_header.zig +218 -0
- package/src/tigerbeetle/src/c/test.zig +7 -7
- package/src/tigerbeetle/src/cli.zig +4 -4
- package/src/tigerbeetle/src/config.zig +183 -379
- package/src/tigerbeetle/src/constants.zig +394 -0
- package/src/tigerbeetle/src/demo.zig +1 -1
- package/src/tigerbeetle/src/ewah_fuzz.zig +2 -0
- package/src/tigerbeetle/src/io/darwin.zig +1 -1
- package/src/tigerbeetle/src/io/linux.zig +2 -2
- package/src/tigerbeetle/src/io/windows.zig +1 -1
- package/src/tigerbeetle/src/lsm/bloom_filter.zig +1 -1
- package/src/tigerbeetle/src/lsm/compaction.zig +8 -3
- package/src/tigerbeetle/src/lsm/forest.zig +1 -1
- package/src/tigerbeetle/src/lsm/forest_fuzz.zig +10 -7
- package/src/tigerbeetle/src/lsm/grid.zig +1 -1
- package/src/tigerbeetle/src/lsm/groove.zig +5 -39
- package/src/tigerbeetle/src/lsm/level_iterator.zig +1 -1
- package/src/tigerbeetle/src/lsm/manifest.zig +1 -6
- package/src/tigerbeetle/src/lsm/manifest_level.zig +1 -1
- package/src/tigerbeetle/src/lsm/manifest_log.zig +1 -1
- package/src/tigerbeetle/src/lsm/manifest_log_fuzz.zig +14 -9
- package/src/tigerbeetle/src/lsm/posted_groove.zig +2 -13
- package/src/tigerbeetle/src/lsm/segmented_array_benchmark.zig +1 -1
- package/src/tigerbeetle/src/lsm/set_associative_cache.zig +1 -1
- package/src/tigerbeetle/src/lsm/table.zig +25 -17
- package/src/tigerbeetle/src/lsm/table_immutable.zig +1 -1
- package/src/tigerbeetle/src/lsm/table_iterator.zig +1 -1
- package/src/tigerbeetle/src/lsm/table_mutable.zig +1 -1
- package/src/tigerbeetle/src/lsm/test.zig +1 -1
- package/src/tigerbeetle/src/lsm/tree.zig +28 -3
- package/src/tigerbeetle/src/lsm/tree_fuzz.zig +16 -17
- package/src/tigerbeetle/src/main.zig +18 -16
- package/src/tigerbeetle/src/message_bus.zig +1 -1
- package/src/tigerbeetle/src/message_pool.zig +2 -2
- package/src/tigerbeetle/src/simulator.zig +2 -9
- package/src/tigerbeetle/src/state_machine.zig +582 -1806
- package/src/tigerbeetle/src/storage.zig +1 -1
- package/src/tigerbeetle/src/test/accounting/auditor.zig +1 -1
- package/src/tigerbeetle/src/test/accounting/workload.zig +1 -1
- package/src/tigerbeetle/src/test/cluster.zig +1 -1
- package/src/tigerbeetle/src/test/conductor.zig +1 -1
- package/src/tigerbeetle/src/test/fuzz.zig +19 -0
- package/src/tigerbeetle/src/test/message_bus.zig +1 -1
- package/src/tigerbeetle/src/test/network.zig +1 -1
- package/src/tigerbeetle/src/test/state_checker.zig +1 -1
- package/src/tigerbeetle/src/test/storage.zig +5 -5
- package/src/tigerbeetle/src/test/storage_checker.zig +1 -1
- package/src/tigerbeetle/src/test/table.zig +226 -0
- package/src/tigerbeetle/src/time.zig +1 -1
- package/src/tigerbeetle/src/tracer.zig +400 -212
- package/src/tigerbeetle/src/unit_tests.zig +1 -0
- package/src/tigerbeetle/src/vsr/client.zig +1 -1
- package/src/tigerbeetle/src/vsr/clock.zig +1 -1
- package/src/tigerbeetle/src/vsr/journal.zig +6 -6
- package/src/tigerbeetle/src/vsr/journal_format_fuzz.zig +3 -1
- package/src/tigerbeetle/src/vsr/replica.zig +5 -3
- package/src/tigerbeetle/src/vsr/replica_format.zig +1 -1
- package/src/tigerbeetle/src/vsr/superblock.zig +1 -1
- package/src/tigerbeetle/src/vsr/superblock_client_table.zig +1 -1
- package/src/tigerbeetle/src/vsr/superblock_free_set.zig +3 -2
- package/src/tigerbeetle/src/vsr/superblock_free_set_fuzz.zig +2 -0
- package/src/tigerbeetle/src/vsr/superblock_fuzz.zig +8 -5
- package/src/tigerbeetle/src/vsr/superblock_manifest.zig +1 -1
- package/src/tigerbeetle/src/vsr/superblock_quorums_fuzz.zig +2 -0
- package/src/tigerbeetle/src/vsr.zig +1 -1
package/dist/.client.node.sha256
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
17ba799be39b3aa1c55b37b39f013d58b0c9d8a5e3356aa750951d4c3cc7e248 dist/client.node
|
package/package.json
CHANGED
package/src/node.zig
CHANGED
|
@@ -20,12 +20,17 @@ 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 config = @import("tigerbeetle/src/
|
|
23
|
+
const config = @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
|
|
|
@@ -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 config = @import("../../
|
|
5
|
+
const config = @import("../../constants.zig");
|
|
6
6
|
const log = std.log.scoped(.tb_client_context);
|
|
7
7
|
|
|
8
8
|
const util = @import("../../util.zig");
|
|
@@ -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,7 +26,7 @@ pub const tb_completion_t = fn (
|
|
|
25
26
|
result_len: u32,
|
|
26
27
|
) callconv(.C) void;
|
|
27
28
|
|
|
28
|
-
const config = @import("../
|
|
29
|
+
const config = @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, .{
|
|
@@ -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,
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
const std = @import("std");
|
|
2
|
+
const tb = @import("../tigerbeetle.zig");
|
|
3
|
+
const tb_client = @import("tb_client.zig");
|
|
4
|
+
|
|
5
|
+
const type_mappings = .{
|
|
6
|
+
.{ tb.AccountFlags, "TB_ACCOUNT_FLAGS" },
|
|
7
|
+
.{ tb.Account, "tb_account_t" },
|
|
8
|
+
.{ tb.TransferFlags, "TB_TRANSFER_FLAGS" },
|
|
9
|
+
.{ tb.Transfer, "tb_transfer_t" },
|
|
10
|
+
.{ tb.CreateAccountResult, "TB_CREATE_ACCOUNT_RESULT" },
|
|
11
|
+
.{ tb.CreateTransferResult, "TB_CREATE_TRANSFER_RESULT" },
|
|
12
|
+
.{ tb.CreateAccountsResult, "tb_create_accounts_result_t" },
|
|
13
|
+
.{ tb.CreateTransfersResult, "tb_create_transfers_result_t" },
|
|
14
|
+
.{ tb_client.tb_operation_t, "TB_OPERATION" },
|
|
15
|
+
.{ tb_client.tb_packet_status_t, "TB_PACKET_STATUS" },
|
|
16
|
+
.{ tb_client.tb_packet_t, "tb_packet_t" },
|
|
17
|
+
.{ tb_client.tb_packet_list_t, "tb_packet_list_t" },
|
|
18
|
+
.{ tb_client.tb_client_t, "tb_client_t" },
|
|
19
|
+
.{ tb_client.tb_status_t, "TB_STATUS" },
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
fn resolve_c_type(comptime Type: type) []const u8 {
|
|
23
|
+
switch (@typeInfo(Type)) {
|
|
24
|
+
.Array => |info| return resolve_c_type(info.child),
|
|
25
|
+
.Enum => |info| return resolve_c_type(info.tag_type),
|
|
26
|
+
.Struct => return resolve_c_type(std.meta.Int(.unsigned, @bitSizeOf(Type))),
|
|
27
|
+
.Int => |info| {
|
|
28
|
+
std.debug.assert(info.signedness == .unsigned);
|
|
29
|
+
return switch (info.bits) {
|
|
30
|
+
8 => "uint8_t",
|
|
31
|
+
16 => "uint16_t",
|
|
32
|
+
32 => "uint32_t",
|
|
33
|
+
64 => "uint64_t",
|
|
34
|
+
128 => "tb_uint128_t",
|
|
35
|
+
else => @compileError("invalid int type"),
|
|
36
|
+
};
|
|
37
|
+
},
|
|
38
|
+
.Optional => |info| switch (@typeInfo(info.child)) {
|
|
39
|
+
.Pointer => return resolve_c_type(info.child),
|
|
40
|
+
else => @compileError("Unsupported optional type: " ++ @typeName(Type)),
|
|
41
|
+
},
|
|
42
|
+
.Pointer => |info| {
|
|
43
|
+
std.debug.assert(info.size != .Slice);
|
|
44
|
+
std.debug.assert(!info.is_allowzero);
|
|
45
|
+
|
|
46
|
+
inline for (type_mappings) |type_mapping| {
|
|
47
|
+
const ZigType = type_mapping[0];
|
|
48
|
+
const c_name = type_mapping[1];
|
|
49
|
+
|
|
50
|
+
if (info.child == ZigType) {
|
|
51
|
+
const prefix = if (@typeInfo(ZigType) == .Struct) "struct " else "";
|
|
52
|
+
return prefix ++ c_name ++ "*";
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return resolve_c_type(info.child) ++ "*";
|
|
57
|
+
},
|
|
58
|
+
.Void, .Opaque => return "void",
|
|
59
|
+
else => @compileError("Unhandled type: " ++ @typeName(Type)),
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
fn to_uppercase(comptime input: []const u8) []const u8 {
|
|
64
|
+
comptime var output: [input.len]u8 = undefined;
|
|
65
|
+
inline for (output) |*char, i| {
|
|
66
|
+
char.* = input[i];
|
|
67
|
+
char.* -= 32 * @as(u8, @boolToInt(char.* >= 'a' and char.* <= 'z'));
|
|
68
|
+
}
|
|
69
|
+
return &output;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
fn emit_enum(
|
|
73
|
+
buffer: *std.ArrayList(u8),
|
|
74
|
+
comptime type_info: anytype,
|
|
75
|
+
comptime c_name: []const u8,
|
|
76
|
+
comptime value_fmt: []const u8,
|
|
77
|
+
comptime skip_fields: []const []const u8,
|
|
78
|
+
) !void {
|
|
79
|
+
var suffix_pos = std.mem.lastIndexOf(u8, c_name, "_").?;
|
|
80
|
+
if (std.mem.count(u8, c_name, "_") == 1) suffix_pos = c_name.len;
|
|
81
|
+
|
|
82
|
+
try buffer.writer().print("typedef enum {s} {{\n", .{c_name});
|
|
83
|
+
|
|
84
|
+
inline for (type_info.fields) |field, i| {
|
|
85
|
+
comptime var skip = false;
|
|
86
|
+
inline for (skip_fields) |sf| {
|
|
87
|
+
skip = skip or comptime std.mem.eql(u8, sf, field.name);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (!skip) {
|
|
91
|
+
try buffer.writer().print(" {s}_{s} = " ++ value_fmt ++ ",\n", .{
|
|
92
|
+
c_name[0..suffix_pos],
|
|
93
|
+
to_uppercase(field.name),
|
|
94
|
+
i,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
try buffer.writer().print("}} {s};\n\n", .{c_name});
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
fn emit_struct(
|
|
103
|
+
buffer: *std.ArrayList(u8),
|
|
104
|
+
comptime type_info: anytype,
|
|
105
|
+
comptime c_name: []const u8,
|
|
106
|
+
) !void {
|
|
107
|
+
try buffer.writer().print("typedef struct {s} {{\n", .{c_name});
|
|
108
|
+
|
|
109
|
+
inline for (type_info.fields) |field| {
|
|
110
|
+
try buffer.writer().print(" {s} {s}", .{
|
|
111
|
+
resolve_c_type(field.field_type),
|
|
112
|
+
field.name,
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
switch (@typeInfo(field.field_type)) {
|
|
116
|
+
.Array => |array| try buffer.writer().print("[{d}]", .{array.len}),
|
|
117
|
+
else => {},
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
try buffer.writer().print(";\n", .{});
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
try buffer.writer().print("}} {s};\n\n", .{c_name});
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
pub fn main() !void {
|
|
127
|
+
@setEvalBranchQuota(100_000);
|
|
128
|
+
|
|
129
|
+
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
|
130
|
+
defer arena.deinit();
|
|
131
|
+
const allocator = arena.allocator();
|
|
132
|
+
|
|
133
|
+
var buffer = std.ArrayList(u8).init(allocator);
|
|
134
|
+
try buffer.writer().print(
|
|
135
|
+
\\ //////////////////////////////////////////////////////////
|
|
136
|
+
\\ // This file was auto-generated by tb_client_header.zig //
|
|
137
|
+
\\ // Do not manually modify. //
|
|
138
|
+
\\ //////////////////////////////////////////////////////////
|
|
139
|
+
\\
|
|
140
|
+
\\#ifndef TB_CLIENT_H
|
|
141
|
+
\\#define TB_CLIENT_H
|
|
142
|
+
\\
|
|
143
|
+
\\#include <stddef.h>
|
|
144
|
+
\\#include <stdint.h>
|
|
145
|
+
\\#include <stdbool.h>
|
|
146
|
+
\\
|
|
147
|
+
\\typedef __uint128_t tb_uint128_t;
|
|
148
|
+
\\
|
|
149
|
+
\\
|
|
150
|
+
, .{});
|
|
151
|
+
|
|
152
|
+
// Emit C type declarations.
|
|
153
|
+
inline for (type_mappings) |type_mapping| {
|
|
154
|
+
const ZigType = type_mapping[0];
|
|
155
|
+
const c_name = type_mapping[1];
|
|
156
|
+
|
|
157
|
+
switch (@typeInfo(ZigType)) {
|
|
158
|
+
.Struct => |info| switch (info.layout) {
|
|
159
|
+
.Auto => @compileError("Invalid C struct type: " ++ @typeName(ZigType)),
|
|
160
|
+
.Packed => try emit_enum(&buffer, info, c_name, "1 << {d}", &.{"padding"}),
|
|
161
|
+
.Extern => try emit_struct(&buffer, info, c_name),
|
|
162
|
+
},
|
|
163
|
+
.Enum => |info| {
|
|
164
|
+
comptime var skip: []const []const u8 = &.{};
|
|
165
|
+
if (ZigType == tb_client.tb_operation_t) {
|
|
166
|
+
skip = &.{ "reserved", "root", "register" };
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
try emit_enum(&buffer, info, c_name, "{d}", skip);
|
|
170
|
+
},
|
|
171
|
+
else => try buffer.writer().print("typedef {s} {s}; \n\n", .{
|
|
172
|
+
resolve_c_type(ZigType),
|
|
173
|
+
c_name,
|
|
174
|
+
}),
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Emit C function declarations.
|
|
179
|
+
// TODO: use `std.meta.declaractions` and generate with pub + export functions.
|
|
180
|
+
// Zig 0.9.1 has `decl.data.Fn.arg_names` but it's currently/incorrectly a zero-sized slice.
|
|
181
|
+
try buffer.writer().print(
|
|
182
|
+
\\TB_STATUS tb_client_init(
|
|
183
|
+
\\ tb_client_t* out_client,
|
|
184
|
+
\\ struct tb_packet_list_t* out_packets,
|
|
185
|
+
\\ uint32_t cluster_id,
|
|
186
|
+
\\ const char* address_ptr,
|
|
187
|
+
\\ uint32_t address_len,
|
|
188
|
+
\\ uint32_t packets_count,
|
|
189
|
+
\\ uintptr_t on_completion_ctx,
|
|
190
|
+
\\ void (*on_completion_fn)(uintptr_t, tb_client_t, tb_packet_t*, const uint8_t*, uint32_t)
|
|
191
|
+
\\);
|
|
192
|
+
\\
|
|
193
|
+
\\TB_STATUS tb_client_init_echo(
|
|
194
|
+
\\ tb_client_t* out_client,
|
|
195
|
+
\\ struct tb_packet_list_t* out_packets,
|
|
196
|
+
\\ uint32_t cluster_id,
|
|
197
|
+
\\ const char* address_ptr,
|
|
198
|
+
\\ uint32_t address_len,
|
|
199
|
+
\\ uint32_t packets_count,
|
|
200
|
+
\\ uintptr_t on_completion_ctx,
|
|
201
|
+
\\ void (*on_completion_fn)(uintptr_t, tb_client_t, tb_packet_t*, const uint8_t*, uint32_t)
|
|
202
|
+
\\);
|
|
203
|
+
\\
|
|
204
|
+
\\void tb_client_submit(
|
|
205
|
+
\\ tb_client_t client,
|
|
206
|
+
\\ struct tb_packet_list_t* packets
|
|
207
|
+
\\);
|
|
208
|
+
\\
|
|
209
|
+
\\void tb_client_deinit(
|
|
210
|
+
\\ tb_client_t client
|
|
211
|
+
\\);
|
|
212
|
+
\\
|
|
213
|
+
\\
|
|
214
|
+
, .{});
|
|
215
|
+
|
|
216
|
+
try buffer.writer().print("#endif // TB_CLIENT_H\n\n", .{});
|
|
217
|
+
try std.fs.cwd().writeFile("src/c/tb_client.h", buffer.items);
|
|
218
|
+
}
|