PLT-7883: Fix database race in bulk importer in GetByUsername. (#7611)

Этот коммит содержится в:
George Goldberg
2017-10-12 18:00:05 +01:00
коммит произвёл Christopher Speller
родитель 785cc06f6e
Коммит fe41022353

Просмотреть файл

@@ -644,28 +644,30 @@ func (a *App) ImportUser(data *UserImportData, dryRun bool) *model.AppError {
} }
} }
var err *model.AppError
var savedUser *model.User
if user.Id == "" { if user.Id == "" {
if _, err := a.createUser(user); err != nil { if savedUser, err = a.createUser(user); err != nil {
return err return err
} }
} else { } else {
if hasUserChanged { if hasUserChanged {
if _, err := a.UpdateUser(user, false); err != nil { if savedUser, err = a.UpdateUser(user, false); err != nil {
return err return err
} }
} }
if hasUserRolesChanged { if hasUserRolesChanged {
if _, err := a.UpdateUserRoles(user.Id, roles); err != nil { if savedUser, err = a.UpdateUserRoles(user.Id, roles); err != nil {
return err return err
} }
} }
if hasNotifyPropsChanged { if hasNotifyPropsChanged {
if _, err := a.UpdateUserNotifyProps(user.Id, user.NotifyProps); err != nil { if savedUser, err = a.UpdateUserNotifyProps(user.Id, user.NotifyProps); err != nil {
return err return err
} }
} }
if len(password) > 0 { if len(password) > 0 {
if err := a.UpdatePassword(user, password); err != nil { if err = a.UpdatePassword(user, password); err != nil {
return err return err
} }
} else { } else {
@@ -684,12 +686,16 @@ func (a *App) ImportUser(data *UserImportData, dryRun bool) *model.AppError {
} }
} }
if savedUser == nil {
savedUser = user
}
// Preferences. // Preferences.
var preferences model.Preferences var preferences model.Preferences
if data.Theme != nil { if data.Theme != nil {
preferences = append(preferences, model.Preference{ preferences = append(preferences, model.Preference{
UserId: user.Id, UserId: savedUser.Id,
Category: model.PREFERENCE_CATEGORY_THEME, Category: model.PREFERENCE_CATEGORY_THEME,
Name: "", Name: "",
Value: *data.Theme, Value: *data.Theme,
@@ -698,7 +704,7 @@ func (a *App) ImportUser(data *UserImportData, dryRun bool) *model.AppError {
if data.UseMilitaryTime != nil { if data.UseMilitaryTime != nil {
preferences = append(preferences, model.Preference{ preferences = append(preferences, model.Preference{
UserId: user.Id, UserId: savedUser.Id,
Category: model.PREFERENCE_CATEGORY_DISPLAY_SETTINGS, Category: model.PREFERENCE_CATEGORY_DISPLAY_SETTINGS,
Name: "use_military_time", Name: "use_military_time",
Value: *data.UseMilitaryTime, Value: *data.UseMilitaryTime,
@@ -707,7 +713,7 @@ func (a *App) ImportUser(data *UserImportData, dryRun bool) *model.AppError {
if data.CollapsePreviews != nil { if data.CollapsePreviews != nil {
preferences = append(preferences, model.Preference{ preferences = append(preferences, model.Preference{
UserId: user.Id, UserId: savedUser.Id,
Category: model.PREFERENCE_CATEGORY_DISPLAY_SETTINGS, Category: model.PREFERENCE_CATEGORY_DISPLAY_SETTINGS,
Name: "collapse_previews", Name: "collapse_previews",
Value: *data.CollapsePreviews, Value: *data.CollapsePreviews,
@@ -716,7 +722,7 @@ func (a *App) ImportUser(data *UserImportData, dryRun bool) *model.AppError {
if data.MessageDisplay != nil { if data.MessageDisplay != nil {
preferences = append(preferences, model.Preference{ preferences = append(preferences, model.Preference{
UserId: user.Id, UserId: savedUser.Id,
Category: model.PREFERENCE_CATEGORY_DISPLAY_SETTINGS, Category: model.PREFERENCE_CATEGORY_DISPLAY_SETTINGS,
Name: "message_display", Name: "message_display",
Value: *data.MessageDisplay, Value: *data.MessageDisplay,
@@ -725,7 +731,7 @@ func (a *App) ImportUser(data *UserImportData, dryRun bool) *model.AppError {
if data.ChannelDisplayMode != nil { if data.ChannelDisplayMode != nil {
preferences = append(preferences, model.Preference{ preferences = append(preferences, model.Preference{
UserId: user.Id, UserId: savedUser.Id,
Category: model.PREFERENCE_CATEGORY_DISPLAY_SETTINGS, Category: model.PREFERENCE_CATEGORY_DISPLAY_SETTINGS,
Name: "channel_display_mode", Name: "channel_display_mode",
Value: *data.ChannelDisplayMode, Value: *data.ChannelDisplayMode,
@@ -734,9 +740,9 @@ func (a *App) ImportUser(data *UserImportData, dryRun bool) *model.AppError {
if data.TutorialStep != nil { if data.TutorialStep != nil {
preferences = append(preferences, model.Preference{ preferences = append(preferences, model.Preference{
UserId: user.Id, UserId: savedUser.Id,
Category: model.PREFERENCE_CATEGORY_TUTORIAL_STEPS, Category: model.PREFERENCE_CATEGORY_TUTORIAL_STEPS,
Name: user.Id, Name: savedUser.Id,
Value: *data.TutorialStep, Value: *data.TutorialStep,
}) })
} }
@@ -747,19 +753,14 @@ func (a *App) ImportUser(data *UserImportData, dryRun bool) *model.AppError {
} }
} }
return a.ImportUserTeams(*data.Username, data.Teams) return a.ImportUserTeams(savedUser, data.Teams)
} }
func (a *App) ImportUserTeams(username string, data *[]UserTeamImportData) *model.AppError { func (a *App) ImportUserTeams(user *model.User, data *[]UserTeamImportData) *model.AppError {
if data == nil { if data == nil {
return nil return nil
} }
user, err := a.GetUserByUsername(username)
if err != nil {
return err
}
for _, tdata := range *data { for _, tdata := range *data {
team, err := a.GetTeamByName(*tdata.Name) team, err := a.GetTeamByName(*tdata.Name)
if err != nil { if err != nil {