From 797aacb8ebfe81ab65e4fa36bd30d6e58faa3f6c Mon Sep 17 00:00:00 2001 From: Monty Taylor Date: Wed, 17 Jul 2019 13:34:13 -0400 Subject: [PATCH] Update User.NumRepos atomically in createRepository (#7493) The update call on the user call races if there is more than one repository creation concurrently, leading to incorrect count of repos. Split things in two, so that we call the update for last visibility (which isn't problematic if it races, since it can only ever be best-effort anyway). This way we can atomically increment the count of repos. --- models/repo.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/models/repo.go b/models/repo.go index fc5f81eb5..c60488844 100644 --- a/models/repo.go +++ b/models/repo.go @@ -1306,13 +1306,17 @@ func createRepository(e *xorm.Session, doer, u *User, repo *Repository) (err err return err } - u.NumRepos++ // Remember visibility preference. u.LastRepoVisibility = repo.IsPrivate - if err = updateUser(e, u); err != nil { + if err = updateUserCols(e, u, "last_repo_visibility"); err != nil { return fmt.Errorf("updateUser: %v", err) } + if _, err = e.Incr("num_repos").ID(u.ID).Update(new(User)); err != nil { + return fmt.Errorf("increment user total_repos: %v", err) + } + u.NumRepos++ + // Give access to all members in owner team. if u.IsOrganization() { t, err := u.getOwnerTeam(e)