fix(diagnostics): stabilize pending crash ordering

This commit is contained in:
2026-07-21 18:23:50 +02:00
parent a8a873c83d
commit 873ec6fd94
2 changed files with 11 additions and 2 deletions

View File

@@ -31,10 +31,13 @@ private class JvmPendingCrashStore(
return directory return directory
.listFiles { file -> file.isFile && file.name.endsWith(".crash") } .listFiles { file -> file.isFile && file.name.endsWith(".crash") }
.orEmpty() .orEmpty()
.sortedByDescending { it.lastModified() }
.mapNotNull { file -> .mapNotNull { file ->
runCatching { CrashReportCodec.decode(file.readText(StandardCharsets.UTF_8)) }.getOrNull() runCatching { CrashReportCodec.decode(file.readText(StandardCharsets.UTF_8)) }.getOrNull()
} }
.sortedWith(
compareByDescending<CrashReport> { it.timestampMillis }
.thenBy { it.id },
)
} }
@Synchronized @Synchronized
@@ -64,7 +67,10 @@ private class JvmPendingCrashStore(
file to report file to report
} }
} }
.sortedByDescending { (_, report) -> report.timestampMillis } .sortedWith(
compareByDescending<Pair<File, CrashReport>> { (_, report) -> report.timestampMillis }
.thenBy { (_, report) -> report.id },
)
reports.forEachIndexed { index, (file, report) -> reports.forEachIndexed { index, (file, report) ->
if (index >= maxCount || report.timestampMillis < olderThanTimestampMillis) file.delete() if (index >= maxCount || report.timestampMillis < olderThanTimestampMillis) file.delete()
} }

View File

@@ -2,6 +2,7 @@ package com.vnidrop.app.diagnostics
import java.io.File import java.io.File
import java.nio.file.Files import java.nio.file.Files
import java.nio.file.attribute.FileTime
import kotlin.test.Test import kotlin.test.Test
import kotlin.test.assertEquals import kotlin.test.assertEquals
import kotlin.test.assertFalse import kotlin.test.assertFalse
@@ -24,6 +25,8 @@ class PendingCrashStoreJvmTest {
File(directory, ".orphan.tmp").writeText("partial") File(directory, ".orphan.tmp").writeText("partial")
store.write(current.copy(id = "../../escape")) store.write(current.copy(id = "../../escape"))
val escapedPath = File(directory, "../../escape.crash").canonicalFile val escapedPath = File(directory, "../../escape.crash").canonicalFile
Files.setLastModifiedTime(File(directory, "${older.id}.crash").toPath(), FileTime.fromMillis(2_000))
Files.setLastModifiedTime(File(directory, "${current.id}.crash").toPath(), FileTime.fromMillis(1_000))
assertEquals( assertEquals(
listOf("replaced", "older"), listOf("replaced", "older"),