From eadfb83baa110f351adede7889a9b9eba9649017 Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Thu, 26 Mar 2026 16:14:54 -0700 Subject: [PATCH] add striped lock to FsCache --- src/network/cache/FsCache.zig | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/network/cache/FsCache.zig b/src/network/cache/FsCache.zig index 5e0e9e46..87df4f83 100644 --- a/src/network/cache/FsCache.zig +++ b/src/network/cache/FsCache.zig @@ -23,16 +23,23 @@ const CachedMetadata = Cache.CachedMetadata; const CachedResponse = Cache.CachedResponse; const CACHE_VERSION: usize = 1; +const LOCK_STRIPES = 16; pub const FsCache = @This(); dir: std.fs.Dir, +locks: [LOCK_STRIPES]std.Thread.Mutex = .{std.Thread.Mutex{}} ** LOCK_STRIPES, const CacheMetadataFile = struct { version: usize, metadata: CachedMetadata, }; +fn getLockPtr(self: *FsCache, key: *const [HASHED_KEY_LEN]u8) *std.Thread.Mutex { + const lock_idx: usize = @truncate(std.hash.Wyhash.hash(0, key) % LOCK_STRIPES); + return &self.locks[lock_idx]; +} + const HASHED_KEY_LEN = 64; const HASHED_PATH_LEN = HASHED_KEY_LEN + 5; const HASHED_TMP_PATH_LEN = HASHED_PATH_LEN + 4; @@ -94,6 +101,10 @@ pub fn get(self: *FsCache, arena: std.mem.Allocator, key: []const u8) ?Cache.Cac const meta_p = metaPath(&hashed_key); const body_p = bodyPath(&hashed_key); + const lock = self.getLockPtr(&hashed_key); + lock.lock(); + defer lock.unlock(); + const meta_file = self.dir.openFile(&meta_p, .{ .mode = .read_only }) catch return null; defer meta_file.close(); @@ -136,9 +147,12 @@ pub fn put(self: *FsCache, key: []const u8, meta: CachedMetadata, body: []const const meta_tmp_p = metaTmpPath(&hashed_key); const body_p = bodyPath(&hashed_key); const body_tmp_p = bodyTmpPath(&hashed_key); - var writer_buf: [512]u8 = undefined; + const lock = self.getLockPtr(&hashed_key); + lock.lock(); + defer lock.unlock(); + { const meta_file = try self.dir.createFile(&meta_tmp_p, .{}); errdefer {