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.
- package/README.md +5 -10
- package/dist/bin/aarch64-linux-gnu/client.node +0 -0
- package/dist/bin/aarch64-linux-musl/client.node +0 -0
- package/dist/bin/aarch64-macos/client.node +0 -0
- package/dist/bin/x86_64-linux-gnu/client.node +0 -0
- package/dist/bin/x86_64-linux-musl/client.node +0 -0
- package/dist/bin/x86_64-macos/client.node +0 -0
- package/dist/index.js +33 -1
- package/dist/index.js.map +1 -1
- package/package-lock.json +66 -0
- package/package.json +6 -16
- package/src/index.ts +56 -1
- package/src/node.zig +9 -9
- package/dist/.client.node.sha256 +0 -1
- package/scripts/build_lib.sh +0 -61
- package/scripts/download_node_headers.sh +0 -32
- package/src/tigerbeetle/scripts/benchmark.bat +0 -55
- package/src/tigerbeetle/scripts/benchmark.sh +0 -66
- package/src/tigerbeetle/scripts/confirm_image.sh +0 -44
- package/src/tigerbeetle/scripts/fail_on_diff.sh +0 -9
- package/src/tigerbeetle/scripts/fuzz_loop.sh +0 -15
- package/src/tigerbeetle/scripts/fuzz_loop_hash_log.sh +0 -12
- package/src/tigerbeetle/scripts/fuzz_unique_errors.sh +0 -7
- package/src/tigerbeetle/scripts/install.bat +0 -7
- package/src/tigerbeetle/scripts/install.sh +0 -21
- package/src/tigerbeetle/scripts/install_zig.bat +0 -113
- package/src/tigerbeetle/scripts/install_zig.sh +0 -90
- package/src/tigerbeetle/scripts/lint.zig +0 -199
- package/src/tigerbeetle/scripts/pre-commit.sh +0 -9
- package/src/tigerbeetle/scripts/scripts/benchmark.bat +0 -55
- package/src/tigerbeetle/scripts/scripts/benchmark.sh +0 -66
- package/src/tigerbeetle/scripts/scripts/confirm_image.sh +0 -44
- package/src/tigerbeetle/scripts/scripts/fail_on_diff.sh +0 -9
- package/src/tigerbeetle/scripts/scripts/fuzz_loop.sh +0 -15
- package/src/tigerbeetle/scripts/scripts/fuzz_loop_hash_log.sh +0 -12
- package/src/tigerbeetle/scripts/scripts/fuzz_unique_errors.sh +0 -7
- package/src/tigerbeetle/scripts/scripts/install.bat +0 -7
- package/src/tigerbeetle/scripts/scripts/install.sh +0 -21
- package/src/tigerbeetle/scripts/scripts/install_zig.bat +0 -113
- package/src/tigerbeetle/scripts/scripts/install_zig.sh +0 -90
- package/src/tigerbeetle/scripts/scripts/lint.zig +0 -199
- package/src/tigerbeetle/scripts/scripts/pre-commit.sh +0 -9
- package/src/tigerbeetle/scripts/scripts/shellcheck.sh +0 -5
- package/src/tigerbeetle/scripts/scripts/tests_on_alpine.sh +0 -10
- package/src/tigerbeetle/scripts/scripts/tests_on_ubuntu.sh +0 -14
- package/src/tigerbeetle/scripts/scripts/upgrade_ubuntu_kernel.sh +0 -48
- package/src/tigerbeetle/scripts/scripts/validate_docs.sh +0 -23
- package/src/tigerbeetle/scripts/scripts/vr_state_enumerate +0 -46
- package/src/tigerbeetle/scripts/shellcheck.sh +0 -5
- package/src/tigerbeetle/scripts/tests_on_alpine.sh +0 -10
- package/src/tigerbeetle/scripts/tests_on_ubuntu.sh +0 -14
- package/src/tigerbeetle/scripts/upgrade_ubuntu_kernel.sh +0 -48
- package/src/tigerbeetle/scripts/validate_docs.sh +0 -23
- package/src/tigerbeetle/scripts/vr_state_enumerate +0 -46
- package/src/tigerbeetle/src/benchmark.zig +0 -336
- package/src/tigerbeetle/src/config.zig +0 -233
- package/src/tigerbeetle/src/constants.zig +0 -428
- package/src/tigerbeetle/src/ewah.zig +0 -286
- package/src/tigerbeetle/src/ewah_benchmark.zig +0 -120
- package/src/tigerbeetle/src/ewah_fuzz.zig +0 -130
- package/src/tigerbeetle/src/fifo.zig +0 -120
- package/src/tigerbeetle/src/io/benchmark.zig +0 -213
- package/src/tigerbeetle/src/io/darwin.zig +0 -814
- package/src/tigerbeetle/src/io/linux.zig +0 -1071
- package/src/tigerbeetle/src/io/test.zig +0 -643
- package/src/tigerbeetle/src/io/windows.zig +0 -1183
- package/src/tigerbeetle/src/io.zig +0 -34
- package/src/tigerbeetle/src/iops.zig +0 -107
- package/src/tigerbeetle/src/lsm/README.md +0 -308
- package/src/tigerbeetle/src/lsm/binary_search.zig +0 -341
- package/src/tigerbeetle/src/lsm/bloom_filter.zig +0 -125
- package/src/tigerbeetle/src/lsm/compaction.zig +0 -603
- package/src/tigerbeetle/src/lsm/composite_key.zig +0 -77
- package/src/tigerbeetle/src/lsm/direction.zig +0 -11
- package/src/tigerbeetle/src/lsm/eytzinger.zig +0 -587
- package/src/tigerbeetle/src/lsm/eytzinger_benchmark.zig +0 -330
- package/src/tigerbeetle/src/lsm/forest.zig +0 -205
- package/src/tigerbeetle/src/lsm/forest_fuzz.zig +0 -450
- package/src/tigerbeetle/src/lsm/grid.zig +0 -573
- package/src/tigerbeetle/src/lsm/groove.zig +0 -1036
- package/src/tigerbeetle/src/lsm/k_way_merge.zig +0 -474
- package/src/tigerbeetle/src/lsm/level_iterator.zig +0 -332
- package/src/tigerbeetle/src/lsm/manifest.zig +0 -617
- package/src/tigerbeetle/src/lsm/manifest_level.zig +0 -878
- package/src/tigerbeetle/src/lsm/manifest_log.zig +0 -789
- package/src/tigerbeetle/src/lsm/manifest_log_fuzz.zig +0 -691
- package/src/tigerbeetle/src/lsm/merge_iterator.zig +0 -106
- package/src/tigerbeetle/src/lsm/node_pool.zig +0 -235
- package/src/tigerbeetle/src/lsm/posted_groove.zig +0 -381
- package/src/tigerbeetle/src/lsm/segmented_array.zig +0 -1329
- package/src/tigerbeetle/src/lsm/segmented_array_benchmark.zig +0 -148
- package/src/tigerbeetle/src/lsm/segmented_array_fuzz.zig +0 -9
- package/src/tigerbeetle/src/lsm/set_associative_cache.zig +0 -850
- package/src/tigerbeetle/src/lsm/table.zig +0 -1009
- package/src/tigerbeetle/src/lsm/table_immutable.zig +0 -192
- package/src/tigerbeetle/src/lsm/table_iterator.zig +0 -340
- package/src/tigerbeetle/src/lsm/table_mutable.zig +0 -203
- package/src/tigerbeetle/src/lsm/test.zig +0 -439
- package/src/tigerbeetle/src/lsm/tree.zig +0 -1169
- package/src/tigerbeetle/src/lsm/tree_fuzz.zig +0 -479
- package/src/tigerbeetle/src/message_bus.zig +0 -1013
- package/src/tigerbeetle/src/message_pool.zig +0 -156
- package/src/tigerbeetle/src/ring_buffer.zig +0 -399
- package/src/tigerbeetle/src/simulator.zig +0 -580
- package/src/tigerbeetle/src/state_machine/auditor.zig +0 -578
- package/src/tigerbeetle/src/state_machine/workload.zig +0 -883
- package/src/tigerbeetle/src/state_machine.zig +0 -2099
- package/src/tigerbeetle/src/static_allocator.zig +0 -65
- package/src/tigerbeetle/src/stdx.zig +0 -171
- package/src/tigerbeetle/src/storage.zig +0 -393
- package/src/tigerbeetle/src/testing/cluster/message_bus.zig +0 -82
- package/src/tigerbeetle/src/testing/cluster/network.zig +0 -237
- package/src/tigerbeetle/src/testing/cluster/state_checker.zig +0 -169
- package/src/tigerbeetle/src/testing/cluster/storage_checker.zig +0 -202
- package/src/tigerbeetle/src/testing/cluster.zig +0 -444
- package/src/tigerbeetle/src/testing/fuzz.zig +0 -140
- package/src/tigerbeetle/src/testing/hash_log.zig +0 -66
- package/src/tigerbeetle/src/testing/id.zig +0 -99
- package/src/tigerbeetle/src/testing/packet_simulator.zig +0 -374
- package/src/tigerbeetle/src/testing/priority_queue.zig +0 -645
- package/src/tigerbeetle/src/testing/reply_sequence.zig +0 -139
- package/src/tigerbeetle/src/testing/state_machine.zig +0 -250
- package/src/tigerbeetle/src/testing/storage.zig +0 -757
- package/src/tigerbeetle/src/testing/table.zig +0 -247
- package/src/tigerbeetle/src/testing/time.zig +0 -84
- package/src/tigerbeetle/src/tigerbeetle.zig +0 -227
- package/src/tigerbeetle/src/time.zig +0 -112
- package/src/tigerbeetle/src/tracer.zig +0 -529
- package/src/tigerbeetle/src/unit_tests.zig +0 -40
- package/src/tigerbeetle/src/vopr.zig +0 -495
- package/src/tigerbeetle/src/vsr/README.md +0 -209
- package/src/tigerbeetle/src/vsr/client.zig +0 -544
- package/src/tigerbeetle/src/vsr/clock.zig +0 -855
- package/src/tigerbeetle/src/vsr/journal.zig +0 -2415
- package/src/tigerbeetle/src/vsr/journal_format_fuzz.zig +0 -111
- package/src/tigerbeetle/src/vsr/marzullo.zig +0 -309
- package/src/tigerbeetle/src/vsr/replica.zig +0 -6616
- package/src/tigerbeetle/src/vsr/replica_format.zig +0 -219
- package/src/tigerbeetle/src/vsr/superblock.zig +0 -1631
- package/src/tigerbeetle/src/vsr/superblock_client_table.zig +0 -256
- package/src/tigerbeetle/src/vsr/superblock_free_set.zig +0 -929
- package/src/tigerbeetle/src/vsr/superblock_free_set_fuzz.zig +0 -334
- package/src/tigerbeetle/src/vsr/superblock_fuzz.zig +0 -390
- package/src/tigerbeetle/src/vsr/superblock_manifest.zig +0 -615
- package/src/tigerbeetle/src/vsr/superblock_quorums.zig +0 -394
- package/src/tigerbeetle/src/vsr/superblock_quorums_fuzz.zig +0 -314
- 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
|
-
}
|