chore: debug level executor logs
This commit is contained in:
		
							parent
							
								
									4b418600e3
								
							
						
					
					
						commit
						158bba1460
					
				|  | @ -96,6 +96,12 @@ func setupSlog(logPath string) error { | ||||||
| 		Level: stderrLogLevel, | 		Level: stderrLogLevel, | ||||||
| 	}) | 	}) | ||||||
| 	handlers = append(handlers, stderrHandler) | 	handlers = append(handlers, stderrHandler) | ||||||
|  | 	if runningTest { | ||||||
|  | 		stderrJSONHandler := slog.NewJSONHandler(os.Stderr, &slog.HandlerOptions{ | ||||||
|  | 			Level: stderrLogLevel, | ||||||
|  | 		}) | ||||||
|  | 		handlers = append(handlers, stderrJSONHandler) | ||||||
|  | 	} | ||||||
| 	// Create a multi-handler
 | 	// Create a multi-handler
 | ||||||
| 	multiHandler := &multiHandler{handlers: handlers} | 	multiHandler := &multiHandler{handlers: handlers} | ||||||
| 	multiHandlerWithAttrs := multiHandler.WithAttrs( | 	multiHandlerWithAttrs := multiHandler.WithAttrs( | ||||||
|  |  | ||||||
|  | @ -7,7 +7,6 @@ import ( | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"unicode" | 	"unicode" | ||||||
| 
 | 
 | ||||||
| 	"github.com/criyle/go-judge/envexec" |  | ||||||
| 	"github.com/joint-online-judge/JOJ3/internal/stage" | 	"github.com/joint-online-judge/JOJ3/internal/stage" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -36,15 +35,6 @@ type Conf struct { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type DiffParserSummary struct { |  | ||||||
| 	Status     stage.Status |  | ||||||
| 	ExitStatus int |  | ||||||
| 	Error      string |  | ||||||
| 	Time       uint64 |  | ||||||
| 	Memory     uint64 |  | ||||||
| 	RunTime    uint64 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type Diff struct{} | type Diff struct{} | ||||||
| 
 | 
 | ||||||
| func (*Diff) Run(results []stage.ExecutorResult, confAny any) ( | func (*Diff) Run(results []stage.ExecutorResult, confAny any) ( | ||||||
|  | @ -60,25 +50,10 @@ func (*Diff) Run(results []stage.ExecutorResult, confAny any) ( | ||||||
| 
 | 
 | ||||||
| 	var res []stage.ParserResult | 	var res []stage.ParserResult | ||||||
| 	forceQuit := false | 	forceQuit := false | ||||||
| 	var summary DiffParserSummary |  | ||||||
| 	summary.Status = stage.Status(envexec.StatusAccepted) |  | ||||||
| 	for i, caseConf := range conf.Cases { | 	for i, caseConf := range conf.Cases { | ||||||
| 		result := results[i] | 		result := results[i] | ||||||
| 		score := 0 | 		score := 0 | ||||||
| 		comment := "" | 		comment := "" | ||||||
| 		if result.Status != stage.Status(envexec.StatusAccepted) && |  | ||||||
| 			summary.Status == stage.Status(envexec.StatusAccepted) { |  | ||||||
| 			summary.Status = result.Status |  | ||||||
| 		} |  | ||||||
| 		if result.ExitStatus != 0 && summary.ExitStatus == 0 { |  | ||||||
| 			summary.ExitStatus = result.ExitStatus |  | ||||||
| 		} |  | ||||||
| 		if result.Error != "" && summary.Error == "" { |  | ||||||
| 			summary.Error = result.Error |  | ||||||
| 		} |  | ||||||
| 		summary.Time += result.Time |  | ||||||
| 		summary.Memory += result.Memory |  | ||||||
| 		summary.RunTime += result.RunTime |  | ||||||
| 		for _, output := range caseConf.Outputs { | 		for _, output := range caseConf.Outputs { | ||||||
| 			answer, err := os.ReadFile(output.AnswerPath) | 			answer, err := os.ReadFile(output.AnswerPath) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
|  | @ -124,22 +99,11 @@ func (*Diff) Run(results []stage.ExecutorResult, confAny any) ( | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		caseSummary := DiffParserSummary{ |  | ||||||
| 			Status:     result.Status, |  | ||||||
| 			ExitStatus: result.ExitStatus, |  | ||||||
| 			Error:      result.Error, |  | ||||||
| 			Time:       result.Time, |  | ||||||
| 			Memory:     result.Memory, |  | ||||||
| 			RunTime:    result.RunTime, |  | ||||||
| 		} |  | ||||||
| 		slog.Debug("diff parser case parse done", |  | ||||||
| 			"case", i, "caseSummary", caseSummary) |  | ||||||
| 		res = append(res, stage.ParserResult{ | 		res = append(res, stage.ParserResult{ | ||||||
| 			Score:   score, | 			Score:   score, | ||||||
| 			Comment: comment, | 			Comment: comment, | ||||||
| 		}) | 		}) | ||||||
| 	} | 	} | ||||||
| 	slog.Debug("diff parser run done", "diffParserSummary", summary) |  | ||||||
| 
 | 
 | ||||||
| 	return res, forceQuit, nil | 	return res, forceQuit, nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -121,25 +121,26 @@ type ExecutorResult struct { | ||||||
| 	Buffs map[string][]byte `json:"-"` | 	Buffs map[string][]byte `json:"-"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (r ExecutorResult) String() string { | type ExecutorResultSummary struct { | ||||||
| 	type Result struct { | 	Status     Status            `json:"status"` | ||||||
| 		Status     Status | 	ExitStatus int               `json:"exitStatus"` | ||||||
| 		ExitStatus int | 	Error      string            `json:"error,omitempty"` | ||||||
| 		Error      string | 	Time       uint64            `json:"time"` | ||||||
| 		Time       uint64 | 	Memory     uint64            `json:"memory"` | ||||||
| 		RunTime    uint64 | 	RunTime    uint64            `json:"runTime"` | ||||||
| 		Memory     envexec.Size | 	Files      map[string]string `json:"files,omitempty"` | ||||||
| 		Files      map[string]string | 	FileIDs    map[string]string `json:"fileIds,omitempty"` | ||||||
| 		FileIDs    map[string]string | 	FileError  []FileError       `json:"fileError,omitempty"` | ||||||
| 		FileError  []FileError |  | ||||||
| } | } | ||||||
| 	d := Result{ | 
 | ||||||
|  | func (r ExecutorResult) String() string { | ||||||
|  | 	d := ExecutorResultSummary{ | ||||||
| 		Status:     r.Status, | 		Status:     r.Status, | ||||||
| 		ExitStatus: r.ExitStatus, | 		ExitStatus: r.ExitStatus, | ||||||
| 		Error:      r.Error, | 		Error:      r.Error, | ||||||
| 		Time:       r.Time, | 		Time:       r.Time, | ||||||
|  | 		Memory:     r.Memory, | ||||||
| 		RunTime:    r.RunTime, | 		RunTime:    r.RunTime, | ||||||
| 		Memory:     envexec.Size(r.Memory), |  | ||||||
| 		Files:      make(map[string]string), | 		Files:      make(map[string]string), | ||||||
| 		FileIDs:    r.FileIDs, | 		FileIDs:    r.FileIDs, | ||||||
| 		FileError:  r.FileError, | 		FileError:  r.FileError, | ||||||
|  | @ -150,6 +151,45 @@ func (r ExecutorResult) String() string { | ||||||
| 	return fmt.Sprintf("%+v", d) | 	return fmt.Sprintf("%+v", d) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (r ExecutorResult) MarshalJSON() ([]byte, error) { | ||||||
|  | 	d := ExecutorResultSummary{ | ||||||
|  | 		Status:     r.Status, | ||||||
|  | 		ExitStatus: r.ExitStatus, | ||||||
|  | 		Error:      r.Error, | ||||||
|  | 		Time:       r.Time, | ||||||
|  | 		Memory:     r.Memory, | ||||||
|  | 		RunTime:    r.RunTime, | ||||||
|  | 		Files:      make(map[string]string), | ||||||
|  | 		FileIDs:    r.FileIDs, | ||||||
|  | 		FileError:  r.FileError, | ||||||
|  | 	} | ||||||
|  | 	for k, v := range r.Files { | ||||||
|  | 		d.Files[k] = "len:" + strconv.Itoa(len(v)) | ||||||
|  | 	} | ||||||
|  | 	return json.Marshal(d) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func SummarizeExecutorResults(results []ExecutorResult) ExecutorResultSummary { | ||||||
|  | 	var summary ExecutorResultSummary | ||||||
|  | 	summary.Status = Status(envexec.StatusAccepted) | ||||||
|  | 	for _, result := range results { | ||||||
|  | 		if result.Status != Status(envexec.StatusAccepted) && | ||||||
|  | 			summary.Status == Status(envexec.StatusAccepted) { | ||||||
|  | 			summary.Status = result.Status | ||||||
|  | 		} | ||||||
|  | 		if result.ExitStatus != 0 && summary.ExitStatus == 0 { | ||||||
|  | 			summary.ExitStatus = result.ExitStatus | ||||||
|  | 		} | ||||||
|  | 		if result.Error != "" && summary.Error == "" { | ||||||
|  | 			summary.Error = result.Error | ||||||
|  | 		} | ||||||
|  | 		summary.Time += result.Time | ||||||
|  | 		summary.Memory += result.Memory | ||||||
|  | 		summary.RunTime += result.RunTime | ||||||
|  | 	} | ||||||
|  | 	return summary | ||||||
|  | } | ||||||
|  | 
 | ||||||
| type StageExecutor struct { | type StageExecutor struct { | ||||||
| 	Name string | 	Name string | ||||||
| 	Cmds []Cmd | 	Cmds []Cmd | ||||||
|  |  | ||||||
|  | @ -12,30 +12,65 @@ func Run(stages []Stage) (stageResults []StageResult, forceQuit bool, err error) | ||||||
| 	slog.Info("stage run start") | 	slog.Info("stage run start") | ||||||
| 	for _, stage := range stages { | 	for _, stage := range stages { | ||||||
| 		slog.Info("stage start", "name", stage.Name) | 		slog.Info("stage start", "name", stage.Name) | ||||||
| 		slog.Info("executor run start", "name", stage.Executor.Name) | 		slog.Info( | ||||||
| 		slog.Debug("executor run start", "name", stage.Executor.Name, | 			"executor run start", | ||||||
| 			"cmds", stage.Executor.Cmds) | 			"stageName", stage.Name, | ||||||
|  | 			"name", stage.Executor.Name, | ||||||
|  | 		) | ||||||
|  | 		slog.Debug( | ||||||
|  | 			"executor run start", | ||||||
|  | 			"stageName", stage.Name, | ||||||
|  | 			"name", stage.Executor.Name, | ||||||
|  | 			"cmds", stage.Executor.Cmds, | ||||||
|  | 		) | ||||||
| 		executor, ok := executorMap[stage.Executor.Name] | 		executor, ok := executorMap[stage.Executor.Name] | ||||||
| 		if !ok { | 		if !ok { | ||||||
| 			slog.Error("executor not found", "name", stage.Executor.Name) | 			slog.Error( | ||||||
|  | 				"executor not found", | ||||||
|  | 				"stageName", stage.Name, | ||||||
|  | 				"name", stage.Executor.Name, | ||||||
|  | 			) | ||||||
| 			err = fmt.Errorf("executor not found: %s", stage.Executor.Name) | 			err = fmt.Errorf("executor not found: %s", stage.Executor.Name) | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| 		executorResults, err = executor.Run(stage.Executor.Cmds) | 		executorResults, err = executor.Run(stage.Executor.Cmds) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			slog.Error("executor run error", "name", stage.Executor.Name, "error", err) | 			slog.Error( | ||||||
|  | 				"executor run error", | ||||||
|  | 				"stageName", stage.Name, | ||||||
|  | 				"name", stage.Executor.Name, | ||||||
|  | 				"error", err, | ||||||
|  | 			) | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| 		slog.Debug("executor run done", "results", executorResults) | 		slog.Debug( | ||||||
|  | 			"executor run done", | ||||||
|  | 			"stageName", stage.Name, | ||||||
|  | 			"name", stage.Executor.Name, | ||||||
|  | 			"results", executorResults, | ||||||
|  | 			"summary", SummarizeExecutorResults(executorResults), | ||||||
|  | 		) | ||||||
| 		parserResults = []ParserResult{} | 		parserResults = []ParserResult{} | ||||||
| 		forceQuit = false | 		forceQuit = false | ||||||
| 		for _, stageParser := range stage.Parsers { | 		for _, stageParser := range stage.Parsers { | ||||||
| 			slog.Info("parser run start", "name", stageParser.Name) | 			slog.Info( | ||||||
| 			slog.Debug("parser run start", "name", stageParser.Name, | 				"parser run start", | ||||||
| 				"conf", stageParser.Conf) | 				"stageName", stage.Name, | ||||||
|  | 				"name", stageParser.Name, | ||||||
|  | 			) | ||||||
|  | 			slog.Debug( | ||||||
|  | 				"parser run start", | ||||||
|  | 				"stageName", stage.Name, | ||||||
|  | 				"name", stageParser.Name, | ||||||
|  | 				"conf", stageParser.Conf, | ||||||
|  | 			) | ||||||
| 			parser, ok := parserMap[stageParser.Name] | 			parser, ok := parserMap[stageParser.Name] | ||||||
| 			if !ok { | 			if !ok { | ||||||
| 				slog.Error("parser not found", "name", stageParser.Name) | 				slog.Error( | ||||||
|  | 					"parser not found", | ||||||
|  | 					"stageName", stage.Name, | ||||||
|  | 					"name", stageParser.Name, | ||||||
|  | 				) | ||||||
| 				err = fmt.Errorf("parser not found: %s", stageParser.Name) | 				err = fmt.Errorf("parser not found: %s", stageParser.Name) | ||||||
| 				return | 				return | ||||||
| 			} | 			} | ||||||
|  | @ -43,14 +78,28 @@ func Run(stages []Stage) (stageResults []StageResult, forceQuit bool, err error) | ||||||
| 			tmpParserResults, parserForceQuit, err = parser.Run( | 			tmpParserResults, parserForceQuit, err = parser.Run( | ||||||
| 				executorResults, stageParser.Conf) | 				executorResults, stageParser.Conf) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				slog.Error("parser run error", "name", stageParser.Name, "error", err) | 				slog.Error( | ||||||
|  | 					"parser run error", | ||||||
|  | 					"stageName", stage.Name, | ||||||
|  | 					"name", stageParser.Name, | ||||||
|  | 					"error", err, | ||||||
|  | 				) | ||||||
| 				return | 				return | ||||||
| 			} | 			} | ||||||
| 			if parserForceQuit { | 			if parserForceQuit { | ||||||
| 				slog.Error("parser force quit", "name", stageParser.Name) | 				slog.Error( | ||||||
|  | 					"parser force quit", | ||||||
|  | 					"stageName", stage.Name, | ||||||
|  | 					"name", stageParser.Name, | ||||||
|  | 				) | ||||||
| 			} | 			} | ||||||
| 			forceQuit = forceQuit || parserForceQuit | 			forceQuit = forceQuit || parserForceQuit | ||||||
| 			slog.Debug("parser run done", "results", tmpParserResults) | 			slog.Debug( | ||||||
|  | 				"parser run done", | ||||||
|  | 				"stageName", stage.Name, | ||||||
|  | 				"name", stageParser.Name, | ||||||
|  | 				"results", tmpParserResults, | ||||||
|  | 			) | ||||||
| 			if len(parserResults) == 0 { | 			if len(parserResults) == 0 { | ||||||
| 				parserResults = tmpParserResults | 				parserResults = tmpParserResults | ||||||
| 			} else { | 			} else { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user