tigerbeetle-node 0.11.12 → 0.12.0

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 (143) hide show
  1. package/README.md +212 -196
  2. package/dist/bin/aarch64-linux-gnu/client.node +0 -0
  3. package/dist/bin/aarch64-linux-musl/client.node +0 -0
  4. package/dist/bin/aarch64-macos/client.node +0 -0
  5. package/dist/bin/x86_64-linux-gnu/client.node +0 -0
  6. package/dist/bin/x86_64-linux-musl/client.node +0 -0
  7. package/dist/bin/x86_64-macos/client.node +0 -0
  8. package/dist/index.js +33 -1
  9. package/dist/index.js.map +1 -1
  10. package/package-lock.json +66 -0
  11. package/package.json +8 -17
  12. package/src/index.ts +56 -1
  13. package/src/node.zig +10 -9
  14. package/dist/.client.node.sha256 +0 -1
  15. package/scripts/build_lib.sh +0 -61
  16. package/scripts/download_node_headers.sh +0 -32
  17. package/src/tigerbeetle/scripts/benchmark.bat +0 -48
  18. package/src/tigerbeetle/scripts/benchmark.sh +0 -66
  19. package/src/tigerbeetle/scripts/confirm_image.sh +0 -44
  20. package/src/tigerbeetle/scripts/fuzz_loop.sh +0 -15
  21. package/src/tigerbeetle/scripts/fuzz_unique_errors.sh +0 -7
  22. package/src/tigerbeetle/scripts/install.bat +0 -7
  23. package/src/tigerbeetle/scripts/install.sh +0 -21
  24. package/src/tigerbeetle/scripts/install_zig.bat +0 -113
  25. package/src/tigerbeetle/scripts/install_zig.sh +0 -90
  26. package/src/tigerbeetle/scripts/lint.zig +0 -199
  27. package/src/tigerbeetle/scripts/pre-commit.sh +0 -9
  28. package/src/tigerbeetle/scripts/scripts/benchmark.bat +0 -48
  29. package/src/tigerbeetle/scripts/scripts/benchmark.sh +0 -66
  30. package/src/tigerbeetle/scripts/scripts/confirm_image.sh +0 -44
  31. package/src/tigerbeetle/scripts/scripts/fuzz_loop.sh +0 -15
  32. package/src/tigerbeetle/scripts/scripts/fuzz_unique_errors.sh +0 -7
  33. package/src/tigerbeetle/scripts/scripts/install.bat +0 -7
  34. package/src/tigerbeetle/scripts/scripts/install.sh +0 -21
  35. package/src/tigerbeetle/scripts/scripts/install_zig.bat +0 -113
  36. package/src/tigerbeetle/scripts/scripts/install_zig.sh +0 -90
  37. package/src/tigerbeetle/scripts/scripts/lint.zig +0 -199
  38. package/src/tigerbeetle/scripts/scripts/pre-commit.sh +0 -9
  39. package/src/tigerbeetle/scripts/scripts/shellcheck.sh +0 -5
  40. package/src/tigerbeetle/scripts/scripts/tests_on_alpine.sh +0 -10
  41. package/src/tigerbeetle/scripts/scripts/tests_on_ubuntu.sh +0 -14
  42. package/src/tigerbeetle/scripts/scripts/upgrade_ubuntu_kernel.sh +0 -48
  43. package/src/tigerbeetle/scripts/scripts/validate_docs.sh +0 -23
  44. package/src/tigerbeetle/scripts/scripts/vr_state_enumerate +0 -46
  45. package/src/tigerbeetle/scripts/shellcheck.sh +0 -5
  46. package/src/tigerbeetle/scripts/tests_on_alpine.sh +0 -10
  47. package/src/tigerbeetle/scripts/tests_on_ubuntu.sh +0 -14
  48. package/src/tigerbeetle/scripts/upgrade_ubuntu_kernel.sh +0 -48
  49. package/src/tigerbeetle/scripts/validate_docs.sh +0 -23
  50. package/src/tigerbeetle/scripts/vr_state_enumerate +0 -46
  51. package/src/tigerbeetle/src/benchmark.zig +0 -314
  52. package/src/tigerbeetle/src/config.zig +0 -234
  53. package/src/tigerbeetle/src/constants.zig +0 -436
  54. package/src/tigerbeetle/src/ewah.zig +0 -286
  55. package/src/tigerbeetle/src/ewah_benchmark.zig +0 -120
  56. package/src/tigerbeetle/src/ewah_fuzz.zig +0 -130
  57. package/src/tigerbeetle/src/fifo.zig +0 -120
  58. package/src/tigerbeetle/src/io/benchmark.zig +0 -213
  59. package/src/tigerbeetle/src/io/darwin.zig +0 -814
  60. package/src/tigerbeetle/src/io/linux.zig +0 -1062
  61. package/src/tigerbeetle/src/io/test.zig +0 -643
  62. package/src/tigerbeetle/src/io/windows.zig +0 -1183
  63. package/src/tigerbeetle/src/io.zig +0 -34
  64. package/src/tigerbeetle/src/iops.zig +0 -107
  65. package/src/tigerbeetle/src/lsm/README.md +0 -308
  66. package/src/tigerbeetle/src/lsm/binary_search.zig +0 -341
  67. package/src/tigerbeetle/src/lsm/bloom_filter.zig +0 -125
  68. package/src/tigerbeetle/src/lsm/compaction.zig +0 -603
  69. package/src/tigerbeetle/src/lsm/composite_key.zig +0 -77
  70. package/src/tigerbeetle/src/lsm/direction.zig +0 -11
  71. package/src/tigerbeetle/src/lsm/eytzinger.zig +0 -587
  72. package/src/tigerbeetle/src/lsm/eytzinger_benchmark.zig +0 -330
  73. package/src/tigerbeetle/src/lsm/forest.zig +0 -204
  74. package/src/tigerbeetle/src/lsm/forest_fuzz.zig +0 -401
  75. package/src/tigerbeetle/src/lsm/grid.zig +0 -573
  76. package/src/tigerbeetle/src/lsm/groove.zig +0 -972
  77. package/src/tigerbeetle/src/lsm/k_way_merge.zig +0 -474
  78. package/src/tigerbeetle/src/lsm/level_iterator.zig +0 -332
  79. package/src/tigerbeetle/src/lsm/manifest.zig +0 -617
  80. package/src/tigerbeetle/src/lsm/manifest_level.zig +0 -877
  81. package/src/tigerbeetle/src/lsm/manifest_log.zig +0 -789
  82. package/src/tigerbeetle/src/lsm/manifest_log_fuzz.zig +0 -691
  83. package/src/tigerbeetle/src/lsm/merge_iterator.zig +0 -106
  84. package/src/tigerbeetle/src/lsm/node_pool.zig +0 -235
  85. package/src/tigerbeetle/src/lsm/posted_groove.zig +0 -378
  86. package/src/tigerbeetle/src/lsm/segmented_array.zig +0 -1328
  87. package/src/tigerbeetle/src/lsm/segmented_array_benchmark.zig +0 -148
  88. package/src/tigerbeetle/src/lsm/segmented_array_fuzz.zig +0 -9
  89. package/src/tigerbeetle/src/lsm/set_associative_cache.zig +0 -850
  90. package/src/tigerbeetle/src/lsm/table.zig +0 -1031
  91. package/src/tigerbeetle/src/lsm/table_immutable.zig +0 -203
  92. package/src/tigerbeetle/src/lsm/table_iterator.zig +0 -340
  93. package/src/tigerbeetle/src/lsm/table_mutable.zig +0 -220
  94. package/src/tigerbeetle/src/lsm/test.zig +0 -438
  95. package/src/tigerbeetle/src/lsm/tree.zig +0 -1193
  96. package/src/tigerbeetle/src/lsm/tree_fuzz.zig +0 -474
  97. package/src/tigerbeetle/src/message_bus.zig +0 -1012
  98. package/src/tigerbeetle/src/message_pool.zig +0 -156
  99. package/src/tigerbeetle/src/ring_buffer.zig +0 -399
  100. package/src/tigerbeetle/src/simulator.zig +0 -569
  101. package/src/tigerbeetle/src/state_machine/auditor.zig +0 -577
  102. package/src/tigerbeetle/src/state_machine/workload.zig +0 -883
  103. package/src/tigerbeetle/src/state_machine.zig +0 -1881
  104. package/src/tigerbeetle/src/static_allocator.zig +0 -65
  105. package/src/tigerbeetle/src/stdx.zig +0 -162
  106. package/src/tigerbeetle/src/storage.zig +0 -393
  107. package/src/tigerbeetle/src/testing/cluster/message_bus.zig +0 -82
  108. package/src/tigerbeetle/src/testing/cluster/network.zig +0 -237
  109. package/src/tigerbeetle/src/testing/cluster/state_checker.zig +0 -169
  110. package/src/tigerbeetle/src/testing/cluster/storage_checker.zig +0 -202
  111. package/src/tigerbeetle/src/testing/cluster.zig +0 -443
  112. package/src/tigerbeetle/src/testing/fuzz.zig +0 -140
  113. package/src/tigerbeetle/src/testing/hash_log.zig +0 -66
  114. package/src/tigerbeetle/src/testing/id.zig +0 -99
  115. package/src/tigerbeetle/src/testing/packet_simulator.zig +0 -364
  116. package/src/tigerbeetle/src/testing/priority_queue.zig +0 -645
  117. package/src/tigerbeetle/src/testing/reply_sequence.zig +0 -139
  118. package/src/tigerbeetle/src/testing/state_machine.zig +0 -249
  119. package/src/tigerbeetle/src/testing/storage.zig +0 -757
  120. package/src/tigerbeetle/src/testing/table.zig +0 -247
  121. package/src/tigerbeetle/src/testing/time.zig +0 -84
  122. package/src/tigerbeetle/src/tigerbeetle.zig +0 -227
  123. package/src/tigerbeetle/src/time.zig +0 -112
  124. package/src/tigerbeetle/src/tracer.zig +0 -529
  125. package/src/tigerbeetle/src/unit_tests.zig +0 -42
  126. package/src/tigerbeetle/src/vopr.zig +0 -495
  127. package/src/tigerbeetle/src/vsr/README.md +0 -209
  128. package/src/tigerbeetle/src/vsr/client.zig +0 -544
  129. package/src/tigerbeetle/src/vsr/clock.zig +0 -853
  130. package/src/tigerbeetle/src/vsr/journal.zig +0 -2413
  131. package/src/tigerbeetle/src/vsr/journal_format_fuzz.zig +0 -111
  132. package/src/tigerbeetle/src/vsr/marzullo.zig +0 -309
  133. package/src/tigerbeetle/src/vsr/replica.zig +0 -6381
  134. package/src/tigerbeetle/src/vsr/replica_format.zig +0 -219
  135. package/src/tigerbeetle/src/vsr/superblock.zig +0 -1631
  136. package/src/tigerbeetle/src/vsr/superblock_client_table.zig +0 -256
  137. package/src/tigerbeetle/src/vsr/superblock_free_set.zig +0 -929
  138. package/src/tigerbeetle/src/vsr/superblock_free_set_fuzz.zig +0 -334
  139. package/src/tigerbeetle/src/vsr/superblock_fuzz.zig +0 -390
  140. package/src/tigerbeetle/src/vsr/superblock_manifest.zig +0 -615
  141. package/src/tigerbeetle/src/vsr/superblock_quorums.zig +0 -394
  142. package/src/tigerbeetle/src/vsr/superblock_quorums_fuzz.zig +0 -314
  143. package/src/tigerbeetle/src/vsr.zig +0 -1352
@@ -1,256 +0,0 @@
1
- const std = @import("std");
2
- const assert = std.debug.assert;
3
- const mem = std.mem;
4
-
5
- const constants = @import("../constants.zig");
6
- const vsr = @import("../vsr.zig");
7
- const stdx = @import("../stdx.zig");
8
-
9
- const MessagePool = @import("../message_pool.zig").MessagePool;
10
-
11
- pub const ClientTable = struct {
12
- /// We found two bugs in the VRR paper relating to the client table:
13
- ///
14
- /// 1. a correctness bug, where successive client crashes may cause request numbers to collide for
15
- /// different request payloads, resulting in requests receiving the wrong reply, and
16
- ///
17
- /// 2. a liveness bug, where if the client table is updated for request and prepare messages with
18
- /// the client's latest request number, then the client may be locked out from the cluster if the
19
- /// request is ever reordered through a view change.
20
- ///
21
- /// We therefore take a different approach with the implementation of our client table, to:
22
- ///
23
- /// 1. register client sessions explicitly through the state machine to ensure that client session
24
- /// numbers always increase, and
25
- ///
26
- /// 2. make a more careful distinction between uncommitted and committed request numbers,
27
- /// considering that uncommitted requests may not survive a view change.
28
- pub const Entry = struct {
29
- /// The client's session number as committed to the cluster by a register request.
30
- session: u64,
31
-
32
- /// The reply sent to the client's latest committed request.
33
- reply: *MessagePool.Message,
34
- };
35
-
36
- const Entries = std.AutoHashMapUnmanaged(u128, Entry);
37
-
38
- entries: Entries,
39
- sorted: []*const Entry,
40
- message_pool: *MessagePool,
41
-
42
- pub fn init(allocator: mem.Allocator, message_pool: *MessagePool) !ClientTable {
43
- var entries: Entries = .{};
44
- errdefer entries.deinit(allocator);
45
-
46
- try entries.ensureTotalCapacity(allocator, @intCast(u32, constants.clients_max));
47
- assert(entries.capacity() >= constants.clients_max);
48
-
49
- const sorted = try allocator.alloc(*const Entry, constants.clients_max);
50
- errdefer allocator.free(sorted);
51
-
52
- return ClientTable{
53
- .entries = entries,
54
- .sorted = sorted,
55
- .message_pool = message_pool,
56
- };
57
- }
58
-
59
- pub fn deinit(client_table: *ClientTable, allocator: mem.Allocator) void {
60
- {
61
- var it = client_table.iterator();
62
- while (it.next()) |entry| {
63
- client_table.message_pool.unref(entry.reply);
64
- }
65
- }
66
-
67
- client_table.entries.deinit(allocator);
68
- allocator.free(client_table.sorted);
69
- }
70
-
71
- fn sort_entries_less_than(context: void, a: *const Entry, b: *const Entry) bool {
72
- _ = context;
73
- assert(a.reply.header.client != b.reply.header.client);
74
- return std.math.order(
75
- a.reply.header.client,
76
- b.reply.header.client,
77
- ) == .lt;
78
- }
79
-
80
- /// Maximum size of the buffer needed to encode the client table on disk.
81
- pub const encode_size_max = blk: {
82
- var size_max: usize = 0;
83
-
84
- // First goes the vsr headers for the entries.
85
- // This takes advantage of the buffer alignment to avoid adding padding for the headers.
86
- size_max = std.mem.alignForward(size_max, @alignOf(vsr.Header));
87
- size_max += @sizeOf(vsr.Header) * constants.clients_max;
88
-
89
- // Then follows the session values for the entries.
90
- size_max = std.mem.alignForward(size_max, @alignOf(u64));
91
- size_max += @sizeOf(u64) * constants.clients_max;
92
-
93
- // Followed by the message bodies for the entries.
94
- size_max = std.mem.alignForward(size_max, @alignOf(u8));
95
- size_max += constants.message_size_max * constants.clients_max;
96
-
97
- // Finally the entry count at the end
98
- size_max = std.mem.alignForward(size_max, @alignOf(u32));
99
- size_max += @sizeOf(u32);
100
-
101
- break :blk size_max;
102
- };
103
-
104
- pub fn encode(client_table: *const ClientTable, target: []align(@alignOf(vsr.Header)) u8) u64 {
105
- // The entries must be collected and sorted into a separate buffer first before iteration.
106
- // This avoids relying on iteration order of AutoHashMapUnmanaged which may change between
107
- // zig versions.
108
- var entries_count: u32 = 0;
109
- {
110
- var it = client_table.entries.valueIterator();
111
- while (it.next()) |entry| : (entries_count += 1) {
112
- assert(entries_count < client_table.sorted.len);
113
- assert(entry.reply.header.command == .reply);
114
- client_table.sorted[entries_count] = entry;
115
- }
116
- }
117
-
118
- assert(entries_count <= client_table.sorted.len);
119
- const entries = client_table.sorted[0..entries_count];
120
- std.sort.sort(*const Entry, entries, {}, sort_entries_less_than);
121
-
122
- var size: u64 = 0;
123
- assert(target.len >= encode_size_max);
124
-
125
- // Write all headers:
126
- var new_size = std.mem.alignForward(size, @alignOf(vsr.Header));
127
- std.mem.set(u8, target[size..new_size], 0);
128
- size = new_size;
129
-
130
- for (entries) |entry| {
131
- stdx.copy_disjoint(.inexact, u8, target[size..], mem.asBytes(entry.reply.header));
132
- size += @sizeOf(vsr.Header);
133
- }
134
-
135
- // Write all sessions:
136
- new_size = std.mem.alignForward(size, @alignOf(u64));
137
- std.mem.set(u8, target[size..new_size], 0);
138
- size = new_size;
139
-
140
- for (entries) |entry| {
141
- stdx.copy_disjoint(.inexact, u8, target[size..], mem.asBytes(&entry.session));
142
- size += @sizeOf(u64);
143
- }
144
-
145
- // Write all messages:
146
- new_size = std.mem.alignForward(size, @alignOf(u8));
147
- std.mem.set(u8, target[size..new_size], 0);
148
- size = new_size;
149
-
150
- for (entries) |entry| {
151
- const body = entry.reply.body();
152
- assert(body.len == (entry.reply.header.size - @sizeOf(vsr.Header)));
153
- stdx.copy_disjoint(.inexact, u8, target[size..], body);
154
- size += body.len;
155
- }
156
-
157
- // Finally write the entry count:
158
- new_size = std.mem.alignForward(size, @alignOf(u32));
159
- std.mem.set(u8, target[size..new_size], 0);
160
- size = new_size;
161
-
162
- stdx.copy_disjoint(.inexact, u8, target[size..], mem.asBytes(&entries_count));
163
- size += @sizeOf(u32);
164
-
165
- assert(size <= encode_size_max);
166
- return size;
167
- }
168
-
169
- pub fn decode(client_table: *ClientTable, source: []align(@alignOf(vsr.Header)) const u8) void {
170
- // Read the entry count at the end of the buffer to determine how many there are.
171
- var entries_count: u32 = undefined;
172
- stdx.copy_disjoint(.exact, u8, mem.asBytes(&entries_count), source[source.len - @sizeOf(u32) ..]);
173
- assert(entries_count <= client_table.sorted.len);
174
-
175
- assert(client_table.count() == 0);
176
- defer assert(client_table.count() == entries_count);
177
-
178
- // Skip decoding if there aren't any entries.
179
- if (entries_count == 0) return;
180
-
181
- var size: u64 = 0;
182
- assert(source.len > 0);
183
- assert(source.len <= encode_size_max);
184
-
185
- size = std.mem.alignForward(size, @alignOf(vsr.Header));
186
- const headers = mem.bytesAsSlice(
187
- vsr.Header,
188
- source[size..][0 .. entries_count * @sizeOf(vsr.Header)],
189
- );
190
- size += mem.sliceAsBytes(headers).len;
191
-
192
- size = std.mem.alignForward(size, @alignOf(u64));
193
- const sessions = mem.bytesAsSlice(u64, source[size..][0 .. entries_count * @sizeOf(u64)]);
194
- size += mem.sliceAsBytes(sessions).len;
195
-
196
- size = std.mem.alignForward(size, @alignOf(u8));
197
- var bodies = source[size .. source.len - @sizeOf(u32)];
198
-
199
- for (headers) |header, i| {
200
- // Prepare the entry with a message.
201
- var entry: Entry = undefined;
202
- entry.reply = client_table.message_pool.get_message();
203
-
204
- // Read the header and session for the entry.
205
- entry.session = sessions[i];
206
- entry.reply.header.* = header;
207
- assert(entry.reply.header.valid_checksum());
208
- assert(entry.reply.header.command == .reply);
209
- assert(entry.reply.header.commit >= entry.session);
210
-
211
- // Get the message body buffer for the entry.
212
- const body_size = entry.reply.header.size - @sizeOf(vsr.Header);
213
- const body = entry.reply.body()[0..body_size];
214
-
215
- // Read the message body for the entry.
216
- assert(bodies.len >= body_size);
217
- stdx.copy_disjoint(.exact, u8, body, bodies[0..body_size]);
218
- bodies = bodies[body_size..];
219
- assert(entry.reply.header.valid_checksum_body(body));
220
-
221
- // Insert into the client table
222
- client_table.put(&entry);
223
- }
224
- }
225
-
226
- pub fn count(client_table: *const ClientTable) usize {
227
- return client_table.entries.count();
228
- }
229
-
230
- pub fn capacity(client_table: *const ClientTable) usize {
231
- return client_table.sorted.len;
232
- }
233
-
234
- pub fn get(client_table: *ClientTable, client: u128) ?*Entry {
235
- return client_table.entries.getPtr(client);
236
- }
237
-
238
- pub fn put(client_table: *ClientTable, entry: *const Entry) void {
239
- const client = entry.reply.header.client;
240
- client_table.entries.putAssumeCapacityNoClobber(client, entry.*);
241
-
242
- if (constants.verify) assert(client_table.entries.contains(client));
243
- }
244
-
245
- pub fn remove(client_table: *ClientTable, client: u128) void {
246
- assert(client_table.entries.remove(client));
247
-
248
- if (constants.verify) assert(!client_table.entries.contains(client));
249
- }
250
-
251
- pub const Iterator = Entries.ValueIterator;
252
-
253
- pub fn iterator(client_table: *ClientTable) Iterator {
254
- return client_table.entries.valueIterator();
255
- }
256
- };