Improve performance of marking chats read.

SQLite isn't always smart enough to use the best index for a query.
The main improvement here was to force it to use a better index than the
one it was using (which, on my device, happened to by the story index,
which was only minimally useful here).
This commit is contained in:
Greyson Parrelli
2023-01-04 14:21:41 -05:00
parent a513e93d18
commit 59f05e0815
3 changed files with 29 additions and 33 deletions

View File

@@ -10,6 +10,7 @@ import androidx.annotation.NonNull;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import org.signal.core.util.Stopwatch;
import org.signal.core.util.concurrent.SignalExecutors;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.database.MessageTable.ExpirationInfo;
@@ -72,21 +73,15 @@ public class MarkReadReceiver extends BroadcastReceiver {
public static void process(@NonNull Context context, @NonNull List<MarkedMessageInfo> markedReadMessages) {
if (markedReadMessages.isEmpty()) return;
List<SyncMessageId> syncMessageIds = Stream.of(markedReadMessages)
.map(MarkedMessageInfo::getSyncMessageId)
.toList();
List<ExpirationInfo> mmsExpirationInfo = Stream.of(markedReadMessages)
.map(MarkedMessageInfo::getExpirationInfo)
.filter(ExpirationInfo::isMms)
.filter(info -> info.getExpiresIn() > 0 && info.getExpireStarted() <= 0)
.toList();
List<ExpirationInfo> smsExpirationInfo = Stream.of(markedReadMessages)
.map(MarkedMessageInfo::getExpirationInfo)
.filterNot(ExpirationInfo::isMms)
.filter(info -> info.getExpiresIn() > 0 && info.getExpireStarted() <= 0)
.toList();
List<SyncMessageId> syncMessageIds = Stream.of(markedReadMessages)
.map(MarkedMessageInfo::getSyncMessageId)
.toList();
List<ExpirationInfo> expirationInfo = Stream.of(markedReadMessages)
.map(MarkedMessageInfo::getExpirationInfo)
.filter(info -> info.getExpiresIn() > 0 && info.getExpireStarted() <= 0)
.toList();
scheduleDeletion(context, smsExpirationInfo, mmsExpirationInfo);
scheduleDeletion(expirationInfo);
MultiDeviceReadUpdateJob.enqueue(syncMessageIds);
@@ -108,23 +103,13 @@ public class MarkReadReceiver extends BroadcastReceiver {
});
}
private static void scheduleDeletion(@NonNull Context context,
@NonNull List<ExpirationInfo> smsExpirationInfo,
@NonNull List<ExpirationInfo> mmsExpirationInfo)
{
if (smsExpirationInfo.size() > 0) {
SignalDatabase.messages().markExpireStarted(Stream.of(smsExpirationInfo).map(ExpirationInfo::getId).toList(), System.currentTimeMillis());
}
private static void scheduleDeletion(@NonNull List<ExpirationInfo> expirationInfo) {
if (expirationInfo.size() > 0) {
SignalDatabase.messages().markExpireStarted(Stream.of(expirationInfo).map(ExpirationInfo::getId).toList(), System.currentTimeMillis());
if (mmsExpirationInfo.size() > 0) {
SignalDatabase.messages().markExpireStarted(Stream.of(mmsExpirationInfo).map(ExpirationInfo::getId).toList(), System.currentTimeMillis());
}
if (smsExpirationInfo.size() + mmsExpirationInfo.size() > 0) {
ExpiringMessageManager expirationManager = ApplicationDependencies.getExpiringMessageManager();
Stream.concat(Stream.of(smsExpirationInfo), Stream.of(mmsExpirationInfo))
.forEach(info -> expirationManager.scheduleDeletion(info.getId(), info.isMms(), info.getExpiresIn()));
expirationInfo.stream().forEach(info -> expirationManager.scheduleDeletion(info.getId(), info.isMms(), info.getExpiresIn()));
}
}
}