mirror of
https://github.com/lightpanda-io/browser.git
synced 2026-04-03 08:00:34 +00:00
more expressive cache logging
This commit is contained in:
@@ -375,16 +375,8 @@ fn processRequest(self: *Client, req: Request) !void {
|
|||||||
.timestamp = std.time.timestamp(),
|
.timestamp = std.time.timestamp(),
|
||||||
.request_headers = req_header_list.items,
|
.request_headers = req_header_list.items,
|
||||||
})) |cached| {
|
})) |cached| {
|
||||||
log.debug(.browser, "http.cache.get", .{
|
|
||||||
.url = req.url,
|
|
||||||
.found = true,
|
|
||||||
.metadata = cached.metadata,
|
|
||||||
});
|
|
||||||
|
|
||||||
defer req.headers.deinit();
|
defer req.headers.deinit();
|
||||||
return serveFromCache(req, &cached);
|
return serveFromCache(req, &cached);
|
||||||
} else {
|
|
||||||
log.debug(.browser, "http.cache.get", .{ .url = req.url, .found = false });
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -972,12 +964,9 @@ fn processOneMessage(self: *Client, msg: http.Handles.MultiMessage, transfer: *T
|
|||||||
|
|
||||||
if (transfer._pending_cache_metadata) |metadata| {
|
if (transfer._pending_cache_metadata) |metadata| {
|
||||||
const cache = &self.network.cache.?;
|
const cache = &self.network.cache.?;
|
||||||
log.debug(.browser, "http cache", .{ .url = transfer.req.url, .metadata = metadata });
|
|
||||||
|
|
||||||
cache.put(metadata, body) catch |err| {
|
cache.put(metadata, body) catch |err| {
|
||||||
log.warn(.http, "cache put failed", .{ .err = err });
|
log.warn(.cache, "cache put failed", .{ .err = err });
|
||||||
};
|
};
|
||||||
log.debug(.browser, "http.cache.put", .{ .url = transfer.req.url });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// release conn ASAP so that it's available; some done_callbacks
|
// release conn ASAP so that it's available; some done_callbacks
|
||||||
@@ -1157,6 +1146,13 @@ pub const Response = struct {
|
|||||||
.cached => {},
|
.cached => {},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn format(self: Response, writer: *std.Io.Writer) !void {
|
||||||
|
return switch (self.inner) {
|
||||||
|
.transfer => |t| try t.format(writer),
|
||||||
|
.cached => |c| try c.format(writer),
|
||||||
|
};
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const Transfer = struct {
|
pub const Transfer = struct {
|
||||||
|
|||||||
14
src/network/cache/Cache.zig
vendored
14
src/network/cache/Cache.zig
vendored
@@ -138,11 +138,25 @@ pub const CachedData = union(enum) {
|
|||||||
offset: usize,
|
offset: usize,
|
||||||
len: usize,
|
len: usize,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
pub fn format(self: CachedData, writer: *std.Io.Writer) !void {
|
||||||
|
switch (self) {
|
||||||
|
.buffer => |buf| try writer.print("buffer({d} bytes)", .{buf.len}),
|
||||||
|
.file => |f| try writer.print("file(offset={d}, len={d} bytes)", .{ f.offset, f.len }),
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const CachedResponse = struct {
|
pub const CachedResponse = struct {
|
||||||
metadata: CachedMetadata,
|
metadata: CachedMetadata,
|
||||||
data: CachedData,
|
data: CachedData,
|
||||||
|
|
||||||
|
pub fn format(self: *const CachedResponse, writer: *std.Io.Writer) !void {
|
||||||
|
try writer.print("metadata=(", .{});
|
||||||
|
try self.metadata.format(writer);
|
||||||
|
try writer.print("), data=", .{});
|
||||||
|
try self.data.format(writer);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn tryCache(
|
pub fn tryCache(
|
||||||
|
|||||||
58
src/network/cache/FsCache.zig
vendored
58
src/network/cache/FsCache.zig
vendored
@@ -97,7 +97,7 @@ pub fn get(self: *FsCache, arena: std.mem.Allocator, req: CacheRequest) ?Cache.C
|
|||||||
const file = self.dir.openFile(&cache_p, .{ .mode = .read_only }) catch |e| {
|
const file = self.dir.openFile(&cache_p, .{ .mode = .read_only }) catch |e| {
|
||||||
switch (e) {
|
switch (e) {
|
||||||
std.fs.File.OpenError.FileNotFound => {
|
std.fs.File.OpenError.FileNotFound => {
|
||||||
log.debug(.cache, "miss", .{ .url = req.url, .hash = &hashed_key });
|
log.debug(.cache, "miss", .{ .url = req.url, .hash = &hashed_key, .reason = "missing" });
|
||||||
},
|
},
|
||||||
else => |err| {
|
else => |err| {
|
||||||
log.warn(.cache, "open file err", .{ .url = req.url, .err = err });
|
log.warn(.cache, "open file err", .{ .url = req.url, .err = err });
|
||||||
@@ -141,13 +141,19 @@ pub fn get(self: *FsCache, arena: std.mem.Allocator, req: CacheRequest) ?Cache.C
|
|||||||
&json_reader,
|
&json_reader,
|
||||||
.{ .allocate = .alloc_always },
|
.{ .allocate = .alloc_always },
|
||||||
) catch |e| {
|
) catch |e| {
|
||||||
log.warn(.cache, "metadata parse", .{ .url = req.url, .err = e });
|
// Warn because malformed metadata can be a deeper symptom.
|
||||||
|
log.warn(.cache, "miss", .{ .url = req.url, .err = e, .reason = "malformed metadata" });
|
||||||
cleanup = true;
|
cleanup = true;
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
||||||
if (cache_file.version != CACHE_VERSION) {
|
if (cache_file.version != CACHE_VERSION) {
|
||||||
log.warn(.cache, "version", .{ .url = req.url, .expected = CACHE_VERSION, .got = cache_file.version });
|
log.debug(.cache, "miss", .{
|
||||||
|
.url = req.url,
|
||||||
|
.reason = "version mismatch",
|
||||||
|
.expected = CACHE_VERSION,
|
||||||
|
.got = cache_file.version,
|
||||||
|
});
|
||||||
cleanup = true;
|
cleanup = true;
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -158,7 +164,7 @@ pub fn get(self: *FsCache, arena: std.mem.Allocator, req: CacheRequest) ?Cache.C
|
|||||||
const now = req.timestamp;
|
const now = req.timestamp;
|
||||||
const age = (now - metadata.stored_at) + @as(i64, @intCast(metadata.age_at_store));
|
const age = (now - metadata.stored_at) + @as(i64, @intCast(metadata.age_at_store));
|
||||||
if (age < 0 or @as(u64, @intCast(age)) >= metadata.cache_control.max_age) {
|
if (age < 0 or @as(u64, @intCast(age)) >= metadata.cache_control.max_age) {
|
||||||
log.debug(.cache, "expired", .{ .url = req.url });
|
log.debug(.cache, "miss", .{ .url = req.url, .reason = "expired" });
|
||||||
cleanup = true;
|
cleanup = true;
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -173,7 +179,13 @@ pub fn get(self: *FsCache, arena: std.mem.Allocator, req: CacheRequest) ?Cache.C
|
|||||||
} else "";
|
} else "";
|
||||||
|
|
||||||
if (!std.ascii.eqlIgnoreCase(value, incoming)) {
|
if (!std.ascii.eqlIgnoreCase(value, incoming)) {
|
||||||
log.debug(.cache, "vary mismatch", .{ .url = req.url, .header = name });
|
log.debug(.cache, "miss", .{
|
||||||
|
.url = req.url,
|
||||||
|
.reason = "vary mismatch",
|
||||||
|
.header = name,
|
||||||
|
.expected = value,
|
||||||
|
.got = incoming,
|
||||||
|
});
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -185,6 +197,8 @@ pub fn get(self: *FsCache, arena: std.mem.Allocator, req: CacheRequest) ?Cache.C
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.debug(.cache, "hit", .{ .url = req.url, .hash = &hashed_key });
|
||||||
|
|
||||||
return .{
|
return .{
|
||||||
.metadata = metadata,
|
.metadata = metadata,
|
||||||
.data = .{
|
.data = .{
|
||||||
@@ -206,27 +220,45 @@ pub fn put(self: *FsCache, meta: CachedMetadata, body: []const u8) !void {
|
|||||||
lock.lock();
|
lock.lock();
|
||||||
defer lock.unlock();
|
defer lock.unlock();
|
||||||
|
|
||||||
const file = try self.dir.createFile(&cache_tmp_p, .{ .truncate = true });
|
const file = self.dir.createFile(&cache_tmp_p, .{ .truncate = true }) catch |e| {
|
||||||
|
log.err(.cache, "create file", .{ .url = meta.url, .file = &cache_tmp_p, .err = e });
|
||||||
|
return e;
|
||||||
|
};
|
||||||
defer file.close();
|
defer file.close();
|
||||||
|
|
||||||
var writer_buf: [1024]u8 = undefined;
|
var writer_buf: [1024]u8 = undefined;
|
||||||
|
|
||||||
var file_writer = file.writer(&writer_buf);
|
var file_writer = file.writer(&writer_buf);
|
||||||
var file_writer_iface = &file_writer.interface;
|
var file_writer_iface = &file_writer.interface;
|
||||||
|
|
||||||
var len_buf: [8]u8 = undefined;
|
var len_buf: [8]u8 = undefined;
|
||||||
std.mem.writeInt(u64, &len_buf, body.len, .little);
|
std.mem.writeInt(u64, &len_buf, body.len, .little);
|
||||||
try file_writer_iface.writeAll(&len_buf);
|
|
||||||
try file_writer_iface.writeAll(body);
|
|
||||||
|
|
||||||
try std.json.Stringify.value(
|
file_writer_iface.writeAll(&len_buf) catch |e| {
|
||||||
|
log.err(.cache, "write body len", .{ .url = meta.url, .err = e });
|
||||||
|
return e;
|
||||||
|
};
|
||||||
|
file_writer_iface.writeAll(body) catch |e| {
|
||||||
|
log.err(.cache, "write body", .{ .url = meta.url, .err = e });
|
||||||
|
return e;
|
||||||
|
};
|
||||||
|
std.json.Stringify.value(
|
||||||
CacheMetadataJson{ .version = CACHE_VERSION, .metadata = meta },
|
CacheMetadataJson{ .version = CACHE_VERSION, .metadata = meta },
|
||||||
.{ .whitespace = .minified },
|
.{ .whitespace = .minified },
|
||||||
file_writer_iface,
|
file_writer_iface,
|
||||||
);
|
) catch |e| {
|
||||||
|
log.err(.cache, "write metadata", .{ .url = meta.url, .err = e });
|
||||||
|
return e;
|
||||||
|
};
|
||||||
|
file_writer_iface.flush() catch |e| {
|
||||||
|
log.err(.cache, "flush", .{ .url = meta.url, .err = e });
|
||||||
|
return e;
|
||||||
|
};
|
||||||
|
self.dir.rename(&cache_tmp_p, &cache_p) catch |e| {
|
||||||
|
log.err(.cache, "rename", .{ .url = meta.url, .from = &cache_tmp_p, .to = &cache_p, .err = e });
|
||||||
|
return e;
|
||||||
|
};
|
||||||
|
|
||||||
try file_writer_iface.flush();
|
log.debug(.cache, "put", .{ .url = meta.url, .hash = &hashed_key, .body_len = body.len });
|
||||||
try self.dir.rename(&cache_tmp_p, &cache_p);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const testing = std.testing;
|
const testing = std.testing;
|
||||||
|
|||||||
Reference in New Issue
Block a user