Skip to content

Commit b3278d6

Browse files
committed
Remove last piece of code that assumes merge = two segments
1 parent 450bc96 commit b3278d6

File tree

2 files changed

+38
-40
lines changed

2 files changed

+38
-40
lines changed

src/Index.zig

+3-37
Original file line numberDiff line numberDiff line change
@@ -285,11 +285,9 @@ fn doCheckpoint(self: *Self) !bool {
285285
self.file_segments_lock.lock();
286286
defer self.file_segments_lock.unlock();
287287

288-
var ids = try self.getFileSegmentIds();
288+
var ids = try self.file_segments.getIdsAfterAppend(dest, self.allocator);
289289
defer ids.deinit();
290290

291-
try ids.append(dest.data.id);
292-
293291
try filefmt.writeIndexFile(self.data_dir, ids.items);
294292

295293
self.segments_lock.lock();
@@ -424,32 +422,12 @@ fn finishFileSegmentMerge(self: *Self, merge: FileSegmentList.PreparedMerge) !vo
424422
errdefer self.file_segments.destroySegment(merge.target);
425423
errdefer merge.target.data.delete(self.data_dir);
426424

427-
var ids = try self.getFileSegmentIds();
425+
var ids = try self.file_segments.getIdsAfterAppliedMerge(merge, self.allocator);
428426
defer ids.deinit();
429427

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-
451428
try filefmt.writeIndexFile(self.data_dir, ids.items);
452429

430+
// we want to do this outside of segments_lock to avoid blocking searches more than necessary
453431
defer self.file_segments.cleanupAfterMerge(merge, .{self.data_dir});
454432

455433
self.segments_lock.lock();
@@ -537,18 +515,6 @@ fn readyForCheckpoint(self: *Self) !?*MemorySegmentNode {
537515
return null;
538516
}
539517

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-
552518
pub fn update(self: *Self, changes: []const Change) !void {
553519
//const t1 = std.time.milliTimestamp();
554520
if (try self.maybeMergeMemorySegments()) {

src/segment_list.zig

+35-3
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,44 @@ pub fn SegmentList(Segment: type) type {
5757
self.segments.append(node);
5858
}
5959

60-
pub fn getIds(self: *Self, ids: *std.ArrayList(common.SegmentID)) !void {
61-
try ids.ensureTotalCapacity(self.segments.len);
60+
pub fn getIdsAfterAppend(self: *Self, new_segment: *List.Node, allocator: std.mem.Allocator) !std.ArrayList(common.SegmentID) {
61+
var ids = std.ArrayList(common.SegmentID).init(allocator);
62+
errdefer ids.deinit();
63+
64+
try ids.ensureTotalCapacity(self.segments.len + 1);
65+
6266
var it = self.segments.first;
6367
while (it) |node| : (it = node.next) {
64-
try ids.append(node.data.id);
68+
ids.appendAssumeCapacity(node.data.id);
6569
}
70+
71+
ids.appendAssumeCapacity(new_segment.data.id);
72+
73+
return ids;
74+
}
75+
76+
pub fn getIdsAfterAppliedMerge(self: *Self, merge: PreparedMerge, allocator: std.mem.Allocator) !std.ArrayList(common.SegmentID) {
77+
var ids = std.ArrayList(common.SegmentID).init(allocator);
78+
errdefer ids.deinit();
79+
80+
try ids.ensureTotalCapacity(self.segments.len - merge.sources.num_segments + 1);
81+
82+
var it = self.segments.first;
83+
var inside_merge = false;
84+
while (it) |node| : (it = node.next) {
85+
if (it == merge.sources.start) {
86+
inside_merge = true;
87+
}
88+
if (!inside_merge) {
89+
ids.appendAssumeCapacity(node.data.id);
90+
}
91+
if (it == merge.sources.end) {
92+
inside_merge = false;
93+
ids.appendAssumeCapacity(merge.target.data.id);
94+
}
95+
}
96+
97+
return ids;
6698
}
6799

68100
pub fn getMaxCommitId(self: *const Self) u64 {

0 commit comments

Comments
 (0)