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:
@@ -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) {
|
||||
|
@@ -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()
|
||||
|
||||
|
@@ -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}")
|
||||
|
Reference in New Issue
Block a user