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.
- package/README.md +212 -196
- 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 +8 -17
- package/src/index.ts +56 -1
- package/src/node.zig +10 -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 -48
- package/src/tigerbeetle/scripts/benchmark.sh +0 -66
- package/src/tigerbeetle/scripts/confirm_image.sh +0 -44
- package/src/tigerbeetle/scripts/fuzz_loop.sh +0 -15
- 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 -48
- package/src/tigerbeetle/scripts/scripts/benchmark.sh +0 -66
- package/src/tigerbeetle/scripts/scripts/confirm_image.sh +0 -44
- package/src/tigerbeetle/scripts/scripts/fuzz_loop.sh +0 -15
- 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 -314
- package/src/tigerbeetle/src/config.zig +0 -234
- package/src/tigerbeetle/src/constants.zig +0 -436
- 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 -1062
- 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 -204
- package/src/tigerbeetle/src/lsm/forest_fuzz.zig +0 -401
- package/src/tigerbeetle/src/lsm/grid.zig +0 -573
- package/src/tigerbeetle/src/lsm/groove.zig +0 -972
- 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 -877
- 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 -378
- package/src/tigerbeetle/src/lsm/segmented_array.zig +0 -1328
- 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 -1031
- package/src/tigerbeetle/src/lsm/table_immutable.zig +0 -203
- package/src/tigerbeetle/src/lsm/table_iterator.zig +0 -340
- package/src/tigerbeetle/src/lsm/table_mutable.zig +0 -220
- package/src/tigerbeetle/src/lsm/test.zig +0 -438
- package/src/tigerbeetle/src/lsm/tree.zig +0 -1193
- package/src/tigerbeetle/src/lsm/tree_fuzz.zig +0 -474
- package/src/tigerbeetle/src/message_bus.zig +0 -1012
- 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 -569
- package/src/tigerbeetle/src/state_machine/auditor.zig +0 -577
- package/src/tigerbeetle/src/state_machine/workload.zig +0 -883
- package/src/tigerbeetle/src/state_machine.zig +0 -1881
- package/src/tigerbeetle/src/static_allocator.zig +0 -65
- package/src/tigerbeetle/src/stdx.zig +0 -162
- 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 -443
- 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 -364
- 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 -249
- 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 -42
- 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 -853
- package/src/tigerbeetle/src/vsr/journal.zig +0 -2413
- 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 -6381
- 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 -1352
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
const std = @import("std");
|
|
2
|
-
const assert = std.debug.assert;
|
|
3
|
-
|
|
4
|
-
const stdx = @import("../stdx.zig");
|
|
5
|
-
|
|
6
|
-
const k_max = 2;
|
|
7
|
-
|
|
8
|
-
pub fn MergeIteratorType(
|
|
9
|
-
comptime Table: type,
|
|
10
|
-
comptime IteratorA: type,
|
|
11
|
-
comptime IteratorB: type,
|
|
12
|
-
) type {
|
|
13
|
-
return struct {
|
|
14
|
-
const Self = @This();
|
|
15
|
-
|
|
16
|
-
iterator_a: *IteratorA,
|
|
17
|
-
iterator_b: *IteratorB,
|
|
18
|
-
|
|
19
|
-
empty_a: bool,
|
|
20
|
-
empty_b: bool,
|
|
21
|
-
|
|
22
|
-
previous_key_popped: ?Table.Key,
|
|
23
|
-
|
|
24
|
-
pub fn init(
|
|
25
|
-
iterator_a: *IteratorA,
|
|
26
|
-
iterator_b: *IteratorB,
|
|
27
|
-
) Self {
|
|
28
|
-
return Self{
|
|
29
|
-
.iterator_a = iterator_a,
|
|
30
|
-
.iterator_b = iterator_b,
|
|
31
|
-
.empty_a = false,
|
|
32
|
-
.empty_b = false,
|
|
33
|
-
.previous_key_popped = null,
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/// Returns `true` once both `iterator_a` and `iterator_b` have raised `error.Empty`.
|
|
38
|
-
pub fn empty(it: Self) bool {
|
|
39
|
-
return it.empty_a and it.empty_b;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/// Returns `null` if either `iterator_a` or `iterator_b` return `error.Empty` or `error.Drained`.
|
|
43
|
-
/// Check `it.empty()` to disambiguate.
|
|
44
|
-
pub fn pop(it: *Self) ?Table.Value {
|
|
45
|
-
while (true) {
|
|
46
|
-
if (it.empty_a and it.empty_b) {
|
|
47
|
-
return null;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
if (it.empty_a) {
|
|
51
|
-
_ = it.iterator_b.peek() catch |error_b| switch (error_b) {
|
|
52
|
-
error.Drained => return null,
|
|
53
|
-
error.Empty => {
|
|
54
|
-
it.empty_b = true;
|
|
55
|
-
continue;
|
|
56
|
-
},
|
|
57
|
-
};
|
|
58
|
-
return it.iterator_b.pop();
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
if (it.empty_b) {
|
|
62
|
-
_ = it.iterator_a.peek() catch |error_a| switch (error_a) {
|
|
63
|
-
error.Drained => return null,
|
|
64
|
-
error.Empty => {
|
|
65
|
-
it.empty_a = true;
|
|
66
|
-
continue;
|
|
67
|
-
},
|
|
68
|
-
};
|
|
69
|
-
return it.iterator_a.pop();
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
const key_a = it.iterator_a.peek() catch |error_a| switch (error_a) {
|
|
73
|
-
error.Drained => return null,
|
|
74
|
-
error.Empty => {
|
|
75
|
-
it.empty_a = true;
|
|
76
|
-
continue;
|
|
77
|
-
},
|
|
78
|
-
};
|
|
79
|
-
const key_b = it.iterator_b.peek() catch |error_b| switch (error_b) {
|
|
80
|
-
error.Drained => return null,
|
|
81
|
-
error.Empty => {
|
|
82
|
-
it.empty_b = true;
|
|
83
|
-
continue;
|
|
84
|
-
},
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
switch (Table.compare_keys(key_a, key_b)) {
|
|
88
|
-
.lt => return it.iterator_a.pop(),
|
|
89
|
-
.gt => return it.iterator_b.pop(),
|
|
90
|
-
.eq => {
|
|
91
|
-
const value_a = it.iterator_a.pop();
|
|
92
|
-
const value_b = it.iterator_b.pop();
|
|
93
|
-
switch (Table.usage) {
|
|
94
|
-
.general => return value_a,
|
|
95
|
-
.secondary_index => {
|
|
96
|
-
// In secondary indexes, puts and removes alternate and can be safely cancelled out.
|
|
97
|
-
assert(Table.tombstone(&value_a) != Table.tombstone(&value_b));
|
|
98
|
-
continue;
|
|
99
|
-
},
|
|
100
|
-
}
|
|
101
|
-
},
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
};
|
|
106
|
-
}
|
|
@@ -1,235 +0,0 @@
|
|
|
1
|
-
const std = @import("std");
|
|
2
|
-
const assert = std.debug.assert;
|
|
3
|
-
const math = std.math;
|
|
4
|
-
const mem = std.mem;
|
|
5
|
-
const meta = std.meta;
|
|
6
|
-
|
|
7
|
-
pub fn NodePool(comptime _node_size: u32, comptime _node_alignment: u13) type {
|
|
8
|
-
return struct {
|
|
9
|
-
const Self = @This();
|
|
10
|
-
|
|
11
|
-
pub const node_size = _node_size;
|
|
12
|
-
pub const node_alignment = _node_alignment;
|
|
13
|
-
pub const Node = *align(node_alignment) [node_size]u8;
|
|
14
|
-
|
|
15
|
-
comptime {
|
|
16
|
-
assert(node_size > 0);
|
|
17
|
-
assert(node_alignment > 0);
|
|
18
|
-
assert(node_alignment <= 4096);
|
|
19
|
-
assert(math.isPowerOfTwo(node_size));
|
|
20
|
-
assert(math.isPowerOfTwo(node_alignment));
|
|
21
|
-
assert(node_size % node_alignment == 0);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
buffer: []align(node_alignment) u8,
|
|
25
|
-
free: std.bit_set.DynamicBitSetUnmanaged,
|
|
26
|
-
|
|
27
|
-
pub fn init(allocator: mem.Allocator, node_count: u32) !Self {
|
|
28
|
-
assert(node_count > 0);
|
|
29
|
-
|
|
30
|
-
const size = node_size * node_count;
|
|
31
|
-
const buffer = try allocator.allocAdvanced(u8, node_alignment, size, .exact);
|
|
32
|
-
errdefer allocator.free(buffer);
|
|
33
|
-
|
|
34
|
-
const free = try std.bit_set.DynamicBitSetUnmanaged.initFull(allocator, node_count);
|
|
35
|
-
errdefer free.deinit(allocator);
|
|
36
|
-
|
|
37
|
-
return Self{
|
|
38
|
-
.buffer = buffer,
|
|
39
|
-
.free = free,
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
pub fn deinit(pool: *Self, allocator: mem.Allocator) void {
|
|
44
|
-
// If the NodePool is being deinitialized, all nodes should have already been
|
|
45
|
-
// released to the pool.
|
|
46
|
-
assert(pool.free.count() == pool.free.bit_length);
|
|
47
|
-
|
|
48
|
-
allocator.free(pool.buffer);
|
|
49
|
-
pool.free.deinit(allocator);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
pub fn acquire(pool: *Self) Node {
|
|
53
|
-
// TODO: To ensure this "unreachable" is never reached, the primary must reject
|
|
54
|
-
// new requests when storage space is too low to fulfill them.
|
|
55
|
-
const node_index = pool.free.findFirstSet() orelse unreachable;
|
|
56
|
-
assert(pool.free.isSet(node_index));
|
|
57
|
-
pool.free.unset(node_index);
|
|
58
|
-
|
|
59
|
-
return pool.buffer[node_index * node_size ..][0..node_size];
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
pub fn release(pool: *Self, node: Node) void {
|
|
63
|
-
// Our pointer arithmetic assumes that the unit of node_size is a u8.
|
|
64
|
-
comptime assert(meta.Elem(Node) == u8);
|
|
65
|
-
comptime assert(meta.Elem(@TypeOf(pool.buffer)) == u8);
|
|
66
|
-
|
|
67
|
-
assert(@ptrToInt(node) >= @ptrToInt(pool.buffer.ptr));
|
|
68
|
-
assert(@ptrToInt(node) + node_size <= @ptrToInt(pool.buffer.ptr) + pool.buffer.len);
|
|
69
|
-
|
|
70
|
-
const node_index = @divExact(@ptrToInt(node) - @ptrToInt(pool.buffer.ptr), node_size);
|
|
71
|
-
assert(!pool.free.isSet(node_index));
|
|
72
|
-
pool.free.set(node_index);
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
fn TestContext(comptime node_size: usize, comptime node_alignment: u12) type {
|
|
78
|
-
const testing = std.testing;
|
|
79
|
-
const TestPool = NodePool(node_size, node_alignment);
|
|
80
|
-
|
|
81
|
-
const log = false;
|
|
82
|
-
|
|
83
|
-
return struct {
|
|
84
|
-
const Self = @This();
|
|
85
|
-
|
|
86
|
-
node_count: u32,
|
|
87
|
-
random: std.rand.Random,
|
|
88
|
-
node_pool: TestPool,
|
|
89
|
-
node_map: std.AutoArrayHashMap(TestPool.Node, u64),
|
|
90
|
-
sentinel: u64,
|
|
91
|
-
|
|
92
|
-
acquires: u64 = 0,
|
|
93
|
-
releases: u64 = 0,
|
|
94
|
-
|
|
95
|
-
fn init(random: std.rand.Random, node_count: u32) !Self {
|
|
96
|
-
var node_pool = try TestPool.init(testing.allocator, node_count);
|
|
97
|
-
errdefer node_pool.deinit(testing.allocator);
|
|
98
|
-
|
|
99
|
-
var node_map = std.AutoArrayHashMap(TestPool.Node, u64).init(testing.allocator);
|
|
100
|
-
errdefer node_map.deinit();
|
|
101
|
-
|
|
102
|
-
const sentinel = random.int(u64);
|
|
103
|
-
mem.set(u64, mem.bytesAsSlice(u64, node_pool.buffer), sentinel);
|
|
104
|
-
|
|
105
|
-
return Self{
|
|
106
|
-
.node_count = node_count,
|
|
107
|
-
.random = random,
|
|
108
|
-
.node_pool = node_pool,
|
|
109
|
-
.node_map = node_map,
|
|
110
|
-
.sentinel = sentinel,
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
fn deinit(context: *Self) void {
|
|
115
|
-
context.node_pool.deinit(testing.allocator);
|
|
116
|
-
context.node_map.deinit();
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
fn run(context: *Self) !void {
|
|
120
|
-
{
|
|
121
|
-
var i: usize = 0;
|
|
122
|
-
while (i < context.node_count * 4) : (i += 1) {
|
|
123
|
-
switch (context.random.uintLessThanBiased(u32, 100)) {
|
|
124
|
-
0...59 => try context.acquire(),
|
|
125
|
-
60...99 => try context.release(),
|
|
126
|
-
else => unreachable,
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
{
|
|
132
|
-
var i: usize = 0;
|
|
133
|
-
while (i < context.node_count * 4) : (i += 1) {
|
|
134
|
-
switch (context.random.uintLessThanBiased(u32, 100)) {
|
|
135
|
-
0...39 => try context.acquire(),
|
|
136
|
-
40...99 => try context.release(),
|
|
137
|
-
else => unreachable,
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
try context.release_all();
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
fn acquire(context: *Self) !void {
|
|
146
|
-
if (context.node_map.count() == context.node_count) return;
|
|
147
|
-
|
|
148
|
-
const node = context.node_pool.acquire();
|
|
149
|
-
|
|
150
|
-
// Verify that this node has not already been acquired.
|
|
151
|
-
for (mem.bytesAsSlice(u64, node)) |word| {
|
|
152
|
-
try testing.expectEqual(context.sentinel, word);
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
const gop = try context.node_map.getOrPut(node);
|
|
156
|
-
try testing.expect(!gop.found_existing);
|
|
157
|
-
|
|
158
|
-
// Write unique data into the node so we can test that it doesn't get overwritten.
|
|
159
|
-
const id = context.random.int(u64);
|
|
160
|
-
mem.set(u64, mem.bytesAsSlice(u64, node), id);
|
|
161
|
-
gop.value_ptr.* = id;
|
|
162
|
-
|
|
163
|
-
context.acquires += 1;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
fn release(context: *Self) !void {
|
|
167
|
-
if (context.node_map.count() == 0) return;
|
|
168
|
-
|
|
169
|
-
const index = context.random.uintLessThanBiased(usize, context.node_map.count());
|
|
170
|
-
const node = context.node_map.keys()[index];
|
|
171
|
-
const id = context.node_map.values()[index];
|
|
172
|
-
|
|
173
|
-
// Verify that the data of this node has not been overwritten since we acquired it.
|
|
174
|
-
for (mem.bytesAsSlice(u64, node)) |word| {
|
|
175
|
-
try testing.expectEqual(id, word);
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
mem.set(u64, mem.bytesAsSlice(u64, node), context.sentinel);
|
|
179
|
-
context.node_pool.release(node);
|
|
180
|
-
context.node_map.swapRemoveAt(index);
|
|
181
|
-
|
|
182
|
-
context.releases += 1;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
fn release_all(context: *Self) !void {
|
|
186
|
-
while (context.node_map.count() > 0) try context.release();
|
|
187
|
-
|
|
188
|
-
// Verify that nothing in the entire buffer has been acquired.
|
|
189
|
-
for (mem.bytesAsSlice(u64, context.node_pool.buffer)) |word| {
|
|
190
|
-
try testing.expectEqual(context.sentinel, word);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
if (log) {
|
|
194
|
-
std.debug.print("\nacquires: {}, releases: {}\n", .{
|
|
195
|
-
context.acquires,
|
|
196
|
-
context.releases,
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
try testing.expect(context.acquires > 0);
|
|
201
|
-
try testing.expect(context.acquires == context.releases);
|
|
202
|
-
}
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
test "NodePool" {
|
|
207
|
-
const seed = 42;
|
|
208
|
-
|
|
209
|
-
var prng = std.rand.DefaultPrng.init(seed);
|
|
210
|
-
const random = prng.random();
|
|
211
|
-
|
|
212
|
-
const Tuple = struct {
|
|
213
|
-
node_size: u32,
|
|
214
|
-
node_alignment: u12,
|
|
215
|
-
};
|
|
216
|
-
|
|
217
|
-
inline for (.{
|
|
218
|
-
Tuple{ .node_size = 8, .node_alignment = 8 },
|
|
219
|
-
Tuple{ .node_size = 16, .node_alignment = 8 },
|
|
220
|
-
Tuple{ .node_size = 64, .node_alignment = 8 },
|
|
221
|
-
Tuple{ .node_size = 16, .node_alignment = 16 },
|
|
222
|
-
Tuple{ .node_size = 32, .node_alignment = 16 },
|
|
223
|
-
Tuple{ .node_size = 128, .node_alignment = 16 },
|
|
224
|
-
}) |tuple| {
|
|
225
|
-
const Context = TestContext(tuple.node_size, tuple.node_alignment);
|
|
226
|
-
|
|
227
|
-
var i: u32 = 1;
|
|
228
|
-
while (i < 64) : (i += 1) {
|
|
229
|
-
var context = try Context.init(random, i);
|
|
230
|
-
defer context.deinit();
|
|
231
|
-
|
|
232
|
-
try context.run();
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
}
|