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,334 +0,0 @@
1
- //! Fuzz FreeSet reserve/acquire/release flow.
2
- //!
3
- //! This fuzzer does *not* cover FreeSet encoding/decoding.
4
- const std = @import("std");
5
- const assert = std.debug.assert;
6
- const log = std.log.scoped(.fuzz_vsr_superblock_free_set);
7
-
8
- const FreeSet = @import("./superblock_free_set.zig").FreeSet;
9
- const Reservation = @import("./superblock_free_set.zig").Reservation;
10
- const fuzz = @import("../testing/fuzz.zig");
11
-
12
- pub const tigerbeetle_config = @import("../config.zig").configs.test_min;
13
-
14
- pub fn main() !void {
15
- const allocator = std.testing.allocator;
16
- const args = try fuzz.parse_fuzz_args(allocator);
17
-
18
- var prng = std.rand.DefaultPrng.init(args.seed);
19
-
20
- const blocks_count = FreeSet.shard_bits * (1 + prng.random().uintLessThan(usize, 10));
21
- const events = try generate_events(allocator, prng.random(), blocks_count);
22
- defer allocator.free(events);
23
-
24
- try run_fuzz(allocator, prng.random(), blocks_count, events);
25
- }
26
-
27
- fn run_fuzz(
28
- allocator: std.mem.Allocator,
29
- random: std.rand.Random,
30
- blocks_count: usize,
31
- events: []const FreeSetEvent,
32
- ) !void {
33
- var free_set = try FreeSet.init(allocator, blocks_count);
34
- defer free_set.deinit(allocator);
35
-
36
- var free_set_model = try FreeSetModel.init(allocator, blocks_count);
37
- defer free_set_model.deinit(allocator);
38
-
39
- var active_reservations = std.ArrayList(Reservation).init(allocator);
40
- defer active_reservations.deinit();
41
-
42
- var active_addresses = std.ArrayList(u64).init(allocator);
43
- defer active_addresses.deinit();
44
-
45
- for (events) |event| {
46
- log.debug("event={}", .{event});
47
- switch (event) {
48
- .reserve => |reserve| {
49
- const reservation_actual = free_set.reserve(reserve.blocks);
50
- const reservation_expect = free_set_model.reserve(reserve.blocks);
51
- assert(std.meta.eql(reservation_expect, reservation_actual));
52
-
53
- if (reservation_expect) |reservation| {
54
- assert(reserve.blocks == free_set_model.count_free_reserved(reservation));
55
- assert(reserve.blocks == free_set.count_free_reserved(reservation));
56
- try active_reservations.append(reservation);
57
- }
58
- },
59
- .forfeit => {
60
- random.shuffle(Reservation, active_reservations.items);
61
- for (active_reservations.items) |reservation| {
62
- free_set.forfeit(reservation);
63
- free_set_model.forfeit(reservation);
64
- }
65
- active_reservations.clearRetainingCapacity();
66
- },
67
- .acquire => |data| {
68
- if (active_reservations.items.len == 0) continue;
69
- const reservation = active_reservations.items[
70
- data.reservation % active_reservations.items.len
71
- ];
72
- const address_actual = free_set.acquire(reservation);
73
- const address_expect = free_set_model.acquire(reservation);
74
- assert(std.meta.eql(address_expect, address_actual));
75
- if (address_expect) |address| {
76
- try active_addresses.append(address);
77
- }
78
- },
79
- .release => |data| {
80
- if (active_addresses.items.len == 0) continue;
81
-
82
- const address_index = data.address % active_addresses.items.len;
83
- const address = active_addresses.swapRemove(address_index);
84
- free_set.release(address);
85
- free_set_model.release(address);
86
- },
87
- .checkpoint => {
88
- random.shuffle(Reservation, active_reservations.items);
89
- for (active_reservations.items) |reservation| {
90
- free_set.forfeit(reservation);
91
- free_set_model.forfeit(reservation);
92
- }
93
- active_reservations.clearRetainingCapacity();
94
-
95
- free_set.checkpoint();
96
- free_set_model.checkpoint();
97
- },
98
- }
99
-
100
- assert(free_set_model.count_reservations() == free_set.count_reservations());
101
- assert(free_set_model.count_free() == free_set.count_free());
102
- assert(free_set_model.count_acquired() == free_set.count_acquired());
103
- assert(std.meta.eql(
104
- free_set_model.highest_address_acquired(),
105
- free_set.highest_address_acquired(),
106
- ));
107
-
108
- for (active_reservations.items) |reservation| {
109
- assert(
110
- free_set_model.count_free_reserved(reservation) ==
111
- free_set.count_free_reserved(reservation),
112
- );
113
- }
114
- }
115
- }
116
-
117
- const FreeSetEventType = std.meta.Tag(FreeSetEvent);
118
- const FreeSetEvent = union(enum) {
119
- reserve: struct { blocks: usize },
120
- forfeit: void,
121
- acquire: struct { reservation: usize },
122
- release: struct { address: usize },
123
- checkpoint: void,
124
- };
125
-
126
- fn generate_events(
127
- allocator: std.mem.Allocator,
128
- random: std.rand.Random,
129
- blocks_count: usize,
130
- ) ![]const FreeSetEvent {
131
- const event_distribution = fuzz.Distribution(FreeSetEventType){
132
- .reserve = 1 + random.float(f64) * 100,
133
- .forfeit = 1,
134
- .acquire = random.float(f64) * 1000,
135
- .release = if (random.boolean()) 0 else 500 * random.float(f64),
136
- .checkpoint = random.floatExp(f64) * 10,
137
- };
138
-
139
- const events = try allocator.alloc(FreeSetEvent, std.math.min(
140
- @as(usize, 2_000_000),
141
- fuzz.random_int_exponential(random, usize, blocks_count * 100),
142
- ));
143
- errdefer allocator.free(events);
144
-
145
- log.info("event_distribution = {d:.2}", .{event_distribution});
146
- log.info("event_count = {d}", .{events.len});
147
-
148
- const reservation_blocks_mean = 1 + random.uintLessThan(usize, @divFloor(blocks_count, 20));
149
- for (events) |*event| {
150
- event.* = switch (fuzz.random_enum(random, FreeSetEventType, event_distribution)) {
151
- .reserve => FreeSetEvent{ .reserve = .{
152
- .blocks = 1 + fuzz.random_int_exponential(random, usize, reservation_blocks_mean),
153
- } },
154
- .forfeit => FreeSetEvent{ .forfeit = {} },
155
- .acquire => FreeSetEvent{ .acquire = .{ .reservation = random.int(usize) } },
156
- .release => FreeSetEvent{ .release = .{
157
- .address = random.int(usize),
158
- } },
159
- .checkpoint => FreeSetEvent{ .checkpoint = {} },
160
- };
161
- }
162
- return events;
163
- }
164
-
165
- const FreeSetModel = struct {
166
- /// Set bits indicate acquired blocks.
167
- blocks_acquired: std.DynamicBitSetUnmanaged,
168
-
169
- /// Set bits indicate blocks that will be released at the next checkpoint.
170
- blocks_released: std.DynamicBitSetUnmanaged,
171
-
172
- /// Set bits indicate blocks that are currently reserved and not yet forfeited.
173
- blocks_reserved: std.DynamicBitSetUnmanaged,
174
-
175
- reservation_count: usize = 0,
176
- reservation_session: usize = 1,
177
-
178
- fn init(allocator: std.mem.Allocator, blocks_count: usize) !FreeSetModel {
179
- var blocks_acquired = try std.DynamicBitSetUnmanaged.initEmpty(allocator, blocks_count);
180
- errdefer blocks_acquired.deinit(allocator);
181
-
182
- var blocks_released = try std.DynamicBitSetUnmanaged.initEmpty(allocator, blocks_count);
183
- errdefer blocks_released.deinit(allocator);
184
-
185
- var blocks_reserved = try std.DynamicBitSetUnmanaged.initEmpty(allocator, blocks_count);
186
- errdefer blocks_reserved.deinit(allocator);
187
-
188
- return FreeSetModel{
189
- .blocks_acquired = blocks_acquired,
190
- .blocks_released = blocks_released,
191
- .blocks_reserved = blocks_reserved,
192
- };
193
- }
194
-
195
- fn deinit(set: *FreeSetModel, allocator: std.mem.Allocator) void {
196
- set.blocks_acquired.deinit(allocator);
197
- set.blocks_released.deinit(allocator);
198
- set.blocks_reserved.deinit(allocator);
199
- }
200
-
201
- pub fn count_reservations(set: FreeSetModel) usize {
202
- return set.reservation_count;
203
- }
204
-
205
- pub fn count_free(set: FreeSetModel) usize {
206
- return set.blocks_acquired.capacity() - set.blocks_acquired.count();
207
- }
208
-
209
- pub fn count_free_reserved(set: FreeSetModel, reservation: Reservation) usize {
210
- assert(reservation.block_count > 0);
211
- set.assert_reservation_active(reservation);
212
-
213
- var count: usize = 0;
214
- var iterator = set.blocks_acquired.iterator(.{ .kind = .unset });
215
- while (iterator.next()) |block| {
216
- if (block >= reservation.block_base and
217
- block < reservation.block_base + reservation.block_count)
218
- {
219
- count += 1;
220
- }
221
- }
222
- return count;
223
- }
224
-
225
- pub fn count_acquired(set: FreeSetModel) usize {
226
- return set.blocks_acquired.count();
227
- }
228
-
229
- pub fn highest_address_acquired(set: FreeSetModel) ?u64 {
230
- const block = set.blocks_acquired.iterator(.{
231
- .direction = .reverse,
232
- }).next() orelse return null;
233
- return block + 1;
234
- }
235
-
236
- pub fn reserve(set: *FreeSetModel, reserve_count: usize) ?Reservation {
237
- assert(reserve_count > 0);
238
-
239
- var blocks_found_free: usize = 0;
240
- var iterator = set.blocks_acquired.iterator(.{ .kind = .unset });
241
- while (iterator.next()) |block| {
242
- if (block < set.blocks_reserved.count()) {
243
- assert(set.blocks_reserved.isSet(block));
244
- continue;
245
- }
246
-
247
- blocks_found_free += 1;
248
- if (blocks_found_free == reserve_count) {
249
- const block_base = set.blocks_reserved.count();
250
- const block_count = block + 1 - block_base;
251
-
252
- var i: usize = 0;
253
- while (i < block_count) : (i += 1) set.blocks_reserved.set(block_base + i);
254
-
255
- set.reservation_count += 1;
256
- return Reservation{
257
- .block_base = block_base,
258
- .block_count = block_count,
259
- .session = set.reservation_session,
260
- };
261
- }
262
- }
263
- return null;
264
- }
265
-
266
- pub fn forfeit(set: *FreeSetModel, reservation: Reservation) void {
267
- set.assert_reservation_active(reservation);
268
- set.reservation_count -= 1;
269
-
270
- var i: usize = 0;
271
- while (i < reservation.block_count) : (i += 1) {
272
- set.blocks_reserved.unset(reservation.block_base + i);
273
- }
274
-
275
- if (set.reservation_count == 0) {
276
- set.reservation_session +%= 1;
277
- assert(set.blocks_reserved.count() == 0);
278
- }
279
- }
280
-
281
- pub fn acquire(set: *FreeSetModel, reservation: Reservation) ?u64 {
282
- assert(reservation.block_count > 0);
283
- assert(reservation.block_base < set.blocks_acquired.capacity());
284
- assert(reservation.session == set.reservation_session);
285
- set.assert_reservation_active(reservation);
286
-
287
- var iterator = set.blocks_acquired.iterator(.{ .kind = .unset });
288
- while (iterator.next()) |block| {
289
- if (block >= reservation.block_base and
290
- block < reservation.block_base + reservation.block_count)
291
- {
292
- assert(!set.blocks_acquired.isSet(block));
293
- set.blocks_acquired.set(block);
294
-
295
- const address = block + 1;
296
- return address;
297
- }
298
- }
299
- return null;
300
- }
301
-
302
- pub fn is_free(set: *FreeSetModel, address: u64) bool {
303
- return !set.blocks_acquired.isSet(address - 1);
304
- }
305
-
306
- pub fn release(set: *FreeSetModel, address: u64) void {
307
- const block = address - 1;
308
- set.blocks_released.set(block);
309
- }
310
-
311
- pub fn checkpoint(set: *FreeSetModel) void {
312
- assert(set.blocks_reserved.count() == 0);
313
-
314
- var iterator = set.blocks_released.iterator(.{});
315
- while (iterator.next()) |block| {
316
- assert(set.blocks_released.isSet(block));
317
- assert(set.blocks_acquired.isSet(block));
318
-
319
- set.blocks_released.unset(block);
320
- set.blocks_acquired.unset(block);
321
- }
322
- assert(set.blocks_released.count() == 0);
323
- }
324
-
325
- fn assert_reservation_active(set: FreeSetModel, reservation: Reservation) void {
326
- assert(set.reservation_count > 0);
327
- assert(set.reservation_session == reservation.session);
328
-
329
- var i: usize = 0;
330
- while (i < reservation.block_count) : (i += 1) {
331
- assert(set.blocks_reserved.isSet(reservation.block_base + i));
332
- }
333
- }
334
- };