From f5cb2c8e2e8c12de4ef5e414d311e915a65106f8 Mon Sep 17 00:00:00 2001 From: prixod Date: Mon, 1 Dec 2025 22:29:25 +0400 Subject: [PATCH] fix java --- .../Services/JavaCompilationServiceIsolate.cs | 42 ++++++++++++++++--- .../Services/JavaExecutionServiceIsolate.cs | 10 ++++- .../KotlinCompilationServiceIsolate.cs | 9 ++++ .../Services/KotlinExecutionServiceIsolate.cs | 16 ++++++- 4 files changed, 69 insertions(+), 8 deletions(-) diff --git a/src/LiquidCode.Tester.Worker/Services/JavaCompilationServiceIsolate.cs b/src/LiquidCode.Tester.Worker/Services/JavaCompilationServiceIsolate.cs index 09be33c..394d2ba 100644 --- a/src/LiquidCode.Tester.Worker/Services/JavaCompilationServiceIsolate.cs +++ b/src/LiquidCode.Tester.Worker/Services/JavaCompilationServiceIsolate.cs @@ -14,7 +14,7 @@ public class JavaCompilationServiceIsolate : ICompilationService private readonly IsolateBoxPool _boxPool; private const int CompilationTimeLimitSeconds = 30; - private const int CompilationMemoryLimitMb = 512; + private const int CompilationMemoryLimitMb = 1024; // JVM needs more memory public JavaCompilationServiceIsolate( ILogger logger, @@ -85,6 +85,7 @@ public class JavaCompilationServiceIsolate : ICompilationService arguments.Add($"/box/{sourceFileName}"); var stderrFilePath = Path.Combine(boxDir, "compile_stderr.txt"); + var stdoutFilePath = Path.Combine(boxDir, "compile_stdout.txt"); var isolateResult = await _isolateService.RunAsync(new IsolateRunOptions { @@ -94,28 +95,57 @@ public class JavaCompilationServiceIsolate : ICompilationService TimeLimitSeconds = CompilationTimeLimitSeconds, WallTimeLimitSeconds = CompilationTimeLimitSeconds * 2, MemoryLimitKb = CompilationMemoryLimitMb * 1024, - StackLimitKb = 256 * 1024, - ProcessLimit = 10, // javac may spawn multiple processes + StackLimitKb = 128 * 1024, // 128MB stack per process + ProcessLimit = 64, // JVM needs many threads/processes EnableNetwork = false, + StdoutFile = stdoutFilePath, StderrFile = stderrFilePath, WorkingDirectory = "/box", DirectoryBindings = new List { + new DirectoryBinding { HostPath = "/usr/bin", SandboxPath = "/usr/bin", ReadOnly = true }, new DirectoryBinding { HostPath = "/usr/lib", SandboxPath = "/usr/lib", ReadOnly = true }, - new DirectoryBinding { HostPath = "/lib", SandboxPath = "/lib", ReadOnly = true } + new DirectoryBinding { HostPath = "/lib", SandboxPath = "/lib", ReadOnly = true }, + new DirectoryBinding { HostPath = "/lib64", SandboxPath = "/lib64", ReadOnly = true }, + new DirectoryBinding { HostPath = "/etc", SandboxPath = "/etc", ReadOnly = true } } }); var compilerOutput = string.Empty; + + // Read stdout (javac may output errors there) + if (File.Exists(stdoutFilePath)) + { + var stdoutContent = await File.ReadAllTextAsync(stdoutFilePath); + if (!string.IsNullOrWhiteSpace(stdoutContent)) + { + compilerOutput = stdoutContent; + _logger.LogDebug("Read stdout file: {Length} bytes", stdoutContent.Length); + } + } + + // Read stderr if (File.Exists(stderrFilePath)) { - compilerOutput = await File.ReadAllTextAsync(stderrFilePath); + var stderrContent = await File.ReadAllTextAsync(stderrFilePath); + if (!string.IsNullOrWhiteSpace(stderrContent)) + { + compilerOutput = string.IsNullOrEmpty(compilerOutput) + ? stderrContent + : $"{compilerOutput}\n{stderrContent}"; + _logger.LogDebug("Read stderr file: {Length} bytes", stderrContent.Length); + } } + if (!string.IsNullOrEmpty(isolateResult.ErrorOutput)) { - compilerOutput = $"{compilerOutput}\n{isolateResult.ErrorOutput}".Trim(); + compilerOutput = string.IsNullOrEmpty(compilerOutput) + ? isolateResult.ErrorOutput + : $"{compilerOutput}\n{isolateResult.ErrorOutput}"; } + _logger.LogDebug("Final compiler output: {Output}", compilerOutput); + if (isolateResult.TimeLimitExceeded) { _logger.LogWarning("Java compilation time limit exceeded for box {BoxId}", boxId); diff --git a/src/LiquidCode.Tester.Worker/Services/JavaExecutionServiceIsolate.cs b/src/LiquidCode.Tester.Worker/Services/JavaExecutionServiceIsolate.cs index d71bb4f..c5b2f9a 100644 --- a/src/LiquidCode.Tester.Worker/Services/JavaExecutionServiceIsolate.cs +++ b/src/LiquidCode.Tester.Worker/Services/JavaExecutionServiceIsolate.cs @@ -84,7 +84,15 @@ public class JavaExecutionServiceIsolate : IExecutionService EnableNetwork = false, StdinFile = sandboxInputPath, StdoutFile = outputFilePath, - WorkingDirectory = "/box" + WorkingDirectory = "/box", + DirectoryBindings = new List + { + new DirectoryBinding { HostPath = "/usr/bin", SandboxPath = "/usr/bin", ReadOnly = true }, + new DirectoryBinding { HostPath = "/usr/lib", SandboxPath = "/usr/lib", ReadOnly = true }, + new DirectoryBinding { HostPath = "/lib", SandboxPath = "/lib", ReadOnly = true }, + new DirectoryBinding { HostPath = "/lib64", SandboxPath = "/lib64", ReadOnly = true }, + new DirectoryBinding { HostPath = "/etc", SandboxPath = "/etc", ReadOnly = true } + } }); stopwatch.Stop(); diff --git a/src/LiquidCode.Tester.Worker/Services/KotlinCompilationServiceIsolate.cs b/src/LiquidCode.Tester.Worker/Services/KotlinCompilationServiceIsolate.cs index 6eaf5ca..781ec9a 100644 --- a/src/LiquidCode.Tester.Worker/Services/KotlinCompilationServiceIsolate.cs +++ b/src/LiquidCode.Tester.Worker/Services/KotlinCompilationServiceIsolate.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using LiquidCode.Tester.Worker.Services.Isolate; using LiquidCode.Tester.Worker.Models; @@ -106,7 +107,15 @@ public class KotlinCompilationServiceIsolate : ICompilationService { new DirectoryBinding { HostPath = "/usr/lib", SandboxPath = "/usr/lib", ReadOnly = true }, new DirectoryBinding { HostPath = "/lib", SandboxPath = "/lib", ReadOnly = true }, + new DirectoryBinding { HostPath = "/lib64", SandboxPath = "/lib64", ReadOnly = true }, + new DirectoryBinding { HostPath = "/usr/bin", SandboxPath = "/usr/bin", ReadOnly = true }, + new DirectoryBinding { HostPath = "/bin", SandboxPath = "/bin", ReadOnly = true }, + new DirectoryBinding { HostPath = "/etc", SandboxPath = "/etc", ReadOnly = true }, new DirectoryBinding { HostPath = "/opt/kotlinc", SandboxPath = "/opt/kotlinc", ReadOnly = true } + }, + EnvironmentVariables = new Dictionary + { + ["PATH"] = "/usr/local/bin:/usr/bin:/bin" } }); diff --git a/src/LiquidCode.Tester.Worker/Services/KotlinExecutionServiceIsolate.cs b/src/LiquidCode.Tester.Worker/Services/KotlinExecutionServiceIsolate.cs index f5d11ce..5182f7b 100644 --- a/src/LiquidCode.Tester.Worker/Services/KotlinExecutionServiceIsolate.cs +++ b/src/LiquidCode.Tester.Worker/Services/KotlinExecutionServiceIsolate.cs @@ -1,4 +1,5 @@ using System.Diagnostics; +using System.Collections.Generic; using LiquidCode.Tester.Worker.Services.Isolate; namespace LiquidCode.Tester.Worker.Services; @@ -78,7 +79,20 @@ public class KotlinExecutionServiceIsolate : IExecutionService EnableNetwork = false, StdinFile = sandboxInputPath, StdoutFile = outputFilePath, - WorkingDirectory = "/box" + WorkingDirectory = "/box", + DirectoryBindings = new List + { + new DirectoryBinding { HostPath = "/usr/lib", SandboxPath = "/usr/lib", ReadOnly = true }, + new DirectoryBinding { HostPath = "/lib", SandboxPath = "/lib", ReadOnly = true }, + new DirectoryBinding { HostPath = "/lib64", SandboxPath = "/lib64", ReadOnly = true }, + new DirectoryBinding { HostPath = "/usr/bin", SandboxPath = "/usr/bin", ReadOnly = true }, + new DirectoryBinding { HostPath = "/bin", SandboxPath = "/bin", ReadOnly = true }, + new DirectoryBinding { HostPath = "/etc", SandboxPath = "/etc", ReadOnly = true } + }, + EnvironmentVariables = new Dictionary + { + ["PATH"] = "/usr/local/bin:/usr/bin:/bin" + } }); stopwatch.Stop();