Skip to content

Commit a021c5f

Browse files
authored
Merge pull request #20 from CapstoneProjectCMC/coding-service/Fix-CodingDocker
Add fix coding
2 parents fbdd0cd + d5e179f commit a021c5f

File tree

35 files changed

+826
-789
lines changed

35 files changed

+826
-789
lines changed

build-image-coding.sh

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
export DOCKER_BUILDKIT=1
4+
5+
DOCKERHUB_USER="${DOCKERHUB_USER:-yunomix2834}"
6+
IMAGE_TAG="${IMAGE_TAG:-$(date +%Y%m%d.%H%M%S)}"
7+
8+
# Xác định DOCKER_GID an toàn
9+
if [[ "$OSTYPE" == "darwin"* ]]; then
10+
DOCKER_GID=999
11+
elif [ -S /var/run/docker.sock ]; then
12+
DOCKER_GID=$(stat -c '%g' /var/run/docker.sock 2>/dev/null || echo 999)
13+
else
14+
DOCKER_GID=999
15+
fi
16+
17+
login() {
18+
[ -n "$DOCKERHUB_TOKEN" ] && echo "$DOCKERHUB_TOKEN" | docker login -u "$DOCKERHUB_USER" --password-stdin
19+
}
20+
21+
build_push_java() {
22+
local module=$1
23+
local build_args=("--build-arg" "MODULE=$module")
24+
25+
if [[ "$module" == "coding-service" ]]; then
26+
build_args+=(
27+
"--build-arg" "DOCKER_HOST_GID=${DOCKER_GID}"
28+
)
29+
fi
30+
31+
docker buildx build \
32+
-f docker/java-service-coding.Dockerfile \
33+
"${build_args[@]}" \
34+
-t "$DOCKERHUB_USER/codecampus-$module:$IMAGE_TAG" \
35+
--push .
36+
}
37+
38+
main() {
39+
login
40+
echo "Building with DOCKER_GID=${DOCKER_GID}"
41+
42+
build_push_java coding-service
43+
}
44+
45+
main "$@"

build-image.sh

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,6 @@ export DOCKER_BUILDKIT=1
55
DOCKERHUB_USER="${DOCKERHUB_USER:-yunomix2834}"
66
IMAGE_TAG="${IMAGE_TAG:-$(date +%Y%m%d.%H%M%S)}"
77

8-
# Xác định DOCKER_GID an toàn
9-
if [[ "$OSTYPE" == "darwin"* ]]; then
10-
DOCKER_GID=999
11-
elif [ -S /var/run/docker.sock ]; then
12-
DOCKER_GID=$(stat -c '%g' /var/run/docker.sock 2>/dev/null || echo 999)
13-
else
14-
DOCKER_GID=999
15-
fi
16-
178
login() {
189
[ -n "$DOCKERHUB_TOKEN" ] && echo "$DOCKERHUB_TOKEN" | docker login -u "$DOCKERHUB_USER" --password-stdin
1910
}
@@ -22,12 +13,6 @@ build_push_java() {
2213
local module=$1
2314
local build_args=("--build-arg" "MODULE=$module")
2415

25-
if [[ "$module" == "coding-service" ]]; then
26-
build_args+=(
27-
"--build-arg" "DOCKER_HOST_GID=${DOCKER_GID}"
28-
)
29-
fi
30-
3116
docker buildx build \
3217
-f docker/java-service.Dockerfile \
3318
"${build_args[@]}" \
@@ -39,7 +24,7 @@ main() {
3924
login
4025
echo "Building with DOCKER_GID=${DOCKER_GID}"
4126

42-
for svc in search-service profile-service identity-service; do
27+
for svc in search-service; do
4328
echo "Building $svc..."
4429
build_push_java "$svc"
4530
done

build-service.sh

Lines changed: 0 additions & 38 deletions
This file was deleted.

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

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,11 @@
2727
import java.io.IOException;
2828
import java.nio.file.Files;
2929
import java.nio.file.Path;
30-
import java.nio.file.attribute.PosixFilePermission;
3130
import java.nio.file.attribute.PosixFilePermissions;
3231
import java.time.Instant;
3332
import java.util.ArrayList;
3433
import java.util.Comparator;
3534
import java.util.List;
36-
import java.util.Set;
3735
import java.util.stream.Stream;
3836

3937
@Service
@@ -56,12 +54,13 @@ private static Path createWorkDir() throws IOException {
5654
// Đảm bảo thư mục RUNNER_ROOT tồn tại và có quyền
5755
if (!Files.exists(RUNNER_ROOT)) {
5856
Files.createDirectories(RUNNER_ROOT);
59-
Set<PosixFilePermission> rootPerms =
60-
PosixFilePermissions.fromString("rwxrwxrwx");
61-
Files.setPosixFilePermissions(RUNNER_ROOT, rootPerms);
57+
Files.setPosixFilePermissions(
58+
RUNNER_ROOT, PosixFilePermissions.fromString("rwxrwxrwx"));
6259
}
63-
6460
Path workDir = Files.createTempDirectory(RUNNER_ROOT, "pg_");
61+
Files.setPosixFilePermissions(
62+
workDir, PosixFilePermissions.fromString(
63+
"rwxrwxrwx"));
6564
return workDir;
6665
}
6766

@@ -82,7 +81,12 @@ public SubmitCodeResponse judgeCodeSubmission(
8281
.build();
8382
codeSubmissionRepository.saveAndFlush(codeSubmission);
8483

84+
final int memoryMbLimit = codingExercise.getMemoryLimit() > 0 ?
85+
codingExercise.getMemoryLimit() : 256;
86+
final float cpusLimit = 0.5f;
87+
8588
int passedCount = 0;
89+
int peakMemoryKb = 0;
8690
List<TestCaseResultSyncDto> testCaseResultSyncDtoList =
8791
new ArrayList<>();
8892

@@ -95,33 +99,23 @@ public SubmitCodeResponse judgeCodeSubmission(
9599
request.getLanguage(),
96100
request.getSourceCode(),
97101
workDir);
98-
} catch (InterruptedException | IOException e) {
99-
// compile failure từ DockerSandboxService.exec → log rồi rethrow
100-
safeDeleteDir(workDir);
101-
throw new RuntimeException(e);
102-
} finally {
103-
safeDeleteDir(workDir);
104-
}
105-
106-
/* ====== Default limit khi client không set ====== */
107-
int memoryMb = request.getMemoryMb() > 0 ? request.getMemoryMb() : 256;
108-
float cpus = request.getCpus() > 0 ? request.getCpus() : 0.5f;
109102

110-
try {
111103
for (TestCase testCase : codingExercise.getTestCases()) {
112104
CodeResult codeResult = dockerSandboxService.runTest(
113105
bin,
114106
testCase,
115-
memoryMb,
116-
cpus);
107+
memoryMbLimit,
108+
cpusLimit);
117109

118110
if (codeResult.isPassed()) {
119111
passedCount++;
120112
}
113+
peakMemoryKb = Math.max(peakMemoryKb, codeResult.getMemoryKb());
121114

122115
CodeSubmissionResult codeSubmissionResult =
123116
CodeSubmissionResult.builder()
124-
.submission(codeSubmission).testCase(testCase)
117+
.submission(codeSubmission)
118+
.testCase(testCase)
125119
.passed(codeResult.isPassed())
126120
.runtimeMs(codeResult.getRuntimeMs())
127121
.memoryKb(codeResult.getMemoryKb())
@@ -144,7 +138,8 @@ public SubmitCodeResponse judgeCodeSubmission(
144138
codeResult.getError())
145139
.build());
146140
}
147-
141+
} catch (InterruptedException | IOException e) {
142+
throw new RuntimeException(e);
148143
} finally {
149144
safeDeleteDir(workDir);
150145
}
@@ -174,6 +169,9 @@ public SubmitCodeResponse judgeCodeSubmission(
174169
.setTimeTakenSeconds(
175170
request.getTimeTakenSeconds())
176171
.addAllResults(testCaseResultSyncDtoList)
172+
.setPeakMemoryKb(peakMemoryKb)
173+
.setCpus(cpusLimit)
174+
.setMemoryMb(memoryMbLimit)
177175
.build())
178176
.build());
179177

@@ -193,6 +191,9 @@ public SubmitCodeResponse judgeCodeSubmission(
193191
.setErrorMessage(r.getErrorMessage())
194192
.build())
195193
.toList())
194+
.setMemoryMb(memoryMbLimit)
195+
.setCpus(cpusLimit)
196+
.setPeakMemoryKb(peakMemoryKb)
196197
.build();
197198
}
198199

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

Lines changed: 50 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.io.IOException;
1515
import java.io.InputStream;
1616
import java.io.OutputStreamWriter;
17+
import java.nio.charset.StandardCharsets;
1718
import java.nio.file.Files;
1819
import java.nio.file.Path;
1920
import java.nio.file.attribute.PosixFilePermission;
@@ -43,14 +44,12 @@ private static Path createWorkDir() throws IOException {
4344
// Đảm bảo thư mục RUNNER_ROOT tồn tại và có quyền
4445
if (!Files.exists(RUNNER_ROOT)) {
4546
Files.createDirectories(RUNNER_ROOT);
47+
Files.setPosixFilePermissions(
48+
RUNNER_ROOT, PosixFilePermissions.fromString("rwxrwxrwx"));
4649
}
47-
48-
// Tạo thư mục work với quyền 777
4950
Path workDir = Files.createTempDirectory(RUNNER_ROOT, "pg_");
50-
Set<PosixFilePermission> perms =
51-
PosixFilePermissions.fromString("rwxrwxrwx");
52-
Files.setPosixFilePermissions(workDir, perms);
53-
51+
Files.setPosixFilePermissions(
52+
workDir, PosixFilePermissions.fromString("rwxrwxrwx"));
5453
return workDir;
5554
}
5655

@@ -89,17 +88,18 @@ public CompiledArtifact compile(
8988

9089
// 3. Tên nhị phân / jar random để tránh trùng
9190
String binName = "bin_" + UUID.randomUUID();
92-
String inPath = DockerHelper.inVolumePath(workDir);
91+
final boolean inDocker = !DockerHelper.selfContainer().isBlank();
92+
final String inPath = inDocker
93+
? DockerHelper.inVolumePath(workDir)
94+
: workDir.toString();
9395

94-
List<String> runBase = DockerHelper.selfContainer().isBlank()
96+
List<String> runBase = inDocker
9597
? DockerHelper.cmd("run", "--rm",
96-
"-v", RUNNER_VOLUME + ":/work",
97-
"-w", inPath,
98-
SANDBOX_IMAGE)
99-
: DockerHelper.cmd("run", "--rm",
10098
"--volumes-from", DockerHelper.selfContainer(),
101-
"-w", inPath,
102-
SANDBOX_IMAGE);
99+
"-w", inPath, SANDBOX_IMAGE)
100+
: DockerHelper.cmd("run", "--rm",
101+
"-v", RUNNER_ROOT + ":" + RUNNER_ROOT,
102+
"-w", inPath, SANDBOX_IMAGE);
103103

104104
ProcessBuilder compilePb = switch (language) {
105105
case "cpp" -> new ProcessBuilder(
@@ -130,24 +130,27 @@ public CodeResult runTest(
130130
int memoryMb,
131131
float cpus) {
132132
String container = "judge_" + UUID.randomUUID();
133-
String inPath = DockerHelper.inVolumePath(compiledArtifact.workDir());
133+
boolean inDocker = !DockerHelper.selfContainer().isBlank();
134+
String inPath = inDocker
135+
? DockerHelper.inVolumePath(compiledArtifact.workDir())
136+
: compiledArtifact.workDir().toString();
134137

135138
try {
136-
/* 1. khởi tạo container rỗng, giới hạn RAM + CPU, network none */
137-
List<String> startArgs = DockerHelper.selfContainer().isBlank()
139+
// 1) khởi tạo container rỗng, giới hạn RAM + CPU, network none
140+
List<String> startArgs = inDocker
138141
? DockerHelper.cmd("run", "-dit",
139142
"--memory=%sm".formatted(memoryMb),
140143
"--cpus=" + cpus,
141144
"--network", "none",
142-
"-v", RUNNER_VOLUME + ":/work",
145+
"--volumes-from", DockerHelper.selfContainer(),
143146
"-w", inPath,
144147
"--name", container,
145148
SANDBOX_IMAGE, "bash")
146149
: DockerHelper.cmd("run", "-dit",
147150
"--memory=%sm".formatted(memoryMb),
148151
"--cpus=" + cpus,
149152
"--network", "none",
150-
"--volumes-from", DockerHelper.selfContainer(),
153+
"-v", inPath + ":" + inPath,
151154
"-w", inPath,
152155
"--name", container,
153156
SANDBOX_IMAGE, "bash");
@@ -161,7 +164,7 @@ public CodeResult runTest(
161164
default -> throw new IllegalStateException();
162165
};
163166

164-
/* Chạy */
167+
// 2) run + feed input
165168
long startTime = System.nanoTime();
166169
Process run = new ProcessBuilder(
167170
Stream.concat(
@@ -180,17 +183,28 @@ public CodeResult runTest(
180183
int exitCode = run.waitFor();
181184
long endTime = System.nanoTime();
182185

186+
// 3) đo memory trước khi rm
187+
int memoryKb = 0;
188+
try {
189+
memoryKb = readContainerMemKb(container);
190+
} catch (Exception e) {
191+
log.warn("Read memory usage failed: {}", e.toString());
192+
}
193+
183194
boolean passed =
184195
exitCode == 0 && equal(out, testCase.getExpectedOutput());
185196

186197
return new CodeResult(
187198
passed,
188199
(int) ((endTime - startTime) / 1_000_000),
189-
0, out.trim(), err.trim());
200+
memoryKb, out.trim(), err.trim());
190201

191202
} catch (Exception ex) {
192203
log.error("Sandbox error", ex);
193-
return new CodeResult(false, 0, 0, "", ex.getMessage());
204+
return new CodeResult(
205+
false,
206+
0, 0,
207+
"", ex.getMessage());
194208
} finally {
195209
silent(DockerHelper.cmd("rm", "-f", container)
196210
.toArray(new String[0]));
@@ -210,6 +224,20 @@ void exec(ProcessBuilder processBuilder)
210224
}
211225
}
212226

227+
int readContainerMemKb(String container)
228+
throws IOException, InterruptedException {
229+
Process process = new ProcessBuilder(
230+
DockerHelper.cmd("exec", container, "bash", "-c",
231+
"cat /sys/fs/cgroup/memory.current || cat /sys/fs/cgroup/memory/memory.usage_in_bytes"))
232+
.start();
233+
234+
String output = new String(process.getInputStream().readAllBytes(),
235+
StandardCharsets.UTF_8).trim();
236+
process.waitFor();
237+
long bytes = Long.parseLong(output);
238+
return (int) (bytes / 1024);
239+
}
240+
213241
String read(InputStream inputStream)
214242
throws IOException {
215243
return new String(inputStream.readAllBytes());
-16.2 KB
Binary file not shown.

common-events/target/maven-archiver/pom.properties

Lines changed: 0 additions & 3 deletions
This file was deleted.

common-events/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst

Lines changed: 0 additions & 8 deletions
This file was deleted.

0 commit comments

Comments
 (0)