Skip to content

Commit e177728

Browse files
Store task errors following migrations and display them (#13246) (#13287)
* Store task errors following migrations and display them When migrate tasks fail store the error in the task table and ensure that they show on the status page. Fix #13242 Signed-off-by: Andrew Thornton <[email protected]> * Update web_src/js/index.js * Hide the failed first Signed-off-by: Andrew Thornton <[email protected]> Co-authored-by: techknowlogick <[email protected]> Co-authored-by: zeripath <[email protected]>
1 parent 074f7ab commit e177728

File tree

8 files changed

+95
-41
lines changed

8 files changed

+95
-41
lines changed

models/task.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,27 @@ func GetMigratingTask(repoID int64) (*Task, error) {
147147
return &task, nil
148148
}
149149

150+
// GetMigratingTaskByID returns the migrating task by repo's id
151+
func GetMigratingTaskByID(id, doerID int64) (*Task, *migration.MigrateOptions, error) {
152+
var task = Task{
153+
ID: id,
154+
DoerID: doerID,
155+
Type: structs.TaskTypeMigrateRepo,
156+
}
157+
has, err := x.Get(&task)
158+
if err != nil {
159+
return nil, nil, err
160+
} else if !has {
161+
return nil, nil, ErrTaskDoesNotExist{id, 0, task.Type}
162+
}
163+
164+
var opts migration.MigrateOptions
165+
if err := json.Unmarshal([]byte(task.PayloadContent), &opts); err != nil {
166+
return nil, nil, err
167+
}
168+
return &task, &opts, nil
169+
}
170+
150171
// FindTaskOptions find all tasks
151172
type FindTaskOptions struct {
152173
Status int

modules/task/migrate.go

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import (
2020
"code.gitea.io/gitea/modules/util"
2121
)
2222

23-
func handleCreateError(owner *models.User, err error, name string) error {
23+
func handleCreateError(owner *models.User, err error) error {
2424
switch {
2525
case models.IsErrReachLimitOfRepo(err):
2626
return fmt.Errorf("You have already reached your limit of %d repositories", owner.MaxCreationLimit())
@@ -38,8 +38,8 @@ func handleCreateError(owner *models.User, err error, name string) error {
3838
func runMigrateTask(t *models.Task) (err error) {
3939
defer func() {
4040
if e := recover(); e != nil {
41-
err = fmt.Errorf("PANIC whilst trying to do migrate task: %v\nStacktrace: %v", err, log.Stack(2))
42-
log.Critical("PANIC during runMigrateTask[%d] by DoerID[%d] to RepoID[%d] for OwnerID[%d]: %v", t.ID, t.DoerID, t.RepoID, t.OwnerID, err)
41+
err = fmt.Errorf("PANIC whilst trying to do migrate task: %v", e)
42+
log.Critical("PANIC during runMigrateTask[%d] by DoerID[%d] to RepoID[%d] for OwnerID[%d]: %v\nStacktrace: %v", t.ID, t.DoerID, t.RepoID, t.OwnerID, e, log.Stack(2))
4343
}
4444

4545
if err == nil {
@@ -55,7 +55,8 @@ func runMigrateTask(t *models.Task) (err error) {
5555
t.EndTime = timeutil.TimeStampNow()
5656
t.Status = structs.TaskStatusFailed
5757
t.Errors = err.Error()
58-
if err := t.UpdateCols("status", "errors", "end_time"); err != nil {
58+
t.RepoID = 0
59+
if err := t.UpdateCols("status", "errors", "repo_id", "end_time"); err != nil {
5960
log.Error("Task UpdateCols failed: %v", err)
6061
}
6162

@@ -66,42 +67,44 @@ func runMigrateTask(t *models.Task) (err error) {
6667
}
6768
}()
6869

69-
if err := t.LoadRepo(); err != nil {
70-
return err
70+
if err = t.LoadRepo(); err != nil {
71+
return
7172
}
7273

7374
// if repository is ready, then just finsih the task
7475
if t.Repo.Status == models.RepositoryReady {
7576
return nil
7677
}
7778

78-
if err := t.LoadDoer(); err != nil {
79-
return err
79+
if err = t.LoadDoer(); err != nil {
80+
return
8081
}
81-
if err := t.LoadOwner(); err != nil {
82-
return err
82+
if err = t.LoadOwner(); err != nil {
83+
return
8384
}
8485
t.StartTime = timeutil.TimeStampNow()
8586
t.Status = structs.TaskStatusRunning
86-
if err := t.UpdateCols("start_time", "status"); err != nil {
87-
return err
87+
if err = t.UpdateCols("start_time", "status"); err != nil {
88+
return
8889
}
8990

9091
var opts *migration.MigrateOptions
9192
opts, err = t.MigrateConfig()
9293
if err != nil {
93-
return err
94+
return
9495
}
9596

9697
opts.MigrateToRepoID = t.RepoID
97-
repo, err := migrations.MigrateRepository(graceful.GetManager().HammerContext(), t.Doer, t.Owner.Name, *opts)
98+
var repo *models.Repository
99+
repo, err = migrations.MigrateRepository(graceful.GetManager().HammerContext(), t.Doer, t.Owner.Name, *opts)
98100
if err == nil {
99101
log.Trace("Repository migrated [%d]: %s/%s", repo.ID, t.Owner.Name, repo.Name)
100-
return nil
102+
return
101103
}
102104

103105
if models.IsErrRepoAlreadyExist(err) {
104-
return errors.New("The repository name is already used")
106+
err = errors.New("The repository name is already used")
107+
return
105108
}
106109

107110
// remoteAddr may contain credentials, so we sanitize it
@@ -113,5 +116,7 @@ func runMigrateTask(t *models.Task) (err error) {
113116
return fmt.Errorf("Migration failed: %v", err.Error())
114117
}
115118

116-
return handleCreateError(t.Owner, err, "MigratePost")
119+
// do not be tempted to coalesce this line with the return
120+
err = handleCreateError(t.Owner, err)
121+
return
117122
}

public/img/failed.png

10.8 KB
Loading

routers/repo/repo.go

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -402,19 +402,3 @@ func Download(ctx *context.Context) {
402402

403403
ctx.ServeFile(archivePath, ctx.Repo.Repository.Name+"-"+refName+ext)
404404
}
405-
406-
// Status returns repository's status
407-
func Status(ctx *context.Context) {
408-
task, err := models.GetMigratingTask(ctx.Repo.Repository.ID)
409-
if err != nil {
410-
ctx.JSON(500, map[string]interface{}{
411-
"err": err,
412-
})
413-
return
414-
}
415-
416-
ctx.JSON(200, map[string]interface{}{
417-
"status": ctx.Repo.Repository.Status,
418-
"err": task.Errors,
419-
})
420-
}

routers/routes/routes.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,7 @@ func RegisterRoutes(m *macaron.Macaron) {
479479
m.Get("/forgot_password", user.ForgotPasswd)
480480
m.Post("/forgot_password", user.ForgotPasswdPost)
481481
m.Post("/logout", user.SignOut)
482+
m.Get("/task/:task", user.TaskStatus)
482483
})
483484
// ***** END: User *****
484485

@@ -986,8 +987,6 @@ func RegisterRoutes(m *macaron.Macaron) {
986987

987988
m.Get("/archive/*", repo.MustBeNotEmpty, reqRepoCodeReader, repo.Download)
988989

989-
m.Get("/status", reqRepoCodeReader, repo.Status)
990-
991990
m.Group("/branches", func() {
992991
m.Get("", repo.Branches)
993992
}, repo.MustBeNotEmpty, context.RepoRef(), reqRepoCodeReader)

routers/user/task.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// Copyright 2020 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package user
6+
7+
import (
8+
"code.gitea.io/gitea/models"
9+
"code.gitea.io/gitea/modules/context"
10+
)
11+
12+
// TaskStatus returns task's status
13+
func TaskStatus(ctx *context.Context) {
14+
task, opts, err := models.GetMigratingTaskByID(ctx.ParamsInt64("task"), ctx.User.ID)
15+
if err != nil {
16+
ctx.JSON(500, map[string]interface{}{
17+
"err": err,
18+
})
19+
return
20+
}
21+
22+
ctx.JSON(200, map[string]interface{}{
23+
"status": task.Status,
24+
"err": task.Errors,
25+
"repo-id": task.RepoID,
26+
"repo-name": opts.RepoName,
27+
"start": task.StartTime,
28+
"end": task.EndTime,
29+
})
30+
}

templates/repo/migrate/migrating.tmpl

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,16 @@
77
{{template "base/alert" .}}
88
<div class="home">
99
<div class="ui stackable middle very relaxed page grid">
10-
<div id="repo_migrating" class="sixteen wide center aligned centered column" repo="{{.Repo.Repository.FullName}}">
10+
<div id="repo_migrating" class="sixteen wide center aligned centered column" task="{{.MigrateTask.ID}}">
1111
<div>
1212
<img src="{{StaticUrlPrefix}}/img/loading.png"/>
1313
</div>
1414
</div>
15+
<div id="repo_migrating_failed_image" class="sixteen wide center aligned centered column" style="display: none;">
16+
<div>
17+
<img src="{{StaticUrlPrefix}}/img/failed.png"/>
18+
</div>
19+
</div>
1520
</div>
1621
<div class="ui stackable middle very relaxed page grid">
1722
<div class="sixteen wide center aligned centered column">
@@ -20,6 +25,7 @@
2025
</div>
2126
<div id="repo_migrating_failed">
2227
<p>{{.i18n.Tr "repo.migrate.migrating_failed" .CloneAddr | Safe}}</p>
28+
<p id="repo_migrating_failed_error"></p>
2329
</div>
2430
</div>
2531
</div>

web_src/js/index.js

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -191,33 +191,42 @@ function updateIssuesMeta(url, action, issueIds, elementId) {
191191
function initRepoStatusChecker() {
192192
const migrating = $('#repo_migrating');
193193
$('#repo_migrating_failed').hide();
194+
$('#repo_migrating_failed_image').hide();
194195
if (migrating) {
195-
const repo_name = migrating.attr('repo');
196-
if (typeof repo_name === 'undefined') {
196+
const task = migrating.attr('task');
197+
if (typeof task === 'undefined') {
197198
return;
198199
}
199200
$.ajax({
200201
type: 'GET',
201-
url: `${AppSubUrl}/${repo_name}/status`,
202+
url: `${AppSubUrl}/user/task/${task}`,
202203
data: {
203204
_csrf: csrf,
204205
},
205206
complete(xhr) {
206207
if (xhr.status === 200) {
207208
if (xhr.responseJSON) {
208-
if (xhr.responseJSON.status === 0) {
209+
if (xhr.responseJSON.status === 4) {
209210
window.location.reload();
210211
return;
212+
} else if (xhr.responseJSON.status === 3) {
213+
$('#repo_migrating_progress').hide();
214+
$('#repo_migrating').hide();
215+
$('#repo_migrating_failed').show();
216+
$('#repo_migrating_failed_image').show();
217+
$('#repo_migrating_failed_error').text(xhr.responseJSON.err);
218+
return;
211219
}
212-
213220
setTimeout(() => {
214221
initRepoStatusChecker();
215222
}, 2000);
216223
return;
217224
}
218225
}
219226
$('#repo_migrating_progress').hide();
227+
$('#repo_migrating').hide();
220228
$('#repo_migrating_failed').show();
229+
$('#repo_migrating_failed_image').show();
221230
}
222231
});
223232
}

0 commit comments

Comments
 (0)