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,334 +0,0 @@
1
- //! Fuzz FreeSet reserve/acquire/release flow.
2
- //!
3
- //! This fuzzer does *not* cover FreeSet encoding/decoding.
4
- const std = @import("std");
5
- const assert = std.debug.assert;
6
- const log = std.log.scoped(.fuzz_vsr_superblock_free_set);
7
-
8
- const FreeSet = @import("./superblock_free_set.zig").FreeSet;
9
- const Reservation = @import("./superblock_free_set.zig").Reservation;
10
- const fuzz = @import("../testing/fuzz.zig");
11
-
12
- pub const tigerbeetle_config = @import("../config.zig").configs.test_min;
13
-
14
- pub fn main() !void {
15
- const allocator = std.testing.allocator;
16
- const args = try fuzz.parse_fuzz_args(allocator);
17
-
18
- var prng = std.rand.DefaultPrng.init(args.seed);
19
-
20
- const blocks_count = FreeSet.shard_bits * (1 + prng.random().uintLessThan(usize, 10));
21
- const events = try generate_events(allocator, prng.random(), blocks_count);
22
- defer allocator.free(events);
23
-
24
- try run_fuzz(allocator, prng.random(), blocks_count, events);
25
- }
26
-
27
- fn run_fuzz(
28
- allocator: std.mem.Allocator,
29
- random: std.rand.Random,
30
- blocks_count: usize,
31
- events: []const FreeSetEvent,
32
- ) !void {
33
- var free_set = try FreeSet.init(allocator, blocks_count);
34
- defer free_set.deinit(allocator);
35
-
36
- var free_set_model = try FreeSetModel.init(allocator, blocks_count);
37
- defer free_set_model.deinit(allocator);
38
-
39
- var active_reservations = std.ArrayList(Reservation).init(allocator);
40
- defer active_reservations.deinit();
41
-
42
- var active_addresses = std.ArrayList(u64).init(allocator);
43
- defer active_addresses.deinit();
44
-
45
- for (events) |event| {
46
- log.debug("event={}", .{event});
47
- switch (event) {
48
- .reserve => |reserve| {
49
- const reservation_actual = free_set.reserve(reserve.blocks);
50
- const reservation_expect = free_set_model.reserve(reserve.blocks);
51
- assert(std.meta.eql(reservation_expect, reservation_actual));
52
-
53
- if (reservation_expect) |reservation| {
54
- assert(reserve.blocks == free_set_model.count_free_reserved(reservation));
55
- assert(reserve.blocks == free_set.count_free_reserved(reservation));
56
- try active_reservations.append(reservation);
57
- }
58
- },
59
- .forfeit => {
60
- random.shuffle(Reservation, active_reservations.items);
61
- for (active_reservations.items) |reservation| {
62
- free_set.forfeit(reservation);
63
- free_set_model.forfeit(reservation);
64
- }
65
- active_reservations.clearRetainingCapacity();
66
- },
67
- .acquire => |data| {
68
- if (active_reservations.items.len == 0) continue;
69
- const reservation = active_reservations.items[
70
- data.reservation % active_reservations.items.len
71
- ];
72
- const address_actual = free_set.acquire(reservation);
73
- const address_expect = free_set_model.acquire(reservation);
74
- assert(std.meta.eql(address_expect, address_actual));
75
- if (address_expect) |address| {
76
- try active_addresses.append(address);
77
- }
78
- },
79
- .release => |data| {
80
- if (active_addresses.items.len == 0) continue;
81
-
82
- const address_index = data.address % active_addresses.items.len;
83
- const address = active_addresses.swapRemove(address_index);
84
- free_set.release(address);
85
- free_set_model.release(address);
86
- },
87
- .checkpoint => {
88
- random.shuffle(Reservation, active_reservations.items);
89
- for (active_reservations.items) |reservation| {
90
- free_set.forfeit(reservation);
91
- free_set_model.forfeit(reservation);
92
- }
93
- active_reservations.clearRetainingCapacity();
94
-
95
- free_set.checkpoint();
96
- free_set_model.checkpoint();
97
- },
98
- }
99
-
100
- assert(free_set_model.count_reservations() == free_set.count_reservations());
101
- assert(free_set_model.count_free() == free_set.count_free());
102
- assert(free_set_model.count_acquired() == free_set.count_acquired());
103
- assert(std.meta.eql(
104
- free_set_model.highest_address_acquired(),
105
- free_set.highest_address_acquired(),
106
- ));
107
-
108
- for (active_reservations.items) |reservation| {
109
- assert(
110
- free_set_model.count_free_reserved(reservation) ==
111
- free_set.count_free_reserved(reservation),
112
- );
113
- }
114
- }
115
- }
116
-
117
- const FreeSetEventType = std.meta.Tag(FreeSetEvent);
118
- const FreeSetEvent = union(enum) {
119
- reserve: struct { blocks: usize },
120
- forfeit: void,
121
- acquire: struct { reservation: usize },
122
- release: struct { address: usize },
123
- checkpoint: void,
124
- };
125
-
126
- fn generate_events(
127
- allocator: std.mem.Allocator,
128
- random: std.rand.Random,
129
- blocks_count: usize,
130
- ) ![]const FreeSetEvent {
131
- const event_distribution = fuzz.Distribution(FreeSetEventType){
132
- .reserve = 1 + random.float(f64) * 100,
133
- .forfeit = 1,
134
- .acquire = random.float(f64) * 1000,
135
- .release = if (random.boolean()) 0 else 500 * random.float(f64),
136
- .checkpoint = random.floatExp(f64) * 10,
137
- };
138
-
139
- const events = try allocator.alloc(FreeSetEvent, std.math.min(
140
- @as(usize, 2_000_000),
141
- fuzz.random_int_exponential(random, usize, blocks_count * 100),
142
- ));
143
- errdefer allocator.free(events);
144
-
145
- log.info("event_distribution = {d:.2}", .{event_distribution});
146
- log.info("event_count = {d}", .{events.len});
147
-
148
- const reservation_blocks_mean = 1 + random.uintLessThan(usize, @divFloor(blocks_count, 20));
149
- for (events) |*event| {
150
- event.* = switch (fuzz.random_enum(random, FreeSetEventType, event_distribution)) {
151
- .reserve => FreeSetEvent{ .reserve = .{
152
- .blocks = 1 + fuzz.random_int_exponential(random, usize, reservation_blocks_mean),
153
- } },
154
- .forfeit => FreeSetEvent{ .forfeit = {} },
155
- .acquire => FreeSetEvent{ .acquire = .{ .reservation = random.int(usize) } },
156
- .release => FreeSetEvent{ .release = .{
157
- .address = random.int(usize),
158
- } },
159
- .checkpoint => FreeSetEvent{ .checkpoint = {} },
160
- };
161
- }
162
- return events;
163
- }
164
-
165
- const FreeSetModel = struct {
166
- /// Set bits indicate acquired blocks.
167
- blocks_acquired: std.DynamicBitSetUnmanaged,
168
-
169
- /// Set bits indicate blocks that will be released at the next checkpoint.
170
- blocks_released: std.DynamicBitSetUnmanaged,
171
-
172
- /// Set bits indicate blocks that are currently reserved and not yet forfeited.
173
- blocks_reserved: std.DynamicBitSetUnmanaged,
174
-
175
- reservation_count: usize = 0,
176
- reservation_session: usize = 1,
177
-
178
- fn init(allocator: std.mem.Allocator, blocks_count: usize) !FreeSetModel {
179
- var blocks_acquired = try std.DynamicBitSetUnmanaged.initEmpty(allocator, blocks_count);
180
- errdefer blocks_acquired.deinit(allocator);
181
-
182
- var blocks_released = try std.DynamicBitSetUnmanaged.initEmpty(allocator, blocks_count);
183
- errdefer blocks_released.deinit(allocator);
184
-
185
- var blocks_reserved = try std.DynamicBitSetUnmanaged.initEmpty(allocator, blocks_count);
186
- errdefer blocks_reserved.deinit(allocator);
187
-
188
- return FreeSetModel{
189
- .blocks_acquired = blocks_acquired,
190
- .blocks_released = blocks_released,
191
- .blocks_reserved = blocks_reserved,
192
- };
193
- }
194
-
195
- fn deinit(set: *FreeSetModel, allocator: std.mem.Allocator) void {
196
- set.blocks_acquired.deinit(allocator);
197
- set.blocks_released.deinit(allocator);
198
- set.blocks_reserved.deinit(allocator);
199
- }
200
-
201
- pub fn count_reservations(set: FreeSetModel) usize {
202
- return set.reservation_count;
203
- }
204
-
205
- pub fn count_free(set: FreeSetModel) usize {
206
- return set.blocks_acquired.capacity() - set.blocks_acquired.count();
207
- }
208
-
209
- pub fn count_free_reserved(set: FreeSetModel, reservation: Reservation) usize {
210
- assert(reservation.block_count > 0);
211
- set.assert_reservation_active(reservation);
212
-
213
- var count: usize = 0;
214
- var iterator = set.blocks_acquired.iterator(.{ .kind = .unset });
215
- while (iterator.next()) |block| {
216
- if (block >= reservation.block_base and
217
- block < reservation.block_base + reservation.block_count)
218
- {
219
- count += 1;
220
- }
221
- }
222
- return count;
223
- }
224
-
225
- pub fn count_acquired(set: FreeSetModel) usize {
226
- return set.blocks_acquired.count();
227
- }
228
-
229
- pub fn highest_address_acquired(set: FreeSetModel) ?u64 {
230
- const block = set.blocks_acquired.iterator(.{
231
- .direction = .reverse,
232
- }).next() orelse return null;
233
- return block + 1;
234
- }
235
-
236
- pub fn reserve(set: *FreeSetModel, reserve_count: usize) ?Reservation {
237
- assert(reserve_count > 0);
238
-
239
- var blocks_found_free: usize = 0;
240
- var iterator = set.blocks_acquired.iterator(.{ .kind = .unset });
241
- while (iterator.next()) |block| {
242
- if (block < set.blocks_reserved.count()) {
243
- assert(set.blocks_reserved.isSet(block));
244
- continue;
245
- }
246
-
247
- blocks_found_free += 1;
248
- if (blocks_found_free == reserve_count) {
249
- const block_base = set.blocks_reserved.count();
250
- const block_count = block + 1 - block_base;
251
-
252
- var i: usize = 0;
253
- while (i < block_count) : (i += 1) set.blocks_reserved.set(block_base + i);
254
-
255
- set.reservation_count += 1;
256
- return Reservation{
257
- .block_base = block_base,
258
- .block_count = block_count,
259
- .session = set.reservation_session,
260
- };
261
- }
262
- }
263
- return null;
264
- }
265
-
266
- pub fn forfeit(set: *FreeSetModel, reservation: Reservation) void {
267
- set.assert_reservation_active(reservation);
268
- set.reservation_count -= 1;
269
-
270
- var i: usize = 0;
271
- while (i < reservation.block_count) : (i += 1) {
272
- set.blocks_reserved.unset(reservation.block_base + i);
273
- }
274
-
275
- if (set.reservation_count == 0) {
276
- set.reservation_session +%= 1;
277
- assert(set.blocks_reserved.count() == 0);
278
- }
279
- }
280
-
281
- pub fn acquire(set: *FreeSetModel, reservation: Reservation) ?u64 {
282
- assert(reservation.block_count > 0);
283
- assert(reservation.block_base < set.blocks_acquired.capacity());
284
- assert(reservation.session == set.reservation_session);
285
- set.assert_reservation_active(reservation);
286
-
287
- var iterator = set.blocks_acquired.iterator(.{ .kind = .unset });
288
- while (iterator.next()) |block| {
289
- if (block >= reservation.block_base and
290
- block < reservation.block_base + reservation.block_count)
291
- {
292
- assert(!set.blocks_acquired.isSet(block));
293
- set.blocks_acquired.set(block);
294
-
295
- const address = block + 1;
296
- return address;
297
- }
298
- }
299
- return null;
300
- }
301
-
302
- pub fn is_free(set: *FreeSetModel, address: u64) bool {
303
- return !set.blocks_acquired.isSet(address - 1);
304
- }
305
-
306
- pub fn release(set: *FreeSetModel, address: u64) void {
307
- const block = address - 1;
308
- set.blocks_released.set(block);
309
- }
310
-
311
- pub fn checkpoint(set: *FreeSetModel) void {
312
- assert(set.blocks_reserved.count() == 0);
313
-
314
- var iterator = set.blocks_released.iterator(.{});
315
- while (iterator.next()) |block| {
316
- assert(set.blocks_released.isSet(block));
317
- assert(set.blocks_acquired.isSet(block));
318
-
319
- set.blocks_released.unset(block);
320
- set.blocks_acquired.unset(block);
321
- }
322
- assert(set.blocks_released.count() == 0);
323
- }
324
-
325
- fn assert_reservation_active(set: FreeSetModel, reservation: Reservation) void {
326
- assert(set.reservation_count > 0);
327
- assert(set.reservation_session == reservation.session);
328
-
329
- var i: usize = 0;
330
- while (i < reservation.block_count) : (i += 1) {
331
- assert(set.blocks_reserved.isSet(reservation.block_base + i));
332
- }
333
- }
334
- };