Decrease db thrashing when starting expiration timers for messages.

This commit is contained in:
Cody Henthorne
2023-10-11 16:14:08 -04:00
parent 05296e3d9b
commit 6a6b80cce2
6 changed files with 51 additions and 28 deletions

View File

@@ -559,13 +559,9 @@ class ConversationRepository(
}
}
fun startExpirationTimeout(messageRecord: MessageRecord) {
SignalExecutors.BOUNDED_IO.execute {
val now = System.currentTimeMillis()
SignalDatabase.messages.markExpireStarted(messageRecord.id, now)
ApplicationDependencies.getExpiringMessageManager().scheduleDeletion(messageRecord.id, messageRecord.isMms, now, messageRecord.expiresIn)
}
fun startExpirationTimeout(expirationInfos: List<MessageTable.ExpirationInfo>) {
SignalDatabase.messages.markExpireStarted(expirationInfos.map { it.id to it.expireStarted })
ApplicationDependencies.getExpiringMessageManager().scheduleDeletion(expirationInfos)
}
fun markLastSeen(threadId: Long) {

View File

@@ -15,8 +15,10 @@ import io.reactivex.rxjava3.core.Completable
import io.reactivex.rxjava3.core.Flowable
import io.reactivex.rxjava3.core.Maybe
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.core.Single
import io.reactivex.rxjava3.disposables.CompositeDisposable
import io.reactivex.rxjava3.disposables.Disposable
import io.reactivex.rxjava3.kotlin.addTo
import io.reactivex.rxjava3.kotlin.plusAssign
import io.reactivex.rxjava3.kotlin.subscribeBy
@@ -34,6 +36,7 @@ import org.thoughtcrime.securesms.conversation.ScheduledMessagesRepository
import org.thoughtcrime.securesms.conversation.mutiselect.MultiselectPart
import org.thoughtcrime.securesms.conversation.v2.data.ConversationElementKey
import org.thoughtcrime.securesms.database.DatabaseObserver
import org.thoughtcrime.securesms.database.MessageTable
import org.thoughtcrime.securesms.database.model.IdentityRecord
import org.thoughtcrime.securesms.database.model.Mention
import org.thoughtcrime.securesms.database.model.MessageId
@@ -67,6 +70,7 @@ import org.thoughtcrime.securesms.util.rx.RxStore
import org.thoughtcrime.securesms.wallpaper.ChatWallpaper
import org.whispersystems.signalservice.api.push.ServiceId
import java.util.Optional
import java.util.concurrent.TimeUnit
import kotlin.time.Duration
/**
@@ -141,6 +145,8 @@ class ConversationViewModel(
.distinctUntilChanged()
.observeOn(AndroidSchedulers.mainThread())
private val startExpiration = BehaviorSubject.create<MessageTable.ExpirationInfo>()
init {
disposables += recipient
.subscribeBy {
@@ -233,6 +239,16 @@ class ConversationViewModel(
identityRecordsStore.update { newState }
}
.addTo(disposables)
startExpiration
.buffer(startExpiration.throttleLast(1, TimeUnit.SECONDS))
.observeOn(Schedulers.io())
.subscribe(object : Observer<List<MessageTable.ExpirationInfo>> {
override fun onNext(t: List<MessageTable.ExpirationInfo>) = repository.startExpirationTimeout(t.distinctBy { it.id })
override fun onSubscribe(d: Disposable) = Unit
override fun onError(e: Throwable) = Unit
override fun onComplete() = Unit
})
}
fun setSearchQuery(query: String?) {
@@ -245,6 +261,7 @@ class ConversationViewModel(
override fun onCleared() {
disposables.clear()
startExpiration.onComplete()
}
fun setShowScrollButtonsForScrollPosition(showScrollButtons: Boolean, willScrollToBottomOnNewMessage: Boolean) {
@@ -312,7 +329,14 @@ class ConversationViewModel(
}
fun startExpirationTimeout(messageRecord: MessageRecord) {
repository.startExpirationTimeout(messageRecord)
startExpiration.onNext(
MessageTable.ExpirationInfo(
id = messageRecord.id,
expiresIn = messageRecord.expiresIn,
expireStarted = System.currentTimeMillis(),
isMms = messageRecord.isMms
)
)
}
fun updateReaction(messageRecord: MessageRecord, emoji: String): Completable {