Commit 956f1ebc70

Andrew Kelley <andrew@ziglang.org>
2024-07-10 05:26:16
std.Build.Watch: gracefully handle fanotify queue overflow
1 parent e712ca5
Changed files (1)
lib
std
Build
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);
+            }
+        }
+    }
+}