From e1949cb59bf4886a37998fd5c7bf78860b89ef30 Mon Sep 17 00:00:00 2001 From: Valere Date: Mon, 23 May 2022 10:03:13 +0200 Subject: [PATCH] to device decryption perf --- .../internal/crypto/RoomDecryptorProvider.kt | 7 ++++- .../session/sync/SyncResponseHandler.kt | 2 +- .../session/sync/handler/CryptoSyncHandler.kt | 27 ++++++++++++++++--- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/RoomDecryptorProvider.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/RoomDecryptorProvider.kt index a80bafbe79..026b638a26 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/RoomDecryptorProvider.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/RoomDecryptorProvider.kt @@ -17,9 +17,11 @@ package org.matrix.android.sdk.internal.crypto import org.matrix.android.sdk.api.crypto.MXCRYPTO_ALGORITHM_MEGOLM +import org.matrix.android.sdk.api.crypto.MXCRYPTO_ALGORITHM_OLM import org.matrix.android.sdk.api.session.crypto.NewSessionListener import org.matrix.android.sdk.internal.crypto.algorithms.IMXDecrypting import org.matrix.android.sdk.internal.crypto.algorithms.megolm.MXMegolmDecryptionFactory +import org.matrix.android.sdk.internal.crypto.algorithms.olm.MXOlmDecryption import org.matrix.android.sdk.internal.crypto.algorithms.olm.MXOlmDecryptionFactory import org.matrix.android.sdk.internal.session.SessionScope import timber.log.Timber @@ -44,6 +46,8 @@ internal class RoomDecryptorProvider @Inject constructor( newSessionListeners.remove(listener) } + private val olmDecryptor: MXOlmDecryption by lazy { olmDecryptionFactory.create() } + /** * Get a decryptor for a given room and algorithm. * If we already have a decryptor for the given room and algorithm, return @@ -85,7 +89,8 @@ internal class RoomDecryptorProvider @Inject constructor( } } } - else -> olmDecryptionFactory.create() + MXCRYPTO_ALGORITHM_OLM -> olmDecryptor + else -> return null } if (!roomId.isNullOrEmpty()) { synchronized(roomDecryptors) { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt index 02a7a9a37f..74b945788a 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt @@ -94,7 +94,7 @@ internal class SyncResponseHandler @Inject constructor( } } }.also { - Timber.v("Finish handling toDevice in $it ms") + Timber.d("Finish handling toDevice in $it ms") } val aggregator = SyncResponsePostTreatmentAggregator() diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/CryptoSyncHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/CryptoSyncHandler.kt index e5a5a0bbad..9461cd71be 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/CryptoSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/CryptoSyncHandler.kt @@ -16,6 +16,10 @@ package org.matrix.android.sdk.internal.session.sync.handler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.joinAll +import kotlinx.coroutines.launch +import org.matrix.android.sdk.api.MatrixCoroutineDispatchers import org.matrix.android.sdk.api.logger.LoggerTag import org.matrix.android.sdk.api.session.crypto.MXCryptoError import org.matrix.android.sdk.api.session.crypto.model.MXEventDecryptionResult @@ -36,15 +40,32 @@ import javax.inject.Inject private val loggerTag = LoggerTag("CryptoSyncHandler", LoggerTag.CRYPTO) internal class CryptoSyncHandler @Inject constructor(private val cryptoService: DefaultCryptoService, + private val cryptoCoroutineScope: CoroutineScope, + private val coroutineDispatchers: MatrixCoroutineDispatchers, private val verificationService: DefaultVerificationService) { suspend fun handleToDevice(toDevice: ToDeviceSyncResponse, progressReporter: ProgressReporter? = null) { - val total = toDevice.events?.size ?: 0 + val toDeviceList = toDevice.events.orEmpty() + + val total = toDeviceList.size + progressReporter?.reportProgress(0f) + // Olm decryption can be parallelized for better performances. + // We keep events in the same order and group them by sender_key + // as we can't parallelized event from same sender + toDeviceList + .filter { it.getClearType() == EventType.ENCRYPTED } + .groupBy { it.content?.get("sender_key") } + .map { + cryptoCoroutineScope.launch(coroutineDispatchers.computation) { + it.value.forEach { toDevice -> + decryptToDeviceEvent(toDevice, null) + } + } + }.joinAll() + toDevice.events?.forEachIndexed { index, event -> progressReporter?.reportProgress(index * 100F / total) - // Decrypt event if necessary Timber.tag(loggerTag.value).i("To device event from ${event.senderId} of type:${event.type}") - decryptToDeviceEvent(event, null) if (event.getClearType() == EventType.MESSAGE && event.getClearContent()?.toModel()?.msgType == "m.bad.encrypted") { Timber.tag(loggerTag.value).e("handleToDeviceEvent() : Warning: Unable to decrypt to-device event : ${event.content}")