Performance: invoke UpdateTrustWorker only once per incremental sync.

This commit is contained in:
Benoit Marty 2022-08-22 17:44:07 +02:00 committed by Benoit Marty
parent 9b57630eae
commit 13f7a9fc10
4 changed files with 31 additions and 10 deletions

View File

@ -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.RoomDisplayNameResolver
import org.matrix.android.sdk.internal.session.room.membership.RoomMemberHelper 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.room.relationship.RoomChildRelationInfo
import org.matrix.android.sdk.internal.session.sync.SyncResponsePostTreatmentAggregator
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
import kotlin.system.measureTimeMillis import kotlin.system.measureTimeMillis
@ -91,7 +92,8 @@ internal class RoomSummaryUpdater @Inject constructor(
roomSummary: RoomSyncSummary? = null, roomSummary: RoomSyncSummary? = null,
unreadNotifications: RoomSyncUnreadNotifications? = null, unreadNotifications: RoomSyncUnreadNotifications? = null,
updateMembers: Boolean = false, updateMembers: Boolean = false,
inviterId: String? = null inviterId: String? = null,
aggregator: SyncResponsePostTreatmentAggregator? = null
) { ) {
val roomSummaryEntity = RoomSummaryEntity.getOrCreate(realm, roomId) val roomSummaryEntity = RoomSummaryEntity.getOrCreate(realm, roomId)
if (roomSummary != null) { if (roomSummary != null) {
@ -180,8 +182,14 @@ internal class RoomSummaryUpdater @Inject constructor(
roomSummaryEntity.otherMemberIds.clear() roomSummaryEntity.otherMemberIds.clear()
roomSummaryEntity.otherMemberIds.addAll(otherRoomMembers) roomSummaryEntity.otherMemberIds.addAll(otherRoomMembers)
if (roomSummaryEntity.isEncrypted && otherRoomMembers.isNotEmpty()) { if (roomSummaryEntity.isEncrypted && otherRoomMembers.isNotEmpty()) {
// mmm maybe we could only refresh shield instead of checking trust also? if (aggregator == null) {
crossSigningService.onUsersDeviceUpdate(otherRoomMembers) // 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)
}
} }
} }
} }

View File

@ -25,4 +25,7 @@ internal class SyncResponsePostTreatmentAggregator {
// List of userIds to fetch and update at the end of incremental syncs // List of userIds to fetch and update at the end of incremental syncs
val userIdsToFetch = mutableListOf<String>() val userIdsToFetch = mutableListOf<String>()
// Set of users to call `crossSigningService.onUsersDeviceUpdate` once per sync
val userIdsWithDeviceUpdate = mutableSetOf<String>()
} }

View File

@ -20,6 +20,7 @@ import com.zhuinden.monarchy.Monarchy
import org.matrix.android.sdk.api.MatrixPatterns import org.matrix.android.sdk.api.MatrixPatterns
import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.extensions.tryOrNull
import org.matrix.android.sdk.api.session.user.model.User 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.di.SessionDatabase
import org.matrix.android.sdk.internal.session.profile.GetProfileInfoTask import org.matrix.android.sdk.internal.session.profile.GetProfileInfoTask
import org.matrix.android.sdk.internal.session.sync.RoomSyncEphemeralTemporaryStore import org.matrix.android.sdk.internal.session.sync.RoomSyncEphemeralTemporaryStore
@ -36,12 +37,14 @@ internal class SyncResponsePostTreatmentAggregatorHandler @Inject constructor(
private val ephemeralTemporaryStore: RoomSyncEphemeralTemporaryStore, private val ephemeralTemporaryStore: RoomSyncEphemeralTemporaryStore,
private val updateUserAccountDataTask: UpdateUserAccountDataTask, private val updateUserAccountDataTask: UpdateUserAccountDataTask,
private val getProfileInfoTask: GetProfileInfoTask, private val getProfileInfoTask: GetProfileInfoTask,
private val crossSigningService: DefaultCrossSigningService,
@SessionDatabase private val monarchy: Monarchy, @SessionDatabase private val monarchy: Monarchy,
) { ) {
suspend fun handle(aggregator: SyncResponsePostTreatmentAggregator) { suspend fun handle(aggregator: SyncResponsePostTreatmentAggregator) {
cleanupEphemeralFiles(aggregator.ephemeralFilesToDelete) cleanupEphemeralFiles(aggregator.ephemeralFilesToDelete)
updateDirectUserIds(aggregator.directChatsToCheck) updateDirectUserIds(aggregator.directChatsToCheck)
fetchAndUpdateUsers(aggregator.userIdsToFetch) fetchAndUpdateUsers(aggregator.userIdsToFetch)
handleUserIdsWithDeviceUpdate(aggregator.userIdsWithDeviceUpdate)
} }
private fun cleanupEphemeralFiles(ephemeralFilesToDelete: List<String>) { private fun cleanupEphemeralFiles(ephemeralFilesToDelete: List<String>) {
@ -92,6 +95,10 @@ internal class SyncResponsePostTreatmentAggregatorHandler @Inject constructor(
} }
} }
private fun handleUserIdsWithDeviceUpdate(userIdsWithDeviceUpdate: Iterable<String>) {
crossSigningService.onUsersDeviceUpdate(userIdsWithDeviceUpdate.toList())
}
private suspend fun List<User>.saveLocally() { private suspend fun List<User>.saveLocally() {
val userEntities = map { user -> UserEntityFactory.create(user) } val userEntities = map { user -> UserEntityFactory.create(user) }
monarchy.awaitTransaction { monarchy.awaitTransaction {

View File

@ -154,12 +154,12 @@ internal class RoomSyncHandler @Inject constructor(
} }
is HandlingStrategy.INVITED -> is HandlingStrategy.INVITED ->
handlingStrategy.data.mapWithProgress(reporter, InitialSyncStep.ImportingAccountInvitedRooms, 0.1f) { 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 -> { is HandlingStrategy.LEFT -> {
handlingStrategy.data.mapWithProgress(reporter, InitialSyncStep.ImportingAccountLeftRooms, 0.3f) { 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, Membership.JOIN,
roomSync.summary, roomSync.summary,
roomSync.unreadNotifications, roomSync.unreadNotifications,
updateMembers = hasRoomMember updateMembers = hasRoomMember,
aggregator = aggregator
) )
return roomEntity return roomEntity
} }
@ -295,7 +296,8 @@ internal class RoomSyncHandler @Inject constructor(
roomId: String, roomId: String,
roomSync: InvitedRoomSync, roomSync: InvitedRoomSync,
insertType: EventInsertType, insertType: EventInsertType,
syncLocalTimestampMillis: Long syncLocalTimestampMillis: Long,
aggregator: SyncResponsePostTreatmentAggregator
): RoomEntity { ): RoomEntity {
Timber.v("Handle invited sync for room $roomId") Timber.v("Handle invited sync for room $roomId")
val isInitialSync = insertType == EventInsertType.INITIAL_SYNC val isInitialSync = insertType == EventInsertType.INITIAL_SYNC
@ -319,7 +321,7 @@ internal class RoomSyncHandler @Inject constructor(
it.type == EventType.STATE_ROOM_MEMBER it.type == EventType.STATE_ROOM_MEMBER
} }
roomChangeMembershipStateDataSource.setMembershipFromSync(roomId, Membership.INVITE) 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 return roomEntity
} }
@ -328,7 +330,8 @@ internal class RoomSyncHandler @Inject constructor(
roomId: String, roomId: String,
roomSync: RoomSync, roomSync: RoomSync,
insertType: EventInsertType, insertType: EventInsertType,
syncLocalTimestampMillis: Long syncLocalTimestampMillis: Long,
aggregator: SyncResponsePostTreatmentAggregator
): RoomEntity { ): RoomEntity {
val isInitialSync = insertType == EventInsertType.INITIAL_SYNC val isInitialSync = insertType == EventInsertType.INITIAL_SYNC
val roomEntity = RoomEntity.getOrCreate(realm, roomId) val roomEntity = RoomEntity.getOrCreate(realm, roomId)
@ -366,7 +369,7 @@ internal class RoomSyncHandler @Inject constructor(
roomEntity.chunks.clearWith { it.deleteOnCascade(deleteStateEvents = true, canDeleteRoot = true) } roomEntity.chunks.clearWith { it.deleteOnCascade(deleteStateEvents = true, canDeleteRoot = true) }
roomTypingUsersHandler.handle(realm, roomId, null) roomTypingUsersHandler.handle(realm, roomId, null)
roomChangeMembershipStateDataSource.setMembershipFromSync(roomId, Membership.LEAVE) 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 return roomEntity
} }