From 956f1ebc707f8a2530e49b80357768f3bf1235ac Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Tue, 9 Jul 2024 20:26:16 -0700 Subject: [PATCH] std.Build.Watch: gracefully handle fanotify queue overflow --- lib/std/Build/Watch.zig | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib/std/Build/Watch.zig b/lib/std/Build/Watch.zig index b58e524cab..2ffcd27ca7 100644 --- a/lib/std/Build/Watch.zig +++ b/lib/std/Build/Watch.zig @@ -135,6 +135,12 @@ pub fn markDirtySteps(w: *Watch, gpa: Allocator) !bool { meta = @ptrCast(@as([*]u8, @ptrCast(meta)) + meta[0].event_len); }) { assert(meta[0].vers == M.VERSION); + if (meta[0].mask.Q_OVERFLOW) { + any_dirty = true; + std.log.warn("file system watch queue overflowed; falling back to fstat", .{}); + markAllFilesDirty(w, gpa); + return true; + } const fid: *align(1) fanotify.event_info_fid = @ptrCast(meta + 1); switch (fid.hdr.info_type) { .DFID_NAME => { @@ -171,3 +177,13 @@ pub fn markFailedStepsDirty(gpa: Allocator, all_steps: []const *Step) void { else => continue, }; } + +fn markAllFilesDirty(w: *Watch, gpa: Allocator) void { + for (w.handle_table.values()) |reaction_set| { + for (reaction_set.values()) |step_set| { + for (step_set.keys()) |step| { + step.recursiveReset(gpa); + } + } + } +}