From 7d812cea2e2c4d2a7c9288a2c82d0432eb71de57 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Tue, 29 Sep 2026 12:55:45 +0800 Subject: [PATCH] Downgrade ExecutionTerminated to debug Detect closed peer so that subsequent sends don't keep trying and failing --- src/Watchdog.zig | 2 +- src/browser/Frame.zig | 6 +++++- src/server/Link.zig | 11 +++++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/Watchdog.zig b/src/Watchdog.zig index 0ea938b2a..bd080ce60 100644 --- a/src/Watchdog.zig +++ b/src/Watchdog.zig @@ -132,7 +132,7 @@ fn run(self: *Watchdog) void { if (entry.fired == false) { entry.fired = true; - log.err(.app, "watchdog stall", .{ .stalled_ms = stalled_ms }); + log.warn(.app, "watchdog stall", .{ .stalled_ms = stalled_ms }); entry.env.requestTerminate(); } } diff --git a/src/browser/Frame.zig b/src/browser/Frame.zig index 7d44d3268..201b009b2 100644 --- a/src/browser/Frame.zig +++ b/src/browser/Frame.zig @@ -1255,7 +1255,9 @@ pub fn documentIsLoaded(self: *Frame) void { self.document._ready_state = .interactive; self._documentIsLoaded() catch |err| switch (err) { error.JsException => {}, // already logged - else => log.err(.frame, "document is loaded2", .{ .err = err, .type = self._type, .url = self.url }), + // logged by whatever requested the terminate (watchdog, runaway loop) + error.ExecutionTerminated => log.debug(.frame, "document is loaded", .{ .err = err, .type = self._type, .url = self.url }), + else => log.err(.frame, "document is loaded", .{ .err = err, .type = self._type, .url = self.url }), }; } @@ -1359,6 +1361,8 @@ pub fn documentIsComplete(self: *Frame) void { self._load_state = .complete; self._documentIsComplete() catch |err| switch (err) { error.JsException => {}, // already logged + // logged by whatever requested the terminate (watchdog, runaway loop) + error.ExecutionTerminated => log.debug(.frame, "document is complete", .{ .err = err, .type = self._type, .url = self.url }), else => log.err(.frame, "document is complete", .{ .err = err, .type = self._type, .url = self.url }), }; diff --git a/src/server/Link.zig b/src/server/Link.zig index 7097a88a2..8d7348c67 100644 --- a/src/server/Link.zig +++ b/src/server/Link.zig @@ -60,6 +60,7 @@ send_arena: ArenaAllocator, send_depth: u32, send_timeout_ms: i32, max_inbox_backlog: usize, +peer_closed: bool, pub fn init( self: *Link, @@ -91,6 +92,7 @@ pub fn init( .send_depth = 0, .send_timeout_ms = SEND_TIMEOUT_MS, .max_inbox_backlog = @as(usize, config.cdpMaxMessageSize()) * INBOX_BACKLOG_MESSAGES, + .peer_closed = false, }; } @@ -132,6 +134,10 @@ pub fn releaseSendArena(self: *Link) void { } pub fn send(self: *Link, data: []const u8) !void { + if (self.peer_closed) { + return; + } + var pos: usize = 0; const socket = self.socket; @@ -157,6 +163,11 @@ pub fn send(self: *Link, data: []const u8) !void { }, // a signal landed mid-write; nothing was written error.Interrupted => continue, + error.BrokenPipe, error.ConnectionResetByPeer => { + lp.log.debug(.app, "link peer closed", .{ .err = err }); + self.peer_closed = true; + return; + }, else => return err, };