tigerbeetle-node 0.11.13 → 0.12.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 (147) hide show
  1. package/README.md +5 -10
  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 +6 -16
  12. package/src/index.ts +56 -1
  13. package/src/node.zig +9 -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 -55
  18. package/src/tigerbeetle/scripts/benchmark.sh +0 -66
  19. package/src/tigerbeetle/scripts/confirm_image.sh +0 -44
  20. package/src/tigerbeetle/scripts/fail_on_diff.sh +0 -9
  21. package/src/tigerbeetle/scripts/fuzz_loop.sh +0 -15
  22. package/src/tigerbeetle/scripts/fuzz_loop_hash_log.sh +0 -12
  23. package/src/tigerbeetle/scripts/fuzz_unique_errors.sh +0 -7
  24. package/src/tigerbeetle/scripts/install.bat +0 -7
  25. package/src/tigerbeetle/scripts/install.sh +0 -21
  26. package/src/tigerbeetle/scripts/install_zig.bat +0 -113
  27. package/src/tigerbeetle/scripts/install_zig.sh +0 -90
  28. package/src/tigerbeetle/scripts/lint.zig +0 -199
  29. package/src/tigerbeetle/scripts/pre-commit.sh +0 -9
  30. package/src/tigerbeetle/scripts/scripts/benchmark.bat +0 -55
  31. package/src/tigerbeetle/scripts/scripts/benchmark.sh +0 -66
  32. package/src/tigerbeetle/scripts/scripts/confirm_image.sh +0 -44
  33. package/src/tigerbeetle/scripts/scripts/fail_on_diff.sh +0 -9
  34. package/src/tigerbeetle/scripts/scripts/fuzz_loop.sh +0 -15
  35. package/src/tigerbeetle/scripts/scripts/fuzz_loop_hash_log.sh +0 -12
  36. package/src/tigerbeetle/scripts/scripts/fuzz_unique_errors.sh +0 -7
  37. package/src/tigerbeetle/scripts/scripts/install.bat +0 -7
  38. package/src/tigerbeetle/scripts/scripts/install.sh +0 -21
  39. package/src/tigerbeetle/scripts/scripts/install_zig.bat +0 -113
  40. package/src/tigerbeetle/scripts/scripts/install_zig.sh +0 -90
  41. package/src/tigerbeetle/scripts/scripts/lint.zig +0 -199
  42. package/src/tigerbeetle/scripts/scripts/pre-commit.sh +0 -9
  43. package/src/tigerbeetle/scripts/scripts/shellcheck.sh +0 -5
  44. package/src/tigerbeetle/scripts/scripts/tests_on_alpine.sh +0 -10
  45. package/src/tigerbeetle/scripts/scripts/tests_on_ubuntu.sh +0 -14
  46. package/src/tigerbeetle/scripts/scripts/upgrade_ubuntu_kernel.sh +0 -48
  47. package/src/tigerbeetle/scripts/scripts/validate_docs.sh +0 -23
  48. package/src/tigerbeetle/scripts/scripts/vr_state_enumerate +0 -46
  49. package/src/tigerbeetle/scripts/shellcheck.sh +0 -5
  50. package/src/tigerbeetle/scripts/tests_on_alpine.sh +0 -10
  51. package/src/tigerbeetle/scripts/tests_on_ubuntu.sh +0 -14
  52. package/src/tigerbeetle/scripts/upgrade_ubuntu_kernel.sh +0 -48
  53. package/src/tigerbeetle/scripts/validate_docs.sh +0 -23
  54. package/src/tigerbeetle/scripts/vr_state_enumerate +0 -46
  55. package/src/tigerbeetle/src/benchmark.zig +0 -336
  56. package/src/tigerbeetle/src/config.zig +0 -233
  57. package/src/tigerbeetle/src/constants.zig +0 -428
  58. package/src/tigerbeetle/src/ewah.zig +0 -286
  59. package/src/tigerbeetle/src/ewah_benchmark.zig +0 -120
  60. package/src/tigerbeetle/src/ewah_fuzz.zig +0 -130
  61. package/src/tigerbeetle/src/fifo.zig +0 -120
  62. package/src/tigerbeetle/src/io/benchmark.zig +0 -213
  63. package/src/tigerbeetle/src/io/darwin.zig +0 -814
  64. package/src/tigerbeetle/src/io/linux.zig +0 -1071
  65. package/src/tigerbeetle/src/io/test.zig +0 -643
  66. package/src/tigerbeetle/src/io/windows.zig +0 -1183
  67. package/src/tigerbeetle/src/io.zig +0 -34
  68. package/src/tigerbeetle/src/iops.zig +0 -107
  69. package/src/tigerbeetle/src/lsm/README.md +0 -308
  70. package/src/tigerbeetle/src/lsm/binary_search.zig +0 -341
  71. package/src/tigerbeetle/src/lsm/bloom_filter.zig +0 -125
  72. package/src/tigerbeetle/src/lsm/compaction.zig +0 -603
  73. package/src/tigerbeetle/src/lsm/composite_key.zig +0 -77
  74. package/src/tigerbeetle/src/lsm/direction.zig +0 -11
  75. package/src/tigerbeetle/src/lsm/eytzinger.zig +0 -587
  76. package/src/tigerbeetle/src/lsm/eytzinger_benchmark.zig +0 -330
  77. package/src/tigerbeetle/src/lsm/forest.zig +0 -205
  78. package/src/tigerbeetle/src/lsm/forest_fuzz.zig +0 -450
  79. package/src/tigerbeetle/src/lsm/grid.zig +0 -573
  80. package/src/tigerbeetle/src/lsm/groove.zig +0 -1036
  81. package/src/tigerbeetle/src/lsm/k_way_merge.zig +0 -474
  82. package/src/tigerbeetle/src/lsm/level_iterator.zig +0 -332
  83. package/src/tigerbeetle/src/lsm/manifest.zig +0 -617
  84. package/src/tigerbeetle/src/lsm/manifest_level.zig +0 -878
  85. package/src/tigerbeetle/src/lsm/manifest_log.zig +0 -789
  86. package/src/tigerbeetle/src/lsm/manifest_log_fuzz.zig +0 -691
  87. package/src/tigerbeetle/src/lsm/merge_iterator.zig +0 -106
  88. package/src/tigerbeetle/src/lsm/node_pool.zig +0 -235
  89. package/src/tigerbeetle/src/lsm/posted_groove.zig +0 -381
  90. package/src/tigerbeetle/src/lsm/segmented_array.zig +0 -1329
  91. package/src/tigerbeetle/src/lsm/segmented_array_benchmark.zig +0 -148
  92. package/src/tigerbeetle/src/lsm/segmented_array_fuzz.zig +0 -9
  93. package/src/tigerbeetle/src/lsm/set_associative_cache.zig +0 -850
  94. package/src/tigerbeetle/src/lsm/table.zig +0 -1009
  95. package/src/tigerbeetle/src/lsm/table_immutable.zig +0 -192
  96. package/src/tigerbeetle/src/lsm/table_iterator.zig +0 -340
  97. package/src/tigerbeetle/src/lsm/table_mutable.zig +0 -203
  98. package/src/tigerbeetle/src/lsm/test.zig +0 -439
  99. package/src/tigerbeetle/src/lsm/tree.zig +0 -1169
  100. package/src/tigerbeetle/src/lsm/tree_fuzz.zig +0 -479
  101. package/src/tigerbeetle/src/message_bus.zig +0 -1013
  102. package/src/tigerbeetle/src/message_pool.zig +0 -156
  103. package/src/tigerbeetle/src/ring_buffer.zig +0 -399
  104. package/src/tigerbeetle/src/simulator.zig +0 -580
  105. package/src/tigerbeetle/src/state_machine/auditor.zig +0 -578
  106. package/src/tigerbeetle/src/state_machine/workload.zig +0 -883
  107. package/src/tigerbeetle/src/state_machine.zig +0 -2099
  108. package/src/tigerbeetle/src/static_allocator.zig +0 -65
  109. package/src/tigerbeetle/src/stdx.zig +0 -171
  110. package/src/tigerbeetle/src/storage.zig +0 -393
  111. package/src/tigerbeetle/src/testing/cluster/message_bus.zig +0 -82
  112. package/src/tigerbeetle/src/testing/cluster/network.zig +0 -237
  113. package/src/tigerbeetle/src/testing/cluster/state_checker.zig +0 -169
  114. package/src/tigerbeetle/src/testing/cluster/storage_checker.zig +0 -202
  115. package/src/tigerbeetle/src/testing/cluster.zig +0 -444
  116. package/src/tigerbeetle/src/testing/fuzz.zig +0 -140
  117. package/src/tigerbeetle/src/testing/hash_log.zig +0 -66
  118. package/src/tigerbeetle/src/testing/id.zig +0 -99
  119. package/src/tigerbeetle/src/testing/packet_simulator.zig +0 -374
  120. package/src/tigerbeetle/src/testing/priority_queue.zig +0 -645
  121. package/src/tigerbeetle/src/testing/reply_sequence.zig +0 -139
  122. package/src/tigerbeetle/src/testing/state_machine.zig +0 -250
  123. package/src/tigerbeetle/src/testing/storage.zig +0 -757
  124. package/src/tigerbeetle/src/testing/table.zig +0 -247
  125. package/src/tigerbeetle/src/testing/time.zig +0 -84
  126. package/src/tigerbeetle/src/tigerbeetle.zig +0 -227
  127. package/src/tigerbeetle/src/time.zig +0 -112
  128. package/src/tigerbeetle/src/tracer.zig +0 -529
  129. package/src/tigerbeetle/src/unit_tests.zig +0 -40
  130. package/src/tigerbeetle/src/vopr.zig +0 -495
  131. package/src/tigerbeetle/src/vsr/README.md +0 -209
  132. package/src/tigerbeetle/src/vsr/client.zig +0 -544
  133. package/src/tigerbeetle/src/vsr/clock.zig +0 -855
  134. package/src/tigerbeetle/src/vsr/journal.zig +0 -2415
  135. package/src/tigerbeetle/src/vsr/journal_format_fuzz.zig +0 -111
  136. package/src/tigerbeetle/src/vsr/marzullo.zig +0 -309
  137. package/src/tigerbeetle/src/vsr/replica.zig +0 -6616
  138. package/src/tigerbeetle/src/vsr/replica_format.zig +0 -219
  139. package/src/tigerbeetle/src/vsr/superblock.zig +0 -1631
  140. package/src/tigerbeetle/src/vsr/superblock_client_table.zig +0 -256
  141. package/src/tigerbeetle/src/vsr/superblock_free_set.zig +0 -929
  142. package/src/tigerbeetle/src/vsr/superblock_free_set_fuzz.zig +0 -334
  143. package/src/tigerbeetle/src/vsr/superblock_fuzz.zig +0 -390
  144. package/src/tigerbeetle/src/vsr/superblock_manifest.zig +0 -615
  145. package/src/tigerbeetle/src/vsr/superblock_quorums.zig +0 -394
  146. package/src/tigerbeetle/src/vsr/superblock_quorums_fuzz.zig +0 -314
  147. package/src/tigerbeetle/src/vsr.zig +0 -1425
@@ -1,139 +0,0 @@
1
- //! Replies from the cluster may arrive out-of-order; the ReplySequence reassembles them in the
2
- //! correct order (by ascending op number).
3
- const std = @import("std");
4
- const assert = std.debug.assert;
5
-
6
- const vsr = @import("../vsr.zig");
7
- const stdx = @import("../stdx.zig");
8
- const constants = @import("../constants.zig");
9
- const IdPermutation = @import("id.zig").IdPermutation;
10
- const MessagePool = @import("../message_pool.zig").MessagePool;
11
- const Message = MessagePool.Message;
12
- const Client = @import("cluster.zig").Client;
13
- const StateMachine = @import("cluster.zig").StateMachine;
14
-
15
- // TODO(zig) This won't be necessary in Zig 0.10.
16
- const PriorityQueue = @import("./priority_queue.zig").PriorityQueue;
17
-
18
- /// Both messages belong to the ReplySequence's `MessagePool`.
19
- const PendingReply = struct {
20
- client_index: usize,
21
- request: *Message,
22
- reply: *Message,
23
-
24
- /// `PendingReply`s are ordered by ascending reply op.
25
- fn compare(context: void, a: PendingReply, b: PendingReply) std.math.Order {
26
- _ = context;
27
- return std.math.order(a.reply.header.op, b.reply.header.op);
28
- }
29
- };
30
-
31
- const PendingReplyQueue = PriorityQueue(PendingReply, void, PendingReply.compare);
32
-
33
- pub const ReplySequence = struct {
34
- /// Reply messages (from cluster to client) may be reordered during transit.
35
- /// The ReplySequence must reassemble them in the original order (ascending op/commit
36
- /// number) before handing them off to the Workload for verification.
37
- ///
38
- /// `ReplySequence.stalled_queue` hold replies (and corresponding requests) that are
39
- /// waiting to be processed.
40
- pub const stalled_queue_capacity =
41
- constants.clients_max * constants.client_request_queue_max * 2;
42
-
43
- message_pool: MessagePool,
44
-
45
- /// The next op to be verified.
46
- /// Starts at 1, because op=0 is the root.
47
- stalled_op: u64 = 1,
48
-
49
- /// The list of messages waiting to be verified (the reply for a lower op has not yet arrived).
50
- /// Includes `register` messages.
51
- stalled_queue: PendingReplyQueue,
52
-
53
- pub fn init(allocator: std.mem.Allocator) !ReplySequence {
54
- // *2 for PendingReply.request and PendingReply.reply.
55
- var message_pool = try MessagePool.init_capacity(allocator, stalled_queue_capacity * 2);
56
- errdefer message_pool.deinit(allocator);
57
-
58
- var stalled_queue = PendingReplyQueue.init(allocator, {});
59
- errdefer stalled_queue.deinit();
60
- try stalled_queue.ensureTotalCapacity(stalled_queue_capacity);
61
-
62
- return ReplySequence{
63
- .message_pool = message_pool,
64
- .stalled_queue = stalled_queue,
65
- };
66
- }
67
-
68
- pub fn deinit(sequence: *ReplySequence, allocator: std.mem.Allocator) void {
69
- while (sequence.stalled_queue.removeOrNull()) |pending| {
70
- sequence.message_pool.unref(pending.request);
71
- sequence.message_pool.unref(pending.reply);
72
- }
73
- sequence.stalled_queue.deinit();
74
- sequence.message_pool.deinit(allocator);
75
- }
76
-
77
- pub fn empty(sequence: *const ReplySequence) bool {
78
- return sequence.stalled_queue.len == 0;
79
- }
80
-
81
- pub fn free(sequence: ReplySequence) usize {
82
- return stalled_queue_capacity - sequence.stalled_queue.len;
83
- }
84
-
85
- pub fn insert(
86
- sequence: *ReplySequence,
87
- client_index: usize,
88
- request_message: *Message,
89
- reply_message: *Message,
90
- ) void {
91
- assert(request_message.header.invalid() == null);
92
- assert(request_message.header.command == .request);
93
-
94
- assert(reply_message.header.invalid() == null);
95
- assert(reply_message.header.request == request_message.header.request);
96
- assert(reply_message.header.op >= sequence.stalled_op);
97
- assert(reply_message.header.command == .reply);
98
- assert(reply_message.header.operation == request_message.header.operation);
99
-
100
- sequence.stalled_queue.add(.{
101
- .client_index = client_index,
102
- .request = sequence.clone_message(request_message),
103
- .reply = sequence.clone_message(reply_message),
104
- }) catch unreachable;
105
- }
106
-
107
- pub fn peek(sequence: *ReplySequence) ?PendingReply {
108
- assert(sequence.stalled_queue.len <= stalled_queue_capacity);
109
-
110
- const commit = sequence.stalled_queue.peek() orelse return null;
111
- if (commit.reply.header.op == sequence.stalled_op) {
112
- return commit;
113
- } else {
114
- assert(commit.reply.header.op > sequence.stalled_op);
115
- return null;
116
- }
117
- }
118
-
119
- pub fn next(sequence: *ReplySequence) void {
120
- const commit = sequence.stalled_queue.remove();
121
- assert(commit.reply.header.op == sequence.stalled_op);
122
-
123
- sequence.stalled_op += 1;
124
- sequence.message_pool.unref(commit.reply);
125
- sequence.message_pool.unref(commit.request);
126
- }
127
-
128
- /// Copy the message from a Client's MessagePool to the ReplySequence's MessagePool.
129
- ///
130
- /// The client has a finite amount of messages in its pool, and the ReplySequence needs to hold
131
- /// onto requests/replies until all preceeding requests/replies have arrived.
132
- ///
133
- /// Returns the ReplySequence's message.
134
- fn clone_message(sequence: *ReplySequence, message_client: *const Message) *Message {
135
- const message_sequence = sequence.message_pool.get_message();
136
- stdx.copy_disjoint(.exact, u8, message_sequence.buffer, message_client.buffer);
137
- return message_sequence;
138
- }
139
- };
@@ -1,250 +0,0 @@
1
- const std = @import("std");
2
- const assert = std.debug.assert;
3
-
4
- const constants = @import("../constants.zig");
5
- const vsr = @import("../vsr.zig");
6
- const log = std.log.scoped(.state_machine);
7
-
8
- pub fn StateMachineType(comptime Storage: type, comptime constants_: struct {
9
- message_body_size_max: usize,
10
- lsm_batch_multiple: usize,
11
- }) type {
12
- _ = Storage;
13
- _ = constants_;
14
-
15
- return struct {
16
- const StateMachine = @This();
17
- const Grid = @import("../lsm/grid.zig").GridType(Storage);
18
-
19
- pub const Workload = WorkloadType(StateMachine);
20
-
21
- pub const Operation = enum(u8) {
22
- /// Operations reserved by VR protocol (for all state machines):
23
- reserved,
24
- root,
25
- register,
26
-
27
- echo,
28
- };
29
-
30
- pub const Options = struct {};
31
-
32
- options: Options,
33
- grid: *Grid,
34
- grid_block: Grid.BlockPtr,
35
- grid_write: Grid.Write = undefined,
36
- prepare_timestamp: u64 = 0,
37
- commit_timestamp: u64 = 0,
38
-
39
- callback: ?fn (state_machine: *StateMachine) void = null,
40
-
41
- pub fn init(allocator: std.mem.Allocator, grid: *Grid, options: Options) !StateMachine {
42
- const grid_block = try allocator.alignedAlloc(
43
- u8,
44
- constants.sector_size,
45
- constants.block_size,
46
- );
47
- errdefer allocator.free(grid_block);
48
- std.mem.set(u8, grid_block, 0);
49
-
50
- return StateMachine{
51
- .options = options,
52
- .grid = grid,
53
- .grid_block = grid_block[0..constants.block_size],
54
- };
55
- }
56
-
57
- pub fn deinit(state_machine: *StateMachine, allocator: std.mem.Allocator) void {
58
- allocator.free(state_machine.grid_block);
59
- }
60
-
61
- // TODO Grid.next_tick
62
- pub fn open(state_machine: *StateMachine, callback: fn (*StateMachine) void) void {
63
- callback(state_machine);
64
- }
65
-
66
- pub fn prepare(
67
- state_machine: *StateMachine,
68
- operation: Operation,
69
- input: []u8,
70
- ) u64 {
71
- _ = operation;
72
- _ = input;
73
-
74
- return state_machine.prepare_timestamp;
75
- }
76
-
77
- pub fn prefetch(
78
- state_machine: *StateMachine,
79
- callback: fn (*StateMachine) void,
80
- op: u64,
81
- operation: Operation,
82
- input: []const u8,
83
- ) void {
84
- _ = op;
85
- _ = operation;
86
- _ = input;
87
-
88
- state_machine.next_tick(callback);
89
- }
90
-
91
- pub fn commit(
92
- state_machine: *StateMachine,
93
- client: u128,
94
- op: u64,
95
- timestamp: u64,
96
- operation: Operation,
97
- input: []const u8,
98
- output: []u8,
99
- ) usize {
100
- _ = state_machine;
101
- _ = client;
102
- _ = timestamp;
103
- _ = input;
104
- _ = output;
105
- assert(op != 0);
106
-
107
- switch (operation) {
108
- .reserved, .root => unreachable,
109
- .register => return 0,
110
- .echo => {
111
- std.mem.copy(u8, output, input);
112
- return input.len;
113
- },
114
- }
115
- }
116
-
117
- // TODO(Grid Recovery): Actually write blocks so that this state machine can be used
118
- // to test grid recovery.
119
- pub fn compact(
120
- state_machine: *StateMachine,
121
- callback: fn (*StateMachine) void,
122
- op: u64,
123
- ) void {
124
- _ = op;
125
- state_machine.next_tick(callback);
126
- }
127
-
128
- pub fn checkpoint(
129
- state_machine: *StateMachine,
130
- callback: fn (*StateMachine) void,
131
- ) void {
132
- state_machine.next_tick(callback);
133
- }
134
-
135
- // TODO Replace with Grid.next_tick()
136
- fn next_tick(state_machine: *StateMachine, callback: fn (*StateMachine) void) void {
137
- // TODO This is a hack to defer till the next tick; use Grid.next_tick instead.
138
- var free_set = state_machine.grid.superblock.free_set;
139
- const reservation = free_set.reserve(1).?;
140
- defer free_set.forfeit(reservation);
141
-
142
- const address = free_set.acquire(reservation).?;
143
- const header = std.mem.bytesAsValue(
144
- vsr.Header,
145
- state_machine.grid_block[0..@sizeOf(vsr.Header)],
146
- );
147
- header.op = address;
148
-
149
- assert(state_machine.callback == null);
150
- state_machine.callback = callback;
151
- state_machine.grid.write_block(
152
- next_tick_callback,
153
- &state_machine.grid_write,
154
- &state_machine.grid_block,
155
- address,
156
- );
157
- }
158
-
159
- fn next_tick_callback(write: *Grid.Write) void {
160
- const state_machine = @fieldParentPtr(StateMachine, "grid_write", write);
161
- const callback = state_machine.callback.?;
162
- state_machine.callback = null;
163
- callback(state_machine);
164
- }
165
- };
166
- }
167
-
168
- fn WorkloadType(comptime StateMachine: type) type {
169
- return struct {
170
- const Workload = @This();
171
-
172
- random: std.rand.Random,
173
- requests_sent: usize = 0,
174
- requests_delivered: usize = 0,
175
-
176
- pub fn init(
177
- allocator: std.mem.Allocator,
178
- random: std.rand.Random,
179
- options: Options,
180
- ) !Workload {
181
- _ = allocator;
182
- _ = options;
183
-
184
- return Workload{
185
- .random = random,
186
- };
187
- }
188
-
189
- pub fn deinit(workload: *Workload, allocator: std.mem.Allocator) void {
190
- _ = workload;
191
- _ = allocator;
192
- }
193
-
194
- pub fn done(workload: *const Workload) bool {
195
- return workload.requests_sent == workload.requests_delivered;
196
- }
197
-
198
- pub fn build_request(
199
- workload: *Workload,
200
- client_index: usize,
201
- body: []align(@alignOf(vsr.Header)) u8,
202
- ) struct {
203
- operation: StateMachine.Operation,
204
- size: usize,
205
- } {
206
- _ = client_index;
207
-
208
- workload.requests_sent += 1;
209
-
210
- // +1 for inclusive limit.
211
- const size = workload.random.uintLessThan(usize, constants.message_body_size_max + 1);
212
- workload.random.bytes(body[0..size]);
213
-
214
- return .{
215
- .operation = .echo,
216
- .size = size,
217
- };
218
- }
219
-
220
- pub fn on_reply(
221
- workload: *Workload,
222
- client_index: usize,
223
- operation: vsr.Operation,
224
- timestamp: u64,
225
- request_body: []align(@alignOf(vsr.Header)) const u8,
226
- reply_body: []align(@alignOf(vsr.Header)) const u8,
227
- ) void {
228
- _ = workload;
229
- _ = client_index;
230
- _ = timestamp;
231
-
232
- workload.requests_delivered += 1;
233
- assert(workload.requests_delivered <= workload.requests_sent);
234
-
235
- assert(operation.cast(StateMachine) == .echo);
236
- assert(std.mem.eql(u8, request_body, reply_body));
237
- }
238
-
239
- pub const Options = struct {
240
- pub fn generate(random: std.rand.Random, options: struct {
241
- client_count: usize,
242
- in_flight_max: usize,
243
- }) Options {
244
- _ = random;
245
- _ = options;
246
- return .{};
247
- }
248
- };
249
- };
250
- }