@@ -285,11 +285,9 @@ fn doCheckpoint(self: *Self) !bool {
285
285
self .file_segments_lock .lock ();
286
286
defer self .file_segments_lock .unlock ();
287
287
288
- var ids = try self .getFileSegmentIds ( );
288
+ var ids = try self .file_segments . getIdsAfterAppend ( dest , self . allocator );
289
289
defer ids .deinit ();
290
290
291
- try ids .append (dest .data .id );
292
-
293
291
try filefmt .writeIndexFile (self .data_dir , ids .items );
294
292
295
293
self .segments_lock .lock ();
@@ -424,32 +422,12 @@ fn finishFileSegmentMerge(self: *Self, merge: FileSegmentList.PreparedMerge) !vo
424
422
errdefer self .file_segments .destroySegment (merge .target );
425
423
errdefer merge .target .data .delete (self .data_dir );
426
424
427
- var ids = try self .getFileSegmentIds ( );
425
+ var ids = try self .file_segments . getIdsAfterAppliedMerge ( merge , self . allocator );
428
426
defer ids .deinit ();
429
427
430
- var index1 : usize = 0 ;
431
- var index2 : usize = 0 ;
432
-
433
- std .debug .assert (merge .sources .num_segments == 2 );
434
-
435
- var i : usize = 0 ;
436
- while (i < ids .items .len ) : (i += 1 ) {
437
- if (SegmentID .eq (ids .items [i ], merge .sources .start .data .id )) {
438
- index1 = i ;
439
- }
440
- if (SegmentID .eq (ids .items [i ], merge .sources .end .data .id )) {
441
- index2 = i ;
442
- }
443
- }
444
-
445
- std .debug .assert (index1 + 1 == index2 );
446
-
447
- try ids .replaceRange (index1 , 2 , &[_ ]SegmentID {merge .target .data .id });
448
-
449
- std .debug .assert (std .sort .isSorted (SegmentID , ids .items , {}, SegmentID .cmp ));
450
-
451
428
try filefmt .writeIndexFile (self .data_dir , ids .items );
452
429
430
+ // we want to do this outside of segments_lock to avoid blocking searches more than necessary
453
431
defer self .file_segments .cleanupAfterMerge (merge , .{self .data_dir });
454
432
455
433
self .segments_lock .lock ();
@@ -537,18 +515,6 @@ fn readyForCheckpoint(self: *Self) !?*MemorySegmentNode {
537
515
return null ;
538
516
}
539
517
540
- fn getFileSegmentIds (self : * Self ) ! std. ArrayList (SegmentID ) {
541
- var segment_ids = std .ArrayList (SegmentID ).init (self .allocator );
542
- errdefer segment_ids .deinit ();
543
-
544
- self .segments_lock .lockShared ();
545
- defer self .segments_lock .unlockShared ();
546
-
547
- try self .file_segments .getIds (& segment_ids );
548
-
549
- return segment_ids ;
550
- }
551
-
552
518
pub fn update (self : * Self , changes : []const Change ) ! void {
553
519
//const t1 = std.time.milliTimestamp();
554
520
if (try self .maybeMergeMemorySegments ()) {
0 commit comments