diff --git a/src/event_log.zig b/src/event_log.zig index eac0bdc..2d0f605 100644 --- a/src/event_log.zig +++ b/src/event_log.zig @@ -835,6 +835,8 @@ pub const DiskPersist = struct { if (self.max_dir_bytes > 0) { try self.gcBySize(); } + + self.markDbSuccess(); } /// delete oldest event files until total directory size is under max_dir_bytes diff --git a/src/main.zig b/src/main.zig index d963868..aaddac6 100644 --- a/src/main.zig +++ b/src/main.zig @@ -297,7 +297,6 @@ pub fn main() !void { log.err("failed to start GC thread: {s}", .{@errorName(err)}); return err; }; - gc_thread.detach(); // wire HTTP fallback into broadcaster (all API endpoints served on WS port) var http_context = api.HttpContext{ @@ -366,7 +365,9 @@ pub fn main() !void { ws_listener.deinit(io); server_future.cancel(io); - // GC thread is detached and checks shutdown_flag — no cancel needed + // join GC thread — it checks shutdown_flag and will exit its sleep loop. + // must complete before dp.deinit() runs (dp is stack-owned). + gc_thread.join(); // cancel broadcaster fiber (shutdown flag already set, it will drain remaining) broadcast_future.cancel(io);