diff --git a/i18n/en.json b/i18n/en.json index aeeca11e0a..eb49526f56 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -5607,6 +5607,10 @@ "id": "app.job.download_export_results_not_enabled", "translation": "DownloadExportResults in config.json is false. Please set this to true to download the results of this job." }, + { + "id": "app.job.error", + "translation": "Error during job execution." + }, { "id": "app.job.get.app_error", "translation": "Unable to get the job." diff --git a/jobs/base_workers.go b/jobs/base_workers.go index 60fa0465ef..58bdc98ba7 100644 --- a/jobs/base_workers.go +++ b/jobs/base_workers.go @@ -81,7 +81,7 @@ func (worker *SimpleWorker) DoJob(job *model.Job) { err := worker.execute(job) if err != nil { mlog.Error("SimpleWorker: job execution error", mlog.String("worker", worker.name), mlog.String("job_id", job.Id), mlog.Err(err)) - worker.setJobError(job, model.NewAppError("DoJob", "app.user.get_total_users_count.app_error", nil, "", http.StatusInternalServerError).Wrap(err)) + worker.setJobError(job, model.NewAppError("DoJob", "app.job.error", nil, "", http.StatusInternalServerError).Wrap(err)) return } diff --git a/jobs/jobs.go b/jobs/jobs.go index fdc9dbd4c1..e23ca766c6 100644 --- a/jobs/jobs.go +++ b/jobs/jobs.go @@ -122,6 +122,9 @@ func (srv *JobServer) SetJobError(job *model.Job, jobError *model.AppError) *mod if jobError.DetailedError != "" { job.Data["error"] += " — " + jobError.DetailedError } + if wrapped := jobError.Unwrap(); wrapped != nil { + job.Data["error"] += " — " + wrapped.Error() + } updated, err := srv.Store.Job().UpdateOptimistically(job, model.JobStatusInProgress) if err != nil { return model.NewAppError("SetJobError", "app.job.update.app_error", nil, "", http.StatusInternalServerError).Wrap(err) diff --git a/jobs/jobs_test.go b/jobs/jobs_test.go index bb28db69a8..04c315d85e 100644 --- a/jobs/jobs_test.go +++ b/jobs/jobs_test.go @@ -4,6 +4,8 @@ package jobs import ( + "errors" + "net/http" "testing" "github.com/stretchr/testify/require" @@ -390,6 +392,26 @@ func TestSetJobError(t *testing.T) { err := jobServer.SetJobError(job, jobError) require.Nil(t, err) }) + + t.Run("error message set correctly", func(t *testing.T) { + jobServer, mockStore, _ := makeJobServer(t) + + jobError := model.NewAppError("anywhere", "not.a.valid.id", nil, "details", http.StatusTeapot).Wrap(errors.New("wrapped")) + + job := &model.Job{ + Id: "job_id", + Type: "job_type", + Progress: -1, + Data: map[string]string{}, + } + + mockStore.JobStore.On("UpdateOptimistically", job, model.JobStatusInProgress).Return(false, nil) + mockStore.JobStore.On("UpdateOptimistically", job, model.JobStatusCancelRequested).Return(true, nil) + + err := jobServer.SetJobError(job, jobError) + require.Nil(t, err) + require.Equal(t, "not.a.valid.id — details — wrapped", job.Data["error"]) + }) }) }