From 949bc8fb957329d36a7a8a232fc559c1d7df7754 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Mon, 4 Aug 2025 15:29:01 -0400 Subject: [PATCH] Add additional logging around JobManager memory state. --- .../securesms/jobmanager/JobController.java | 8 +++ .../jobmanager/persistence/JobStorage.kt | 3 ++ .../securesms/jobs/FastJobStorage.kt | 54 ++++++++++++++----- 3 files changed, 51 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobController.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobController.java index 3935f9150e..76be46f1de 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobController.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobController.java @@ -354,6 +354,7 @@ class JobController { List jobs = jobStorage.debugGetJobSpecs(1000); List constraints = jobStorage.debugGetConstraintSpecs(1000); List dependencies = jobStorage.debugGetAllDependencySpecs(); + String additional = jobStorage.debugAdditionalDetails(); StringBuilder info = new StringBuilder(); @@ -378,6 +379,13 @@ class JobController { info.append("None\n"); } + info.append("\n-- Additional Details\n"); + if (additional != null) { + info.append(additional).append('\n'); + } else { + info.append("None\n"); + } + return info.toString(); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/persistence/JobStorage.kt b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/persistence/JobStorage.kt index 25c337d8ad..64497fae7c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/persistence/JobStorage.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/persistence/JobStorage.kt @@ -67,4 +67,7 @@ interface JobStorage { @WorkerThread fun debugGetAllDependencySpecs(): List + + @WorkerThread + fun debugAdditionalDetails(): String? } diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/FastJobStorage.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/FastJobStorage.kt index e0bc087b98..229f4e12f6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/FastJobStorage.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/FastJobStorage.kt @@ -377,6 +377,23 @@ class FastJobStorage(private val jobDatabase: JobDatabase) : JobStorage { return dependenciesByJobId.values.flatten() } + @Synchronized + override fun debugAdditionalDetails(): String { + return buildString { + appendLine("minimalJobs: Size(${minimalJobs.size}), Items(${minimalJobs.joinToString(", ") { it.toLogString() }})") + appendLine("jobSpecCache: Size(${jobSpecCache.size}), Items(${jobSpecCache.keys.joinToString(", ") { it.toLogString() }})") + appendLine("eligibleJobs: Size(${eligibleJobs.size}), Items(${eligibleJobs.joinToString(", ") { it.toLogString() }})") + appendLine("migrationJobs: Size(${migrationJobs.size}), Items(${migrationJobs.joinToString(", ") { it.toLogString() }})") + appendLine("mostEligibleForQueue: Size(${mostEligibleJobForQueue.size}), Items(${mostEligibleJobForQueue.entries.joinToString(", ") { "[${it.key} => ${it.value.toLogString()}]" }})") + appendLine("constraintsByJobId: Size(${constraintsByJobId.size}), Items(${constraintsByJobId.entries.joinToString(", ") { "[${it.key.toLogString()} => ${it.value.joinToString(", ") { c -> c.toLogString() }}]" }})") + appendLine("dependenciesByJobId: Size(${dependenciesByJobId.size}), Items(${dependenciesByJobId.entries.joinToString(", ") { "[${it.key.toLogString()} => ${it.value.map { d -> d.toLogString() }}]" }})") + } + } + + private fun String.toLogString(): String { + return "JOB::$this" + } + private fun updateCachedJobSpecs(filter: (MinimalJobSpec) -> Boolean, transformer: (MinimalJobSpec) -> MinimalJobSpec, singleUpdate: Boolean = false) { val iterator = minimalJobs.listIterator() @@ -548,23 +565,32 @@ class FastJobStorage(private val jobDatabase: JobDatabase) : JobStorage { } } - /** - * Identical to [EligibleMinJobComparator], but for full jobs. - */ - private object EligibleFullJobComparator : Comparator { - override fun compare(o1: JobSpec, o2: JobSpec): Int { - return when { - o1.globalPriority > o2.globalPriority -> -1 - o1.globalPriority < o2.globalPriority -> 1 - o1.createTime < o2.createTime -> -1 - o1.createTime > o2.createTime -> 1 - else -> o1.id.compareTo(o2.id) - } + private fun debugStopwatch(label: String): Stopwatch? { + return if (DEBUG) Stopwatch(label, decimalPlaces = 2) else null + } + + private fun MinimalJobSpec.toLogString(): String { + return if (this.isMemoryOnly) { + return "😶‍🌫️JOB::$this" + } else { + return "JOB::$this" } } - private fun debugStopwatch(label: String): Stopwatch? { - return if (DEBUG) Stopwatch(label, decimalPlaces = 2) else null + private fun ConstraintSpec.toLogString(): String { + return if (this.isMemoryOnly) { + return "😶‍🌫️JOB::$this" + } else { + return "JOB::$this" + } + } + + private fun DependencySpec.toLogString(): String { + return if (this.isMemoryOnly) { + return "😶‍🌫️JOB::$this" + } else { + return "JOB::$this" + } } }