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,332 +0,0 @@
|
|
|
1
|
-
const std = @import("std");
|
|
2
|
-
const mem = std.mem;
|
|
3
|
-
const math = std.math;
|
|
4
|
-
const assert = std.debug.assert;
|
|
5
|
-
|
|
6
|
-
const constants = @import("../constants.zig");
|
|
7
|
-
|
|
8
|
-
const Direction = @import("direction.zig").Direction;
|
|
9
|
-
const TableIteratorType = @import("table_iterator.zig").TableIteratorType;
|
|
10
|
-
const RingBuffer = @import("../ring_buffer.zig").RingBuffer;
|
|
11
|
-
const ManifestType = @import("manifest.zig").ManifestType;
|
|
12
|
-
const GridType = @import("grid.zig").GridType;
|
|
13
|
-
|
|
14
|
-
/// A LevelIterator sequentially iterates the values of every table in the level.
|
|
15
|
-
pub fn LevelIteratorType(comptime Table: type, comptime Storage: type) type {
|
|
16
|
-
const Key = Table.Key;
|
|
17
|
-
const Value = Table.Value;
|
|
18
|
-
const key_from_value = Table.key_from_value;
|
|
19
|
-
|
|
20
|
-
return struct {
|
|
21
|
-
const LevelIterator = @This();
|
|
22
|
-
const TableIterator = TableIteratorType(Table, Storage);
|
|
23
|
-
|
|
24
|
-
const Grid = GridType(Storage);
|
|
25
|
-
const Manifest = ManifestType(Table, Storage);
|
|
26
|
-
|
|
27
|
-
const BlockPtrConst = *align(constants.sector_size) const [constants.block_size]u8;
|
|
28
|
-
|
|
29
|
-
const TableInfo = Manifest.TableInfo;
|
|
30
|
-
const TableInfoCallback = fn (
|
|
31
|
-
it: *LevelIterator,
|
|
32
|
-
table: *const TableInfo,
|
|
33
|
-
index_block: BlockPtrConst,
|
|
34
|
-
) void;
|
|
35
|
-
|
|
36
|
-
const TableIteratorScope = struct {
|
|
37
|
-
it: *LevelIterator = undefined,
|
|
38
|
-
table_iterator: TableIterator,
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
const ValuesRingBuffer = RingBuffer(Value, Table.data.value_count_max, .pointer);
|
|
42
|
-
const TablesRingBuffer = RingBuffer(TableIteratorScope, 2, .array);
|
|
43
|
-
|
|
44
|
-
grid: *Grid,
|
|
45
|
-
manifest: *Manifest,
|
|
46
|
-
callback: fn (*LevelIterator) void,
|
|
47
|
-
table_info: ?*const TableInfo,
|
|
48
|
-
table_info_callback: TableInfoCallback,
|
|
49
|
-
level: u8,
|
|
50
|
-
snapshot: u64,
|
|
51
|
-
|
|
52
|
-
/// A lower bound on the iteration range.
|
|
53
|
-
key_min: Key,
|
|
54
|
-
|
|
55
|
-
/// An upper bound on the iteration range.
|
|
56
|
-
key_max: Key,
|
|
57
|
-
|
|
58
|
-
/// The key_max (when .ascending) or key_min (when .descending) of the last table iterated,
|
|
59
|
-
/// used to get the next table from the manifest.
|
|
60
|
-
key_exclusive: ?Key = null,
|
|
61
|
-
|
|
62
|
-
// TODO LevelIterator needs to support .descending `direction` when used for range queries.
|
|
63
|
-
direction: Direction,
|
|
64
|
-
|
|
65
|
-
manifest_iterated: bool = false,
|
|
66
|
-
|
|
67
|
-
/// Buffered values that precede the iterators in `tables`.
|
|
68
|
-
values: ValuesRingBuffer,
|
|
69
|
-
tables: TablesRingBuffer,
|
|
70
|
-
|
|
71
|
-
// Used for verifying key order when constants.verify == true.
|
|
72
|
-
key_prev: ?Key,
|
|
73
|
-
|
|
74
|
-
pub fn init(allocator: mem.Allocator) !LevelIterator {
|
|
75
|
-
var values = try ValuesRingBuffer.init(allocator);
|
|
76
|
-
errdefer values.deinit(allocator);
|
|
77
|
-
|
|
78
|
-
var table_a = try TableIterator.init(allocator);
|
|
79
|
-
errdefer table_a.deinit(allocator);
|
|
80
|
-
|
|
81
|
-
var table_b = try TableIterator.init(allocator);
|
|
82
|
-
errdefer table_b.deinit(allocator);
|
|
83
|
-
|
|
84
|
-
return LevelIterator{
|
|
85
|
-
.grid = undefined,
|
|
86
|
-
.manifest = undefined,
|
|
87
|
-
.callback = undefined,
|
|
88
|
-
.table_info = null,
|
|
89
|
-
.table_info_callback = undefined,
|
|
90
|
-
.level = undefined,
|
|
91
|
-
.snapshot = undefined,
|
|
92
|
-
.key_min = undefined,
|
|
93
|
-
.key_max = undefined,
|
|
94
|
-
.direction = undefined,
|
|
95
|
-
.values = values,
|
|
96
|
-
.tables = .{
|
|
97
|
-
.buffer = .{
|
|
98
|
-
.{ .table_iterator = table_a },
|
|
99
|
-
.{ .table_iterator = table_b },
|
|
100
|
-
},
|
|
101
|
-
},
|
|
102
|
-
.key_prev = null,
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
pub fn deinit(it: *LevelIterator, allocator: mem.Allocator) void {
|
|
107
|
-
it.values.deinit(allocator);
|
|
108
|
-
for (it.tables.buffer) |*scope| scope.table_iterator.deinit(allocator);
|
|
109
|
-
it.* = undefined;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
pub const Context = struct {
|
|
113
|
-
grid: *Grid,
|
|
114
|
-
manifest: *Manifest,
|
|
115
|
-
level: u8,
|
|
116
|
-
snapshot: u64,
|
|
117
|
-
key_min: Key,
|
|
118
|
-
key_max: Key,
|
|
119
|
-
direction: Direction,
|
|
120
|
-
table_info_callback: TableInfoCallback,
|
|
121
|
-
};
|
|
122
|
-
|
|
123
|
-
pub fn start(
|
|
124
|
-
it: *LevelIterator,
|
|
125
|
-
context: Context,
|
|
126
|
-
callback: fn (*LevelIterator) void,
|
|
127
|
-
) void {
|
|
128
|
-
if (context.direction == .descending) {
|
|
129
|
-
@panic("TODO Implement descending direction for LevelIterator.");
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
it.* = .{
|
|
133
|
-
.grid = context.grid,
|
|
134
|
-
.manifest = context.manifest,
|
|
135
|
-
.callback = callback,
|
|
136
|
-
.table_info = null,
|
|
137
|
-
.table_info_callback = context.table_info_callback,
|
|
138
|
-
.level = context.level,
|
|
139
|
-
.snapshot = context.snapshot,
|
|
140
|
-
.key_min = context.key_min,
|
|
141
|
-
.key_max = context.key_max,
|
|
142
|
-
.direction = context.direction,
|
|
143
|
-
.values = .{ .buffer = it.values.buffer },
|
|
144
|
-
.tables = .{ .buffer = it.tables.buffer },
|
|
145
|
-
.key_prev = null,
|
|
146
|
-
};
|
|
147
|
-
|
|
148
|
-
assert(it.key_exclusive == null);
|
|
149
|
-
assert(it.manifest_iterated == false);
|
|
150
|
-
assert(it.values.empty());
|
|
151
|
-
assert(it.tables.empty());
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
/// Returns true if an IO operation was started. If this returns true, then `callback()`
|
|
155
|
-
/// will be called on completion.
|
|
156
|
-
pub fn tick(it: *LevelIterator) bool {
|
|
157
|
-
if (it.buffered_enough_values()) return false;
|
|
158
|
-
|
|
159
|
-
if (it.tables.tail_ptr()) |scope| {
|
|
160
|
-
assert(scope.it == it);
|
|
161
|
-
|
|
162
|
-
const tail = &scope.table_iterator;
|
|
163
|
-
// Buffer values as necessary for the current tail.
|
|
164
|
-
if (tail.tick()) return true;
|
|
165
|
-
// Since buffered_enough_values() was false above and tick did not start
|
|
166
|
-
// new I/O, the tail table must have already buffered all values.
|
|
167
|
-
// This is critical to ensure no values are skipped during iteration.
|
|
168
|
-
assert(tail.buffered_all_values());
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
const table = it.next_table_info();
|
|
172
|
-
if (table == null) return false;
|
|
173
|
-
|
|
174
|
-
const table_iterator = it.next_table_iterator();
|
|
175
|
-
assert(it.tables.tail_ptr().?.it == it);
|
|
176
|
-
|
|
177
|
-
assert(it.table_info == null);
|
|
178
|
-
it.table_info = table;
|
|
179
|
-
|
|
180
|
-
const table_iterator_context = .{
|
|
181
|
-
.grid = it.grid,
|
|
182
|
-
.address = table.?.address,
|
|
183
|
-
.checksum = table.?.checksum,
|
|
184
|
-
.index_block_callback = table_iterator_index_callback,
|
|
185
|
-
};
|
|
186
|
-
table_iterator.start(table_iterator_context, table_iterator_callback);
|
|
187
|
-
|
|
188
|
-
assert(table_iterator.tick());
|
|
189
|
-
return true;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
fn next_table_info(it: *LevelIterator) ?*const TableInfo {
|
|
193
|
-
if (it.manifest_iterated) return null;
|
|
194
|
-
|
|
195
|
-
const next_table = it.manifest.next_table(
|
|
196
|
-
it.level,
|
|
197
|
-
it.snapshot,
|
|
198
|
-
it.key_min,
|
|
199
|
-
it.key_max,
|
|
200
|
-
it.key_exclusive,
|
|
201
|
-
it.direction,
|
|
202
|
-
);
|
|
203
|
-
|
|
204
|
-
if (next_table) |table| {
|
|
205
|
-
it.key_exclusive = switch (it.direction) {
|
|
206
|
-
.ascending => table.key_max,
|
|
207
|
-
.descending => table.key_min,
|
|
208
|
-
};
|
|
209
|
-
return table;
|
|
210
|
-
} else {
|
|
211
|
-
assert(!it.manifest_iterated);
|
|
212
|
-
it.manifest_iterated = true;
|
|
213
|
-
return null;
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
fn next_table_iterator(it: *LevelIterator) *TableIterator {
|
|
218
|
-
if (it.tables.full()) {
|
|
219
|
-
const table = &it.tables.head_ptr().?.table_iterator;
|
|
220
|
-
while (true) {
|
|
221
|
-
_ = table.peek() catch break;
|
|
222
|
-
it.values.push_assume_capacity(table.pop());
|
|
223
|
-
}
|
|
224
|
-
it.tables.advance_head();
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
const scope = it.tables.next_tail_ptr().?;
|
|
228
|
-
it.tables.advance_tail();
|
|
229
|
-
scope.it = it;
|
|
230
|
-
return &scope.table_iterator;
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
fn table_iterator_index_callback(
|
|
234
|
-
table_iterator: *TableIterator,
|
|
235
|
-
index_block: BlockPtrConst,
|
|
236
|
-
) void {
|
|
237
|
-
const scope = @fieldParentPtr(TableIteratorScope, "table_iterator", table_iterator);
|
|
238
|
-
const it = scope.it;
|
|
239
|
-
|
|
240
|
-
assert(it.table_info != null);
|
|
241
|
-
const table = it.table_info.?;
|
|
242
|
-
it.table_info = null;
|
|
243
|
-
|
|
244
|
-
it.table_info_callback(it, table, index_block);
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
fn table_iterator_callback(table_iterator: *TableIterator) void {
|
|
248
|
-
const scope = @fieldParentPtr(TableIteratorScope, "table_iterator", table_iterator);
|
|
249
|
-
const it = scope.it;
|
|
250
|
-
|
|
251
|
-
if (!it.tick()) {
|
|
252
|
-
assert(it.buffered_enough_values());
|
|
253
|
-
it.callback(it);
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
/// Returns true if all remaining values in the level have been buffered.
|
|
258
|
-
pub fn buffered_all_values(it: LevelIterator) bool {
|
|
259
|
-
// Iterating the manifest is necessary but not sufficient since I/O may yet be required.
|
|
260
|
-
if (!it.manifest_iterated) return false;
|
|
261
|
-
|
|
262
|
-
var table_iterators = it.tables.iterator();
|
|
263
|
-
while (table_iterators.next()) |scope| {
|
|
264
|
-
if (!scope.table_iterator.buffered_all_values()) return false;
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
return true;
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
fn buffered_value_count(it: LevelIterator) u32 {
|
|
271
|
-
var value_count = @intCast(u32, it.values.count);
|
|
272
|
-
|
|
273
|
-
var table_iterators = it.tables.iterator();
|
|
274
|
-
while (table_iterators.next()) |scope| {
|
|
275
|
-
value_count += scope.table_iterator.buffered_value_count();
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
return value_count;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
fn buffered_enough_values(it: LevelIterator) bool {
|
|
282
|
-
return it.buffered_all_values() or
|
|
283
|
-
it.buffered_value_count() >= Table.data.value_count_max;
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
/// Returns either:
|
|
287
|
-
/// - the next Key, if available.
|
|
288
|
-
/// - error.Empty when there are no values remaining to iterate.
|
|
289
|
-
/// - error.Drained when the iterator isn't empty, but the values
|
|
290
|
-
/// still need to be buffered into memory via tick().
|
|
291
|
-
pub fn peek(it: LevelIterator) error{ Empty, Drained }!Key {
|
|
292
|
-
if (it.values.head_ptr_const()) |value| return key_from_value(value);
|
|
293
|
-
|
|
294
|
-
const scope = it.tables.head_ptr_const() orelse {
|
|
295
|
-
// Even if there are no values available to peek, some may be unbuffered.
|
|
296
|
-
// We call buffered_all_values() to distinguish between the iterator
|
|
297
|
-
// being empty and needing to tick() to refill values.
|
|
298
|
-
if (!it.buffered_all_values()) return error.Drained;
|
|
299
|
-
return error.Empty;
|
|
300
|
-
};
|
|
301
|
-
|
|
302
|
-
return scope.table_iterator.peek();
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
/// This may only be called after peek() returns a Key (and not Empty or Drained)
|
|
306
|
-
pub fn pop(it: *LevelIterator) Value {
|
|
307
|
-
const value = it.pop_internal();
|
|
308
|
-
|
|
309
|
-
if (constants.verify) {
|
|
310
|
-
const key = Table.key_from_value(&value);
|
|
311
|
-
if (it.key_prev) |k| assert(Table.compare_keys(k, key) == .lt);
|
|
312
|
-
it.key_prev = key;
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
return value;
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
fn pop_internal(it: *LevelIterator) Value {
|
|
319
|
-
if (it.values.pop()) |value| return value;
|
|
320
|
-
|
|
321
|
-
const table_iterator = &it.tables.head_ptr().?.table_iterator;
|
|
322
|
-
const value = table_iterator.pop();
|
|
323
|
-
|
|
324
|
-
_ = table_iterator.peek() catch |err| switch (err) {
|
|
325
|
-
error.Empty => it.tables.advance_head(),
|
|
326
|
-
error.Drained => {},
|
|
327
|
-
};
|
|
328
|
-
|
|
329
|
-
return value;
|
|
330
|
-
}
|
|
331
|
-
};
|
|
332
|
-
}
|