]> source.dussan.org Git - gitea.git/commitdiff
Update User.NumRepos atomically in createRepository (#7493)
authorMonty Taylor <mordred@inaugust.com>
Wed, 17 Jul 2019 17:34:13 +0000 (13:34 -0400)
committertechknowlogick <techknowlogick@gitea.io>
Wed, 17 Jul 2019 17:34:13 +0000 (13:34 -0400)
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

index fc5f81eb5cc94572959f6b61a2805ee98fb2f5ca..c60488844c8ab99d9eed398935e06bb9c28532fb 100644 (file)
@@ -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)