Do not unnecessarily refresh known-unregistered users during migration.

This commit is contained in:
Greyson Parrelli
2020-12-10 12:20:10 -05:00
parent af99753d47
commit 23579a9b1d
4 changed files with 35 additions and 8 deletions

View File

@@ -96,10 +96,13 @@ public final class GroupsV1MigrationUtil {
throw new InvalidMigrationStateException(); throw new InvalidMigrationStateException();
} }
RecipientUtil.ensureUuidsAreAvailable(context, groupRecipient.getParticipants());
groupRecipient = groupRecipient.fresh();
List<Recipient> registeredMembers = RecipientUtil.getEligibleForSending(groupRecipient.getParticipants()); List<Recipient> registeredMembers = RecipientUtil.getEligibleForSending(groupRecipient.getParticipants());
if (RecipientUtil.ensureUuidsAreAvailable(context, registeredMembers)) {
Log.i(TAG, "Newly-discovered UUIDs. Getting fresh recipients.");
registeredMembers = Stream.of(registeredMembers).map(Recipient::fresh).toList();
}
List<Recipient> possibleMembers = forced ? getMigratableManualMigrationMembers(registeredMembers) List<Recipient> possibleMembers = forced ? getMigratableManualMigrationMembers(registeredMembers)
: getMigratableAutoMigrationMembers(registeredMembers); : getMigratableAutoMigrationMembers(registeredMembers);

View File

@@ -61,6 +61,11 @@ public class GroupV1MigrationJob extends BaseJob {
} }
public static void enqueuePossibleAutoMigrate(@NonNull RecipientId recipientId) { public static void enqueuePossibleAutoMigrate(@NonNull RecipientId recipientId) {
if (!FeatureFlags.groupsV1MigrationJob()) {
Log.w(TAG, "Migration job is disabled.");
return;
}
SignalExecutors.BOUNDED.execute(() -> { SignalExecutors.BOUNDED.execute(() -> {
if (Recipient.resolved(recipientId).isPushV1Group()) { if (Recipient.resolved(recipientId).isPushV1Group()) {
ApplicationDependencies.getJobManager().add(new GroupV1MigrationJob(recipientId)); ApplicationDependencies.getJobManager().add(new GroupV1MigrationJob(recipientId));
@@ -69,6 +74,11 @@ public class GroupV1MigrationJob extends BaseJob {
} }
public static void enqueueRoutineMigrationsIfNecessary(@NonNull Application application) { public static void enqueueRoutineMigrationsIfNecessary(@NonNull Application application) {
if (!FeatureFlags.groupsV1MigrationJob()) {
Log.w(TAG, "Migration job is disabled.");
return;
}
if (!SignalStore.registrationValues().isRegistrationComplete() || if (!SignalStore.registrationValues().isRegistrationComplete() ||
!TextSecurePreferences.isPushRegistered(application) || !TextSecurePreferences.isPushRegistered(application) ||
TextSecurePreferences.getLocalUuid(application) == null) TextSecurePreferences.getLocalUuid(application) == null)
@@ -82,12 +92,15 @@ public class GroupV1MigrationJob extends BaseJob {
return; return;
} }
long timeSinceRefresh = System.currentTimeMillis() - SignalStore.misc().getLastProfileRefreshTime(); long timeSinceRefresh = System.currentTimeMillis() - SignalStore.misc().getLastGv1RoutineMigrationTime();
if (timeSinceRefresh < REFRESH_INTERVAL) { if (timeSinceRefresh < REFRESH_INTERVAL) {
Log.i(TAG, "Too soon to refresh. Did the last refresh " + timeSinceRefresh + " ms ago."); Log.i(TAG, "Too soon to refresh. Did the last refresh " + timeSinceRefresh + " ms ago.");
return; return;
} }
SignalStore.misc().setLastGv1RoutineMigrationTime(System.currentTimeMillis());
SignalExecutors.BOUNDED.execute(() -> { SignalExecutors.BOUNDED.execute(() -> {
JobManager jobManager = ApplicationDependencies.getJobManager(); JobManager jobManager = ApplicationDependencies.getJobManager();
List<ThreadRecord> threads = DatabaseFactory.getThreadDatabase(application).getRecentV1Groups(ROUTINE_LIMIT); List<ThreadRecord> threads = DatabaseFactory.getThreadDatabase(application).getRecentV1Groups(ROUTINE_LIMIT);

View File

@@ -93,7 +93,7 @@ public class RecipientUtil {
.toList(); .toList();
} }
public static void ensureUuidsAreAvailable(@NonNull Context context, @NonNull Collection<Recipient> recipients) public static boolean ensureUuidsAreAvailable(@NonNull Context context, @NonNull Collection<Recipient> recipients)
throws IOException throws IOException
{ {
List<Recipient> recipientsWithoutUuids = Stream.of(recipients) List<Recipient> recipientsWithoutUuids = Stream.of(recipients)
@@ -103,6 +103,9 @@ public class RecipientUtil {
if (recipientsWithoutUuids.size() > 0) { if (recipientsWithoutUuids.size() > 0) {
DirectoryHelper.refreshDirectoryFor(context, recipientsWithoutUuids, false); DirectoryHelper.refreshDirectoryFor(context, recipientsWithoutUuids, false);
return true;
} else {
return false;
} }
} }

View File

@@ -64,6 +64,7 @@ public final class FeatureFlags {
private static final String GV1_AUTO_MIGRATE = "android.groupsV1Migration.auto.4"; private static final String GV1_AUTO_MIGRATE = "android.groupsV1Migration.auto.4";
private static final String GV1_MANUAL_MIGRATE = "android.groupsV1Migration.manual"; private static final String GV1_MANUAL_MIGRATE = "android.groupsV1Migration.manual";
private static final String GV1_FORCED_MIGRATE = "android.groupsV1Migration.forced"; private static final String GV1_FORCED_MIGRATE = "android.groupsV1Migration.forced";
private static final String GV1_MIGRATION_JOB = "android.groupsV1Migration.job";
private static final String SEND_VIEWED_RECEIPTS = "android.sendViewedReceipts"; private static final String SEND_VIEWED_RECEIPTS = "android.sendViewedReceipts";
/** /**
@@ -81,6 +82,7 @@ public final class FeatureFlags {
DONATE_MEGAPHONE, DONATE_MEGAPHONE,
VIEWED_RECEIPTS, VIEWED_RECEIPTS,
GV1_AUTO_MIGRATE, GV1_AUTO_MIGRATE,
GV1_MIGRATION_JOB,
GV1_MANUAL_MIGRATE, GV1_MANUAL_MIGRATE,
GV1_FORCED_MIGRATE, GV1_FORCED_MIGRATE,
GROUP_CALLING, GROUP_CALLING,
@@ -107,7 +109,8 @@ public final class FeatureFlags {
private static final Set<String> HOT_SWAPPABLE = SetUtil.newHashSet( private static final Set<String> HOT_SWAPPABLE = SetUtil.newHashSet(
VERIFY_V2, VERIFY_V2,
CLIENT_EXPIRATION, CLIENT_EXPIRATION,
GROUP_CALLING GROUP_CALLING,
GV1_MIGRATION_JOB
); );
/** /**
@@ -238,6 +241,11 @@ public final class FeatureFlags {
return getBoolean(GV1_AUTO_MIGRATE, false); return getBoolean(GV1_AUTO_MIGRATE, false);
} }
/** Whether or not we should run the job to proactively migrate groups. */
public static boolean groupsV1MigrationJob() {
return getBoolean(GV1_MIGRATION_JOB, false);
}
/** Whether or not manual migration from GV1->GV2 is enabled. */ /** Whether or not manual migration from GV1->GV2 is enabled. */
public static boolean groupsV1ManualMigration() { public static boolean groupsV1ManualMigration() {
return getBoolean(GV1_MANUAL_MIGRATE, false) && groupsV1AutoMigration(); return getBoolean(GV1_MANUAL_MIGRATE, false) && groupsV1AutoMigration();