fix(debug): Fix deadlock risk, missing IO dispatcher, and thread safety in session manager

Replace sessions.first() inside fsMutex.withLock with synchronous volatile

read to avoid potential deadlock. Wrap file deletions in IO dispatcher.

Log partial delete failures. Make pendingAutoZips thread-safe via

Collections.synchronizedSet. Add test for ext/cache same-basename IDs.
This commit is contained in:
darken
2026-03-09 04:53:01 +00:00
committed by Matthias Urhahn
parent 70a3114876
commit a5f5feacae
3 changed files with 57 additions and 29 deletions
@@ -199,6 +199,23 @@ class DebugSessionManagerTest : BaseTest() {
// Verify the session IS a Recording — the manager would reject zip/delete calls for this
}
@Test
fun `ext and cache sessions with same basename have different IDs`() {
val cacheLogsDir = File(tempDir, "cache/debug/logs").also { it.mkdirs() }
val extDir = File(externalLogsDir, "capod_1.0_1700000000000_abcd1234").also { it.mkdirs() }
File(extDir, "core.log").writeText("external log")
val cacheDir = File(cacheLogsDir, "capod_1.0_1700000000000_abcd1234").also { it.mkdirs() }
File(cacheDir, "core.log").writeText("cache log")
val sessions = DebugSessionManager.scanSessions(
logDirectories = listOf(externalLogsDir, cacheLogsDir),
)
sessions shouldHaveSize 2
val ids = sessions.map { it.id }.toSet()
ids shouldBe setOf("ext:capod_1.0_1700000000000_abcd1234", "cache:capod_1.0_1700000000000_abcd1234")
}
@Test
fun `zipping session should not be deleted`() {
val sessionDir = File(externalLogsDir, "capod_1.0_1700000000000_abcd1234").also { it.mkdirs() }