From a8e02b9cedc412d4e41893707e7a44476652250c Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Mon, 30 Oct 2023 08:51:37 -0700 Subject: [PATCH] Move envelope follow-up operations outside of the transaction. --- .../securesms/database/SignalDatabase.kt | 11 ++++------ .../securesms/jobs/RetrieveProfileJob.java | 3 ++- .../messages/IncomingMessageObserver.kt | 20 +++++++++++-------- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SignalDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/database/SignalDatabase.kt index fbc238f1f8..57ddff5ec9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SignalDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SignalDatabase.kt @@ -6,6 +6,7 @@ import androidx.annotation.VisibleForTesting import net.zetetic.database.sqlcipher.SQLiteOpenHelper import org.signal.core.util.SqlUtil import org.signal.core.util.logging.Log +import org.signal.core.util.withinTransaction import org.thoughtcrime.securesms.crypto.AttachmentSecret import org.thoughtcrime.securesms.crypto.DatabaseSecret import org.thoughtcrime.securesms.crypto.MasterSecret @@ -345,13 +346,9 @@ open class SignalDatabase(private val context: Application, databaseSecret: Data } @JvmStatic - fun runInTransaction(operation: Runnable) { - instance!!.signalWritableDatabase.beginTransaction() - try { - operation.run() - instance!!.signalWritableDatabase.setTransactionSuccessful() - } finally { - instance!!.signalWritableDatabase.endTransaction() + fun runInTransaction(block: (SQLiteDatabase) -> T): T { + return instance!!.signalWritableDatabase.withinTransaction { + block(it) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveProfileJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveProfileJob.java index 7dd60b3a15..37a946af20 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveProfileJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveProfileJob.java @@ -292,10 +292,11 @@ public class RetrieveProfileJob extends BaseJob { //noinspection SimplifyStreamApiCallChains ListUtil.chunk(operationState.profiles, 150).stream().forEach(list -> { - SignalDatabase.runInTransaction(() -> { + SignalDatabase.runInTransaction((db) -> { for (Pair profile : list) { process(profile.first(), profile.second()); } + return null; }); }); diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/IncomingMessageObserver.kt b/app/src/main/java/org/thoughtcrime/securesms/messages/IncomingMessageObserver.kt index 95dfaad7fd..57975b0c1d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/IncomingMessageObserver.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/IncomingMessageObserver.kt @@ -392,18 +392,22 @@ class IncomingMessageObserver(private val context: Application) { val startTime = System.currentTimeMillis() GroupsV2ProcessingLock.acquireGroupProcessingLock().use { ReentrantSessionLock.INSTANCE.acquire().use { - batch.forEach { + batch.forEach { response -> Log.d(TAG, "Beginning database transaction...") - SignalDatabase.runInTransaction { - val followUpOperations: List? = processEnvelope(bufferedStore, it.envelope, it.serverDeliveredTimestamp) + val followUpOperations = SignalDatabase.runInTransaction { db -> + val followUps: List? = processEnvelope(bufferedStore, response.envelope, response.serverDeliveredTimestamp) bufferedStore.flushToDisk() - if (followUpOperations != null) { - val jobs = followUpOperations.mapNotNull { it.run() } - ApplicationDependencies.getJobManager().addAll(jobs) - } + followUps } Log.d(TAG, "Ended database transaction.") - signalWebSocket.sendAck(it) + + if (followUpOperations != null) { + Log.d(TAG, "Running ${followUpOperations.size} follow-up operations...") + val jobs = followUpOperations.mapNotNull { it.run() } + ApplicationDependencies.getJobManager().addAll(jobs) + } + + signalWebSocket.sendAck(response) } } }