filter: blocklist downloads never reuse a pooled connection, the peer closes it between passes
Gates / frontend (push) Successful in 2m3s
Gates / test (push) Successful in 2m34s
Gates / test-aarch64 (push) Successful in 8m20s
Gates / package (push) Successful in 4m20s
Gates / container (push) Successful in 12s
CI / gates (push) Successful in 30m24s
Gates / frontend (push) Successful in 2m3s
Gates / test (push) Successful in 2m34s
Gates / test-aarch64 (push) Successful in 8m20s
Gates / package (push) Successful in 4m20s
Gates / container (push) Successful in 12s
CI / gates (push) Successful in 30m24s
This commit is contained in:
+13
-1
@@ -482,7 +482,19 @@ fn serve(r: cli.Runner, args: cli.RunArgs) !u8 {
|
||||
// Two HTTP clients on purpose. A blocklist download streams tens of
|
||||
// megabytes and holds its connection for the whole of it; DoH queries must
|
||||
// not queue behind that, and the two have nothing to share but a type.
|
||||
var fetch_http: std.http.Client = .{ .allocator = gpa, .io = io };
|
||||
// `free_size = 0` makes `release` destroy every connection and the pool
|
||||
// hand none back (`Client.zig:133`). The fetcher's `.keep_alive = false` is
|
||||
// what sends `connection: close`, but it cannot carry this alone: `request`
|
||||
// takes a pooled connection before it stores the flag (`Client.zig:1725`,
|
||||
// `:1742`), and a failed send leaves a `.ready` connection that
|
||||
// `Request.deinit` would pool (`Client.zig:890`). A pass runs once a day,
|
||||
// so any kept connection is closed at the peer by the next one, and the
|
||||
// client never retries a stale one — it fails the source for the day.
|
||||
var fetch_http: std.http.Client = .{
|
||||
.allocator = gpa,
|
||||
.io = io,
|
||||
.connection_pool = .{ .free_size = 0 },
|
||||
};
|
||||
defer fetch_http.deinit();
|
||||
var dns_http: std.http.Client = .{ .allocator = gpa, .io = io };
|
||||
defer dns_http.deinit();
|
||||
|
||||
Reference in New Issue
Block a user