Separate thread updates into a job and other perf improvements.

This commit is contained in:
Greyson Parrelli
2021-08-24 11:11:48 -04:00
committed by Alex Hart
parent db7272730e
commit 665d9e31f6
19 changed files with 268 additions and 110 deletions

View File

@@ -36,6 +36,9 @@ import org.thoughtcrime.securesms.migrations.LegacyMigrationJob;
import org.thoughtcrime.securesms.util.SqlUtil;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import java.io.Closeable;
import java.io.IOException;
public class DatabaseFactory {
private static final Object lock = new Object();
@@ -311,4 +314,17 @@ public class DatabaseFactory {
public boolean hasTable(String table) {
return SqlUtil.tableExists(databaseHelper.getRawReadableDatabase(), table);
}
public @NonNull Transaction transaction() {
getRawDatabase().beginTransaction();
return () -> {
getRawDatabase().setTransactionSuccessful();
getRawDatabase().endTransaction();
};
}
public interface Transaction extends Closeable {
@Override
void close();
}
}

View File

@@ -102,7 +102,6 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns
public abstract void markExpireStarted(Collection<Long> messageId, long startTime);
public abstract void markAsEndSession(long id);
public abstract void markAsPreKeyBundle(long id);
public abstract void markAsInvalidVersionKeyExchange(long id);
public abstract void markAsSecure(long id);
public abstract void markAsInsecure(long id);
@@ -111,7 +110,6 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns
public abstract void markAsRateLimited(long id);
public abstract void clearRateLimitStatus(Collection<Long> ids);
public abstract void markAsDecryptFailed(long id);
public abstract void markAsDecryptDuplicate(long id);
public abstract void markAsNoSession(long id);
public abstract void markAsUnsupportedProtocolVersion(long id);
public abstract void markAsInvalidMessage(long id);
@@ -119,8 +117,8 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns
public abstract void markAsOutbox(long id);
public abstract void markAsPendingInsecureSmsFallback(long id);
public abstract void markAsSent(long messageId, boolean secure);
public abstract void markAsSentFailed(long id);
public abstract void markUnidentified(long messageId, boolean unidentified);
public abstract void markAsSentFailed(long id);
public abstract void markAsSending(long messageId);
public abstract void markAsRemoteDelete(long messageId);
public abstract void markAsMissedCall(long id, boolean isVideoOffer);

View File

@@ -56,6 +56,7 @@ import org.thoughtcrime.securesms.database.model.SmsMessageRecord;
import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.groups.GroupMigrationMembershipChange;
import org.thoughtcrime.securesms.jobs.ThreadUpdateJob;
import org.thoughtcrime.securesms.jobs.TrimThreadJob;
import org.thoughtcrime.securesms.linkpreview.LinkPreview;
import org.thoughtcrime.securesms.mms.IncomingMediaMessage;
@@ -296,11 +297,6 @@ public class MmsDatabase extends MessageDatabase {
throw new UnsupportedOperationException();
}
@Override
public void markAsPreKeyBundle(long id) {
throw new UnsupportedOperationException();
}
@Override
public void markAsInvalidVersionKeyExchange(long id) {
throw new UnsupportedOperationException();
@@ -321,11 +317,6 @@ public class MmsDatabase extends MessageDatabase {
throw new UnsupportedOperationException();
}
@Override
public void markAsDecryptDuplicate(long id) {
throw new UnsupportedOperationException();
}
@Override
public void markAsNoSession(long id) {
throw new UnsupportedOperationException();
@@ -759,7 +750,7 @@ public class MmsDatabase extends MessageDatabase {
" WHERE " + ID + " = ?", new String[] {id + ""});
if (threadId.isPresent()) {
DatabaseFactory.getThreadDatabase(context).update(threadId.get(), false);
DatabaseFactory.getThreadDatabase(context).updateSnippetTypeSilently(threadId.get());
}
}
@@ -1352,7 +1343,7 @@ public class MmsDatabase extends MessageDatabase {
if (!Types.isExpirationTimerUpdate(mailbox)) {
DatabaseFactory.getThreadDatabase(context).incrementUnread(threadId, 1);
DatabaseFactory.getThreadDatabase(context).update(threadId, true);
ThreadUpdateJob.enqueue(threadId);
}
notifyConversationListeners(threadId);
@@ -1445,12 +1436,13 @@ public class MmsDatabase extends MessageDatabase {
@Override
public void markIncomingNotificationReceived(long threadId) {
notifyConversationListeners(threadId);
DatabaseFactory.getThreadDatabase(context).update(threadId, true);
if (org.thoughtcrime.securesms.util.Util.isDefaultSmsProvider(context)) {
DatabaseFactory.getThreadDatabase(context).incrementUnread(threadId, 1);
}
ThreadUpdateJob.enqueue(threadId);
TrimThreadJob.enqueueAsync(threadId);
}
@@ -1658,9 +1650,11 @@ public class MmsDatabase extends MessageDatabase {
insertListener.onComplete();
}
notifyConversationListeners(contentValues.getAsLong(THREAD_ID));
DatabaseFactory.getThreadDatabase(context).setLastScrolled(contentValues.getAsLong(THREAD_ID), 0);
DatabaseFactory.getThreadDatabase(context).update(contentValues.getAsLong(THREAD_ID), true);
long contentValuesThreadId = contentValues.getAsLong(THREAD_ID);
notifyConversationListeners(contentValuesThreadId);
DatabaseFactory.getThreadDatabase(context).setLastScrolled(contentValuesThreadId, 0);
ThreadUpdateJob.enqueue(contentValuesThreadId);
}
}

View File

@@ -44,6 +44,7 @@ import org.thoughtcrime.securesms.database.model.databaseprotos.GroupCallUpdateD
import org.thoughtcrime.securesms.database.model.databaseprotos.ProfileChangeDetails;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.groups.GroupMigrationMembershipChange;
import org.thoughtcrime.securesms.jobs.ThreadUpdateJob;
import org.thoughtcrime.securesms.jobs.TrimThreadJob;
import org.thoughtcrime.securesms.mms.IncomingMediaMessage;
import org.thoughtcrime.securesms.mms.MmsException;
@@ -58,6 +59,7 @@ import org.thoughtcrime.securesms.util.Base64;
import org.thoughtcrime.securesms.util.CursorUtil;
import org.thoughtcrime.securesms.util.JsonUtils;
import org.thoughtcrime.securesms.util.SqlUtil;
import org.thoughtcrime.securesms.util.Stopwatch;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.thoughtcrime.securesms.util.Util;
import org.whispersystems.libsignal.util.Pair;
@@ -177,14 +179,24 @@ public class SmsDatabase extends MessageDatabase {
private void updateTypeBitmask(long id, long maskOff, long maskOn) {
SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
db.execSQL("UPDATE " + TABLE_NAME +
" SET " + TYPE + " = (" + TYPE + " & " + (Types.TOTAL_MASK - maskOff) + " | " + maskOn + " )" +
" WHERE " + ID + " = ?", SqlUtil.buildArgs(id));
long threadId = getThreadIdForMessage(id);
DatabaseFactory.getThreadDatabase(context).updateSnippetTypeSilently(threadId);
long threadId;
db.beginTransaction();
try {
db.execSQL("UPDATE " + TABLE_NAME +
" SET " + TYPE + " = (" + TYPE + " & " + (Types.TOTAL_MASK - maskOff) + " | " + maskOn + " )" +
" WHERE " + ID + " = ?", SqlUtil.buildArgs(id));
threadId = getThreadIdForMessage(id);
DatabaseFactory.getThreadDatabase(context).updateSnippetTypeSilently(threadId);
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
notifyConversationListListeners();
notifyConversationListeners(threadId);
}
@@ -267,11 +279,6 @@ public class SmsDatabase extends MessageDatabase {
updateTypeBitmask(id, Types.KEY_EXCHANGE_MASK, Types.END_SESSION_BIT);
}
@Override
public void markAsPreKeyBundle(long id) {
updateTypeBitmask(id, Types.KEY_EXCHANGE_MASK, Types.KEY_EXCHANGE_BIT | Types.KEY_EXCHANGE_BUNDLE_BIT);
}
@Override
public void markAsInvalidVersionKeyExchange(long id) {
updateTypeBitmask(id, 0, Types.KEY_EXCHANGE_INVALID_VERSION_BIT);
@@ -323,11 +330,6 @@ public class SmsDatabase extends MessageDatabase {
updateTypeBitmask(id, Types.ENCRYPTION_MASK, Types.ENCRYPTION_REMOTE_FAILED_BIT);
}
@Override
public void markAsDecryptDuplicate(long id) {
updateTypeBitmask(id, Types.ENCRYPTION_MASK, Types.ENCRYPTION_REMOTE_DUPLICATE_BIT);
}
@Override
public void markAsNoSession(long id) {
updateTypeBitmask(id, Types.ENCRYPTION_MASK, Types.ENCRYPTION_REMOTE_NO_SESSION_BIT);
@@ -656,9 +658,8 @@ public class SmsDatabase extends MessageDatabase {
long threadId = getThreadIdForMessage(messageId);
DatabaseFactory.getThreadDatabase(context).update(threadId, true);
ThreadUpdateJob.enqueue(threadId);
notifyConversationListeners(threadId);
notifyConversationListListeners();
return new InsertResult(messageId, threadId);
}
@@ -741,7 +742,7 @@ public class SmsDatabase extends MessageDatabase {
DatabaseFactory.getThreadDatabase(context).incrementUnread(threadId, 1);
}
DatabaseFactory.getThreadDatabase(context).update(threadId, true);
ThreadUpdateJob.enqueue(threadId);
db.setTransactionSuccessful();
} finally {
@@ -818,7 +819,7 @@ public class SmsDatabase extends MessageDatabase {
DatabaseFactory.getThreadDatabase(context).incrementUnread(threadId, 1);
}
DatabaseFactory.getThreadDatabase(context).update(threadId, true);
ThreadUpdateJob.enqueue(threadId);
db.setTransactionSuccessful();
} finally {
@@ -883,14 +884,15 @@ public class SmsDatabase extends MessageDatabase {
values.put(TYPE, type);
values.put(THREAD_ID, threadId);
SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
long messageId = db.insert(TABLE_NAME, null, values);
SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
long messageId = db.insert(TABLE_NAME, null, values);
DatabaseFactory.getThreadDatabase(context).update(threadId, true);
if (unread) {
DatabaseFactory.getThreadDatabase(context).incrementUnread(threadId, 1);
}
ThreadUpdateJob.enqueue(threadId);
notifyConversationListeners(threadId);
TrimThreadJob.enqueueAsync(threadId);
@@ -1109,7 +1111,7 @@ public class SmsDatabase extends MessageDatabase {
}
if (!silent) {
DatabaseFactory.getThreadDatabase(context).update(threadId, true);
ThreadUpdateJob.enqueue(threadId);
}
if (message.getSubscriptionId() != -1) {
@@ -1152,7 +1154,7 @@ public class SmsDatabase extends MessageDatabase {
long messageId = db.insert(TABLE_NAME, null, values);
DatabaseFactory.getThreadDatabase(context).incrementUnread(threadId, 1);
DatabaseFactory.getThreadDatabase(context).update(threadId, true);
ThreadUpdateJob.enqueue(threadId);
notifyConversationListeners(threadId);
@@ -1176,7 +1178,7 @@ public class SmsDatabase extends MessageDatabase {
databaseHelper.getSignalWritableDatabase().insert(TABLE_NAME, null, values);
DatabaseFactory.getThreadDatabase(context).incrementUnread(threadId, 1);
DatabaseFactory.getThreadDatabase(context).update(threadId, true);
ThreadUpdateJob.enqueue(threadId);
notifyConversationListeners(threadId);
@@ -1226,7 +1228,6 @@ public class SmsDatabase extends MessageDatabase {
if (!message.isIdentityVerified() && !message.isIdentityDefault()) {
DatabaseFactory.getThreadDatabase(context).setLastScrolled(threadId, 0);
DatabaseFactory.getThreadDatabase(context).updateSilently(threadId, true);
DatabaseFactory.getThreadDatabase(context).setLastSeenSilently(threadId);
}
@@ -1237,7 +1238,6 @@ public class SmsDatabase extends MessageDatabase {
}
notifyConversationListeners(threadId);
notifyConversationListListeners();
if (!message.isIdentityVerified() && !message.isIdentityDefault()) {
TrimThreadJob.enqueueAsync(threadId);

View File

@@ -224,8 +224,6 @@ public class ThreadDatabase extends Database {
StorageSyncHelper.scheduleSyncForDataChange();
}
}
notifyConversationListListeners();
}
public void updateSnippet(long threadId, String snippet, @Nullable Uri attachment, long date, long type, boolean unarchive) {