From 96f5ddfca69353f71ee6a4eac141e5fcec366f49 Mon Sep 17 00:00:00 2001 From: Emil Lerch Date: Fri, 4 Apr 2025 12:08:10 -0700 Subject: [PATCH] bail out after 20 unexpected connect failures (takes overnight) --- .gitignore | 1 + src/main.zig | 4 ++++ src/root.zig | 13 ++++++++++++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 3389c86..65f7cf4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .zig-cache/ zig-out/ +.direnv diff --git a/src/main.zig b/src/main.zig index 9c5a25f..5ff82c3 100644 --- a/src/main.zig +++ b/src/main.zig @@ -81,6 +81,10 @@ pub fn main() !u8 { std.log.err("Maximum retries exceeded - exiting", .{}); return 1; }, + error.MaximumUnexpectedConnectionFailureRetriesExceeded => { + std.log.err("Maximum unexpected connection failure retries exceeded - exiting", .{}); + return 100; // This feels like a system issue of some sort + }, else => { std.log.err("Error polling events: {s}", .{@errorName(err)}); continue; diff --git a/src/root.zig b/src/root.zig index 4050382..a5fcfff 100644 --- a/src/root.zig +++ b/src/root.zig @@ -95,6 +95,8 @@ pub const EventPoller = struct { var auth_buf: [1024]u8 = undefined; const auth = try std.fmt.bufPrint(&auth_buf, "Bearer {s}", .{self.api_key}); + var ucf_retries: usize = 0; + const MAX_UCF_RETRIES: usize = 20; var retry_count: usize = 0; const first_run = self.last_id == null; while (retry_count < self.config.max_retries) : (retry_count += 1) { @@ -118,13 +120,22 @@ pub const EventPoller = struct { .authorization = .{ .override = auth }, }, }) catch |err| { - std.log.err("HTTP request failed: {s}", .{@errorName(err)}); + if (err == error.UnexpectedConnectFailure) { + ucf_retries += 1; + std.log.err( + "Unexpected connection failure - may not be recoverable. Retry {d}/{d}", + .{ ucf_retries, MAX_UCF_RETRIES }, + ); + if (ucf_retries >= MAX_UCF_RETRIES) return error.MaximumUnexpectedConnectionFailureRetriesExceeded; + continue; + } else std.log.err("HTTP request failed: {s}", .{@errorName(err)}); if (retry_count + 1 < self.config.max_retries) { std.time.sleep(self.config.retry_delay_ms * std.time.ns_per_ms); continue; } return err; }; + ucf_retries = 0; if (response.status == .forbidden) return error.Unauthorized; if (response.status != .ok) {