commit 956f1ebc707f8a2530e49b80357768f3bf1235ac (tree)
parent e712ca595f3ac2e25911fd0d647bfb8c97019ce8
Author: Andrew Kelley <andrew@ziglang.org>
Date: Tue, 9 Jul 2024 20:26:16 -0700
std.Build.Watch: gracefully handle fanotify queue overflow
Diffstat:
1 file changed, 16 insertions(+), 0 deletions(-)
diff --git 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);
+ }
+ }
+ }
+}