From 9286aea36ac444321043d9b248e46a9c96acc28b Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Sat, 6 Jan 2024 19:47:16 +0800 Subject: [PATCH] chore: more verbose log --- internal/api/consumer/problemUpdate.go | 3 +-- internal/api/consumer/submitUpdate.go | 1 - internal/api/runner/build.go | 4 ++-- internal/api/runner/judge.go | 7 +++++-- internal/service/runner/common.go | 18 +++++++----------- internal/service/runner/compile.go | 14 +++++++++++--- internal/service/runner/deps.go | 2 +- internal/service/runner/new_problem.go | 10 +++++----- internal/service/runner/run_judge.go | 4 ++-- 9 files changed, 34 insertions(+), 29 deletions(-) diff --git a/internal/api/consumer/problemUpdate.go b/internal/api/consumer/problemUpdate.go index f7c6cbb..fb2b103 100644 --- a/internal/api/consumer/problemUpdate.go +++ b/internal/api/consumer/problemUpdate.go @@ -19,7 +19,6 @@ func (h *handler) ProblemUpdate(_ context.Context, t *asynq.Task) error { if p.Status != e.Success { h.log.Warn("RunnerError", zap.Any("payload", p)) - return nil } status := h.problemService.UpdateVersion( @@ -29,7 +28,7 @@ func (h *handler) ProblemUpdate(_ context.Context, t *asynq.Task) error { Bytes: []byte(p.Context), Status: pgtype.Present, }, - "IsEnabled": true, + "IsEnabled": p.Status == e.Success, }, ) diff --git a/internal/api/consumer/submitUpdate.go b/internal/api/consumer/submitUpdate.go index 9c2d4c5..d016438 100644 --- a/internal/api/consumer/submitUpdate.go +++ b/internal/api/consumer/submitUpdate.go @@ -19,7 +19,6 @@ func (h *handler) SubmitUpdate(_ context.Context, t *asynq.Task) error { if p.Status != e.Success { h.log.Warn("RunnerError", zap.Any("payload", p)) - return nil } createData := &status.CreateData{ diff --git a/internal/api/runner/build.go b/internal/api/runner/build.go index d6e0227..aaf76f3 100644 --- a/internal/api/runner/build.go +++ b/internal/api/runner/build.go @@ -22,12 +22,12 @@ func (h *handler) Build(_ context.Context, t *asynq.Task) error { status, ctx := func() (e.Status, string) { url, status := h.storageService.Get(p.StorageKey, time.Second*60*5) if status != e.Success { - return e.InternalError, "{}" + return e.InternalError, "{\"Message\": \"storage error\"}" } config, status := h.runnerService.NewProblem(p.ProblemVersionID, url, true) if status != e.Success { - return e.InternalError, "{}" + return e.InternalError, "{\"Message\": \"build error: " + status.String() + "\"}" } for i := range config.Languages { diff --git a/internal/api/runner/judge.go b/internal/api/runner/judge.go index 2700bc4..8ea1bb5 100644 --- a/internal/api/runner/judge.go +++ b/internal/api/runner/judge.go @@ -25,7 +25,10 @@ func (h *handler) Judge(_ context.Context, t *asynq.Task) error { h.log.Info("judge", zap.Any("payload", p), zap.String("user", user)) status, point, ctx := func() (e.Status, int32, runner.JudgeStatus) { - systemError := runner.JudgeStatus{Message: "System Error"} + systemError := runner.JudgeStatus{ + Message: "System Error", + Tasks: []runner.TaskStatus{{Verdict: runner.VerdictSystemError, Message: "API Error"}}, + } // 1. write user code userCode := filepath.Join(runner.UserDir, user, fmt.Sprintf("%s.%s", user, p.Submission.Language)) @@ -53,7 +56,7 @@ func (h *handler) Judge(_ context.Context, t *asynq.Task) error { // 3. compile compileResult, status := h.runnerService.Compile(p.ProblemVersionID, user, p.Submission.Language) if status != e.Success { - return e.Success, 0, compileResult + return e.InternalError, 0, compileResult } // 4. run and judge diff --git a/internal/service/runner/common.go b/internal/service/runner/common.go index b225a87..9993d28 100644 --- a/internal/service/runner/common.go +++ b/internal/service/runner/common.go @@ -30,13 +30,19 @@ func init() { TmpDir = path.Join(Prefix, TmpDir) } +func (s *service) ProblemExists(version uint) bool { + problemPath := filepath.Join(ProblemDir, fmt.Sprintf("%d", version)) + return file.Exist(problemPath) +} + func (s *service) check(version uint, user string, lang string) e.Status { if !s.ProblemExists(version) { s.log.Info("problem not exists", zap.Uint("version", version)) return e.RunnerProblemNotExist } - if !s.userExists(user, fmt.Sprintf("%s.%s", user, lang)) { + userPath := filepath.Join(UserDir, user, fmt.Sprintf("%s.%s", user, lang)) + if !file.Exist(userPath) { s.log.Info("user program not exists", zap.String("user", user), zap.String("lang", lang)) return e.RunnerUserNotExist } @@ -44,16 +50,6 @@ func (s *service) check(version uint, user string, lang string) e.Status { return e.Success } -func (s *service) ProblemExists(version uint) bool { - problemPath := filepath.Join(ProblemDir, fmt.Sprintf("%d", version)) - return file.Exist(problemPath) -} - -func (s *service) userExists(user string, name string) bool { - userPath := filepath.Join(UserDir, user, name) - return file.Exist(userPath) -} - func (s *service) getLangInfo(config *Config, lang string) (configLanguage, bool) { for _, l := range config.Languages { if l.Lang == lang { diff --git a/internal/service/runner/compile.go b/internal/service/runner/compile.go index fb75a71..e4fca39 100644 --- a/internal/service/runner/compile.go +++ b/internal/service/runner/compile.go @@ -21,7 +21,11 @@ func (s *service) Compile(version uint, user string, lang string) (JudgeStatus, config, err := s.ParseConfig(version, true) if err != nil { - return JudgeStatus{Message: "parse config failed"}, e.RunnerProblemParseFailed + s.log.Error("[compile] parse config failed", zap.Error(err)) + return JudgeStatus{ + Message: "parse config failed", + Tasks: []TaskStatus{{Verdict: VerdictSystemError, Message: "parse config failed"}}, + }, e.RunnerProblemParseFailed } // 2. prepare judge environment @@ -34,7 +38,11 @@ func (s *service) Compile(version uint, user string, lang string) (JudgeStatus, logFile := filepath.Join(workDir, fmt.Sprintf("%s.compile.log", user)) log, err := os.Create(logFile) if err != nil { - return JudgeStatus{Message: "create log file failed"}, e.RunnerUserCompileFailed + s.log.Error("[compile] create log file failed", zap.Error(err)) + return JudgeStatus{ + Message: "create log file failed", + Tasks: []TaskStatus{{Verdict: VerdictSystemError, Message: "create log file failed"}}, + }, e.RunnerUserCompileFailed } defer func(log *os.File) { _ = log.Close() @@ -75,7 +83,7 @@ func (s *service) Compile(version uint, user string, lang string) (JudgeStatus, Done() if err != nil { - s.log.Info("compile failed", + s.log.Info("[compile] compile failed", zap.Error(err), zap.Uint("version", version), zap.String("user", user), diff --git a/internal/service/runner/deps.go b/internal/service/runner/deps.go index 1c3b88e..941b413 100644 --- a/internal/service/runner/deps.go +++ b/internal/service/runner/deps.go @@ -40,7 +40,7 @@ func (s *service) loadImage(cfg *depConfig) e.Status { Done() if err != nil { - s.log.Warn("load image failed", zap.Error(err)) + s.log.Warn("[deps] load image failed", zap.Error(err)) return e.RunnerDepsBuildFailed } diff --git a/internal/service/runner/new_problem.go b/internal/service/runner/new_problem.go index 9a5a0ba..2d89b77 100644 --- a/internal/service/runner/new_problem.go +++ b/internal/service/runner/new_problem.go @@ -18,13 +18,13 @@ func (s *service) download(version uint, url string) e.Status { err := down.Down(zipPath, url) if err != nil { - s.log.Error("download problem failed", zap.Error(err)) + s.log.Error("[new] download problem failed", zap.Error(err)) return e.RunnerDownloadFailed } err = unzip.Unzip(zipPath, problemPath) if err != nil { - s.log.Warn("unzip problem failed", zap.Error(err)) + s.log.Warn("[new] unzip problem failed", zap.Error(err)) return e.RunnerUnzipFailed } @@ -45,7 +45,7 @@ func (s *service) prebuild(version uint, force bool) e.Status { prebuildScript := filepath.Join(ProblemDir, fmt.Sprintf("%d", version), "judge", "prebuild.Makefile") if !file.Exist(prebuildScript) { - s.log.Info("prebuild script not found", zap.String("path", prebuildScript), zap.Uint("version", version)) + s.log.Info("[new] prebuild script not found", zap.String("path", prebuildScript), zap.Uint("version", version)) return e.Success } @@ -69,7 +69,7 @@ func (s *service) prebuild(version uint, force bool) e.Status { err := s.podmanRun(runArgs) if err != nil { - s.log.Warn("prebuild problem failed", zap.Error(err), zap.Uint("version", version)) + s.log.Warn("[new] prebuild problem failed", zap.Error(err), zap.Uint("version", version)) return e.RunnerProblemPrebuildFailed } @@ -91,7 +91,7 @@ func (s *service) NewProblem(version uint, url string, force bool) (Config, e.St cfg, err := s.ParseConfig(version, false) if err != nil { - // TODO: err is dropped here, should return to server: add a new column in problem_version table + s.log.Info("[new] parse problem failed", zap.Error(err), zap.Uint("version", version)) return Config{}, e.RunnerProblemParseFailed } diff --git a/internal/service/runner/run_judge.go b/internal/service/runner/run_judge.go index 01c2659..efbf9ea 100644 --- a/internal/service/runner/run_judge.go +++ b/internal/service/runner/run_judge.go @@ -75,7 +75,7 @@ func (s *service) problemRun(version uint, user string, lang string, config *Con Done() if err != nil { - s.log.Info("run failed", + s.log.Info("[run] run failed", zap.Error(err), zap.Uint("version", version), zap.String("user", user), @@ -138,7 +138,7 @@ func (s *service) problemJudge(version uint, user string, lang string, config *C Done() if err != nil { - s.log.Info("judge failed", + s.log.Info("[judge] judge failed", zap.Error(err), zap.Uint("version", version), zap.String("user", user),