Merge pull request #7871 from vector-im/feature/bca/fix_7870

fix 7870
This commit is contained in:
Benoit Marty 2023-01-02 11:42:08 +01:00 committed by GitHub
commit e0c2dc0b2f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 10 additions and 12 deletions

View file

@ -1,4 +1,4 @@
Changes in Element v.5.16 (2022-12-29) Changes in Element v1.5.16 (2022-12-29)
====================================== ======================================
Features ✨ Features ✨

1
changelog.d/7870.bugfix Normal file
View file

@ -0,0 +1 @@
Start DM will create a deadlock if user profile was never loaded

View file

@ -21,7 +21,7 @@ import io.realm.Realm
import io.realm.RealmConfiguration import io.realm.RealmConfiguration
import io.realm.kotlin.createObject import io.realm.kotlin.createObject
import kotlinx.coroutines.TimeoutCancellationException import kotlinx.coroutines.TimeoutCancellationException
import kotlinx.coroutines.runBlocking import org.matrix.android.sdk.api.session.events.model.Event
import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.api.session.events.model.EventType
import org.matrix.android.sdk.api.session.room.failure.CreateRoomFailure import org.matrix.android.sdk.api.session.room.failure.CreateRoomFailure
import org.matrix.android.sdk.api.session.room.model.Membership import org.matrix.android.sdk.api.session.room.model.Membership
@ -73,8 +73,9 @@ internal class DefaultCreateLocalRoomTask @Inject constructor(
override suspend fun execute(params: CreateRoomParams): String { override suspend fun execute(params: CreateRoomParams): String {
val createRoomBody = createRoomBodyBuilder.build(params) val createRoomBody = createRoomBodyBuilder.build(params)
val roomId = RoomLocalEcho.createLocalEchoId() val roomId = RoomLocalEcho.createLocalEchoId()
val eventList = createLocalRoomStateEventsTask.execute(CreateLocalRoomStateEventsTask.Params(createRoomBody))
monarchy.awaitTransaction { realm -> monarchy.awaitTransaction { realm ->
createLocalRoomEntity(realm, roomId, createRoomBody) createLocalRoomEntity(realm, roomId, eventList)
createLocalRoomSummaryEntity(realm, roomId, params, createRoomBody) createLocalRoomSummaryEntity(realm, roomId, params, createRoomBody)
} }
@ -96,10 +97,10 @@ internal class DefaultCreateLocalRoomTask @Inject constructor(
* Create a local room entity from the given room creation params. * Create a local room entity from the given room creation params.
* This will also generate and store in database the chunk and the events related to the room params in order to retrieve and display the local room. * This will also generate and store in database the chunk and the events related to the room params in order to retrieve and display the local room.
*/ */
private fun createLocalRoomEntity(realm: Realm, roomId: String, createRoomBody: CreateRoomBody) { private fun createLocalRoomEntity(realm: Realm, roomId: String, localStateEventList: List<Event>) {
RoomEntity.getOrCreate(realm, roomId).apply { RoomEntity.getOrCreate(realm, roomId).apply {
membership = Membership.JOIN membership = Membership.JOIN
chunks.add(createLocalRoomChunk(realm, roomId, createRoomBody)) chunks.add(createLocalRoomChunk(realm, roomId, localStateEventList))
membersLoadStatus = RoomMembersLoadStatusType.LOADED membersLoadStatus = RoomMembersLoadStatusType.LOADED
} }
} }
@ -145,23 +146,19 @@ internal class DefaultCreateLocalRoomTask @Inject constructor(
* *
* @param realm the current instance of realm * @param realm the current instance of realm
* @param roomId the id of the local room * @param roomId the id of the local room
* @param createRoomBody the room creation params * @param localStateEventList list of local state events for that room
* *
* @return a chunk entity * @return a chunk entity
*/ */
private fun createLocalRoomChunk(realm: Realm, roomId: String, createRoomBody: CreateRoomBody): ChunkEntity { private fun createLocalRoomChunk(realm: Realm, roomId: String, localStateEventList: List<Event>): ChunkEntity {
val chunkEntity = realm.createObject<ChunkEntity>().apply { val chunkEntity = realm.createObject<ChunkEntity>().apply {
isLastBackward = true isLastBackward = true
isLastForward = true isLastForward = true
} }
// Can't suspend when using realm as it could jump thread
val eventList = runBlocking {
createLocalRoomStateEventsTask.execute(CreateLocalRoomStateEventsTask.Params(createRoomBody))
}
val roomMemberContentsByUser = HashMap<String, RoomMemberContent?>() val roomMemberContentsByUser = HashMap<String, RoomMemberContent?>()
for (event in eventList) { for (event in localStateEventList) {
if (event.eventId == null || event.senderId == null || event.type == null) { if (event.eventId == null || event.senderId == null || event.type == null) {
continue continue
} }