From 13f7a9fc10df57b668f92607c5a02bfaef3946c4 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 22 Aug 2022 17:44:07 +0200 Subject: [PATCH] Performance: invoke UpdateTrustWorker only once per incremental sync. --- .../session/room/summary/RoomSummaryUpdater.kt | 14 +++++++++++--- .../sync/SyncResponsePostTreatmentAggregator.kt | 3 +++ ...yncResponsePostTreatmentAggregatorHandler.kt | 7 +++++++ .../sync/handler/room/RoomSyncHandler.kt | 17 ++++++++++------- 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryUpdater.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryUpdater.kt index 7e064a84ec..f82aa7372e 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryUpdater.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryUpdater.kt @@ -63,6 +63,7 @@ import org.matrix.android.sdk.internal.session.room.accountdata.RoomAccountDataD import org.matrix.android.sdk.internal.session.room.membership.RoomDisplayNameResolver import org.matrix.android.sdk.internal.session.room.membership.RoomMemberHelper import org.matrix.android.sdk.internal.session.room.relationship.RoomChildRelationInfo +import org.matrix.android.sdk.internal.session.sync.SyncResponsePostTreatmentAggregator import timber.log.Timber import javax.inject.Inject import kotlin.system.measureTimeMillis @@ -91,7 +92,8 @@ internal class RoomSummaryUpdater @Inject constructor( roomSummary: RoomSyncSummary? = null, unreadNotifications: RoomSyncUnreadNotifications? = null, updateMembers: Boolean = false, - inviterId: String? = null + inviterId: String? = null, + aggregator: SyncResponsePostTreatmentAggregator? = null ) { val roomSummaryEntity = RoomSummaryEntity.getOrCreate(realm, roomId) if (roomSummary != null) { @@ -180,8 +182,14 @@ internal class RoomSummaryUpdater @Inject constructor( roomSummaryEntity.otherMemberIds.clear() roomSummaryEntity.otherMemberIds.addAll(otherRoomMembers) if (roomSummaryEntity.isEncrypted && otherRoomMembers.isNotEmpty()) { - // mmm maybe we could only refresh shield instead of checking trust also? - crossSigningService.onUsersDeviceUpdate(otherRoomMembers) + if (aggregator == null) { + // Do it now + // mmm maybe we could only refresh shield instead of checking trust also? + crossSigningService.onUsersDeviceUpdate(otherRoomMembers) // This is very long and could maybe be done once per sync response. + } else { + // Schedule it + aggregator.userIdsWithDeviceUpdate.addAll(otherRoomMembers) + } } } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponsePostTreatmentAggregator.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponsePostTreatmentAggregator.kt index e9452c59fc..14f89e8a34 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponsePostTreatmentAggregator.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponsePostTreatmentAggregator.kt @@ -25,4 +25,7 @@ internal class SyncResponsePostTreatmentAggregator { // List of userIds to fetch and update at the end of incremental syncs val userIdsToFetch = mutableListOf() + + // Set of users to call `crossSigningService.onUsersDeviceUpdate` once per sync + val userIdsWithDeviceUpdate = mutableSetOf() } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/SyncResponsePostTreatmentAggregatorHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/SyncResponsePostTreatmentAggregatorHandler.kt index c638ed4f80..9fb37994a0 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/SyncResponsePostTreatmentAggregatorHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/SyncResponsePostTreatmentAggregatorHandler.kt @@ -20,6 +20,7 @@ import com.zhuinden.monarchy.Monarchy import org.matrix.android.sdk.api.MatrixPatterns import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.session.user.model.User +import org.matrix.android.sdk.internal.crypto.crosssigning.DefaultCrossSigningService import org.matrix.android.sdk.internal.di.SessionDatabase import org.matrix.android.sdk.internal.session.profile.GetProfileInfoTask import org.matrix.android.sdk.internal.session.sync.RoomSyncEphemeralTemporaryStore @@ -36,12 +37,14 @@ internal class SyncResponsePostTreatmentAggregatorHandler @Inject constructor( private val ephemeralTemporaryStore: RoomSyncEphemeralTemporaryStore, private val updateUserAccountDataTask: UpdateUserAccountDataTask, private val getProfileInfoTask: GetProfileInfoTask, + private val crossSigningService: DefaultCrossSigningService, @SessionDatabase private val monarchy: Monarchy, ) { suspend fun handle(aggregator: SyncResponsePostTreatmentAggregator) { cleanupEphemeralFiles(aggregator.ephemeralFilesToDelete) updateDirectUserIds(aggregator.directChatsToCheck) fetchAndUpdateUsers(aggregator.userIdsToFetch) + handleUserIdsWithDeviceUpdate(aggregator.userIdsWithDeviceUpdate) } private fun cleanupEphemeralFiles(ephemeralFilesToDelete: List) { @@ -92,6 +95,10 @@ internal class SyncResponsePostTreatmentAggregatorHandler @Inject constructor( } } + private fun handleUserIdsWithDeviceUpdate(userIdsWithDeviceUpdate: Iterable) { + crossSigningService.onUsersDeviceUpdate(userIdsWithDeviceUpdate.toList()) + } + private suspend fun List.saveLocally() { val userEntities = map { user -> UserEntityFactory.create(user) } monarchy.awaitTransaction { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt index 30e1ec6679..bc91ca205d 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt @@ -154,12 +154,12 @@ internal class RoomSyncHandler @Inject constructor( } is HandlingStrategy.INVITED -> handlingStrategy.data.mapWithProgress(reporter, InitialSyncStep.ImportingAccountInvitedRooms, 0.1f) { - handleInvitedRoom(realm, it.key, it.value, insertType, syncLocalTimeStampMillis) + handleInvitedRoom(realm, it.key, it.value, insertType, syncLocalTimeStampMillis, aggregator) } is HandlingStrategy.LEFT -> { handlingStrategy.data.mapWithProgress(reporter, InitialSyncStep.ImportingAccountLeftRooms, 0.3f) { - handleLeftRoom(realm, it.key, it.value, insertType, syncLocalTimeStampMillis) + handleLeftRoom(realm, it.key, it.value, insertType, syncLocalTimeStampMillis, aggregator) } } } @@ -285,7 +285,8 @@ internal class RoomSyncHandler @Inject constructor( Membership.JOIN, roomSync.summary, roomSync.unreadNotifications, - updateMembers = hasRoomMember + updateMembers = hasRoomMember, + aggregator = aggregator ) return roomEntity } @@ -295,7 +296,8 @@ internal class RoomSyncHandler @Inject constructor( roomId: String, roomSync: InvitedRoomSync, insertType: EventInsertType, - syncLocalTimestampMillis: Long + syncLocalTimestampMillis: Long, + aggregator: SyncResponsePostTreatmentAggregator ): RoomEntity { Timber.v("Handle invited sync for room $roomId") val isInitialSync = insertType == EventInsertType.INITIAL_SYNC @@ -319,7 +321,7 @@ internal class RoomSyncHandler @Inject constructor( it.type == EventType.STATE_ROOM_MEMBER } roomChangeMembershipStateDataSource.setMembershipFromSync(roomId, Membership.INVITE) - roomSummaryUpdater.update(realm, roomId, Membership.INVITE, updateMembers = true, inviterId = inviterEvent?.senderId) + roomSummaryUpdater.update(realm, roomId, Membership.INVITE, updateMembers = true, inviterId = inviterEvent?.senderId, aggregator = aggregator) return roomEntity } @@ -328,7 +330,8 @@ internal class RoomSyncHandler @Inject constructor( roomId: String, roomSync: RoomSync, insertType: EventInsertType, - syncLocalTimestampMillis: Long + syncLocalTimestampMillis: Long, + aggregator: SyncResponsePostTreatmentAggregator ): RoomEntity { val isInitialSync = insertType == EventInsertType.INITIAL_SYNC val roomEntity = RoomEntity.getOrCreate(realm, roomId) @@ -366,7 +369,7 @@ internal class RoomSyncHandler @Inject constructor( roomEntity.chunks.clearWith { it.deleteOnCascade(deleteStateEvents = true, canDeleteRoot = true) } roomTypingUsersHandler.handle(realm, roomId, null) roomChangeMembershipStateDataSource.setMembershipFromSync(roomId, Membership.LEAVE) - roomSummaryUpdater.update(realm, roomId, membership, roomSync.summary, roomSync.unreadNotifications) + roomSummaryUpdater.update(realm, roomId, membership, roomSync.summary, roomSync.unreadNotifications, aggregator = aggregator) return roomEntity }