tigerbeetle-node 0.8.1 → 0.9.143

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.
Files changed (83) hide show
  1. package/README.md +584 -184
  2. package/dist/benchmark.js +59 -51
  3. package/dist/benchmark.js.map +1 -1
  4. package/dist/bin/aarch64-linux-gnu/client.node +0 -0
  5. package/dist/bin/aarch64-linux-musl/client.node +0 -0
  6. package/dist/bin/aarch64-macos/client.node +0 -0
  7. package/dist/bin/x86_64-linux-gnu/client.node +0 -0
  8. package/dist/bin/x86_64-linux-musl/client.node +0 -0
  9. package/dist/bin/x86_64-macos/client.node +0 -0
  10. package/dist/bin/x86_64-windows/client.node +0 -0
  11. package/dist/bindings.d.ts +141 -0
  12. package/dist/bindings.js +112 -0
  13. package/dist/bindings.js.map +1 -0
  14. package/dist/index.d.ts +2 -125
  15. package/dist/index.js +51 -101
  16. package/dist/index.js.map +1 -1
  17. package/dist/test.js +69 -55
  18. package/dist/test.js.map +1 -1
  19. package/package-lock.json +26 -0
  20. package/package.json +17 -28
  21. package/src/benchmark.ts +58 -49
  22. package/src/bindings.ts +631 -0
  23. package/src/index.ts +71 -163
  24. package/src/node.zig +169 -148
  25. package/src/test.ts +71 -57
  26. package/src/translate.zig +19 -36
  27. package/.yarn/releases/yarn-berry.cjs +0 -55
  28. package/.yarnrc.yml +0 -1
  29. package/scripts/download_node_headers.sh +0 -25
  30. package/scripts/postinstall.sh +0 -6
  31. package/src/tigerbeetle/scripts/benchmark.bat +0 -46
  32. package/src/tigerbeetle/scripts/benchmark.sh +0 -55
  33. package/src/tigerbeetle/scripts/install.sh +0 -6
  34. package/src/tigerbeetle/scripts/install_zig.bat +0 -109
  35. package/src/tigerbeetle/scripts/install_zig.sh +0 -84
  36. package/src/tigerbeetle/scripts/lint.zig +0 -199
  37. package/src/tigerbeetle/scripts/upgrade_ubuntu_kernel.sh +0 -39
  38. package/src/tigerbeetle/scripts/vopr.bat +0 -48
  39. package/src/tigerbeetle/scripts/vopr.sh +0 -33
  40. package/src/tigerbeetle/scripts/vr_state_enumerate +0 -46
  41. package/src/tigerbeetle/src/benchmark.zig +0 -290
  42. package/src/tigerbeetle/src/cli.zig +0 -244
  43. package/src/tigerbeetle/src/config.zig +0 -239
  44. package/src/tigerbeetle/src/demo.zig +0 -125
  45. package/src/tigerbeetle/src/demo_01_create_accounts.zig +0 -35
  46. package/src/tigerbeetle/src/demo_02_lookup_accounts.zig +0 -7
  47. package/src/tigerbeetle/src/demo_03_create_transfers.zig +0 -24
  48. package/src/tigerbeetle/src/demo_04_create_pending_transfers.zig +0 -61
  49. package/src/tigerbeetle/src/demo_05_post_pending_transfers.zig +0 -37
  50. package/src/tigerbeetle/src/demo_06_void_pending_transfers.zig +0 -24
  51. package/src/tigerbeetle/src/demo_07_lookup_transfers.zig +0 -7
  52. package/src/tigerbeetle/src/fifo.zig +0 -104
  53. package/src/tigerbeetle/src/io/benchmark.zig +0 -213
  54. package/src/tigerbeetle/src/io/darwin.zig +0 -793
  55. package/src/tigerbeetle/src/io/linux.zig +0 -1038
  56. package/src/tigerbeetle/src/io/test.zig +0 -643
  57. package/src/tigerbeetle/src/io/windows.zig +0 -1161
  58. package/src/tigerbeetle/src/io.zig +0 -34
  59. package/src/tigerbeetle/src/main.zig +0 -144
  60. package/src/tigerbeetle/src/message_bus.zig +0 -1000
  61. package/src/tigerbeetle/src/message_pool.zig +0 -142
  62. package/src/tigerbeetle/src/ring_buffer.zig +0 -289
  63. package/src/tigerbeetle/src/simulator.zig +0 -417
  64. package/src/tigerbeetle/src/state_machine.zig +0 -2470
  65. package/src/tigerbeetle/src/storage.zig +0 -308
  66. package/src/tigerbeetle/src/test/cluster.zig +0 -351
  67. package/src/tigerbeetle/src/test/message_bus.zig +0 -93
  68. package/src/tigerbeetle/src/test/network.zig +0 -179
  69. package/src/tigerbeetle/src/test/packet_simulator.zig +0 -387
  70. package/src/tigerbeetle/src/test/state_checker.zig +0 -145
  71. package/src/tigerbeetle/src/test/state_machine.zig +0 -76
  72. package/src/tigerbeetle/src/test/storage.zig +0 -438
  73. package/src/tigerbeetle/src/test/time.zig +0 -84
  74. package/src/tigerbeetle/src/tigerbeetle.zig +0 -222
  75. package/src/tigerbeetle/src/time.zig +0 -113
  76. package/src/tigerbeetle/src/unit_tests.zig +0 -14
  77. package/src/tigerbeetle/src/vsr/client.zig +0 -505
  78. package/src/tigerbeetle/src/vsr/clock.zig +0 -812
  79. package/src/tigerbeetle/src/vsr/journal.zig +0 -2293
  80. package/src/tigerbeetle/src/vsr/marzullo.zig +0 -309
  81. package/src/tigerbeetle/src/vsr/replica.zig +0 -5015
  82. package/src/tigerbeetle/src/vsr.zig +0 -1017
  83. package/yarn.lock +0 -42
@@ -1,142 +0,0 @@
1
- const std = @import("std");
2
- const builtin = @import("builtin");
3
- const assert = std.debug.assert;
4
- const mem = std.mem;
5
-
6
- const config = @import("config.zig");
7
-
8
- const vsr = @import("vsr.zig");
9
- const Header = vsr.Header;
10
-
11
- comptime {
12
- // message_size_max must be a multiple of sector_size for Direct I/O
13
- assert(config.message_size_max % config.sector_size == 0);
14
- }
15
-
16
- /// Add an extra sector_size bytes to allow a partially received subsequent
17
- /// message to be shifted to make space for 0 padding to vsr.sector_ceil.
18
- const message_size_max_padded = config.message_size_max + config.sector_size;
19
-
20
- /// The number of full-sized messages allocated at initialization by the replica message pool.
21
- /// There must be enough messages to ensure that the replica can always progress, to avoid deadlock.
22
- pub const messages_max_replica = messages_max: {
23
- var sum: usize = 0;
24
-
25
- sum += config.io_depth_read + config.io_depth_write; // Journal I/O
26
- sum += config.clients_max; // Replica.client_table
27
- sum += 1; // Replica.loopback_queue
28
- sum += config.pipeline_max; // Replica.pipeline
29
- // Replica.do_view_change_from_all_replicas quorum:
30
- // Replica.recovery_response_quorum is only used for recovery and does not increase the limit.
31
- // All other quorums are bitsets.
32
- sum += config.replicas_max;
33
- sum += config.connections_max; // Connection.recv_message
34
- sum += config.connections_max * config.connection_send_queue_max_replica; // Connection.send_queue
35
- sum += 1; // Handle bursts (e.g. Connection.parse_message)
36
- // Handle Replica.commit_op's reply:
37
- // (This is separate from the burst +1 because they may occur concurrently).
38
- sum += 1;
39
- sum += 20; // TODO Our network simulator allows up to 20 messages for path_capacity_max.
40
-
41
- break :messages_max sum;
42
- };
43
-
44
- /// The number of full-sized messages allocated at initialization by the client message pool.
45
- pub const messages_max_client = messages_max: {
46
- var sum: usize = 0;
47
-
48
- sum += config.replicas_max; // Connection.recv_message
49
- sum += config.replicas_max * config.connection_send_queue_max_client; // Connection.send_queue
50
- sum += config.client_request_queue_max; // Client.request_queue
51
- // Handle bursts (e.g. Connection.parse_message, or sending a ping when the send queue is full).
52
- sum += 1;
53
- sum += 20; // TODO Our network simulator allows up to 20 messages for path_capacity_max.
54
-
55
- break :messages_max sum;
56
- };
57
-
58
- comptime {
59
- // These conditions are necessary (but not sufficient) to prevent deadlocks.
60
- assert(messages_max_replica > config.replicas_max);
61
- assert(messages_max_client > config.client_request_queue_max);
62
- }
63
-
64
- /// A pool of reference-counted Messages, memory for which is allocated only once during
65
- /// initialization and reused thereafter. The messages_max values determine the size of this pool.
66
- pub const MessagePool = struct {
67
- pub const Message = struct {
68
- // TODO: replace this with a header() function to save memory
69
- header: *Header,
70
- /// This buffer is aligned to config.sector_size and casting to that alignment in order
71
- /// to perform Direct I/O is safe.
72
- buffer: []u8,
73
- references: u32 = 0,
74
- next: ?*Message,
75
-
76
- /// Increment the reference count of the message and return the same pointer passed.
77
- pub fn ref(message: *Message) *Message {
78
- message.references += 1;
79
- return message;
80
- }
81
-
82
- pub fn body(message: *Message) []u8 {
83
- return message.buffer[@sizeOf(Header)..message.header.size];
84
- }
85
- };
86
-
87
- /// List of currently unused messages of message_size_max_padded
88
- free_list: ?*Message,
89
-
90
- pub fn init(allocator: mem.Allocator, process_type: vsr.ProcessType) error{OutOfMemory}!MessagePool {
91
- const messages_max: usize = switch (process_type) {
92
- .replica => messages_max_replica,
93
- .client => messages_max_client,
94
- };
95
-
96
- var ret: MessagePool = .{
97
- .free_list = null,
98
- };
99
- {
100
- var i: usize = 0;
101
- while (i < messages_max) : (i += 1) {
102
- const buffer = try allocator.allocAdvanced(
103
- u8,
104
- config.sector_size,
105
- message_size_max_padded,
106
- .exact,
107
- );
108
- const message = try allocator.create(Message);
109
- message.* = .{
110
- .header = mem.bytesAsValue(Header, buffer[0..@sizeOf(Header)]),
111
- .buffer = buffer,
112
- .next = ret.free_list,
113
- };
114
- ret.free_list = message;
115
- }
116
- }
117
-
118
- return ret;
119
- }
120
-
121
- /// Get an unused message with a buffer of config.message_size_max.
122
- /// The returned message has exactly one reference.
123
- pub fn get_message(pool: *MessagePool) *Message {
124
- const message = pool.free_list.?;
125
- pool.free_list = message.next;
126
- message.next = null;
127
- assert(message.references == 0);
128
-
129
- message.references = 1;
130
- return message;
131
- }
132
-
133
- /// Decrement the reference count of the message, possibly freeing it.
134
- pub fn unref(pool: *MessagePool, message: *Message) void {
135
- message.references -= 1;
136
- if (message.references == 0) {
137
- if (builtin.mode == .Debug) mem.set(u8, message.buffer, undefined);
138
- message.next = pool.free_list;
139
- pool.free_list = message;
140
- }
141
- }
142
- };
@@ -1,289 +0,0 @@
1
- const std = @import("std");
2
- const assert = std.debug.assert;
3
-
4
- /// A First In, First Out ring buffer holding at most `count_max` elements.
5
- pub fn RingBuffer(comptime T: type, comptime count_max: usize) type {
6
- return struct {
7
- const Self = @This();
8
-
9
- buffer: [count_max]T = undefined,
10
-
11
- /// The index of the slot with the first item, if any.
12
- index: usize = 0,
13
-
14
- /// The number of items in the buffer.
15
- count: usize = 0,
16
-
17
- // TODO add doc comments to these functions:
18
- pub inline fn head(self: Self) ?T {
19
- if (self.empty()) return null;
20
- return self.buffer[self.index];
21
- }
22
-
23
- pub inline fn head_ptr(self: *Self) ?*T {
24
- if (self.empty()) return null;
25
- return &self.buffer[self.index];
26
- }
27
-
28
- pub inline fn tail(self: Self) ?T {
29
- if (self.empty()) return null;
30
- return self.buffer[(self.index + self.count - 1) % self.buffer.len];
31
- }
32
-
33
- pub inline fn tail_ptr(self: *Self) ?*T {
34
- if (self.empty()) return null;
35
- return &self.buffer[(self.index + self.count - 1) % self.buffer.len];
36
- }
37
-
38
- pub inline fn get_ptr(self: *Self, index: usize) ?*T {
39
- if (index < self.count) {
40
- return &self.buffer[(self.index + index) % self.buffer.len];
41
- } else {
42
- assert(index < count_max);
43
- return null;
44
- }
45
- }
46
-
47
- pub inline fn next_tail(self: Self) ?T {
48
- if (self.full()) return null;
49
- return self.buffer[(self.index + self.count) % self.buffer.len];
50
- }
51
-
52
- pub inline fn next_tail_ptr(self: *Self) ?*T {
53
- if (self.full()) return null;
54
- return &self.buffer[(self.index + self.count) % self.buffer.len];
55
- }
56
-
57
- pub inline fn advance_head(self: *Self) void {
58
- self.index += 1;
59
- self.index %= self.buffer.len;
60
- self.count -= 1;
61
- }
62
-
63
- pub inline fn advance_tail(self: *Self) void {
64
- assert(self.count < self.buffer.len);
65
- self.count += 1;
66
- }
67
-
68
- pub inline fn retreat_tail(self: *Self) void {
69
- self.count -= 1;
70
- }
71
-
72
- /// Returns whether the ring buffer is completely full.
73
- pub inline fn full(self: Self) bool {
74
- return self.count == self.buffer.len;
75
- }
76
-
77
- /// Returns whether the ring buffer is completely empty.
78
- pub inline fn empty(self: Self) bool {
79
- return self.count == 0;
80
- }
81
-
82
- // Higher level, less error-prone wrappers:
83
-
84
- /// Add an element to the RingBuffer. Returns an error if the buffer
85
- /// is already full and the element could not be added.
86
- pub fn push(self: *Self, item: T) error{NoSpaceLeft}!void {
87
- const ptr = self.next_tail_ptr() orelse return error.NoSpaceLeft;
88
- ptr.* = item;
89
- self.advance_tail();
90
- }
91
-
92
- /// Add an element to a RingBuffer, and assert that the capacity is sufficient.
93
- pub fn push_assume_capacity(self: *Self, item: T) void {
94
- self.push(item) catch |err| switch (err) {
95
- error.NoSpaceLeft => unreachable,
96
- };
97
- }
98
-
99
- /// Remove and return the next item, if any.
100
- pub fn pop(self: *Self) ?T {
101
- const result = self.head() orelse return null;
102
- self.advance_head();
103
- return result;
104
- }
105
-
106
- /// Remove and return the last item, if any.
107
- pub fn pop_tail(self: *Self) ?T {
108
- const result = self.tail() orelse return null;
109
- self.retreat_tail();
110
- return result;
111
- }
112
-
113
- pub const Iterator = struct {
114
- ring: *Self,
115
- count: usize = 0,
116
-
117
- pub fn next(it: *Iterator) ?T {
118
- assert(it.count <= it.ring.count);
119
- if (it.count == it.ring.count) return null;
120
- defer it.count += 1;
121
- return it.ring.buffer[(it.ring.index + it.count) % it.ring.buffer.len];
122
- }
123
-
124
- pub fn next_ptr(it: *Iterator) ?*T {
125
- assert(it.count <= it.ring.count);
126
- if (it.count == it.ring.count) return null;
127
- defer it.count += 1;
128
- return &it.ring.buffer[(it.ring.index + it.count) % it.ring.buffer.len];
129
- }
130
- };
131
-
132
- /// Returns an iterator to iterate through all `count` items in the ring buffer.
133
- /// The iterator is invalidated and unsafe if the ring buffer is modified.
134
- pub fn iterator(self: *Self) Iterator {
135
- return .{ .ring = self };
136
- }
137
- };
138
- }
139
-
140
- const testing = std.testing;
141
-
142
- fn test_iterator(comptime T: type, ring: *T, values: []const u32) !void {
143
- const ring_index = ring.index;
144
-
145
- var loops: usize = 0;
146
- while (loops < 2) : (loops += 1) {
147
- var iterator = ring.iterator();
148
- var index: usize = 0;
149
- while (iterator.next()) |item| {
150
- try testing.expectEqual(values[index], item);
151
- index += 1;
152
- }
153
- try testing.expectEqual(values.len, index);
154
- }
155
-
156
- try testing.expectEqual(ring_index, ring.index);
157
- }
158
-
159
- test "RingBuffer: low level interface" {
160
- const Ring = RingBuffer(u32, 2);
161
-
162
- var ring = Ring{};
163
- try test_iterator(Ring, &ring, &[_]u32{});
164
-
165
- try testing.expectEqual(@as(?u32, null), ring.head());
166
- try testing.expectEqual(@as(?*u32, null), ring.head_ptr());
167
- try testing.expectEqual(@as(?u32, null), ring.tail());
168
- try testing.expectEqual(@as(?*u32, null), ring.tail_ptr());
169
-
170
- ring.next_tail_ptr().?.* = 0;
171
- ring.advance_tail();
172
- try testing.expectEqual(@as(?u32, 0), ring.tail());
173
- try testing.expectEqual(@as(u32, 0), ring.tail_ptr().?.*);
174
- try test_iterator(Ring, &ring, &[_]u32{0});
175
-
176
- ring.next_tail_ptr().?.* = 1;
177
- ring.advance_tail();
178
- try testing.expectEqual(@as(?u32, 1), ring.tail());
179
- try testing.expectEqual(@as(u32, 1), ring.tail_ptr().?.*);
180
- try test_iterator(Ring, &ring, &[_]u32{ 0, 1 });
181
-
182
- try testing.expectEqual(@as(?u32, null), ring.next_tail());
183
- try testing.expectEqual(@as(?*u32, null), ring.next_tail_ptr());
184
-
185
- try testing.expectEqual(@as(?u32, 0), ring.head());
186
- try testing.expectEqual(@as(u32, 0), ring.head_ptr().?.*);
187
- ring.advance_head();
188
- try test_iterator(Ring, &ring, &[_]u32{1});
189
-
190
- ring.next_tail_ptr().?.* = 2;
191
- ring.advance_tail();
192
- try testing.expectEqual(@as(?u32, 2), ring.tail());
193
- try testing.expectEqual(@as(u32, 2), ring.tail_ptr().?.*);
194
- try test_iterator(Ring, &ring, &[_]u32{ 1, 2 });
195
-
196
- var iterator = ring.iterator();
197
- while (iterator.next_ptr()) |item_ptr| {
198
- item_ptr.* += 1000;
199
- }
200
-
201
- try testing.expectEqual(@as(?u32, 1001), ring.head());
202
- try testing.expectEqual(@as(u32, 1001), ring.head_ptr().?.*);
203
- ring.advance_head();
204
- try test_iterator(Ring, &ring, &[_]u32{1002});
205
-
206
- ring.next_tail_ptr().?.* = 3;
207
- ring.advance_tail();
208
- try testing.expectEqual(@as(?u32, 3), ring.tail());
209
- try testing.expectEqual(@as(u32, 3), ring.tail_ptr().?.*);
210
- try test_iterator(Ring, &ring, &[_]u32{ 1002, 3 });
211
-
212
- try testing.expectEqual(@as(?u32, 1002), ring.head());
213
- try testing.expectEqual(@as(u32, 1002), ring.head_ptr().?.*);
214
- ring.advance_head();
215
- try test_iterator(Ring, &ring, &[_]u32{3});
216
-
217
- try testing.expectEqual(@as(?u32, 3), ring.head());
218
- try testing.expectEqual(@as(u32, 3), ring.head_ptr().?.*);
219
- ring.advance_head();
220
- try test_iterator(Ring, &ring, &[_]u32{});
221
-
222
- try testing.expectEqual(@as(?u32, null), ring.head());
223
- try testing.expectEqual(@as(?*u32, null), ring.head_ptr());
224
- try testing.expectEqual(@as(?u32, null), ring.tail());
225
- try testing.expectEqual(@as(?*u32, null), ring.tail_ptr());
226
- }
227
-
228
- test "RingBuffer: push/pop high level interface" {
229
- var fifo = RingBuffer(u32, 3){};
230
-
231
- try testing.expect(!fifo.full());
232
- try testing.expect(fifo.empty());
233
- try testing.expectEqual(@as(?*u32, null), fifo.get_ptr(0));
234
- try testing.expectEqual(@as(?*u32, null), fifo.get_ptr(1));
235
- try testing.expectEqual(@as(?*u32, null), fifo.get_ptr(2));
236
-
237
- try fifo.push(1);
238
- try testing.expectEqual(@as(?u32, 1), fifo.head());
239
- try testing.expectEqual(@as(u32, 1), fifo.get_ptr(0).?.*);
240
- try testing.expectEqual(@as(?*u32, null), fifo.get_ptr(1));
241
-
242
- try testing.expect(!fifo.full());
243
- try testing.expect(!fifo.empty());
244
-
245
- try fifo.push(2);
246
- try testing.expectEqual(@as(?u32, 1), fifo.head());
247
- try testing.expectEqual(@as(u32, 2), fifo.get_ptr(1).?.*);
248
-
249
- try fifo.push(3);
250
- try testing.expectError(error.NoSpaceLeft, fifo.push(4));
251
-
252
- try testing.expect(fifo.full());
253
- try testing.expect(!fifo.empty());
254
-
255
- try testing.expectEqual(@as(?u32, 1), fifo.head());
256
- try testing.expectEqual(@as(?u32, 1), fifo.pop());
257
- try testing.expectEqual(@as(u32, 2), fifo.get_ptr(0).?.*);
258
- try testing.expectEqual(@as(u32, 3), fifo.get_ptr(1).?.*);
259
- try testing.expectEqual(@as(?*u32, null), fifo.get_ptr(2));
260
-
261
- try testing.expect(!fifo.full());
262
- try testing.expect(!fifo.empty());
263
-
264
- try fifo.push(4);
265
-
266
- try testing.expectEqual(@as(?u32, 2), fifo.pop());
267
- try testing.expectEqual(@as(?u32, 3), fifo.pop());
268
- try testing.expectEqual(@as(?u32, 4), fifo.pop());
269
- try testing.expectEqual(@as(?u32, null), fifo.pop());
270
-
271
- try testing.expect(!fifo.full());
272
- try testing.expect(fifo.empty());
273
- }
274
-
275
- test "RingBuffer: pop_tail" {
276
- var lifo = RingBuffer(u32, 3){};
277
- try lifo.push(1);
278
- try lifo.push(2);
279
- try lifo.push(3);
280
- try testing.expect(lifo.full());
281
-
282
- try testing.expectEqual(@as(?u32, 3), lifo.pop_tail());
283
- try testing.expectEqual(@as(?u32, 1), lifo.head());
284
- try testing.expectEqual(@as(?u32, 2), lifo.pop_tail());
285
- try testing.expectEqual(@as(?u32, 1), lifo.head());
286
- try testing.expectEqual(@as(?u32, 1), lifo.pop_tail());
287
- try testing.expectEqual(@as(?u32, null), lifo.pop_tail());
288
- try testing.expect(lifo.empty());
289
- }