@@ -10,14 +10,14 @@ const Item = common.Item;
10
10
const SearchResults = common .SearchResults ;
11
11
const Change = common .Change ;
12
12
13
- const Segment = @import ("InMemorySegment.zig" );
14
- const Segments = std .DoublyLinkedList (Segment );
13
+ const InMemorySegment = @import ("InMemorySegment.zig" );
14
+ const InMemorySegments = std .DoublyLinkedList (InMemorySegment );
15
15
16
16
allocator : std.mem.Allocator ,
17
17
write_lock : std.Thread.RwLock ,
18
18
merge_lock : std.Thread.Mutex ,
19
- segments : Segments ,
20
- max_items_per_segment : usize = 100000 ,
19
+ segments : InMemorySegments ,
20
+ max_items_per_segment : usize = 1_000_000 ,
21
21
max_segments : usize = 16 ,
22
22
auto_cleanup : bool = true ,
23
23
@@ -37,28 +37,27 @@ pub fn deinit(self: *Self) void {
37
37
defer self .write_lock .unlock ();
38
38
39
39
while (self .segments .popFirst ()) | node | {
40
- self .destroyNode (node );
40
+ self .destroySegment (node );
41
41
}
42
42
}
43
43
44
- fn destroyNode (self : * Self , node : * Segments.Node ) void {
44
+ fn createSegment (self : * Self ) ! * InMemorySegments.Node {
45
+ const node = try self .allocator .create (InMemorySegments .Node );
46
+ node .data = InMemorySegment .init (self .allocator );
47
+ return node ;
48
+ }
49
+
50
+ fn destroySegment (self : * Self , node : * InMemorySegments.Node ) void {
45
51
node .data .deinit ();
46
52
self .allocator .destroy (node );
47
53
}
48
54
49
55
pub fn update (self : * Self , changes : []const Change ) ! void {
50
56
var committed = false ;
51
57
52
- const node = try self .allocator . create ( Segments . Node );
58
+ const node = try self .createSegment ( );
53
59
defer {
54
- if (! committed ) self .allocator .destroy (node );
55
- }
56
-
57
- node .data = Segment .init (self .allocator );
58
- defer {
59
- if (! committed ) {
60
- node .data .deinit ();
61
- }
60
+ if (! committed ) self .destroySegment (node );
62
61
}
63
62
64
63
var num_items : usize = 0 ;
@@ -134,9 +133,9 @@ fn hasNewerVersion(self: *Self, id: u32, version: u32) bool {
134
133
}
135
134
136
135
const Merge = struct {
137
- first : * Segments .Node ,
138
- last : * Segments .Node ,
139
- replacement : * Segments .Node ,
136
+ first : * InMemorySegments .Node ,
137
+ last : * InMemorySegments .Node ,
138
+ replacement : * InMemorySegments .Node ,
140
139
};
141
140
142
141
fn prepareMerge (self : * Self ) ! ? Merge {
@@ -158,7 +157,7 @@ fn prepareMerge(self: *Self) !?Merge {
158
157
return null ;
159
158
}
160
159
161
- var best_node : ? * Segments .Node = null ;
160
+ var best_node : ? * InMemorySegments .Node = null ;
162
161
var best_score : f64 = std .math .inf (f64 );
163
162
segments_iter = self .segments .first ;
164
163
var level_size = @as (f64 , @floatFromInt (total_size )) / 2 ;
@@ -187,23 +186,17 @@ fn prepareMerge(self: *Self) !?Merge {
187
186
188
187
const segment1 = node1 .data ;
189
188
const segment2 = node2 .data ;
190
- const segments = [2 ]Segment { segment1 , segment2 };
189
+ const segments = [2 ]InMemorySegment { segment1 , segment2 };
191
190
192
191
var committed = false ;
193
192
194
- const node = try self .allocator . create ( Segments . Node );
193
+ const node = try self .createSegment ( );
195
194
defer {
196
- if (! committed ) self .allocator . destroy (node );
195
+ if (! committed ) self .destroySegment (node );
197
196
}
198
197
199
198
const merge = Merge { .first = node1 , .last = node2 , .replacement = node };
200
199
201
- node .data = Segment .init (self .allocator );
202
- defer {
203
- if (! committed ) {
204
- node .data .deinit ();
205
- }
206
- }
207
200
node .data .version = segment1 .version ;
208
201
209
202
var total_docs : usize = 0 ;
@@ -267,11 +260,11 @@ fn commitMerge(self: *Self, merge: Merge) void {
267
260
268
261
self .segments .insertAfter (merge .last , merge .replacement );
269
262
270
- var iter : ? * Segments .Node = merge .first ;
263
+ var iter : ? * InMemorySegments .Node = merge .first ;
271
264
while (iter ) | node | {
272
265
iter = node .next ;
273
266
self .segments .remove (node );
274
- self .destroyNode (node );
267
+ self .destroySegment (node );
275
268
if (node == merge .last ) break ;
276
269
}
277
270
@@ -288,7 +281,7 @@ fn mergeSegments(self: *Self) !void {
288
281
}
289
282
}
290
283
291
- pub fn freezeFirstSegment (self : * Self ) ? * Segment {
284
+ pub fn freezeFirstSegment (self : * Self ) ? * InMemorySegment {
292
285
self .merge_lock .lock ();
293
286
defer self .merge_lock .unlock ();
294
287
@@ -311,7 +304,7 @@ pub fn freezeFirstSegment(self: *Self) ?*Segment {
311
304
return null ;
312
305
}
313
306
314
- pub fn removeFrozenSegment (self : * Self , segment : * Segment ) void {
307
+ pub fn removeSegment (self : * Self , segment : * InMemorySegment ) void {
315
308
self .merge_lock .lock ();
316
309
defer self .merge_lock .unlock ();
317
310
@@ -323,7 +316,7 @@ pub fn removeFrozenSegment(self: *Self, segment: *Segment) void {
323
316
if (& node .data == segment ) {
324
317
if (node .data .frozen ) {
325
318
self .segments .remove (node );
326
- self .destroyNode (node );
319
+ self .destroySegment (node );
327
320
return ;
328
321
}
329
322
}
0 commit comments