forked from Silverfish/proton-bridge
fix(GODT-2326): Only run sync after addIMAPUser()
There is concurrency bug due to competing sync calls that can occur when we clear the sync status in the Vault. Running sync at the end of addIMAPUser() avoids the problem. This patch also remove the execution of a sync task for `user.ClearSyncStatus()`
This commit is contained in:
@ -149,6 +149,7 @@ func (bridge *Bridge) addIMAPUser(ctx context.Context, user *user.User) error {
|
||||
}
|
||||
}
|
||||
|
||||
user.TriggerSync()
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
@ -232,12 +232,13 @@ func New(
|
||||
})
|
||||
})
|
||||
|
||||
// Trigger an initial sync (if necessary).
|
||||
user.goSync()
|
||||
|
||||
return user, nil
|
||||
}
|
||||
|
||||
func (user *User) TriggerSync() {
|
||||
user.goSync()
|
||||
}
|
||||
|
||||
// ID returns the user's ID.
|
||||
func (user *User) ID() string {
|
||||
return safe.RLockRet(func() string {
|
||||
@ -475,11 +476,13 @@ func (user *User) OnStatusDown(context.Context) {
|
||||
user.abortable.Abort()
|
||||
}
|
||||
|
||||
// ClearSyncStatus clears the sync status of the user. This triggers a resync.
|
||||
func (user *User) ClearSyncStatus() error {
|
||||
user.abortable.Abort()
|
||||
defer user.goSync()
|
||||
// GetSyncStatus returns the sync status of the user.
|
||||
func (user *User) GetSyncStatus() vault.SyncStatus {
|
||||
return user.vault.GetSyncStatus()
|
||||
}
|
||||
|
||||
// ClearSyncStatus clears the sync status of the user.
|
||||
func (user *User) ClearSyncStatus() error {
|
||||
return user.vault.ClearSyncStatus()
|
||||
}
|
||||
|
||||
|
||||
@ -197,6 +197,11 @@ func (user *User) RemFailedMessageID(messageID string) error {
|
||||
})
|
||||
}
|
||||
|
||||
// GetSyncStatus returns the user's sync status.
|
||||
func (user *User) GetSyncStatus() SyncStatus {
|
||||
return user.vault.getUser(user.userID).SyncStatus
|
||||
}
|
||||
|
||||
// ClearSyncStatus clears the user's sync status.
|
||||
func (user *User) ClearSyncStatus() error {
|
||||
return user.vault.modUser(user.userID, func(data *UserData) {
|
||||
|
||||
Reference in New Issue
Block a user