Skip to content

Commit 6e9c591

Browse files
committed
Unify segment cleanup
1 parent 3c3a916 commit 6e9c591

File tree

4 files changed

+50
-28
lines changed

4 files changed

+50
-28
lines changed

src/FileSegment.zig

+13-7
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,12 @@ const filefmt = @import("filefmt.zig");
1313

1414
const Self = @This();
1515

16+
pub const Options = struct {
17+
dir: std.fs.Dir,
18+
};
19+
1620
allocator: std.mem.Allocator,
21+
options: Options,
1722
id: SegmentId = .{ .version = 0, .included_merges = 0 },
1823
max_commit_id: u64 = 0,
1924
docs: std.AutoHashMap(u32, bool),
@@ -25,9 +30,10 @@ num_items: usize = 0,
2530

2631
raw_data: ?[]align(std.mem.page_size) u8 = null,
2732

28-
pub fn init(allocator: std.mem.Allocator) Self {
33+
pub fn init(allocator: std.mem.Allocator, options: Options) Self {
2934
return Self{
3035
.allocator = allocator,
36+
.options = options,
3137
.docs = std.AutoHashMap(u32, bool).init(allocator),
3238
.index = std.ArrayList(u32).init(allocator),
3339
.blocks = undefined,
@@ -76,23 +82,23 @@ pub fn search(self: Self, sorted_hashes: []const u32, results: *SearchResults) !
7682
}
7783
}
7884

79-
pub fn open(self: *Self, dir: std.fs.Dir, id: SegmentId) !void {
80-
try filefmt.readSegmentFile(dir, id, self);
85+
pub fn open(self: *Self, id: SegmentId) !void {
86+
try filefmt.readSegmentFile(self.options.dir, id, self);
8187
}
8288

83-
pub fn delete(self: *Self, dir: std.fs.Dir) void {
89+
pub fn delete(self: *Self) void {
8490
var file_name_buf: [filefmt.max_file_name_size]u8 = undefined;
8591
const file_name = filefmt.buildSegmentFileName(&file_name_buf, self.id);
8692

8793
log.info("deleting segment file {s}", .{file_name});
8894

89-
dir.deleteFile(file_name) catch |err| {
95+
self.options.deleteFile(file_name) catch |err| {
9096
log.err("failed to clean up segment file {s}: {}", .{ file_name, err });
9197
};
9298
}
9399

94-
pub fn cleanup(self: *Self, dir: std.fs.Dir) void {
95-
self.delete(dir);
100+
pub fn cleanup(self: *Self) void {
101+
self.delete();
96102
}
97103

98104
pub fn build(self: *Self, dir: std.fs.Dir, source: anytype) !void {

src/Index2.zig

+26-16
Original file line numberDiff line numberDiff line change
@@ -91,20 +91,30 @@ pub fn init(allocator: std.mem.Allocator, dir: std.fs.Dir, options: Options) !Se
9191
var oplog_dir = try dir.makeOpenPath("oplog", .{ .iterate = true });
9292
errdefer oplog_dir.close();
9393

94-
const memory_segments = try SegmentListManager(MemorySegment).init(allocator, .{
95-
.min_segment_size = 100,
96-
.max_segment_size = options.min_segment_size,
97-
.segments_per_level = 5,
98-
.segments_per_merge = 10,
99-
.max_segments = 16,
100-
});
101-
102-
const file_segments = try SegmentListManager(FileSegment).init(allocator, .{
103-
.min_segment_size = options.min_segment_size,
104-
.max_segment_size = options.max_segment_size,
105-
.segments_per_level = 10,
106-
.segments_per_merge = 10,
107-
});
94+
const memory_segments = try SegmentListManager(MemorySegment).init(
95+
allocator,
96+
.{},
97+
.{
98+
.min_segment_size = 100,
99+
.max_segment_size = options.min_segment_size,
100+
.segments_per_level = 5,
101+
.segments_per_merge = 10,
102+
.max_segments = 16,
103+
},
104+
);
105+
106+
const file_segments = try SegmentListManager(FileSegment).init(
107+
allocator,
108+
.{
109+
.dir = data_dir,
110+
},
111+
.{
112+
.min_segment_size = options.min_segment_size,
113+
.max_segment_size = options.max_segment_size,
114+
.segments_per_level = 10,
115+
.segments_per_merge = 10,
116+
},
117+
);
108118

109119
return .{
110120
.options = options,
@@ -220,10 +230,10 @@ const Updater = struct {
220230
};
221231

222232
fn loadSegment(self: *Self, segment_id: SegmentId) !FileSegmentNode {
223-
var node = try FileSegmentList.createSegment(self.allocator, .{});
233+
var node = try FileSegmentList.createSegment(self.allocator, .{ .dir = self.data_dir });
224234
errdefer FileSegmentList.destroySegment(self.allocator, &node);
225235

226-
try node.value.open(self.data_dir, segment_id);
236+
try node.value.open(segment_id);
227237

228238
return node;
229239
}

src/MemorySegment.zig

+4-1
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,17 @@ const SegmentMerger = @import("segment_merger.zig").SegmentMerger;
1414

1515
const Self = @This();
1616

17+
pub const Options = struct {};
18+
1719
allocator: std.mem.Allocator,
1820
id: SegmentId = .{ .version = 0, .included_merges = 0 },
1921
max_commit_id: u64 = 0,
2022
docs: std.AutoHashMap(u32, bool),
2123
items: std.ArrayList(Item),
2224
frozen: bool = false,
2325

24-
pub fn init(allocator: std.mem.Allocator) Self {
26+
pub fn init(allocator: std.mem.Allocator, opts: Options) Self {
27+
_ = opts;
2528
return .{
2629
.allocator = allocator,
2730
.docs = std.AutoHashMap(u32, bool).init(allocator),

src/segment_list2.zig

+7-4
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ pub fn SegmentList(Segment: type) type {
5454
self.nodes.deinit(allocator);
5555
}
5656

57-
pub fn createSegment(allocator: Allocator, extra_init_args: anytype) Allocator.Error!Node {
58-
return Node.create(allocator, @call(.auto, Segment.init, .{allocator} ++ extra_init_args));
57+
pub fn createSegment(allocator: Allocator, options: Segment.Options) Allocator.Error!Node {
58+
return Node.create(allocator, @call(.auto, Segment.init, .{ allocator, options }));
5959
}
6060

6161
pub fn destroySegment(allocator: Allocator, node: *Node) void {
@@ -172,15 +172,17 @@ pub fn SegmentListManager(Segment: type) type {
172172
pub const MergePolicy = TieredMergePolicy(List.Node, getSegmentSize(Segment));
173173

174174
allocator: Allocator,
175+
options: Segment.Options,
175176
segments: SharedPtr(List),
176177
merge_policy: MergePolicy,
177178
num_allowed_segments: std.atomic.Value(usize),
178179
update_lock: std.Thread.Mutex,
179180

180-
pub fn init(allocator: Allocator, merge_policy: MergePolicy) !Self {
181+
pub fn init(allocator: Allocator, options: Segment.Options, merge_policy: MergePolicy) !Self {
181182
const segments = try SharedPtr(List).create(allocator, List.initEmpty());
182183
return Self{
183184
.allocator = allocator,
185+
.options = options,
184186
.segments = segments,
185187
.merge_policy = merge_policy,
186188
.num_allowed_segments = std.atomic.Value(usize).init(0),
@@ -229,7 +231,7 @@ pub fn SegmentListManager(Segment: type) type {
229231

230232
const candidate = self.merge_policy.findSegmentsToMerge(segments.value.nodes.items) orelse return false;
231233

232-
var target = try List.createSegment(self.allocator, .{});
234+
var target = try List.createSegment(self.allocator, self.options);
233235
errdefer List.destroySegment(self.allocator, &target);
234236

235237
var merger = SegmentMerger(Segment).init(self.allocator, segments.value);
@@ -241,6 +243,7 @@ pub fn SegmentListManager(Segment: type) type {
241243
try merger.prepare();
242244

243245
try target.value.merge(&merger);
246+
errdefer target.value.cleanup();
244247

245248
self.update_lock.lock();
246249
defer self.update_lock.unlock();

0 commit comments

Comments
 (0)