From bccd8129a2355c8a3a0865df5921205d4c1a5a6f Mon Sep 17 00:00:00 2001 From: su080915 Date: Fri, 17 Jan 2025 10:53:14 +0900 Subject: [PATCH 1/3] fix: submit response --- .../dto/request/UpdateProgressRequest.kt | 16 +++++++ .../dto/response/SubmitProgressResponse.kt | 6 ++- .../domain/submit/service/SubmitService.kt | 19 +++++--- .../{problem => submit}/util/CodeExecutor.kt | 18 ++++++-- .../handler/ProgressWebSocketHandler.kt | 45 +++++++++++++++---- 5 files changed, 85 insertions(+), 19 deletions(-) create mode 100644 src/main/kotlin/com/solve/domain/submit/dto/request/UpdateProgressRequest.kt rename src/main/kotlin/com/solve/domain/{problem => submit}/util/CodeExecutor.kt (92%) diff --git a/src/main/kotlin/com/solve/domain/submit/dto/request/UpdateProgressRequest.kt b/src/main/kotlin/com/solve/domain/submit/dto/request/UpdateProgressRequest.kt new file mode 100644 index 0000000..891d285 --- /dev/null +++ b/src/main/kotlin/com/solve/domain/submit/dto/request/UpdateProgressRequest.kt @@ -0,0 +1,16 @@ +package com.solve.domain.submit.dto.request + +import com.fasterxml.jackson.annotation.JsonInclude +import com.solve.domain.submit.domain.enums.SubmitState +import com.solve.global.common.enums.ProgrammingLanguage + + +@JsonInclude(JsonInclude.Include.NON_NULL) +data class UpdateProgressRequest( + val submitId: Long, + val progress: Double, + val state: SubmitState, + val timeUsage: Long? = null, + val memoryUsage: Long? = null, + val language: ProgrammingLanguage? = null +) \ No newline at end of file diff --git a/src/main/kotlin/com/solve/domain/submit/dto/response/SubmitProgressResponse.kt b/src/main/kotlin/com/solve/domain/submit/dto/response/SubmitProgressResponse.kt index 2571f83..d036bf3 100644 --- a/src/main/kotlin/com/solve/domain/submit/dto/response/SubmitProgressResponse.kt +++ b/src/main/kotlin/com/solve/domain/submit/dto/response/SubmitProgressResponse.kt @@ -2,11 +2,15 @@ package com.solve.domain.submit.dto.response import com.fasterxml.jackson.annotation.JsonInclude import com.solve.domain.submit.domain.enums.SubmitState +import com.solve.global.common.enums.ProgrammingLanguage @JsonInclude(JsonInclude.Include.NON_NULL) data class SubmitProgressResponse( val submitId: Long, val progress: Double, val result: SubmitState, - val error: String? = null + val error: String? = null, + val timeUsage: Long? = null, + val memoryUsage: Long? = null, + val language: ProgrammingLanguage? = null ) \ No newline at end of file diff --git a/src/main/kotlin/com/solve/domain/submit/service/SubmitService.kt b/src/main/kotlin/com/solve/domain/submit/service/SubmitService.kt index d6646e9..e14375e 100644 --- a/src/main/kotlin/com/solve/domain/submit/service/SubmitService.kt +++ b/src/main/kotlin/com/solve/domain/submit/service/SubmitService.kt @@ -3,10 +3,11 @@ package com.solve.domain.submit.service import com.solve.domain.problem.error.ProblemError import com.solve.domain.problem.repository.ProblemRepository import com.solve.domain.problem.repository.ProblemTestCaseRepository -import com.solve.domain.problem.util.CodeExecutor +import com.solve.domain.submit.util.CodeExecutor import com.solve.domain.submit.domain.entity.Submit import com.solve.domain.submit.domain.enums.SubmitState import com.solve.domain.submit.dto.request.SubmitRequest +import com.solve.domain.submit.dto.request.UpdateProgressRequest import com.solve.domain.submit.dto.response.SubmitResponse import com.solve.domain.submit.error.SubmitError import com.solve.domain.submit.repository.SubmitQueryRepository @@ -115,6 +116,7 @@ class SubmitService( // @Transactional fun processSubmit(submit: Submit, request: SubmitRequest) { + println("???????") val executor = CodeExecutor(submit, request, fileProperties) val problem = submit.problem val testCases = problemTestCaseRepository.findAllByProblem(problem) @@ -126,9 +128,12 @@ class SubmitService( submit.state = SubmitState.JUDGING updateProgress(submit.id!!, progress, SubmitState.JUDGING) + println("!!!!!") + println(testCases) // executor.initializeJavaContainer() for (testCase in testCases) { - val result = executor.execute(testCase.input, problem.timeLimit, testCase.output) + println("testCase: $testCase") + val result = executor.execute(testCase.input, problem.timeLimit, testCase.output, problem.memoryLimit) maxTimeUsage = maxOf(maxTimeUsage, result.timeUsage) maxMemoryUsage = maxOf(maxMemoryUsage, result.memoryUsage) @@ -140,7 +145,7 @@ class SubmitService( // submit.compileError = result.compilationOutput } submitRepository.save(submit) - updateProgress(submit.id, progress, result.state) + updateProgress(submit.id, progress, result.state, submit.language) return } @@ -152,15 +157,15 @@ class SubmitService( submit.timeUsage = maxTimeUsage // timeUsage 필드 사용 submit.memoryUsage = maxMemoryUsage submitRepository.save(submit) - updateProgress(submit.id, 100.0, SubmitState.ACCEPTED) + updateProgress(submit.id, 100.0, SubmitState.ACCEPTED, submit.language, submit.timeUsage, submit.memoryUsage) handleAcceptedSubmission(submit) } - private fun updateProgress(submitId: Long, progress: Double, state: SubmitState) { - progressWebSocketHandler.sendProgressUpdate(submitId, progress, state) + private fun updateProgress(submitId: Long, progress: Double, state: SubmitState, language: ProgrammingLanguage?= null, timeUsage: Long?= null, memoryUsage: Long?= null) { + progressWebSocketHandler.sendProgressUpdate(UpdateProgressRequest(submitId, progress, state, timeUsage, memoryUsage, language)) } - + private fun handleAcceptedSubmission(submit: Submit) { try { val user = submit.author diff --git a/src/main/kotlin/com/solve/domain/problem/util/CodeExecutor.kt b/src/main/kotlin/com/solve/domain/submit/util/CodeExecutor.kt similarity index 92% rename from src/main/kotlin/com/solve/domain/problem/util/CodeExecutor.kt rename to src/main/kotlin/com/solve/domain/submit/util/CodeExecutor.kt index 209c00d..365486f 100644 --- a/src/main/kotlin/com/solve/domain/problem/util/CodeExecutor.kt +++ b/src/main/kotlin/com/solve/domain/submit/util/CodeExecutor.kt @@ -1,7 +1,7 @@ -package com.solve.domain.problem.util +package com.solve.domain.submit.util import com.solve.domain.problem.error.ProblemError -import com.solve.domain.problem.util.config.LanguageConfig +import com.solve.domain.submit.util.config.LanguageConfig import com.solve.domain.submit.domain.entity.Submit import com.solve.domain.submit.domain.enums.SubmitState import com.solve.domain.submit.dto.request.SubmitRequest @@ -38,7 +38,8 @@ class CodeExecutor( } } - fun execute(input: String, timeLimit: Double, expectedOutput: String): ExecutionResult { + fun execute(input: String, timeLimit: Double, expectedOutput: String, memoryLimit: Long): ExecutionResult { + println(3) val sourceFile = createSourceFile() compile(sourceFile)?.let { return it } @@ -116,6 +117,17 @@ class CodeExecutor( val memoryUsage = Regex("Memory Usage: (\\d+) KB") .find(entireOutput)?.groups?.get(1)?.value?.toLongOrNull() ?: 0 + if (memoryUsage > memoryLimit) { + return ExecutionResult( + output = actualOutput, + error = "", + success = false, + state = SubmitState.MEMORY_LIMIT_EXCEEDED, + timeUsage = timeUsage, + memoryUsage = memoryUsage, + ) + } + if (hasPresentationError(actualOutput, expectedOutput)) { return ExecutionResult( output = actualOutput, diff --git a/src/main/kotlin/com/solve/global/websocket/handler/ProgressWebSocketHandler.kt b/src/main/kotlin/com/solve/global/websocket/handler/ProgressWebSocketHandler.kt index 7c572ee..951a2ec 100644 --- a/src/main/kotlin/com/solve/global/websocket/handler/ProgressWebSocketHandler.kt +++ b/src/main/kotlin/com/solve/global/websocket/handler/ProgressWebSocketHandler.kt @@ -2,6 +2,7 @@ package com.solve.global.websocket.handler import com.fasterxml.jackson.databind.ObjectMapper import com.solve.domain.submit.domain.enums.SubmitState +import com.solve.domain.submit.dto.request.UpdateProgressRequest import com.solve.domain.submit.dto.response.SubmitProgressResponse import com.solve.domain.submit.repository.SubmitQueueRepository import org.springframework.stereotype.Component @@ -37,16 +38,44 @@ class ProgressWebSocketHandler( override fun supportsPartialMessages(): Boolean = false - fun sendProgressUpdate(submitId: Long, progress: Double, state: SubmitState) { - val session = sessions[submitId] ?: return - val progressResponse = SubmitProgressResponse( - submitId = submitId, - progress = progress, - result = state - ) + fun sendProgressUpdate(request: UpdateProgressRequest) { + val session = sessions[request.submitId] ?: return + + if (request.state == SubmitState.ACCEPTED && session.isOpen) { + val progressResponse = SubmitProgressResponse( + submitId = request.submitId, + progress = request.progress, + result = request.state, + language = request.language, + timeUsage = request.timeUsage, + memoryUsage = request.memoryUsage, + ) + + session.sendMessage(TextMessage(ObjectMapper().writeValueAsString(progressResponse))) + session.close() + + } else if (request.state == + SubmitState.JUDGING || + request.state == SubmitState.PENDING || + request.state == SubmitState.JUDGING_IN_PROGRESS && + session.isOpen) { + val progressResponse = SubmitProgressResponse( + submitId = request.submitId, + progress = request.progress, + result = request.state, + ) + + session.sendMessage(TextMessage(ObjectMapper().writeValueAsString(progressResponse))) + } else { + val progressResponse = SubmitProgressResponse( + submitId = request.submitId, + progress = request.progress, + result = request.state, + language = request.language + ) - if (session.isOpen) { session.sendMessage(TextMessage(ObjectMapper().writeValueAsString(progressResponse))) + session.close() } } } \ No newline at end of file From 17a68d577499c054be890996f87f4b492a30916c Mon Sep 17 00:00:00 2001 From: su080915 Date: Fri, 17 Jan 2025 10:57:00 +0900 Subject: [PATCH 2/3] fix: problem tags fetch type eager --- .../kotlin/com/solve/domain/problem/domain/entity/Problem.kt | 2 +- src/main/kotlin/com/solve/domain/run/util/CodeRunner.kt | 2 +- .../domain/{problem => submit}/util/config/LanguageConfig.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename src/main/kotlin/com/solve/domain/{problem => submit}/util/config/LanguageConfig.kt (96%) diff --git a/src/main/kotlin/com/solve/domain/problem/domain/entity/Problem.kt b/src/main/kotlin/com/solve/domain/problem/domain/entity/Problem.kt index f2ba104..fab9376 100644 --- a/src/main/kotlin/com/solve/domain/problem/domain/entity/Problem.kt +++ b/src/main/kotlin/com/solve/domain/problem/domain/entity/Problem.kt @@ -42,7 +42,7 @@ class Problem( @Column(name = "tier", nullable = false) val tier: Tier, - @ElementCollection + @ElementCollection(fetch = FetchType.EAGER) @CollectionTable( name = "problem_tags", joinColumns = [JoinColumn(name = "problem_id")] diff --git a/src/main/kotlin/com/solve/domain/run/util/CodeRunner.kt b/src/main/kotlin/com/solve/domain/run/util/CodeRunner.kt index cc705a1..5533206 100644 --- a/src/main/kotlin/com/solve/domain/run/util/CodeRunner.kt +++ b/src/main/kotlin/com/solve/domain/run/util/CodeRunner.kt @@ -1,6 +1,6 @@ package com.solve.domain.run.util -import com.solve.domain.problem.util.config.LanguageConfig +import com.solve.domain.submit.util.config.LanguageConfig import com.solve.global.common.enums.ProgrammingLanguage import com.solve.global.config.file.FileProperties import java.io.BufferedWriter diff --git a/src/main/kotlin/com/solve/domain/problem/util/config/LanguageConfig.kt b/src/main/kotlin/com/solve/domain/submit/util/config/LanguageConfig.kt similarity index 96% rename from src/main/kotlin/com/solve/domain/problem/util/config/LanguageConfig.kt rename to src/main/kotlin/com/solve/domain/submit/util/config/LanguageConfig.kt index d10b7ff..f367ebc 100644 --- a/src/main/kotlin/com/solve/domain/problem/util/config/LanguageConfig.kt +++ b/src/main/kotlin/com/solve/domain/submit/util/config/LanguageConfig.kt @@ -1,4 +1,4 @@ -package com.solve.domain.problem.util.config +package com.solve.domain.submit.util.config import com.solve.global.common.enums.ProgrammingLanguage From c82a6f1a2a5e4af178a7f08a4a2e18b2a1df874e Mon Sep 17 00:00:00 2001 From: su080915 Date: Sat, 18 Jan 2025 16:45:28 +0900 Subject: [PATCH 3/3] fix: submit response --- .../domain/submit/dto/response/SubmitResponse.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/com/solve/domain/submit/dto/response/SubmitResponse.kt b/src/main/kotlin/com/solve/domain/submit/dto/response/SubmitResponse.kt index e77c5a1..9059191 100644 --- a/src/main/kotlin/com/solve/domain/submit/dto/response/SubmitResponse.kt +++ b/src/main/kotlin/com/solve/domain/submit/dto/response/SubmitResponse.kt @@ -2,15 +2,22 @@ package com.solve.domain.submit.dto.response import com.solve.domain.submit.domain.entity.Submit import com.solve.domain.submit.domain.enums.SubmitState +import com.solve.global.common.enums.ProgrammingLanguage data class SubmitResponse( val id: Long, - val result: SubmitState + val result: SubmitState, + val language: ProgrammingLanguage, + val timeUsage: Long?, + val memoryUsage: Long?, ) { companion object { fun of(submit: Submit) = SubmitResponse( id = submit.id!!, - result = submit.state + result = submit.state, + language = submit.language, + timeUsage = submit.timeUsage, + memoryUsage = submit.memoryUsage ) } } \ No newline at end of file