Allow recipient cache to refresh inline while in a transaction.

fork-5.53.8
Greyson Parrelli 2021-03-25 10:33:41 -04:00 zatwierdzone przez Alex Hart
rodzic a59f5d953a
commit da4be5c1cf
1 zmienionych plików z 11 dodań i 6 usunięć

Wyświetl plik

@ -4,12 +4,12 @@ import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import androidx.annotation.AnyThread; import androidx.annotation.AnyThread;
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import net.sqlcipher.database.SQLiteDatabase;
import org.signal.core.util.concurrent.SignalExecutors; import org.signal.core.util.concurrent.SignalExecutors;
import org.signal.core.util.logging.Log; import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.crypto.DatabaseSessionLock;
import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.RecipientDatabase; import org.thoughtcrime.securesms.database.RecipientDatabase;
import org.thoughtcrime.securesms.database.RecipientDatabase.MissingRecipientException; import org.thoughtcrime.securesms.database.RecipientDatabase.MissingRecipientException;
@ -17,13 +17,14 @@ import org.thoughtcrime.securesms.database.ThreadDatabase;
import org.thoughtcrime.securesms.database.model.ThreadRecord; import org.thoughtcrime.securesms.database.model.ThreadRecord;
import org.thoughtcrime.securesms.util.LRUCache; import org.thoughtcrime.securesms.util.LRUCache;
import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.whispersystems.signalservice.api.SignalSessionLock; import org.thoughtcrime.securesms.util.concurrent.FilteredExecutor;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.Executor;
public final class LiveRecipientCache { public final class LiveRecipientCache {
@ -36,6 +37,8 @@ public final class LiveRecipientCache {
private final RecipientDatabase recipientDatabase; private final RecipientDatabase recipientDatabase;
private final Map<RecipientId, LiveRecipient> recipients; private final Map<RecipientId, LiveRecipient> recipients;
private final LiveRecipient unknown; private final LiveRecipient unknown;
private final Executor executor;
private final SQLiteDatabase db;
private volatile RecipientId localRecipientId; private volatile RecipientId localRecipientId;
@ -47,6 +50,8 @@ public final class LiveRecipientCache {
this.recipientDatabase = DatabaseFactory.getRecipientDatabase(context); this.recipientDatabase = DatabaseFactory.getRecipientDatabase(context);
this.recipients = new LRUCache<>(CACHE_MAX); this.recipients = new LRUCache<>(CACHE_MAX);
this.unknown = new LiveRecipient(context, Recipient.UNKNOWN); this.unknown = new LiveRecipient(context, Recipient.UNKNOWN);
this.db = DatabaseFactory.getInstance(context).getRawDatabase();
this.executor = new FilteredExecutor(SignalExecutors.BOUNDED, () -> !db.isDbLockedByCurrentThread());
} }
@AnyThread @AnyThread
@ -62,7 +67,7 @@ public final class LiveRecipientCache {
MissingRecipientException prettyStackTraceError = new MissingRecipientException(newLive.getId()); MissingRecipientException prettyStackTraceError = new MissingRecipientException(newLive.getId());
SignalExecutors.BOUNDED.execute(() -> { executor.execute(() -> {
try { try {
newLive.resolve(); newLive.resolve();
} catch (MissingRecipientException e) { } catch (MissingRecipientException e) {
@ -99,7 +104,7 @@ public final class LiveRecipientCache {
if (needsResolve) { if (needsResolve) {
MissingRecipientException prettyStackTraceError = new MissingRecipientException(recipient.getId()); MissingRecipientException prettyStackTraceError = new MissingRecipientException(recipient.getId());
SignalExecutors.BOUNDED.execute(() -> { executor.execute(() -> {
try { try {
recipient.resolve(); recipient.resolve();
} catch (MissingRecipientException e) { } catch (MissingRecipientException e) {
@ -139,7 +144,7 @@ public final class LiveRecipientCache {
warmedUp = true; warmedUp = true;
} }
SignalExecutors.BOUNDED.execute(() -> { executor.execute(() -> {
ThreadDatabase threadDatabase = DatabaseFactory.getThreadDatabase(context); ThreadDatabase threadDatabase = DatabaseFactory.getThreadDatabase(context);
List<Recipient> recipients = new ArrayList<>(); List<Recipient> recipients = new ArrayList<>();