Skip to content

Commit be82b8f

Browse files
lunnyzeripath
andauthored
Keep database transactions not too big (#13254)
* Keep database transactions not too big * Fix #13255 Signed-off-by: Andrew Thornton <[email protected]> * Only cache the last repo Signed-off-by: Andrew Thornton <[email protected]> Co-authored-by: Andrew Thornton <[email protected]>
1 parent e964c6e commit be82b8f

File tree

1 file changed

+40
-41
lines changed

1 file changed

+40
-41
lines changed

models/migrations/v156.go

+40-41
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"strings"
1111

1212
"code.gitea.io/gitea/modules/git"
13+
"code.gitea.io/gitea/modules/log"
1314
"code.gitea.io/gitea/modules/setting"
1415

1516
"xorm.io/xorm"
@@ -35,9 +36,10 @@ func fixPublisherIDforTagReleases(x *xorm.Engine) error {
3536
}
3637

3738
type Repository struct {
38-
ID int64
39-
OwnerID int64
40-
Name string
39+
ID int64
40+
OwnerID int64
41+
OwnerName string
42+
Name string
4143
}
4244

4345
type User struct {
@@ -50,27 +52,23 @@ func fixPublisherIDforTagReleases(x *xorm.Engine) error {
5052
sess := x.NewSession()
5153
defer sess.Close()
5254

53-
if err := sess.Begin(); err != nil {
54-
return err
55-
}
56-
5755
var (
58-
gitRepoCache = make(map[int64]*git.Repository)
59-
gitRepo *git.Repository
60-
repoCache = make(map[int64]*Repository)
61-
userCache = make(map[int64]*User)
62-
ok bool
63-
err error
56+
repo *Repository
57+
gitRepo *git.Repository
6458
)
6559
defer func() {
66-
for i := range gitRepoCache {
67-
gitRepoCache[i].Close()
60+
if gitRepo != nil {
61+
gitRepo.Close()
6862
}
6963
}()
7064
for start := 0; ; start += batchSize {
7165
releases := make([]*Release, 0, batchSize)
7266

73-
if err := sess.Limit(batchSize, start).Asc("id").Where("is_tag=?", true).Find(&releases); err != nil {
67+
if err := sess.Begin(); err != nil {
68+
return err
69+
}
70+
71+
if err := sess.Limit(batchSize, start).Asc("repo_id", "id").Where("is_tag=?", true).Find(&releases); err != nil {
7472
return err
7573
}
7674

@@ -79,39 +77,36 @@ func fixPublisherIDforTagReleases(x *xorm.Engine) error {
7977
}
8078

8179
for _, release := range releases {
82-
gitRepo, ok = gitRepoCache[release.RepoID]
83-
if !ok {
84-
repo, ok := repoCache[release.RepoID]
85-
if !ok {
86-
repo = new(Repository)
87-
has, err := sess.ID(release.RepoID).Get(repo)
88-
if err != nil {
89-
return err
90-
} else if !has {
91-
return fmt.Errorf("Repository %d is not exist", release.RepoID)
92-
}
93-
94-
repoCache[release.RepoID] = repo
80+
if repo == nil || repo.ID != release.RepoID {
81+
if gitRepo != nil {
82+
gitRepo.Close()
83+
gitRepo = nil
84+
}
85+
repo = new(Repository)
86+
has, err := sess.ID(release.RepoID).Get(repo)
87+
if err != nil {
88+
return err
89+
} else if !has {
90+
log.Warn("Release[%d] is orphaned and refers to non-existing repository %d", release.ID, release.RepoID)
91+
log.Warn("This release should be deleted")
92+
continue
9593
}
9694

97-
user, ok := userCache[repo.OwnerID]
98-
if !ok {
99-
user = new(User)
100-
has, err := sess.ID(repo.OwnerID).Get(user)
101-
if err != nil {
95+
if repo.OwnerName == "" {
96+
// v120.go migration may not have been run correctly - we'll just replicate it here
97+
// because this appears to be a common-ish problem.
98+
if _, err := sess.Exec("UPDATE repository SET owner_name = (SELECT name FROM `user` WHERE `user`.id = repository.owner_id)"); err != nil {
10299
return err
103-
} else if !has {
104-
return fmt.Errorf("User %d is not exist", repo.OwnerID)
105100
}
106101

107-
userCache[repo.OwnerID] = user
102+
if _, err := sess.ID(release.RepoID).Get(repo); err != nil {
103+
return err
104+
}
108105
}
109-
110-
gitRepo, err = git.OpenRepository(repoPath(user.Name, repo.Name))
106+
gitRepo, err = git.OpenRepository(repoPath(repo.OwnerName, repo.Name))
111107
if err != nil {
112108
return err
113109
}
114-
gitRepoCache[release.RepoID] = gitRepo
115110
}
116111

117112
commit, err := gitRepo.GetTagCommit(release.TagName)
@@ -134,7 +129,11 @@ func fixPublisherIDforTagReleases(x *xorm.Engine) error {
134129
return err
135130
}
136131
}
132+
133+
if err := sess.Commit(); err != nil {
134+
return err
135+
}
137136
}
138137

139-
return sess.Commit()
138+
return nil
140139
}

0 commit comments

Comments
 (0)