Lock sync during sign in to prevent possible race condition
This commit is contained in:
@@ -105,11 +105,18 @@ class AccountMenu {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$scope.login = function(extraParams) {
|
$scope.login = function(extraParams) {
|
||||||
|
// Prevent a timed sync from occuring while signing in. There may be a race condition where when
|
||||||
|
// calling `markAllItemsDirtyAndSaveOffline` during sign in, if an authenticated sync happens to occur
|
||||||
|
// right before that's called, items retreived from that sync will be marked as dirty, then resynced, causing mass duplication.
|
||||||
|
// Unlock sync after all sign in processes are complete.
|
||||||
|
syncManager.lockSyncing();
|
||||||
|
|
||||||
$scope.formData.status = "Generating Login Keys...";
|
$scope.formData.status = "Generating Login Keys...";
|
||||||
$timeout(function(){
|
$timeout(function(){
|
||||||
authManager.login($scope.formData.url, $scope.formData.email, $scope.formData.user_password, $scope.formData.ephemeral, extraParams,
|
authManager.login($scope.formData.url, $scope.formData.email, $scope.formData.user_password, $scope.formData.ephemeral, extraParams,
|
||||||
(response) => {
|
(response) => {
|
||||||
if(!response || response.error) {
|
if(!response || response.error) {
|
||||||
|
syncManager.unlockSyncing();
|
||||||
$scope.formData.status = null;
|
$scope.formData.status = null;
|
||||||
var error = response ? response.error : {message: "An unknown error occured."}
|
var error = response ? response.error : {message: "An unknown error occured."}
|
||||||
|
|
||||||
@@ -133,7 +140,10 @@ class AccountMenu {
|
|||||||
|
|
||||||
// Success
|
// Success
|
||||||
else {
|
else {
|
||||||
$scope.onAuthSuccess();
|
$scope.onAuthSuccess(() => {
|
||||||
|
syncManager.unlockSyncing();
|
||||||
|
syncManager.sync("onLogin");
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
@@ -156,7 +166,9 @@ class AccountMenu {
|
|||||||
var error = response ? response.error : {message: "An unknown error occured."}
|
var error = response ? response.error : {message: "An unknown error occured."}
|
||||||
alert(error.message);
|
alert(error.message);
|
||||||
} else {
|
} else {
|
||||||
$scope.onAuthSuccess();
|
$scope.onAuthSuccess(() => {
|
||||||
|
syncManager.sync("onRegister");
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
@@ -170,12 +182,12 @@ class AccountMenu {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$scope.onAuthSuccess = function() {
|
$scope.onAuthSuccess = function(callback) {
|
||||||
var block = function() {
|
var block = function() {
|
||||||
$timeout(function(){
|
$timeout(function(){
|
||||||
$scope.onSuccessfulAuth()();
|
$scope.onSuccessfulAuth()();
|
||||||
syncManager.refreshErroredItems();
|
syncManager.refreshErroredItems();
|
||||||
syncManager.sync("onAuthSuccess");
|
callback && callback();
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -196,7 +208,7 @@ class AccountMenu {
|
|||||||
// clearAllModels will remove data from backing store, but not from working memory
|
// clearAllModels will remove data from backing store, but not from working memory
|
||||||
// See: https://github.com/standardnotes/desktop/issues/131
|
// See: https://github.com/standardnotes/desktop/issues/131
|
||||||
$scope.clearDatabaseAndRewriteAllItems = function(alternateUuids, callback) {
|
$scope.clearDatabaseAndRewriteAllItems = function(alternateUuids, callback) {
|
||||||
storageManager.clearAllModels(function(){
|
storageManager.clearAllModels(() => {
|
||||||
syncManager.markAllItemsDirtyAndSaveOffline(function(){
|
syncManager.markAllItemsDirtyAndSaveOffline(function(){
|
||||||
callback && callback();
|
callback && callback();
|
||||||
}, alternateUuids)
|
}, alternateUuids)
|
||||||
|
|||||||
@@ -193,8 +193,21 @@ class SyncManager {
|
|||||||
this.$interval.cancel(this.syncStatus.checker);
|
this.$interval.cancel(this.syncStatus.checker);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lockSyncing() {
|
||||||
|
this.syncLocked = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
unlockSyncing() {
|
||||||
|
this.syncLocked = false;
|
||||||
|
}
|
||||||
|
|
||||||
sync(callback, options = {}, source) {
|
sync(callback, options = {}, source) {
|
||||||
|
|
||||||
|
if(this.syncLocked) {
|
||||||
|
console.log("Sync Locked, Returning;");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if(!options) options = {};
|
if(!options) options = {};
|
||||||
|
|
||||||
if(typeof callback == 'string') {
|
if(typeof callback == 'string') {
|
||||||
|
|||||||
Reference in New Issue
Block a user