tigerbeetle-node 0.10.0 → 0.11.1

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 (109) hide show
  1. package/README.md +302 -101
  2. package/dist/index.d.ts +70 -72
  3. package/dist/index.js +70 -72
  4. package/dist/index.js.map +1 -1
  5. package/package.json +9 -8
  6. package/scripts/download_node_headers.sh +14 -7
  7. package/src/index.ts +6 -10
  8. package/src/node.zig +6 -3
  9. package/src/tigerbeetle/scripts/benchmark.sh +4 -4
  10. package/src/tigerbeetle/scripts/confirm_image.sh +44 -0
  11. package/src/tigerbeetle/scripts/fuzz_loop.sh +15 -0
  12. package/src/tigerbeetle/scripts/fuzz_unique_errors.sh +7 -0
  13. package/src/tigerbeetle/scripts/install.sh +19 -4
  14. package/src/tigerbeetle/scripts/install_zig.bat +5 -1
  15. package/src/tigerbeetle/scripts/install_zig.sh +24 -14
  16. package/src/tigerbeetle/scripts/pre-commit.sh +9 -0
  17. package/src/tigerbeetle/scripts/shellcheck.sh +5 -0
  18. package/src/tigerbeetle/scripts/tests_on_alpine.sh +10 -0
  19. package/src/tigerbeetle/scripts/tests_on_ubuntu.sh +14 -0
  20. package/src/tigerbeetle/scripts/validate_docs.sh +17 -0
  21. package/src/tigerbeetle/src/benchmark.zig +29 -13
  22. package/src/tigerbeetle/src/c/tb_client/context.zig +248 -47
  23. package/src/tigerbeetle/src/c/tb_client/echo_client.zig +108 -0
  24. package/src/tigerbeetle/src/c/tb_client/packet.zig +2 -2
  25. package/src/tigerbeetle/src/c/tb_client/signal.zig +2 -4
  26. package/src/tigerbeetle/src/c/tb_client/thread.zig +17 -257
  27. package/src/tigerbeetle/src/c/tb_client.h +118 -84
  28. package/src/tigerbeetle/src/c/tb_client.zig +88 -23
  29. package/src/tigerbeetle/src/c/tb_client_header_test.zig +135 -0
  30. package/src/tigerbeetle/src/c/test.zig +371 -1
  31. package/src/tigerbeetle/src/cli.zig +37 -7
  32. package/src/tigerbeetle/src/config.zig +58 -17
  33. package/src/tigerbeetle/src/demo.zig +5 -2
  34. package/src/tigerbeetle/src/demo_01_create_accounts.zig +1 -1
  35. package/src/tigerbeetle/src/demo_03_create_transfers.zig +13 -0
  36. package/src/tigerbeetle/src/ewah.zig +11 -33
  37. package/src/tigerbeetle/src/ewah_benchmark.zig +8 -9
  38. package/src/tigerbeetle/src/io/linux.zig +1 -1
  39. package/src/tigerbeetle/src/lsm/README.md +308 -0
  40. package/src/tigerbeetle/src/lsm/binary_search.zig +137 -10
  41. package/src/tigerbeetle/src/lsm/bloom_filter.zig +43 -0
  42. package/src/tigerbeetle/src/lsm/compaction.zig +376 -397
  43. package/src/tigerbeetle/src/lsm/composite_key.zig +2 -0
  44. package/src/tigerbeetle/src/lsm/eytzinger.zig +1 -1
  45. package/src/tigerbeetle/src/{eytzinger_benchmark.zig → lsm/eytzinger_benchmark.zig} +34 -21
  46. package/src/tigerbeetle/src/lsm/forest.zig +21 -447
  47. package/src/tigerbeetle/src/lsm/forest_fuzz.zig +414 -0
  48. package/src/tigerbeetle/src/lsm/grid.zig +170 -76
  49. package/src/tigerbeetle/src/lsm/groove.zig +197 -133
  50. package/src/tigerbeetle/src/lsm/k_way_merge.zig +40 -18
  51. package/src/tigerbeetle/src/lsm/level_iterator.zig +28 -9
  52. package/src/tigerbeetle/src/lsm/manifest.zig +93 -180
  53. package/src/tigerbeetle/src/lsm/manifest_level.zig +161 -454
  54. package/src/tigerbeetle/src/lsm/manifest_log.zig +243 -356
  55. package/src/tigerbeetle/src/lsm/manifest_log_fuzz.zig +665 -0
  56. package/src/tigerbeetle/src/lsm/node_pool.zig +4 -0
  57. package/src/tigerbeetle/src/lsm/posted_groove.zig +65 -76
  58. package/src/tigerbeetle/src/lsm/segmented_array.zig +580 -251
  59. package/src/tigerbeetle/src/lsm/segmented_array_benchmark.zig +148 -0
  60. package/src/tigerbeetle/src/lsm/segmented_array_fuzz.zig +9 -0
  61. package/src/tigerbeetle/src/lsm/set_associative_cache.zig +62 -12
  62. package/src/tigerbeetle/src/lsm/table.zig +115 -68
  63. package/src/tigerbeetle/src/lsm/table_immutable.zig +30 -23
  64. package/src/tigerbeetle/src/lsm/table_iterator.zig +27 -17
  65. package/src/tigerbeetle/src/lsm/table_mutable.zig +63 -12
  66. package/src/tigerbeetle/src/lsm/test.zig +61 -56
  67. package/src/tigerbeetle/src/lsm/tree.zig +450 -407
  68. package/src/tigerbeetle/src/lsm/tree_fuzz.zig +461 -0
  69. package/src/tigerbeetle/src/main.zig +83 -8
  70. package/src/tigerbeetle/src/message_bus.zig +20 -9
  71. package/src/tigerbeetle/src/message_pool.zig +22 -19
  72. package/src/tigerbeetle/src/ring_buffer.zig +7 -3
  73. package/src/tigerbeetle/src/simulator.zig +179 -119
  74. package/src/tigerbeetle/src/state_machine.zig +381 -246
  75. package/src/tigerbeetle/src/static_allocator.zig +65 -0
  76. package/src/tigerbeetle/src/storage.zig +3 -7
  77. package/src/tigerbeetle/src/test/accounting/auditor.zig +577 -0
  78. package/src/tigerbeetle/src/test/accounting/workload.zig +823 -0
  79. package/src/tigerbeetle/src/test/cluster.zig +33 -81
  80. package/src/tigerbeetle/src/test/conductor.zig +366 -0
  81. package/src/tigerbeetle/src/test/fuzz.zig +121 -0
  82. package/src/tigerbeetle/src/test/id.zig +89 -0
  83. package/src/tigerbeetle/src/test/network.zig +45 -19
  84. package/src/tigerbeetle/src/test/packet_simulator.zig +40 -29
  85. package/src/tigerbeetle/src/test/priority_queue.zig +645 -0
  86. package/src/tigerbeetle/src/test/state_checker.zig +91 -69
  87. package/src/tigerbeetle/src/test/state_machine.zig +11 -35
  88. package/src/tigerbeetle/src/test/storage.zig +470 -106
  89. package/src/tigerbeetle/src/test/storage_checker.zig +204 -0
  90. package/src/tigerbeetle/src/tigerbeetle.zig +15 -16
  91. package/src/tigerbeetle/src/unit_tests.zig +13 -1
  92. package/src/tigerbeetle/src/util.zig +97 -11
  93. package/src/tigerbeetle/src/vopr.zig +495 -0
  94. package/src/tigerbeetle/src/vsr/client.zig +21 -3
  95. package/src/tigerbeetle/src/vsr/journal.zig +293 -212
  96. package/src/tigerbeetle/src/vsr/replica.zig +1086 -515
  97. package/src/tigerbeetle/src/vsr/superblock.zig +382 -637
  98. package/src/tigerbeetle/src/vsr/superblock_client_table.zig +14 -16
  99. package/src/tigerbeetle/src/vsr/superblock_free_set.zig +416 -153
  100. package/src/tigerbeetle/src/vsr/superblock_free_set_fuzz.zig +332 -0
  101. package/src/tigerbeetle/src/vsr/superblock_fuzz.zig +349 -0
  102. package/src/tigerbeetle/src/vsr/superblock_manifest.zig +62 -12
  103. package/src/tigerbeetle/src/vsr/superblock_quorums.zig +394 -0
  104. package/src/tigerbeetle/src/vsr/superblock_quorums_fuzz.zig +312 -0
  105. package/src/tigerbeetle/src/vsr.zig +94 -60
  106. package/src/tigerbeetle/scripts/vopr.bat +0 -48
  107. package/src/tigerbeetle/scripts/vopr.sh +0 -33
  108. package/src/tigerbeetle/src/benchmark_array_search.zig +0 -317
  109. package/src/tigerbeetle/src/benchmarks/perf.zig +0 -299
@@ -4,6 +4,7 @@ const mem = std.mem;
4
4
 
5
5
  const config = @import("../config.zig");
6
6
  const vsr = @import("../vsr.zig");
7
+ const util = @import("../util.zig");
7
8
 
8
9
  const MessagePool = @import("../message_pool.zig").MessagePool;
9
10
 
@@ -45,7 +46,7 @@ pub const ClientTable = struct {
45
46
  try entries.ensureTotalCapacity(allocator, @intCast(u32, config.clients_max));
46
47
  assert(entries.capacity() >= config.clients_max);
47
48
 
48
- const sorted = try allocator.alloc(*const Entry, entries.capacity());
49
+ const sorted = try allocator.alloc(*const Entry, config.clients_max);
49
50
  errdefer allocator.free(sorted);
50
51
 
51
52
  return ClientTable{
@@ -111,7 +112,6 @@ pub const ClientTable = struct {
111
112
  assert(entries_count < client_table.sorted.len);
112
113
  assert(entry.reply.header.command == .reply);
113
114
  client_table.sorted[entries_count] = entry;
114
- entries_count += 1;
115
115
  }
116
116
  }
117
117
 
@@ -128,7 +128,7 @@ pub const ClientTable = struct {
128
128
  size = new_size;
129
129
 
130
130
  for (entries) |entry| {
131
- mem.copy(u8, target[size..], mem.asBytes(entry.reply.header));
131
+ util.copy_disjoint(.inexact, u8, target[size..], mem.asBytes(entry.reply.header));
132
132
  size += @sizeOf(vsr.Header);
133
133
  }
134
134
 
@@ -138,7 +138,7 @@ pub const ClientTable = struct {
138
138
  size = new_size;
139
139
 
140
140
  for (entries) |entry| {
141
- mem.copy(u8, target[size..], mem.asBytes(&entry.session));
141
+ util.copy_disjoint(.inexact, u8, target[size..], mem.asBytes(&entry.session));
142
142
  size += @sizeOf(u64);
143
143
  }
144
144
 
@@ -150,7 +150,7 @@ pub const ClientTable = struct {
150
150
  for (entries) |entry| {
151
151
  const body = entry.reply.body();
152
152
  assert(body.len == (entry.reply.header.size - @sizeOf(vsr.Header)));
153
- mem.copy(u8, target[size..], body);
153
+ util.copy_disjoint(.inexact, u8, target[size..], body);
154
154
  size += body.len;
155
155
  }
156
156
 
@@ -159,7 +159,7 @@ pub const ClientTable = struct {
159
159
  std.mem.set(u8, target[size..new_size], 0);
160
160
  size = new_size;
161
161
 
162
- mem.copy(u8, target[size..], mem.asBytes(&entries_count));
162
+ util.copy_disjoint(.inexact, u8, target[size..], mem.asBytes(&entries_count));
163
163
  size += @sizeOf(u32);
164
164
 
165
165
  assert(size <= encode_size_max);
@@ -169,7 +169,7 @@ pub const ClientTable = struct {
169
169
  pub fn decode(client_table: *ClientTable, source: []align(@alignOf(vsr.Header)) const u8) void {
170
170
  // Read the entry count at the end of the buffer to determine how many there are.
171
171
  var entries_count: u32 = undefined;
172
- mem.copy(u8, mem.asBytes(&entries_count), source[source.len - @sizeOf(u32) ..]);
172
+ util.copy_disjoint(.exact, u8, mem.asBytes(&entries_count), source[source.len - @sizeOf(u32) ..]);
173
173
  assert(entries_count <= client_table.sorted.len);
174
174
 
175
175
  assert(client_table.count() == 0);
@@ -185,27 +185,25 @@ pub const ClientTable = struct {
185
185
  size = std.mem.alignForward(size, @alignOf(vsr.Header));
186
186
  const headers = mem.bytesAsSlice(
187
187
  vsr.Header,
188
- source[size .. entries_count * @sizeOf(vsr.Header)],
188
+ source[size..][0 .. entries_count * @sizeOf(vsr.Header)],
189
189
  );
190
190
  size += mem.sliceAsBytes(headers).len;
191
191
 
192
192
  size = std.mem.alignForward(size, @alignOf(u64));
193
- const sessions = mem.bytesAsSlice(u64, source[size .. entries_count * @sizeOf(u64)]);
193
+ const sessions = mem.bytesAsSlice(u64, source[size..][0 .. entries_count * @sizeOf(u64)]);
194
194
  size += mem.sliceAsBytes(sessions).len;
195
195
 
196
196
  size = std.mem.alignForward(size, @alignOf(u8));
197
- var bodies = source[size..];
198
- assert(bodies.len > 0);
197
+ var bodies = source[size .. source.len - @sizeOf(u32)];
199
198
 
200
- var i: u32 = 0;
201
- while (i < entries_count) : (i += 1) {
199
+ for (headers) |header, i| {
202
200
  // Prepare the entry with a message.
203
201
  var entry: Entry = undefined;
204
202
  entry.reply = client_table.message_pool.get_message();
205
203
 
206
204
  // Read the header and session for the entry.
207
205
  entry.session = sessions[i];
208
- entry.reply.header.* = headers[i];
206
+ entry.reply.header.* = header;
209
207
  assert(entry.reply.header.valid_checksum());
210
208
  assert(entry.reply.header.command == .reply);
211
209
  assert(entry.reply.header.commit >= entry.session);
@@ -216,7 +214,7 @@ pub const ClientTable = struct {
216
214
 
217
215
  // Read the message body for the entry.
218
216
  assert(bodies.len >= body_size);
219
- mem.copy(u8, body, bodies[0..body_size]);
217
+ util.copy_disjoint(.exact, u8, body, bodies[0..body_size]);
220
218
  bodies = bodies[body_size..];
221
219
  assert(entry.reply.header.valid_checksum_body(body));
222
220
 
@@ -230,7 +228,7 @@ pub const ClientTable = struct {
230
228
  }
231
229
 
232
230
  pub fn capacity(client_table: *const ClientTable) usize {
233
- return client_table.entries.capacity();
231
+ return client_table.sorted.len;
234
232
  }
235
233
 
236
234
  pub fn get(client_table: *ClientTable, client: u128) ?*Entry {