Skip to content

Commit b9c4894

Browse files
committed
Update Coding
1 parent c30509f commit b9c4894

File tree

7 files changed

+122
-67
lines changed

7 files changed

+122
-67
lines changed

coding-service/src/main/java/com/codecampus/coding/service/CodeJudgeService.java

Lines changed: 72 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -29,21 +29,23 @@
2929
import java.nio.file.Path;
3030
import java.time.Instant;
3131
import java.util.ArrayList;
32+
import java.util.Comparator;
3233
import java.util.List;
34+
import java.util.stream.Stream;
3335

3436
@Service
3537
@RequiredArgsConstructor
3638
@Slf4j
3739
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
3840
public class CodeJudgeService {
3941

42+
static final Path RUNNER_ROOT =
43+
Path.of(System.getenv().getOrDefault("RUNNER_ROOT", "/work"));
44+
4045
CodeSubmissionRepository codeSubmissionRepository;
4146
CodeSubmissionResultRepository codeSubmissionResultRepository;
42-
4347
CodingHelper codingHelper;
44-
4548
DockerSandboxService dockerSandboxService;
46-
4749
SubmissionSyncServiceGrpc.SubmissionSyncServiceBlockingStub
4850
submissionStub;
4951

@@ -69,50 +71,64 @@ public SubmitCodeResponse judgeCodeSubmission(
6971
new ArrayList<>();
7072

7173
/* Compile một lần, chạy từng test-case */
74+
Path workDir = null;
7275
CompiledArtifact bin;
7376
try {
74-
Path tmpDir = createTempDir();
77+
workDir = createWorkDir();
7578
bin = dockerSandboxService.compile(
76-
request.getLanguage(), request.getSourceCode(), tmpDir);
79+
request.getLanguage(),
80+
request.getSourceCode(),
81+
workDir);
7782
} catch (InterruptedException | IOException e) {
83+
// compile failure từ DockerSandboxService.exec → log rồi rethrow
84+
safeDeleteDir(workDir);
7885
throw new RuntimeException(e);
7986
}
8087

81-
for (TestCase testCase : codingExercise.getTestCases()) {
82-
CodeResult codeResult = dockerSandboxService.runTest(
83-
bin,
84-
testCase,
85-
request.getMemoryMb(),
86-
request.getCpus());
88+
/* ====== Default limit khi client không set ====== */
89+
int memoryMb = request.getMemoryMb() > 0 ? request.getMemoryMb() : 256;
90+
float cpus = request.getCpus() > 0 ? request.getCpus() : 0.5f;
8791

88-
if (codeResult.isPassed()) {
89-
passedCount++;
92+
try {
93+
for (TestCase testCase : codingExercise.getTestCases()) {
94+
CodeResult codeResult = dockerSandboxService.runTest(
95+
bin,
96+
testCase,
97+
memoryMb,
98+
cpus);
99+
100+
if (codeResult.isPassed()) {
101+
passedCount++;
102+
}
103+
104+
CodeSubmissionResult codeSubmissionResult =
105+
CodeSubmissionResult.builder()
106+
.submission(codeSubmission).testCase(testCase)
107+
.passed(codeResult.isPassed())
108+
.runtimeMs(codeResult.getRuntimeMs())
109+
.memoryKb(codeResult.getMemoryKb())
110+
.output(codeResult.getOutput())
111+
.errorMessage(codeResult.getError())
112+
.build();
113+
codeSubmissionResultRepository.save(codeSubmissionResult);
114+
115+
// Sync
116+
testCaseResultSyncDtoList.add(TestCaseResultSyncDto.newBuilder()
117+
.setTestCaseId(testCase.getId())
118+
.setPassed(codeResult.isPassed())
119+
.setRuntimeMs(codeResult.getRuntimeMs())
120+
.setMemoryKb(codeResult.getMemoryKb())
121+
.setOutput(
122+
codeResult.getOutput() == null ? "" :
123+
codeResult.getOutput())
124+
.setErrorMessage(
125+
codeResult.getError() == null ? "" :
126+
codeResult.getError())
127+
.build());
90128
}
91129

92-
CodeSubmissionResult codeSubmissionResult =
93-
CodeSubmissionResult.builder()
94-
.submission(codeSubmission).testCase(testCase)
95-
.passed(codeResult.isPassed())
96-
.runtimeMs(codeResult.getRuntimeMs())
97-
.memoryKb(codeResult.getMemoryKb())
98-
.output(codeResult.getOutput())
99-
.errorMessage(codeResult.getError())
100-
.build();
101-
codeSubmissionResultRepository.save(codeSubmissionResult);
102-
103-
// Sync
104-
testCaseResultSyncDtoList.add(TestCaseResultSyncDto.newBuilder()
105-
.setTestCaseId(testCase.getId())
106-
.setPassed(codeResult.isPassed())
107-
.setRuntimeMs(codeResult.getRuntimeMs())
108-
.setMemoryKb(codeResult.getMemoryKb())
109-
.setOutput(
110-
codeResult.getOutput() == null ? "" :
111-
codeResult.getOutput())
112-
.setErrorMessage(
113-
codeResult.getError() == null ? "" :
114-
codeResult.getError())
115-
.build());
130+
} finally {
131+
safeDeleteDir(workDir);
116132
}
117133

118134
codeSubmission.setScore(passedCount);
@@ -162,8 +178,25 @@ public SubmitCodeResponse judgeCodeSubmission(
162178
.build();
163179
}
164180

165-
Path createTempDir() throws IOException {
166-
return Files.createTempDirectory("judge_");
181+
182+
Path createWorkDir() throws IOException {
183+
Files.createDirectories(RUNNER_ROOT);
184+
return Files.createTempDirectory(RUNNER_ROOT, "judge_");
185+
}
186+
187+
void safeDeleteDir(Path dir) {
188+
if (dir == null) {
189+
return;
190+
}
191+
try (Stream<Path> s = Files.walk(dir)) {
192+
s.sorted(Comparator.reverseOrder()).forEach(p -> {
193+
try {
194+
Files.deleteIfExists(p);
195+
} catch (Exception ignored) {
196+
}
197+
});
198+
} catch (Exception ignored) {
199+
}
167200
}
168201
}
169202

coding-service/src/main/java/com/codecampus/coding/service/DockerSandboxService.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,17 @@
2525
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
2626
public class DockerSandboxService {
2727

28+
private static final String SANDBOX_IMAGE =
29+
System.getenv().getOrDefault("SANDBOX_IMAGE",
30+
"capstoneprojectpythondocker:latest");
31+
private static final Path RUNNER_ROOT =
32+
Path.of(System.getenv().getOrDefault("RUNNER_ROOT", "/work"));
33+
34+
public static Path createWorkDir() throws IOException {
35+
Files.createDirectories(RUNNER_ROOT);
36+
return Files.createTempDirectory(RUNNER_ROOT, "pg_");
37+
}
38+
2839
/**
2940
* Biên dịch mã nguồn 1 lần, trả về “artifact” (đường dẫn | tên bin)
3041
* để run nhiều test-case.
@@ -55,7 +66,7 @@ public CompiledArtifact compile(
5566

5667
// 3. Tên nhị phân / jar random để tránh trùng
5768
String binName = "bin_" + UUID.randomUUID();
58-
String image = "capstoneprojectpythondocker"; // đã có sẵn GCC, JDK
69+
String image = SANDBOX_IMAGE; // đã có sẵn GCC, JDK
5970

6071
ProcessBuilder processBuilder = switch (language) {
6172
case "cpp" -> new ProcessBuilder(
@@ -97,7 +108,7 @@ public CodeResult runTest(
97108
"--network", "none",
98109
"-v", compiledArtifact.workDir().toString() + ":/app",
99110
"--name", container,
100-
"capstoneprojectpythondocker", "bash");
111+
SANDBOX_IMAGE, "bash");
101112
exec(processBuilder);
102113

103114
/* Build */

coding-service/src/main/java/com/codecampus/coding/service/grpc/PlaygroundServiceImpl.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,23 @@
3535
public class PlaygroundServiceImpl
3636
extends PlaygroundServiceGrpc.PlaygroundServiceImplBase {
3737

38+
private static final String SANDBOX_IMAGE =
39+
System.getenv().getOrDefault("SANDBOX_IMAGE",
40+
"capstoneprojectpythondocker:latest");
41+
private static final Path RUNNER_ROOT =
42+
Path.of(System.getenv().getOrDefault("RUNNER_ROOT", "/work"));
3843
private final ExecutorService ioPool = Executors.newCachedThreadPool();
3944

4045
// Huỷ job gần nhất
4146
private final AtomicReference<Context.CancellableContext> lastJob =
4247
new AtomicReference<>();
4348

49+
private static Path createWorkDir() throws IOException {
50+
Files.createDirectories(RUNNER_ROOT);
51+
return Files.createTempDirectory(RUNNER_ROOT,
52+
"pg_"); // <— nằm trong volume host
53+
}
54+
4455
@PreDestroy
4556
public void shutdown() {
4657
ioPool.shutdownNow();
@@ -71,7 +82,7 @@ public void run(
7182
);
7283

7384
// 1) Setup workdir & write source
74-
workDir = Files.createTempDirectory("pg_");
85+
workDir = createWorkDir();
7586
String lang = runRequest.getLanguage();
7687

7788
switch (lang) {
@@ -93,7 +104,7 @@ public void run(
93104
}
94105

95106
// 2) Compile (python bỏ qua)
96-
final String image = "capstoneprojectpythondocker";
107+
final String image = SANDBOX_IMAGE;
97108
String binName = "bin_" + UUID.randomUUID();
98109

99110
if (!"python".equals(lang)) {

docker-compose.prod-services.yml

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,21 @@ services:
4242
- CODING_USERNAME=${CODING_USERNAME}
4343
- CODING_DB_PASSWORD=${CODING_DB_PASSWORD}
4444
- REDIS_PASSWORD=${REDIS_PASSWORD}
45+
- SANDBOX_IMAGE=capstoneprojectpythondocker:latest
46+
- RUNNER_ROOT=/work
47+
volumes:
48+
- /var/run/docker.sock:/var/run/docker.sock # cần cho 'docker run'
49+
- runner_data:/work
4550
ports: [ "8084:8084", "9592:9592" ]
4651
networks: [ backend ]
4752

53+
sandbox-image:
54+
build:
55+
context: .
56+
dockerfile: ./docker/sandbox.Dockerfile
57+
image: capstoneprojectpythondocker:latest
58+
profiles: [ "build-only" ]
59+
4860
quiz-service:
4961
image: ${DOCKERHUB_USER}/codecampus-quiz-service:${IMAGE_TAG:-latest}
5062
environment:
@@ -134,16 +146,4 @@ networks:
134146
name: codecampus_backend
135147

136148
volumes:
137-
identity_pg_data:
138-
submission_pg_data:
139-
quiz_pg_data:
140-
coding_pg_data:
141-
ai_pg_data:
142-
kafka_data:
143-
neo4j_data:
144-
redis_data:
145-
minio_data:
146-
elasticsearch_data:
147-
file_mongo_data:
148-
notification_mongo_data:
149-
chat_mongo_data:
149+
runner_data:
Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ services:
33
identity-service:
44
image: ${DOCKERHUB_USER}/codecampus-identity-service:${IMAGE_TAG:-latest}
55
build:
6-
context: ..
6+
context: ../..
77
dockerfile: ./docker/java-service.Dockerfile
88
args:
99
MODULE: identity-service
@@ -19,7 +19,7 @@ services:
1919
profile-service:
2020
image: ${DOCKERHUB_USER}/codecampus-profile-service:${IMAGE_TAG:-latest}
2121
build:
22-
context: ..
22+
context: ../..
2323
dockerfile: ./docker/java-service.Dockerfile
2424
args:
2525
MODULE: profile-service
@@ -34,7 +34,7 @@ services:
3434
submission-service:
3535
image: ${DOCKERHUB_USER}/codecampus-submission-service:${IMAGE_TAG:-latest}
3636
build:
37-
context: ..
37+
context: ../..
3838
dockerfile: ./docker/java-service.Dockerfile
3939
args:
4040
MODULE: submission-service
@@ -51,7 +51,7 @@ services:
5151
coding-service:
5252
image: ${DOCKERHUB_USER}/codecampus-coding-service:${IMAGE_TAG:-latest}
5353
build:
54-
context: ..
54+
context: ../..
5555
dockerfile: ./docker/java-service.Dockerfile
5656
args:
5757
MODULE: coding-service
@@ -69,7 +69,7 @@ services:
6969
quiz-service:
7070
image: ${DOCKERHUB_USER}/codecampus-quiz-service:${IMAGE_TAG:-latest}
7171
build:
72-
context: ..
72+
context: ../..
7373
dockerfile: ./docker/java-service.Dockerfile
7474
args:
7575
MODULE: quiz-service
@@ -87,7 +87,7 @@ services:
8787
ai-service:
8888
image: ${DOCKERHUB_USER}/codecampus-ai-service:${IMAGE_TAG:-latest}
8989
build:
90-
context: ..
90+
context: ../..
9191
dockerfile: ./docker/java-service.Dockerfile
9292
args:
9393
MODULE: ai-service
@@ -104,7 +104,7 @@ services:
104104
search-service:
105105
image: ${DOCKERHUB_USER}/codecampus-search-service:${IMAGE_TAG:-latest}
106106
build:
107-
context: ..
107+
context: ../..
108108
dockerfile: ./docker/java-service.Dockerfile
109109
args:
110110
MODULE: search-service
@@ -119,7 +119,7 @@ services:
119119
notification-service:
120120
image: ${DOCKERHUB_USER}/codecampus-notification-service:${IMAGE_TAG:-latest}
121121
build:
122-
context: ..
122+
context: ../..
123123
dockerfile: ./docker/java-service.Dockerfile
124124
args:
125125
MODULE: notification-service
@@ -132,7 +132,7 @@ services:
132132
chat-service:
133133
image: ${DOCKERHUB_USER}/codecampus-chat-service:${IMAGE_TAG:-latest}
134134
build:
135-
context: ..
135+
context: ../..
136136
dockerfile: ./docker/java-service.Dockerfile
137137
args:
138138
MODULE: chat-service
@@ -148,7 +148,7 @@ services:
148148
file-service:
149149
image: ${DOCKERHUB_USER}/codecampus-file-service:${IMAGE_TAG:-latest}
150150
build:
151-
context: ..
151+
context: ../..
152152
dockerfile: file-service.Dockerfile
153153
environment:
154154
# cấu hình môi trường ASP.NET
@@ -170,7 +170,7 @@ services:
170170
gateway-service:
171171
image: ${DOCKERHUB_USER}/codecampus-gateway-service:${IMAGE_TAG:-latest}
172172
build:
173-
context: ..
173+
context: ../..
174174
dockerfile: ./docker/java-service.Dockerfile
175175
args:
176176
MODULE: gateway-service

0 commit comments

Comments
 (0)