Skip to content

Commit 3a22b1f

Browse files
committed
Fix file descriptor leak
1 parent 6284750 commit 3a22b1f

File tree

2 files changed

+11
-5
lines changed

2 files changed

+11
-5
lines changed

src/FileSegment.zig

+7-3
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ merged: u32 = 0,
3131
num_items: usize = 0,
3232
delete_in_deinit: bool = false,
3333

34-
raw_data: ?[]align(std.mem.page_size) u8 = null,
34+
mmaped_file: ?std.fs.File = null,
35+
mmaped_data: ?[]align(std.mem.page_size) u8 = null,
3536

3637
pub fn init(allocator: std.mem.Allocator, options: Options) Self {
3738
return Self{
@@ -50,9 +51,12 @@ pub fn deinit(self: *Self, delete_file: KeepOrDelete) void {
5051
self.docs.deinit(self.allocator);
5152
self.index.deinit(self.allocator);
5253

53-
if (self.raw_data) |data| {
54+
if (self.mmaped_data) |data| {
5455
std.posix.munmap(data);
55-
self.raw_data = null;
56+
}
57+
58+
if (self.mmaped_file) |file| {
59+
file.close();
5660
}
5761

5862
if (delete_file == .delete) {

src/filefmt.zig

+4-2
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ pub fn writeSegmentFile(dir: std.fs.Dir, reader: anytype) !void {
310310
log.info("writing segment file {s}", .{file_name});
311311

312312
var file = try dir.atomicFile(file_name, .{});
313-
errdefer file.deinit();
313+
defer file.deinit();
314314

315315
const block_size = default_block_size;
316316

@@ -394,7 +394,7 @@ pub fn readSegmentFile(dir: fs.Dir, info: SegmentInfo, segment: *FileSegment) !v
394394
file.handle,
395395
0,
396396
);
397-
segment.raw_data = raw_data;
397+
segment.mmaped_data = raw_data;
398398

399399
try std.posix.madvise(
400400
raw_data.ptr,
@@ -494,6 +494,8 @@ pub fn readSegmentFile(dir: fs.Dir, info: SegmentInfo, segment: *FileSegment) !v
494494
if (footer.checksum != crc.final()) {
495495
return error.InvalidSegment;
496496
}
497+
498+
segment.mmaped_file = file;
497499
}
498500

499501
test "writeFile/readFile" {

0 commit comments

Comments
 (0)