From a5c4c3b54aeec2349fc4b31cdd344c1a5ee843b3 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Thu, 28 Aug 2025 16:41:15 -0400 Subject: [PATCH] Small JobManager tweaks to scale more often and improve debugging info. --- .../securesms/jobmanager/JobController.java | 13 ++++++++----- .../thoughtcrime/securesms/jobs/FastJobStorage.kt | 8 ++++++-- .../securesms/jobmanager/JobControllerTest.kt | 4 ++-- 3 files changed, 16 insertions(+), 9 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 b65e04ebec..9e32513f49 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobController.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobController.java @@ -32,6 +32,7 @@ import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.IntSupplier; import java.util.function.Predicate; /** @@ -104,6 +105,7 @@ class JobController { synchronized void wakeUp() { notifyAll(); + maybeScaleUpRunners(() -> jobStorage.getEligibleJobCount(System.currentTimeMillis())); } @WorkerThread @@ -145,7 +147,7 @@ class JobController { synchronized (this) { notifyAll(); - maybeScaleUpRunners(jobStorage.getEligibleJobCount(System.currentTimeMillis())); + maybeScaleUpRunners(() -> jobStorage.getEligibleJobCount(System.currentTimeMillis())); } } @@ -197,7 +199,7 @@ class JobController { synchronized (this) { notifyAll(); - maybeScaleUpRunners(jobStorage.getEligibleJobCount(System.currentTimeMillis())); + maybeScaleUpRunners(() -> jobStorage.getEligibleJobCount(System.currentTimeMillis())); } } @@ -233,7 +235,7 @@ class JobController { synchronized (this) { notifyAll(); - maybeScaleUpRunners(jobStorage.getEligibleJobCount(System.currentTimeMillis())); + maybeScaleUpRunners(() -> jobStorage.getEligibleJobCount(System.currentTimeMillis())); } } @@ -492,7 +494,7 @@ class JobController { spawnGeneralRunner(0); } - maybeScaleUpRunners(jobStorage.getEligibleJobCount(System.currentTimeMillis())); + maybeScaleUpRunners(() -> jobStorage.getEligibleJobCount(System.currentTimeMillis())); notifyAll(); } @@ -501,11 +503,12 @@ class JobController { * Scales up the number of {@link JobRunner}s to satisfy the number of eligible jobs, if needed. */ @VisibleForTesting - synchronized void maybeScaleUpRunners(int eligibleJobCount) { + synchronized void maybeScaleUpRunners(IntSupplier eligibleJobCountSupplier) { if (!runnersStarted.get()) { return; } + int eligibleJobCount = eligibleJobCountSupplier.getAsInt(); int activeRunners = this.activeGeneralRunners.size(); int maxPossibleRunnersToSpawn = maxGeneralRunners - activeRunners; int runnersToCoverEligibleJobs = eligibleJobCount - activeRunners; 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 5c4bddd28b..f297f6aa99 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/FastJobStorage.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/FastJobStorage.kt @@ -113,7 +113,9 @@ class FastJobStorage(private val jobDatabase: JobDatabase) : JobStorage { factoryCountIndex.getOrPut(minimalJobSpec.factoryKey) { AtomicInteger(0) }.incrementAndGet() constraintsByJobId[fullSpec.jobSpec.id] = fullSpec.constraintSpecs.toMutableList() - dependenciesByJobId[fullSpec.jobSpec.id] = fullSpec.dependencySpecs.toMutableList() + if (fullSpec.dependencySpecs.isNotEmpty()) { + dependenciesByJobId[fullSpec.jobSpec.id] = fullSpec.dependencySpecs.toMutableList() + } } stopwatch?.split("cache") stopwatch?.stop(TAG) @@ -422,6 +424,8 @@ class FastJobStorage(private val jobDatabase: JobDatabase) : JobStorage { @Synchronized override fun debugAdditionalDetails(): String { + val nonEmptyDependencies = dependenciesByJobId.filterValues { it.isNotEmpty() } + return buildString { appendLine("minimalJobs: Size(${minimalJobs.size}), Items(${minimalJobs.joinToString(", ") { it.toLogString() }})") appendLine("jobSpecCache: Size(${jobSpecCache.size}), Items(${jobSpecCache.keys.joinToString(", ") { it.toLogString() }})") @@ -429,7 +433,7 @@ class FastJobStorage(private val jobDatabase: JobDatabase) : JobStorage { 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() }}]" }})") + appendLine("dependenciesByJobId: Size(${nonEmptyDependencies.size}), Items(${nonEmptyDependencies.entries.joinToString(", ") { "[${it.key.toLogString()} => ${it.value.map { d -> d.toLogString() }}]" }})") } } diff --git a/app/src/test/java/org/thoughtcrime/securesms/jobmanager/JobControllerTest.kt b/app/src/test/java/org/thoughtcrime/securesms/jobmanager/JobControllerTest.kt index ec7b23a872..e640798054 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/jobmanager/JobControllerTest.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/jobmanager/JobControllerTest.kt @@ -479,7 +479,7 @@ class JobControllerTest { fun `maybeScaleUpRunners - creates runners to satisfy demand`() { // When jobController.runnersStarted.set(true) - jobController.maybeScaleUpRunners(MAX_RUNNERS) + jobController.maybeScaleUpRunners { MAX_RUNNERS } // Then assertThat(jobController.activeGeneralRunners.size).isEqualTo(MAX_RUNNERS) @@ -489,7 +489,7 @@ class JobControllerTest { fun `maybeScaleUpRunners - does not exceed max runners`() { // When jobController.runnersStarted.set(true) - jobController.maybeScaleUpRunners(MAX_RUNNERS * 2) + jobController.maybeScaleUpRunners { MAX_RUNNERS * 2 } // Then assertThat(jobController.activeGeneralRunners.size).isEqualTo(MAX_RUNNERS)