Skip to content

Commit 337d691

Browse files
lunnytechknowlogick
authored andcommitted
Detect migrating batch size (#7353)
* Make migrating batch size as configurable * detect different table batch insert size and remove config item * remove unrelated changes
1 parent ef57fe4 commit 337d691

File tree

4 files changed

+73
-17
lines changed

4 files changed

+73
-17
lines changed

models/models.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,3 +368,9 @@ func DumpDatabase(filePath string, dbType string) error {
368368
}
369369
return x.DumpTablesToFile(tbs, filePath)
370370
}
371+
372+
// MaxBatchInsertSize returns the table's max batch insert size
373+
func MaxBatchInsertSize(bean interface{}) int {
374+
t := x.TableInfo(bean)
375+
return 999 / len(t.ColumnsSeq())
376+
}

modules/migrations/base/uploader.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package base
77

88
// Uploader uploads all the informations of one repository
99
type Uploader interface {
10+
MaxBatchInsertSize(tp string) int
1011
CreateRepo(repo *Repository, opts MigrateOptions) error
1112
CreateMilestones(milestones ...*Milestone) error
1213
CreateReleases(releases ...*Release) error

modules/migrations/gitea.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,25 @@ func NewGiteaLocalUploader(doer *models.User, repoOwner, repoName string) *Gitea
5353
}
5454
}
5555

56+
// MaxBatchInsertSize returns the table's max batch insert size
57+
func (g *GiteaLocalUploader) MaxBatchInsertSize(tp string) int {
58+
switch tp {
59+
case "issue":
60+
return models.MaxBatchInsertSize(new(models.Issue))
61+
case "comment":
62+
return models.MaxBatchInsertSize(new(models.Comment))
63+
case "milestone":
64+
return models.MaxBatchInsertSize(new(models.Milestone))
65+
case "label":
66+
return models.MaxBatchInsertSize(new(models.Label))
67+
case "release":
68+
return models.MaxBatchInsertSize(new(models.Release))
69+
case "pullrequest":
70+
return models.MaxBatchInsertSize(new(models.PullRequest))
71+
}
72+
return 10
73+
}
74+
5675
// CreateRepo creates a repository
5776
func (g *GiteaLocalUploader) CreateRepo(repo *base.Repository, opts base.MigrateOptions) error {
5877
owner, err := models.GetUserByName(g.repoOwner)

modules/migrations/migrate.go

Lines changed: 47 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,16 @@ func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts
9191
return err
9292
}
9393

94-
if err := uploader.CreateMilestones(milestones...); err != nil {
95-
return err
94+
msBatchSize := uploader.MaxBatchInsertSize("milestone")
95+
for len(milestones) > 0 {
96+
if len(milestones) < msBatchSize {
97+
msBatchSize = len(milestones)
98+
}
99+
100+
if err := uploader.CreateMilestones(milestones...); err != nil {
101+
return err
102+
}
103+
milestones = milestones[msBatchSize:]
96104
}
97105
}
98106

@@ -103,8 +111,16 @@ func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts
103111
return err
104112
}
105113

106-
if err := uploader.CreateLabels(labels...); err != nil {
107-
return err
114+
lbBatchSize := uploader.MaxBatchInsertSize("label")
115+
for len(labels) > 0 {
116+
if len(labels) < lbBatchSize {
117+
lbBatchSize = len(labels)
118+
}
119+
120+
if err := uploader.CreateLabels(labels...); err != nil {
121+
return err
122+
}
123+
labels = labels[lbBatchSize:]
108124
}
109125
}
110126

@@ -115,15 +131,27 @@ func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts
115131
return err
116132
}
117133

118-
if err := uploader.CreateReleases(releases...); err != nil {
119-
return err
134+
relBatchSize := uploader.MaxBatchInsertSize("release")
135+
for len(releases) > 0 {
136+
if len(releases) < relBatchSize {
137+
relBatchSize = len(releases)
138+
}
139+
140+
if err := uploader.CreateReleases(releases[:relBatchSize]...); err != nil {
141+
return err
142+
}
143+
releases = releases[relBatchSize:]
120144
}
121145
}
122146

147+
var commentBatchSize = uploader.MaxBatchInsertSize("comment")
148+
123149
if opts.Issues {
124150
log.Trace("migrating issues and comments")
151+
var issueBatchSize = uploader.MaxBatchInsertSize("issue")
152+
125153
for i := 1; ; i++ {
126-
issues, isEnd, err := downloader.GetIssues(i, 100)
154+
issues, isEnd, err := downloader.GetIssues(i, issueBatchSize)
127155
if err != nil {
128156
return err
129157
}
@@ -141,7 +169,7 @@ func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts
141169
continue
142170
}
143171

144-
var allComments = make([]*base.Comment, 0, 100)
172+
var allComments = make([]*base.Comment, 0, commentBatchSize)
145173
for _, issue := range issues {
146174
comments, err := downloader.GetComments(issue.Number)
147175
if err != nil {
@@ -154,11 +182,12 @@ func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts
154182
}
155183
allComments = append(allComments, comments...)
156184

157-
if len(allComments) >= 100 {
158-
if err := uploader.CreateComments(allComments...); err != nil {
185+
if len(allComments) >= commentBatchSize {
186+
if err := uploader.CreateComments(allComments[:commentBatchSize]...); err != nil {
159187
return err
160188
}
161-
allComments = make([]*base.Comment, 0, 100)
189+
190+
allComments = allComments[commentBatchSize:]
162191
}
163192
}
164193

@@ -176,8 +205,9 @@ func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts
176205

177206
if opts.PullRequests {
178207
log.Trace("migrating pull requests and comments")
208+
var prBatchSize = models.MaxBatchInsertSize("pullrequest")
179209
for i := 1; ; i++ {
180-
prs, err := downloader.GetPullRequests(i, 100)
210+
prs, err := downloader.GetPullRequests(i, prBatchSize)
181211
if err != nil {
182212
return err
183213
}
@@ -195,7 +225,7 @@ func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts
195225
continue
196226
}
197227

198-
var allComments = make([]*base.Comment, 0, 100)
228+
var allComments = make([]*base.Comment, 0, commentBatchSize)
199229
for _, pr := range prs {
200230
comments, err := downloader.GetComments(pr.Number)
201231
if err != nil {
@@ -209,11 +239,11 @@ func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts
209239

210240
allComments = append(allComments, comments...)
211241

212-
if len(allComments) >= 100 {
213-
if err := uploader.CreateComments(allComments...); err != nil {
242+
if len(allComments) >= commentBatchSize {
243+
if err := uploader.CreateComments(allComments[:commentBatchSize]...); err != nil {
214244
return err
215245
}
216-
allComments = make([]*base.Comment, 0, 100)
246+
allComments = allComments[commentBatchSize:]
217247
}
218248
}
219249
if len(allComments) > 0 {
@@ -222,7 +252,7 @@ func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts
222252
}
223253
}
224254

225-
if len(prs) < 100 {
255+
if len(prs) < prBatchSize {
226256
break
227257
}
228258
}

0 commit comments

Comments
 (0)