Skip to content

Commit 02f4b3f

Browse files
authored
refactor: 제출 로직 리팩토링 (#170)
* refactor: hikari pool 조정 * refactor: thread pool 조정 * refactor: WebClient pool 조정 * refactor: 제출 시 Problem Count DeadLock 문제 해결 * refactor: 주간 토큰 로직 지급 대상자 변경 * refactor: Lock TTL 시간 조정 * refactor: Application idle 상태 시 Consumer 사라지는 현상 해결 * refactor: 리소스 관리 개선 (리소스 해제) * refactor: WebClient 풀 사이즈 조정 * refactor: 문제 제출 횟수 업데이트 로직 수정 * test: 테스트 코드 수정
1 parent 6cd9d0c commit 02f4b3f

File tree

26 files changed

+323
-97
lines changed

26 files changed

+323
-97
lines changed

src/main/java/org/ezcode/codetest/application/problem/service/ProblemService.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.springframework.data.domain.PageImpl;
2828
import org.springframework.data.domain.Pageable;
2929
import org.springframework.stereotype.Service;
30+
import org.springframework.transaction.annotation.Propagation;
3031
import org.springframework.transaction.annotation.Transactional;
3132
import org.springframework.web.multipart.MultipartFile;
3233

@@ -193,5 +194,10 @@ public void addImageToExistingProblem(Long problemId, MultipartFile imageFile) {
193194
problemDomainService.saveProblem(problem);
194195
}
195196

197+
@Transactional(propagation = Propagation.REQUIRES_NEW)
198+
public void problemCountAdjustment(Long problemId, boolean isSolved) {
199+
int correctInc = isSolved ? 1 : 0;
200+
problemDomainService.problemCountAdjustment(problemId, correctInc);
201+
}
196202
}
197203

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.ezcode.codetest.application.submission.dto.event;
2+
3+
public record ProblemCountAdjustmentEvent(
4+
5+
Long problemId,
6+
7+
boolean isSolved
8+
9+
) {
10+
}

src/main/java/org/ezcode/codetest/application/submission/model/SubmissionContext.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,4 +165,8 @@ public String getLanguageVersion() {
165165
public String getUserEmail() {
166166
return user.getEmail();
167167
}
168+
169+
public Long getProblemId() {
170+
return getProblem().getId();
171+
}
168172
}

src/main/java/org/ezcode/codetest/application/submission/port/SubmissionEventService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.ezcode.codetest.application.submission.port;
22

33
import org.ezcode.codetest.application.submission.dto.event.GitPushStatusEvent;
4+
import org.ezcode.codetest.application.submission.dto.event.ProblemCountAdjustmentEvent;
45
import org.ezcode.codetest.application.submission.dto.event.SubmissionErrorEvent;
56
import org.ezcode.codetest.application.submission.dto.event.SubmissionJudgingFinishedEvent;
67
import org.ezcode.codetest.application.submission.dto.event.TestcaseListInitializedEvent;
@@ -17,4 +18,6 @@ public interface SubmissionEventService {
1718
void publishSubmissionError(SubmissionErrorEvent event);
1819

1920
void publishGitPushStatus(GitPushStatusEvent event);
21+
22+
void publishProblemCountAdjustment(ProblemCountAdjustmentEvent event);
2023
}

src/main/java/org/ezcode/codetest/application/submission/service/JudgementService.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.util.concurrent.TimeUnit;
66
import java.util.stream.IntStream;
77

8+
import org.ezcode.codetest.application.submission.dto.event.ProblemCountAdjustmentEvent;
89
import org.ezcode.codetest.application.submission.dto.event.SubmissionErrorEvent;
910
import org.ezcode.codetest.application.submission.dto.event.SubmissionJudgingFinishedEvent;
1011
import org.ezcode.codetest.application.submission.dto.event.TestcaseEvaluatedEvent;
@@ -24,6 +25,7 @@
2425
import org.ezcode.codetest.domain.submission.model.TestcaseEvaluationInput;
2526
import org.ezcode.codetest.domain.submission.service.SubmissionDomainService;
2627
import org.springframework.stereotype.Service;
28+
import org.springframework.transaction.annotation.Transactional;
2729

2830
import lombok.RequiredArgsConstructor;
2931
import lombok.extern.slf4j.Slf4j;
@@ -56,11 +58,13 @@ public void runTestcases(SubmissionContext ctx) throws InterruptedException {
5658
}
5759
}
5860

61+
@Transactional
5962
public void finalizeAndPublish(SubmissionContext ctx) {
6063
SubmissionResult submissionResult = submissionDomainService.finalizeSubmission(ctx);
6164

6265
publishFinalResult(ctx);
6366
publishProblemSolve(submissionResult);
67+
publishProblemCountAdjustment(ctx, submissionResult);
6468
}
6569

6670
public void publishSubmissionError(String sessionKey, Exception e) {
@@ -103,4 +107,10 @@ private void publishFinalResult(SubmissionContext ctx){
103107
private void publishProblemSolve(SubmissionResult submissionResult) {
104108
problemEventService.publishProblemSolveEvent(submissionResult);
105109
}
110+
111+
private void publishProblemCountAdjustment(SubmissionContext ctx, SubmissionResult submissionResult) {
112+
submissionEventService.publishProblemCountAdjustment(
113+
new ProblemCountAdjustmentEvent(ctx.getProblemId(), submissionResult.isSolved())
114+
);
115+
}
106116
}

src/main/java/org/ezcode/codetest/application/submission/service/SubmissionService.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ public void enqueueCodeSubmission(Long problemId, CodeSubmitRequest request, Aut
7474
}
7575

7676
@Async("judgeSubmissionExecutor")
77-
@Transactional
7877
public void processSubmissionAsync(SubmissionMessage msg) {
7978
try {
8079
log.info("[Submission RUN] Thread = {}", Thread.currentThread().getName());

src/main/java/org/ezcode/codetest/common/config/ExecutorConfig.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ public class ExecutorConfig {
1414
@Bean(name = "consumerExecutor")
1515
public Executor consumerExecutor() {
1616
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
17-
executor.setCorePoolSize(5);
18-
executor.setMaxPoolSize(10);
19-
executor.setQueueCapacity(100);
17+
executor.setCorePoolSize(40);
18+
executor.setMaxPoolSize(80);
19+
executor.setQueueCapacity(1000);
2020
executor.setThreadNamePrefix("consumer-");
2121
executor.initialize();
2222
return executor;
@@ -25,9 +25,9 @@ public Executor consumerExecutor() {
2525
@Bean(name = "judgeSubmissionExecutor")
2626
public Executor judgeSubmissionExecutor() {
2727
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
28-
executor.setCorePoolSize(5);
29-
executor.setMaxPoolSize(10);
30-
executor.setQueueCapacity(100);
28+
executor.setCorePoolSize(40);
29+
executor.setMaxPoolSize(80);
30+
executor.setQueueCapacity(1000);
3131
executor.setThreadNamePrefix("submission-");
3232
executor.initialize();
3333
return executor;
@@ -36,9 +36,9 @@ public Executor judgeSubmissionExecutor() {
3636
@Bean(name = "judgeTestcaseExecutor")
3737
public Executor judgeTestcaseExecutor() {
3838
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
39-
executor.setCorePoolSize(25);
40-
executor.setMaxPoolSize(50);
41-
executor.setQueueCapacity(500);
39+
executor.setCorePoolSize(40);
40+
executor.setMaxPoolSize(80);
41+
executor.setQueueCapacity(2000);
4242
executor.setThreadNamePrefix("testcase-");
4343
executor.initialize();
4444
return executor;

src/main/java/org/ezcode/codetest/domain/problem/repository/ProblemRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,6 @@ public interface ProblemRepository {
2121
Optional<Problem> findProblemWithTestcasesById(Long problemId);
2222

2323
boolean existsByTitleAndIsDeletedIsFalse(String title);
24+
25+
void problemCountAdjustment(Long problemId, int correctInc);
2426
}

src/main/java/org/ezcode/codetest/domain/problem/service/ProblemDomainService.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.springframework.data.domain.Page;
2020
import org.springframework.data.domain.Pageable;
2121
import org.springframework.stereotype.Service;
22+
import org.springframework.transaction.annotation.Propagation;
2223

2324
import lombok.RequiredArgsConstructor;
2425

@@ -125,4 +126,8 @@ public ProblemInfo getProblemInfo(Long problemId) {
125126
public void saveProblem(Problem problem) {
126127
problemRepository.save(problem);
127128
}
129+
130+
public void problemCountAdjustment(Long problemId, int correctInc) {
131+
problemRepository.problemCountAdjustment(problemId, correctInc);
132+
}
128133
}

src/main/java/org/ezcode/codetest/domain/submission/model/SubmissionResult.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.util.List;
44

5+
import org.ezcode.codetest.application.submission.model.SubmissionContext;
56
import org.ezcode.codetest.domain.submission.model.entity.UserProblemResult;
67

78
import lombok.Builder;
@@ -18,12 +19,17 @@ public record SubmissionResult(
1819
boolean hasBeenSolved
1920

2021
) {
21-
public static SubmissionResult from(UserProblemResult result, List<String> problemCategory, boolean hasBeenSolved) {
22+
public static SubmissionResult of(
23+
UserProblemResult upr,
24+
SubmissionContext ctx,
25+
boolean allPassed,
26+
boolean before
27+
) {
2228
return SubmissionResult.builder()
23-
.userId(result.getUser().getId())
24-
.problemCategory(problemCategory)
25-
.isSolved(result.isCorrect())
26-
.hasBeenSolved(hasBeenSolved)
29+
.userId(upr.getUser().getId())
30+
.problemCategory(ctx.getCategories())
31+
.isSolved(allPassed && !before)
32+
.hasBeenSolved(before)
2733
.build();
2834
}
2935
}

0 commit comments

Comments
 (0)