Don't use a flag for indicating ongoing sync migration. Reading it from a preference fixes an issue where the sync thread could run before the migration had started

pull/14/head
Sam Bosley 13 years ago
parent 7664049f7e
commit 35a44428c5

@ -19,6 +19,7 @@ import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.actfm.sync.messages.BriefMe; import com.todoroo.astrid.actfm.sync.messages.BriefMe;
import com.todoroo.astrid.actfm.sync.messages.ChangesHappened; import com.todoroo.astrid.actfm.sync.messages.ChangesHappened;
import com.todoroo.astrid.actfm.sync.messages.ClientToServerMessage; import com.todoroo.astrid.actfm.sync.messages.ClientToServerMessage;
@ -43,7 +44,6 @@ import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.TaskOutstanding; import com.todoroo.astrid.data.TaskOutstanding;
import com.todoroo.astrid.data.UserActivity; import com.todoroo.astrid.data.UserActivity;
import com.todoroo.astrid.data.UserActivityOutstanding; import com.todoroo.astrid.data.UserActivityOutstanding;
import com.todoroo.astrid.utility.Flags;
public class ActFmSyncThread { public class ActFmSyncThread {
@ -80,6 +80,8 @@ public class ActFmSyncThread {
private String token; private String token;
private boolean syncMigration = false;
public static enum ModelType { public static enum ModelType {
TYPE_TASK, TYPE_TASK,
TYPE_TAG, TYPE_TAG,
@ -124,6 +126,7 @@ public class ActFmSyncThread {
this.pendingMessages = messageQueue; this.pendingMessages = messageQueue;
this.pendingCallbacks = Collections.synchronizedMap(new HashMap<ClientToServerMessage<?>, Runnable>()); this.pendingCallbacks = Collections.synchronizedMap(new HashMap<ClientToServerMessage<?>, Runnable>());
this.monitor = syncMonitor; this.monitor = syncMonitor;
this.syncMigration = Preferences.getBoolean(AstridNewSyncMigrator.PREF_SYNC_MIGRATION, false);
} }
public synchronized void startSyncThread() { public synchronized void startSyncThread() {
@ -157,10 +160,13 @@ public class ActFmSyncThread {
List<ClientToServerMessage<?>> messageBatch = new LinkedList<ClientToServerMessage<?>>(); List<ClientToServerMessage<?>> messageBatch = new LinkedList<ClientToServerMessage<?>>();
while(true) { while(true) {
synchronized(monitor) { synchronized(monitor) {
while ((pendingMessages.isEmpty() && !timeForBackgroundSync()) || !actFmPreferenceService.isLoggedIn()) { while ((pendingMessages.isEmpty() && !timeForBackgroundSync()) || !actFmPreferenceService.isLoggedIn() || !syncMigration) {
try { try {
monitor.wait(); monitor.wait();
AndroidUtilities.sleepDeep(500L); // Wait briefly for large database operations to finish (e.g. adding a task with several tags may trigger a message before all saves are done--fix this?) AndroidUtilities.sleepDeep(500L); // Wait briefly for large database operations to finish (e.g. adding a task with several tags may trigger a message before all saves are done--fix this?)
if (!syncMigration)
syncMigration = Preferences.getBoolean(AstridNewSyncMigrator.PREF_SYNC_MIGRATION, false);
} catch (InterruptedException e) { } catch (InterruptedException e) {
// Ignored // Ignored
} }
@ -257,7 +263,7 @@ public class ActFmSyncThread {
} }
private boolean timeForBackgroundSync() { private boolean timeForBackgroundSync() {
return !Flags.check(Flags.SYNC_MIGRATION_ONGOING) && false; // TODO: replace && false with a real background sync condition return false; // TODO: replace false with a real background sync condition
} }
private void repopulateQueueFromOutstandingTables() { private void repopulateQueueFromOutstandingTables() {

@ -11,6 +11,7 @@ import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.actfm.sync.messages.NameMaps; import com.todoroo.astrid.actfm.sync.messages.NameMaps;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.OutstandingEntryDao; import com.todoroo.astrid.dao.OutstandingEntryDao;
@ -36,7 +37,6 @@ import com.todoroo.astrid.helper.UUIDHelper;
import com.todoroo.astrid.service.MetadataService; import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.TagDataService; import com.todoroo.astrid.service.TagDataService;
import com.todoroo.astrid.tags.TaskToTagMetadata; import com.todoroo.astrid.tags.TaskToTagMetadata;
import com.todoroo.astrid.utility.Flags;
@SuppressWarnings("nls") @SuppressWarnings("nls")
public class AstridNewSyncMigrator { public class AstridNewSyncMigrator {
@ -54,13 +54,17 @@ public class AstridNewSyncMigrator {
private static final String LOG_TAG = "sync-migrate"; private static final String LOG_TAG = "sync-migrate";
public static final String PREF_SYNC_MIGRATION = "p_sync_migration";
public AstridNewSyncMigrator() { public AstridNewSyncMigrator() {
DependencyInjectionService.getInstance().inject(this); DependencyInjectionService.getInstance().inject(this);
} }
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public void performMigration() { public void performMigration() {
Flags.set(Flags.SYNC_MIGRATION_ONGOING); if (Preferences.getBoolean(PREF_SYNC_MIGRATION, false))
return;
// -------------- // --------------
// First ensure that a TagData object exists for each tag metadata // First ensure that a TagData object exists for each tag metadata
// -------------- // --------------
@ -225,7 +229,11 @@ public class AstridNewSyncMigrator {
} catch (Exception e) { } catch (Exception e) {
Log.e(LOG_TAG, "Error validating task to tag metadata", e); Log.e(LOG_TAG, "Error validating task to tag metadata", e);
} }
Flags.checkAndClear(Flags.SYNC_MIGRATION_ONGOING); Preferences.setBoolean(PREF_SYNC_MIGRATION, true);
ActFmSyncMonitor monitor = ActFmSyncMonitor.getInstance();
synchronized (monitor) {
monitor.notifyAll();
}
} }
private interface UUIDAssertionExtras<TYPE extends RemoteModel> { private interface UUIDAssertionExtras<TYPE extends RemoteModel> {

@ -43,6 +43,7 @@ import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.andlib.utility.Preferences; import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.actfm.sync.ActFmPreferenceService; import com.todoroo.astrid.actfm.sync.ActFmPreferenceService;
import com.todoroo.astrid.actfm.sync.ActFmSyncThread; import com.todoroo.astrid.actfm.sync.ActFmSyncThread;
import com.todoroo.astrid.actfm.sync.AstridNewSyncMigrator;
import com.todoroo.astrid.activity.BeastModePreferences; import com.todoroo.astrid.activity.BeastModePreferences;
import com.todoroo.astrid.backup.BackupConstants; import com.todoroo.astrid.backup.BackupConstants;
import com.todoroo.astrid.backup.BackupService; import com.todoroo.astrid.backup.BackupService;
@ -202,6 +203,8 @@ public class StartupService {
if(justUpgraded && version > 0) { if(justUpgraded && version > 0) {
if(latestSetVersion > 0) { if(latestSetVersion > 0) {
upgradeService.performUpgrade(context, latestSetVersion); upgradeService.performUpgrade(context, latestSetVersion);
} else {
Preferences.setBoolean(AstridNewSyncMigrator.PREF_SYNC_MIGRATION, true); // New installs should have this flag set up front
} }
AstridPreferences.setCurrentVersion(version); AstridPreferences.setCurrentVersion(version);
AstridPreferences.setCurrentVersionName(versionName); AstridPreferences.setCurrentVersionName(versionName);

@ -236,8 +236,8 @@ public final class UpgradeService {
new SubtasksMetadataMigration().performMigration(); new SubtasksMetadataMigration().performMigration();
if (from < V4_6_0) { if (from < V4_6_0) {
new GCMIntentService.GCMMigration().performMigration(UpgradeActivity.this);
new AstridNewSyncMigrator().performMigration(); new AstridNewSyncMigrator().performMigration();
new GCMIntentService.GCMMigration().performMigration(UpgradeActivity.this);
} }
} finally { } finally {

@ -36,12 +36,6 @@ public class Flags {
*/ */
public static final int TLFP_NO_INTERCEPT_TOUCH = 1 << 7; public static final int TLFP_NO_INTERCEPT_TOUCH = 1 << 7;
/**
* If set, indicates that the new sync migration is ongoing and the sync thread should block until it is finished
* Only set once.
*/
public static final int SYNC_MIGRATION_ONGOING = 1 << 8;
public static boolean checkAndClear(int flag) { public static boolean checkAndClear(int flag) {
boolean set = (state & flag) > 0; boolean set = (state & flag) > 0;
state &= ~flag; state &= ~flag;

Loading…
Cancel
Save