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,213 +0,0 @@
1
- const std = @import("std");
2
- const os = std.os;
3
- const assert = std.debug.assert;
4
- const log = std.log.scoped(.io_benchmark);
5
-
6
- const Time = @import("../time.zig").Time;
7
- const IO = @import("../io.zig").IO;
8
-
9
- // 1 MB: larger than socket buffer so forces io_pending on darwin
10
- // Configure this value to smaller amounts to test IO scheduling overhead
11
- const buffer_size = 1 * 1024 * 1024;
12
-
13
- // max time for the benchmark to run
14
- const run_duration = 1 * std.time.ns_per_s;
15
-
16
- pub fn main() !void {
17
- var gpa = std.heap.GeneralPurposeAllocator(.{}){};
18
- const allocator = gpa.allocator();
19
- defer {
20
- const leaks = gpa.deinit();
21
- assert(!leaks);
22
- }
23
-
24
- const buffer = try allocator.alloc(u8, buffer_size * 2);
25
- defer allocator.free(buffer);
26
- std.mem.set(u8, buffer, 0);
27
-
28
- var self = Context{
29
- .io = try IO.init(32, 0),
30
- .tx = .{ .buffer = buffer[0 * buffer_size ..][0..buffer_size] },
31
- .rx = .{ .buffer = buffer[1 * buffer_size ..][0..buffer_size] },
32
- };
33
- defer self.io.deinit();
34
-
35
- var timer = Time{};
36
- const started = timer.monotonic();
37
- defer {
38
- const elapsed_ns = timer.monotonic() - started;
39
- const transferred_mb = @intToFloat(f64, self.transferred) / 1024 / 1024;
40
-
41
- log.info("took {}ms @ {d:.2} MB/s\n", .{
42
- elapsed_ns / std.time.ns_per_ms,
43
- transferred_mb / (@intToFloat(f64, elapsed_ns) / std.time.ns_per_s),
44
- });
45
- }
46
-
47
- // Setup the server socket
48
- self.server.fd = try self.io.open_socket(os.AF.INET, os.SOCK.STREAM, os.IPPROTO.TCP);
49
- defer os.closeSocket(self.server.fd);
50
-
51
- const address = try std.net.Address.parseIp4("127.0.0.1", 3131);
52
- try os.setsockopt(
53
- self.server.fd,
54
- os.SOL.SOCKET,
55
- os.SO.REUSEADDR,
56
- &std.mem.toBytes(@as(c_int, 1)),
57
- );
58
- try os.bind(self.server.fd, &address.any, address.getOsSockLen());
59
- try os.listen(self.server.fd, 1);
60
-
61
- // Start accepting the client
62
- self.io.accept(
63
- *Context,
64
- &self,
65
- Context.on_accept,
66
- &self.server.completion,
67
- self.server.fd,
68
- );
69
-
70
- // Setup the client connection
71
- self.tx.socket.fd = try self.io.open_socket(os.AF.INET, os.SOCK.STREAM, os.IPPROTO.TCP);
72
- defer os.closeSocket(self.tx.socket.fd);
73
-
74
- self.io.connect(
75
- *Context,
76
- &self,
77
- Context.on_connect,
78
- &self.tx.socket.completion,
79
- self.tx.socket.fd,
80
- address,
81
- );
82
-
83
- // Run the IO loop for the duration of the benchmark
84
- log.info("running for {}", .{std.fmt.fmtDuration(run_duration)});
85
- try self.io.run_for_ns(run_duration);
86
-
87
- // Assert that everything is connected
88
- assert(self.server.fd != IO.INVALID_SOCKET);
89
- assert(self.tx.socket.fd != IO.INVALID_SOCKET);
90
- assert(self.rx.socket.fd != IO.INVALID_SOCKET);
91
-
92
- // Close the accepted client socket.
93
- // The actual client socket + server socket are closed by defer
94
- os.closeSocket(self.rx.socket.fd);
95
- }
96
-
97
- const Context = struct {
98
- io: IO,
99
- tx: Pipe,
100
- rx: Pipe,
101
- server: Socket = .{},
102
- transferred: u64 = 0,
103
-
104
- const Socket = struct {
105
- fd: os.socket_t = IO.INVALID_SOCKET,
106
- completion: IO.Completion = undefined,
107
- };
108
- const Pipe = struct {
109
- socket: Socket = .{},
110
- buffer: []u8,
111
- transferred: usize = 0,
112
- };
113
-
114
- fn on_accept(
115
- self: *Context,
116
- completion: *IO.Completion,
117
- result: IO.AcceptError!os.socket_t,
118
- ) void {
119
- assert(self.rx.socket.fd == IO.INVALID_SOCKET);
120
- assert(&self.server.completion == completion);
121
- self.rx.socket.fd = result catch |err| std.debug.panic("accept error {}", .{err});
122
-
123
- // Start reading data from the accepted client socket
124
- assert(self.rx.transferred == 0);
125
- self.do_transfer("rx", .read, 0);
126
- }
127
-
128
- fn on_connect(
129
- self: *Context,
130
- completion: *IO.Completion,
131
- result: IO.ConnectError!void,
132
- ) void {
133
- _ = result catch unreachable;
134
-
135
- assert(self.tx.socket.fd != IO.INVALID_SOCKET);
136
- assert(&self.tx.socket.completion == completion);
137
-
138
- // Start sending data to the server's accepted client
139
- assert(self.tx.transferred == 0);
140
- self.do_transfer("tx", .write, 0);
141
- }
142
-
143
- const TransferType = enum {
144
- read,
145
- write,
146
- };
147
-
148
- fn do_transfer(
149
- self: *Context,
150
- comptime pipe_name: []const u8,
151
- comptime transfer_type: TransferType,
152
- bytes: usize,
153
- ) void {
154
- // The type of IO to perform and what type of IO to perform next (after the current one completes).
155
- const transfer_info = switch (transfer_type) {
156
- .read => .{
157
- .IoError = IO.RecvError,
158
- .io_func = "recv",
159
- .next = TransferType.write,
160
- },
161
- .write => .{
162
- .IoError = IO.SendError,
163
- .io_func = "send",
164
- .next = TransferType.read,
165
- },
166
- };
167
-
168
- assert(bytes <= buffer_size);
169
- self.transferred += bytes;
170
-
171
- // Select which connection (tx or rx) depending on the type of transfer
172
- const pipe = &@field(self, pipe_name);
173
- pipe.transferred += bytes;
174
- assert(pipe.transferred <= pipe.buffer.len);
175
-
176
- // There's still more data to transfer on the connection
177
- if (pipe.transferred < pipe.buffer.len) {
178
- // Callback which calls this function again when data is transferred.
179
- // Effectively loops back above.
180
- const on_transfer = struct {
181
- fn on_transfer(
182
- _self: *Context,
183
- completion: *IO.Completion,
184
- result: transfer_info.IoError!usize,
185
- ) void {
186
- const _bytes = result catch |err| {
187
- std.debug.panic("{s} error: {}", .{ transfer_info.io_func, err });
188
- };
189
- assert(&@field(_self, pipe_name).socket.completion == completion);
190
- _self.do_transfer(pipe_name, transfer_type, _bytes);
191
- }
192
- }.on_transfer;
193
-
194
- // Perform the IO with the callback for the completion
195
- return @field(self.io, transfer_info.io_func)(
196
- *Context,
197
- self,
198
- on_transfer,
199
- &pipe.socket.completion,
200
- pipe.socket.fd,
201
- pipe.buffer[pipe.transferred..],
202
- );
203
- }
204
-
205
- // This transfer type completed transferring all the bytes.
206
- // Now, switch the transfer type (transfer_info.next).
207
- // This means if we read to the buffer, now we write it out.
208
- // Inversely, if we wrote the buffer, now we read it back.
209
- // This is basically a modified echo benchmark.
210
- pipe.transferred = 0;
211
- self.do_transfer(pipe_name, transfer_info.next, 0);
212
- }
213
- };