1
0
mirror of https://github.com/vector-im/riotX-android synced 2025-10-05 15:52:47 +02:00

to device decryption perf

This commit is contained in:
Valere
2022-05-23 10:03:13 +02:00
parent 0b35ee7c79
commit e1949cb59b
3 changed files with 31 additions and 5 deletions

View File

@@ -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) {

View File

@@ -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()

View File

@@ -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<MessageContent>()?.msgType == "m.bad.encrypted") {
Timber.tag(loggerTag.value).e("handleToDeviceEvent() : Warning: Unable to decrypt to-device event : ${event.content}")