From c6486a85ed31871de3f535a0e231969e2f21bb2d Mon Sep 17 00:00:00 2001 From: hanhainebula <2512674094@qq.com> Date: Thu, 12 Nov 2026 00:41:35 +0800 Subject: [PATCH] Fix Java runtime availability in isolated task environments --- .../tests/run_submission.py | 3 +- tasks/agentic-search/tests/run_submission.py | 1 + .../tests/grader.py | 3 +- .../tests/runtime.py | 3 +- .../tests/runtime/evaluate.py | 3 +- .../tests/grader.py | 3 +- tasks/code-context-retrieval/tests/grader.py | 3 +- tasks/composed-image-search/tests/grader.py | 3 +- .../environment/runtime/evaluate.py | 2 +- .../tests/runtime/evaluate.py | 2 +- tasks/decision-model-training/tests/grader.py | 3 +- tasks/document-page-search/tests/grader.py | 3 +- .../evolving-personal-memory/tests/grader.py | 3 +- tasks/filtered-ann-retrieval/tests/grader.py | 3 +- .../tests/offline_exec.py | 2 +- tasks/financial-report-qa/tests/grader.py | 3 +- tasks/icsi-meeting-memory/tests/harness.py | 4 +- .../environment/profile_public.py | 3 +- .../incremental-vector-search/tests/grader.py | 3 +- .../tests/isolate.py | 2 +- .../environment/runtime/evaluate.py | 2 +- .../join-aware-table-retrieval/tests/grade.py | 3 +- .../khmer-embedding-training/tests/grader.py | 3 +- .../tests/runtime.py | 3 +- tasks/layout-page-search/tests/grader.py | 3 +- tasks/legal-stance-retrieval/tests/grader.py | 3 +- tasks/long-document-reranking/tests/grader.py | 3 +- .../tests/run_queries.py | 3 +- .../tests/test.sh | 3 +- tasks/long-pdf-evidence/tests/run_queries.py | 3 +- tasks/long-pdf-evidence/tests/test.sh | 3 +- .../tests/grader.py | 3 +- .../tests/grader.py | 3 +- .../environment/runtime/process.py | 2 +- .../tests/runtime/process.py | 2 +- tasks/narrative-clue-search/tests/grader.py | 3 +- .../tests/grader.py | 3 +- .../paper-metadata-retrieval/tests/grader.py | 3 +- .../environment/runtime/evaluate.py | 2 +- .../quantity-aware-retrieval/tests/grader.py | 3 +- .../query-encoder-alignment/tests/evaluate.py | 3 +- .../tests/run_evaluation.sh | 3 +- .../reasoning-query-rewriting/tests/grader.py | 3 +- tasks/same-place-image-search/tests/grader.py | 3 +- .../scientific-paper-qa/tests/run_queries.py | 3 +- tasks/scientific-paper-qa/tests/test.sh | 3 +- tasks/sketch-text-search/tests/grader.py | 3 +- .../sparse-retrieval-pruning/tests/isolate.py | 2 +- .../tests/run_with_metrics.py | 3 +- tasks/sparse-retrieval-pruning/tests/test.sh | 3 +- tasks/spoken-query-search/tests/grader.py | 3 +- tasks/training-error-tracing/tests/grade.py | 3 +- tasks/video-moment-search/tests/grader.py | 3 +- tasks/visual-document-qa/tests/grader.py | 3 +- tests/unit/test_submission_java.py | 80 +++++++++++++++++++ 55 files changed, 179 insertions(+), 53 deletions(-) create mode 100644 tests/unit/test_submission_java.py diff --git a/tasks/agentic-search-vectorless/tests/run_submission.py b/tasks/agentic-search-vectorless/tests/run_submission.py index b6fa0db..d589846 100644 --- a/tasks/agentic-search-vectorless/tests/run_submission.py +++ b/tasks/agentic-search-vectorless/tests/run_submission.py @@ -27,7 +27,8 @@ def submission_env() -> dict[str, str]: env = {"HOME": "/tmp/agentic-search-vectorless-submission-home", "TMPDIR": "/tmp", - "PATH": "/opt/conda/bin:/usr/local/bin:/usr/bin:/bin", "LANG": "C.UTF-8", + "JAVA_HOME": "/opt/java/openjdk", + "PATH": "/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin", "LANG": "C.UTF-8", "TOKENIZERS_PARALLELISM": "false", "PYTHONUNBUFFERED": "1"} for key in AGENT_API_NAMES | {"HTTP_PROXY", "HTTPS_PROXY", "NO_PROXY", "http_proxy", "https_proxy", "no_proxy"}: diff --git a/tasks/agentic-search/tests/run_submission.py b/tasks/agentic-search/tests/run_submission.py index 796f2c4..448fab8 100644 --- a/tasks/agentic-search/tests/run_submission.py +++ b/tasks/agentic-search/tests/run_submission.py @@ -32,6 +32,7 @@ def submission_env() -> dict[str, str]: # Judge/coding-agent credentials and endpoint settings never cross this boundary. names = AGENT_API_NAMES | {"PATH", "LANG", "LC_ALL", "PYTHONUNBUFFERED", "REACT_MODEL"} env = {name: os.environ[name] for name in names if name in os.environ} + env["JAVA_HOME"] = "/opt/java/openjdk" env["HOME"] = "/tmp/agentic-search-submission-home" env["TMPDIR"] = "/tmp" return env diff --git a/tasks/biomedical-graph-retrieval/tests/grader.py b/tasks/biomedical-graph-retrieval/tests/grader.py index 0f66a80..271b290 100644 --- a/tasks/biomedical-graph-retrieval/tests/grader.py +++ b/tasks/biomedical-graph-retrieval/tests/grader.py @@ -126,7 +126,8 @@ def submission_command(command: list[str]) -> list[str]: f"HOME={INDEX_DIR}", "USER=submission", "LOGNAME=submission", - "PATH=/opt/conda/bin:/usr/local/bin:/usr/bin:/bin", + "JAVA_HOME=/opt/java/openjdk", + "PATH=/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin", "LANG=C.UTF-8", "PYTHONUNBUFFERED=1", "PYTHONDONTWRITEBYTECODE=1", diff --git a/tasks/budgeted-bimetric-retrieval/tests/runtime.py b/tasks/budgeted-bimetric-retrieval/tests/runtime.py index 8b0a1b1..a1d178b 100644 --- a/tasks/budgeted-bimetric-retrieval/tests/runtime.py +++ b/tasks/budgeted-bimetric-retrieval/tests/runtime.py @@ -118,7 +118,8 @@ def __init__(self, command, work, log, cpus, fixed_bytes=0): self.log = log.open('wb', buffering=0) self.logged = 0 scratch = str(Path(work)/'scratch') if (Path(work)/'scratch').exists() else work - env = {'PATH': '/opt/conda/bin:/usr/local/bin:/usr/bin:/bin', 'HOME': scratch, + env = {'JAVA_HOME': '/opt/java/openjdk', + 'PATH': '/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin', 'HOME': scratch, 'TMPDIR': scratch, 'XDG_CACHE_HOME': scratch, 'PYTHONDONTWRITEBYTECODE': '1', 'PYTHONUNBUFFERED': '1', 'LANG': 'C.UTF-8', 'OMP_NUM_THREADS': str(len(cpus)), 'OPENBLAS_NUM_THREADS': str(len(cpus)), 'MKL_NUM_THREADS': str(len(cpus)), diff --git a/tasks/budgeted-candidate-reranking/tests/runtime/evaluate.py b/tasks/budgeted-candidate-reranking/tests/runtime/evaluate.py index dbf194d..c5036dd 100644 --- a/tasks/budgeted-candidate-reranking/tests/runtime/evaluate.py +++ b/tasks/budgeted-candidate-reranking/tests/runtime/evaluate.py @@ -245,7 +245,8 @@ def run_query(query, submission, backend, output, resources): excluded = 0 stderr = (output / (query['query_id']+'.stderr')).open('wb') cpus = sorted(os.sched_getaffinity(0))[:16] - env = {'PATH': '/opt/conda/bin:/usr/local/bin:/usr/bin:/bin', 'HOME': '/work', + env = {'JAVA_HOME': '/opt/java/openjdk', + 'PATH': '/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin', 'HOME': '/work', 'TMPDIR': '/work', 'XDG_CACHE_HOME': '/work', 'LANG': 'C.UTF-8', 'PYTHONDONTWRITEBYTECODE': '1', 'PYTHONUNBUFFERED': '1', 'OMP_NUM_THREADS': str(len(cpus)), 'OPENBLAS_NUM_THREADS': str(len(cpus))} diff --git a/tasks/chunqiu-temporal-retrieval/tests/grader.py b/tasks/chunqiu-temporal-retrieval/tests/grader.py index 0ec91c5..1737930 100644 --- a/tasks/chunqiu-temporal-retrieval/tests/grader.py +++ b/tasks/chunqiu-temporal-retrieval/tests/grader.py @@ -40,7 +40,8 @@ def read_jsonl(path): def child_command(command): - environment = ["PATH=/opt/conda/bin:/usr/local/bin:/usr/bin:/bin", "USER=submission", + environment = ["JAVA_HOME=/opt/java/openjdk", + "PATH=/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin", "USER=submission", "LOGNAME=submission", f"HOME={INDEX}", "LANG=C.UTF-8", "PYTHONUNBUFFERED=1", "PYTHONDONTWRITEBYTECODE=1", "TOKENIZERS_PARALLELISM=false", "OMP_NUM_THREADS=8", "OPENBLAS_NUM_THREADS=8", "HF_HUB_OFFLINE=1", diff --git a/tasks/code-context-retrieval/tests/grader.py b/tasks/code-context-retrieval/tests/grader.py index 2ea23b4..f7a9199 100644 --- a/tasks/code-context-retrieval/tests/grader.py +++ b/tasks/code-context-retrieval/tests/grader.py @@ -84,7 +84,8 @@ def prepare(): def child_env(): env = {'HOME': str(INDEX), 'USER': 'submission', 'LOGNAME': 'submission', - 'PATH': '/opt/conda/bin:/usr/local/bin:/usr/bin:/bin', 'LANG': 'C.UTF-8', + 'JAVA_HOME': '/opt/java/openjdk', + 'PATH': '/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin', 'LANG': 'C.UTF-8', 'TMPDIR': str(INDEX / 'tmp'), 'XDG_CACHE_HOME': str(INDEX / 'cache'), 'PYTHONUNBUFFERED': '1', 'PYTHONDONTWRITEBYTECODE': '1', 'OMP_NUM_THREADS': '16', 'OPENBLAS_NUM_THREADS': '16', diff --git a/tasks/composed-image-search/tests/grader.py b/tasks/composed-image-search/tests/grader.py index 5208f91..08638cd 100644 --- a/tasks/composed-image-search/tests/grader.py +++ b/tasks/composed-image-search/tests/grader.py @@ -29,7 +29,8 @@ def child_env(): "HOME": "/work/index", "USER": "submission", "LOGNAME": "submission", - "PATH": "/opt/conda/bin:/usr/local/bin:/usr/bin:/bin", + "JAVA_HOME": "/opt/java/openjdk", + "PATH": "/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin", "LANG": "C.UTF-8", "PYTHONUNBUFFERED": "1", "PYTHONDONTWRITEBYTECODE": "1", diff --git a/tasks/constrained-molecular-search/environment/runtime/evaluate.py b/tasks/constrained-molecular-search/environment/runtime/evaluate.py index a891c57..810ac6d 100644 --- a/tasks/constrained-molecular-search/environment/runtime/evaluate.py +++ b/tasks/constrained-molecular-search/environment/runtime/evaluate.py @@ -187,7 +187,7 @@ def __init__(self, work, output, resources, library_dir): "PATH", "LD_LIBRARY_PATH", "CUDA_VISIBLE_DEVICES", "NVIDIA_VISIBLE_DEVICES", "NVIDIA_DRIVER_CAPABILITIES") if name in os.environ} scratch = work / "scratch" if (work / "scratch").exists() else work - env.update(HOME=str(scratch), TMPDIR=str(scratch), XDG_CACHE_HOME=str(scratch), + env.update(JAVA_HOME="/opt/java/openjdk", HOME=str(scratch), TMPDIR=str(scratch), XDG_CACHE_HOME=str(scratch), MOLECULE_WORK_DIR=str(work), MOLECULE_LIBRARY_DIR=str(library_dir), PYTHONUNBUFFERED="1", PYTHONDONTWRITEBYTECODE="1", HF_HUB_OFFLINE="1", TRANSFORMERS_OFFLINE="1", OMP_NUM_THREADS="16", diff --git a/tasks/constrained-molecular-search/tests/runtime/evaluate.py b/tasks/constrained-molecular-search/tests/runtime/evaluate.py index a891c57..810ac6d 100644 --- a/tasks/constrained-molecular-search/tests/runtime/evaluate.py +++ b/tasks/constrained-molecular-search/tests/runtime/evaluate.py @@ -187,7 +187,7 @@ def __init__(self, work, output, resources, library_dir): "PATH", "LD_LIBRARY_PATH", "CUDA_VISIBLE_DEVICES", "NVIDIA_VISIBLE_DEVICES", "NVIDIA_DRIVER_CAPABILITIES") if name in os.environ} scratch = work / "scratch" if (work / "scratch").exists() else work - env.update(HOME=str(scratch), TMPDIR=str(scratch), XDG_CACHE_HOME=str(scratch), + env.update(JAVA_HOME="/opt/java/openjdk", HOME=str(scratch), TMPDIR=str(scratch), XDG_CACHE_HOME=str(scratch), MOLECULE_WORK_DIR=str(work), MOLECULE_LIBRARY_DIR=str(library_dir), PYTHONUNBUFFERED="1", PYTHONDONTWRITEBYTECODE="1", HF_HUB_OFFLINE="1", TRANSFORMERS_OFFLINE="1", OMP_NUM_THREADS="16", diff --git a/tasks/decision-model-training/tests/grader.py b/tasks/decision-model-training/tests/grader.py index 93d1664..a7e51e8 100644 --- a/tasks/decision-model-training/tests/grader.py +++ b/tasks/decision-model-training/tests/grader.py @@ -42,7 +42,8 @@ def stop_children(): def child_command(command, runtime): - environment = {"PATH": "/opt/conda/bin:/usr/local/bin:/usr/bin:/bin", + environment = {"JAVA_HOME": "/opt/java/openjdk", + "PATH": "/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin", "USER": "submission", "LOGNAME": "submission", "HOME": str(runtime), "LANG": "C.UTF-8", "PYTHONUNBUFFERED": "1", "PYTHONDONTWRITEBYTECODE": "1", "OMP_NUM_THREADS": "16", "MKL_NUM_THREADS": "16", "OPENBLAS_NUM_THREADS": "1", diff --git a/tasks/document-page-search/tests/grader.py b/tasks/document-page-search/tests/grader.py index c9942ea..9331758 100644 --- a/tasks/document-page-search/tests/grader.py +++ b/tasks/document-page-search/tests/grader.py @@ -29,7 +29,8 @@ def child_env(): "HOME": "/work/index", "USER": "submission", "LOGNAME": "submission", - "PATH": "/opt/conda/bin:/usr/local/bin:/usr/bin:/bin", + "JAVA_HOME": "/opt/java/openjdk", + "PATH": "/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin", "LANG": "C.UTF-8", "PYTHONUNBUFFERED": "1", "PYTHONDONTWRITEBYTECODE": "1", diff --git a/tasks/evolving-personal-memory/tests/grader.py b/tasks/evolving-personal-memory/tests/grader.py index 63ae65a..6a93f4d 100644 --- a/tasks/evolving-personal-memory/tests/grader.py +++ b/tasks/evolving-personal-memory/tests/grader.py @@ -60,7 +60,8 @@ def child_env(home, answer=False): "HOME": str(home), "USER": "answer" if answer else "submission", "LOGNAME": "answer" if answer else "submission", - "PATH": "/opt/conda/bin:/usr/local/bin:/usr/bin:/bin", + "JAVA_HOME": "/opt/java/openjdk", + "PATH": "/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin", "LANG": "C.UTF-8", "PYTHONUNBUFFERED": "1", "PYTHONDONTWRITEBYTECODE": "1", diff --git a/tasks/filtered-ann-retrieval/tests/grader.py b/tasks/filtered-ann-retrieval/tests/grader.py index 40e37d3..398c5ee 100644 --- a/tasks/filtered-ann-retrieval/tests/grader.py +++ b/tasks/filtered-ann-retrieval/tests/grader.py @@ -121,7 +121,8 @@ def __init__(self, command, app, work, log, run_as, threads, *, service=False): self.run_as = run_as self.log = log.open("wb") environment = { - "PATH": f"{Path(sys.executable).parent}:/usr/local/bin:/usr/bin:/bin", + "JAVA_HOME": "/opt/java/openjdk", + "PATH": f"{Path(sys.executable).parent}:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin", "HOME": str(work), "TMPDIR": str(work / "tmp"), "LANG": "C.UTF-8", "LC_ALL": "C.UTF-8", "PYTHONUNBUFFERED": "1", "PYTHONDONTWRITEBYTECODE": "1", diff --git a/tasks/filtered-ann-retrieval/tests/offline_exec.py b/tasks/filtered-ann-retrieval/tests/offline_exec.py index 03bcfb6..86824a6 100644 --- a/tasks/filtered-ann-retrieval/tests/offline_exec.py +++ b/tasks/filtered-ann-retrieval/tests/offline_exec.py @@ -65,7 +65,7 @@ def allow(path, access): allow(index, writable) # Interpreter, shared libraries and read-only system configuration. # Do not allow /task, /tmp, /home, /dev/shm or a common ancestor of index. - for path in ("/usr", "/bin", "/sbin", "/lib", "/lib64", "/opt/conda", + for path in ("/usr", "/bin", "/sbin", "/lib", "/lib64", "/opt/conda", "/opt/java", "/etc/ld.so.cache", "/etc/localtime", "/etc/nsswitch.conf", "/etc/passwd", "/etc/group", "/proc/self", "/proc/cpuinfo", "/proc/meminfo", "/sys/devices/system/cpu"): diff --git a/tasks/financial-report-qa/tests/grader.py b/tasks/financial-report-qa/tests/grader.py index d966954..e88c745 100644 --- a/tasks/financial-report-qa/tests/grader.py +++ b/tasks/financial-report-qa/tests/grader.py @@ -30,7 +30,8 @@ def child_env(): "HOME": "/work/index", "USER": "submission", "LOGNAME": "submission", - "PATH": "/opt/conda/bin:/usr/local/bin:/usr/bin:/bin", + "JAVA_HOME": "/opt/java/openjdk", + "PATH": "/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin", "LANG": "C.UTF-8", "PYTHONUNBUFFERED": "1", "PYTHONDONTWRITEBYTECODE": "1", diff --git a/tasks/icsi-meeting-memory/tests/harness.py b/tasks/icsi-meeting-memory/tests/harness.py index 2275c88..cedf2df 100644 --- a/tasks/icsi-meeting-memory/tests/harness.py +++ b/tasks/icsi-meeting-memory/tests/harness.py @@ -9,6 +9,7 @@ HERE = Path(__file__).resolve().parent RUNTIME = [ "/opt/conda", + "/opt/java", "/usr", "/bin", "/lib", @@ -123,7 +124,8 @@ def invoke(argv, read, work, log, label, timeout, gateway=None): work.mkdir(mode=0o700, exist_ok=True) own(work, 10001, 10001) env = { - "PATH": "/opt/conda/bin:/usr/local/bin:/usr/bin:/bin", + "JAVA_HOME": "/opt/java/openjdk", + "PATH": "/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin", "HOME": str(work), "TMPDIR": str(work), "LANG": "C.UTF-8", diff --git a/tasks/incremental-vector-search/environment/profile_public.py b/tasks/incremental-vector-search/environment/profile_public.py index 21cb48b..38b6f6c 100644 --- a/tasks/incremental-vector-search/environment/profile_public.py +++ b/tasks/incremental-vector-search/environment/profile_public.py @@ -61,7 +61,8 @@ def prepare(): os.setuid(UID) resource.setrlimit(resource.RLIMIT_CORE, (0, 0)) resource.setrlimit(resource.RLIMIT_FSIZE, (32 * 1024**3,) * 2) - env = {'PATH': '/opt/conda/bin:/usr/bin:/bin', 'HOME': str(state), + env = {'JAVA_HOME': '/opt/java/openjdk', + 'PATH': '/opt/conda/bin:/opt/java/openjdk/bin:/usr/bin:/bin', 'HOME': str(state), 'TMPDIR': str(state), 'OMP_NUM_THREADS': '16', 'OPENBLAS_NUM_THREADS': '1', 'MKL_NUM_THREADS': '1', 'KMP_AFFINITY': 'disabled', 'OMP_PROC_BIND': 'false', diff --git a/tasks/incremental-vector-search/tests/grader.py b/tasks/incremental-vector-search/tests/grader.py index 212d430..0dcb3d3 100644 --- a/tasks/incremental-vector-search/tests/grader.py +++ b/tasks/incremental-vector-search/tests/grader.py @@ -204,7 +204,8 @@ def monitor(): if peak_disk > 32 * GIB: raise ValueError("Dataset exceeded 32 GiB storage") - env = {"PATH": "/opt/conda/bin:/usr/bin:/bin", "HOME": "/work/state", + env = {"JAVA_HOME": "/opt/java/openjdk", + "PATH": "/opt/conda/bin:/opt/java/openjdk/bin:/usr/bin:/bin", "HOME": "/work/state", "TMPDIR": "/work/state", "OMP_NUM_THREADS": "16", "OPENBLAS_NUM_THREADS": "1", "MKL_NUM_THREADS": "1", "KMP_AFFINITY": "disabled", "OMP_PROC_BIND": "false", "PYTHONDONTWRITEBYTECODE": "1", "LC_ALL": "C.UTF-8"} diff --git a/tasks/incremental-vector-search/tests/isolate.py b/tasks/incremental-vector-search/tests/isolate.py index 8ddf915..5114e21 100644 --- a/tasks/incremental-vector-search/tests/isolate.py +++ b/tasks/incremental-vector-search/tests/isolate.py @@ -8,7 +8,7 @@ def main(): - runtime = ["/usr", "/bin", "/lib", "/lib64", "/opt/conda", "/etc/ld.so.cache", + runtime = ["/usr", "/bin", "/lib", "/lib64", "/opt/conda", "/opt/java", "/etc/ld.so.cache", "/etc/localtime", "/proc/cpuinfo", "/proc/meminfo", "/sys/devices/system/cpu"] rules = [(p, READ | READ_DIR | EXECUTE) for p in runtime if Path(p).exists()] rules += [("/app/submission", READ | READ_DIR | EXECUTE), diff --git a/tasks/instruction-following-embedding/environment/runtime/evaluate.py b/tasks/instruction-following-embedding/environment/runtime/evaluate.py index 03fcea6..f45aa27 100644 --- a/tasks/instruction-following-embedding/environment/runtime/evaluate.py +++ b/tasks/instruction-following-embedding/environment/runtime/evaluate.py @@ -41,7 +41,7 @@ def __init__(self,role,output,resources): self.work.chmod(0o700);os.chown(self.work,UID,UID) self.log=open(output/f'{role}-worker.stderr','ab') env={k:os.environ[k] for k in ['PATH','LD_LIBRARY_PATH','CUDA_VISIBLE_DEVICES','NVIDIA_VISIBLE_DEVICES','NVIDIA_DRIVER_CAPABILITIES'] if k in os.environ} - env.update(HOME=str(self.work),TMPDIR=str(self.work),ENCODER_WORK_DIR=str(self.work),XDG_CACHE_HOME=str(self.work/'cache'),HF_HOME=str(self.work/'hf'), + env.update(JAVA_HOME='/opt/java/openjdk', HOME=str(self.work),TMPDIR=str(self.work),ENCODER_WORK_DIR=str(self.work),XDG_CACHE_HOME=str(self.work/'cache'),HF_HOME=str(self.work/'hf'), OMP_NUM_THREADS='16',OPENBLAS_NUM_THREADS='16',MKL_NUM_THREADS='16',TOKENIZERS_PARALLELISM='false',PYTHONUNBUFFERED='1',HF_HUB_OFFLINE='1',TRANSFORMERS_OFFLINE='1') self.p=subprocess.Popen(['/opt/conda/bin/python','/task/runtime/worker.py',role],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=self.log,env=env,bufsize=0) os.set_blocking(self.p.stdin.fileno(),False) diff --git a/tasks/join-aware-table-retrieval/tests/grade.py b/tasks/join-aware-table-retrieval/tests/grade.py index e7d9677..4eccc35 100644 --- a/tasks/join-aware-table-retrieval/tests/grade.py +++ b/tasks/join-aware-table-retrieval/tests/grade.py @@ -26,7 +26,8 @@ MAX_LINE = 65536 MAX_INDEX = 8 * 1024**3 ENV = {'HOME': '/home/submission', 'USER': 'submission', 'LOGNAME': 'submission', - 'PATH': '/opt/conda/bin:/usr/local/bin:/usr/bin:/bin', 'LANG': 'C.UTF-8', + 'JAVA_HOME': '/opt/java/openjdk', + 'PATH': '/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin', 'LANG': 'C.UTF-8', 'PYTHONUNBUFFERED': '1', 'OMP_NUM_THREADS': '16', 'OPENBLAS_NUM_THREADS': '16', 'TOKENIZERS_PARALLELISM': 'false', 'TMPDIR': '/work/tmp'} diff --git a/tasks/khmer-embedding-training/tests/grader.py b/tasks/khmer-embedding-training/tests/grader.py index 63c7a10..05a4e82 100755 --- a/tasks/khmer-embedding-training/tests/grader.py +++ b/tasks/khmer-embedding-training/tests/grader.py @@ -75,7 +75,8 @@ def run_stage(user, argv, work, log, timeout): env = { "HOME": str(work), "USER": user, - "PATH": "/opt/conda/bin:/usr/local/bin:/usr/bin:/bin", + "JAVA_HOME": "/opt/java/openjdk", + "PATH": "/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin", "LANG": "C.UTF-8", "TMPDIR": str(work / "tmp"), "HF_HUB_OFFLINE": "1", diff --git a/tasks/large-scale-formula-retrieval/tests/runtime.py b/tasks/large-scale-formula-retrieval/tests/runtime.py index bc47da5..c08c7cd 100644 --- a/tasks/large-scale-formula-retrieval/tests/runtime.py +++ b/tasks/large-scale-formula-retrieval/tests/runtime.py @@ -116,7 +116,8 @@ def sandbox(cpu_ids, work, allow_api=False): def submission_env(work, cpu_ids, allow_api=False): - env = {'PATH': '/opt/conda/bin:/usr/local/bin:/usr/bin:/bin', 'HOME': str(work), + env = {'JAVA_HOME': '/opt/java/openjdk', + 'PATH': '/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin', 'HOME': str(work), 'TMPDIR': str(work), 'XDG_CACHE_HOME': str(work), 'LANG': 'C.UTF-8', 'OMP_NUM_THREADS': str(len(cpu_ids)), 'OPENBLAS_NUM_THREADS': str(len(cpu_ids)), 'MKL_NUM_THREADS': str(len(cpu_ids)), 'OMP_PROC_BIND': 'false', 'KMP_AFFINITY': 'disabled', diff --git a/tasks/layout-page-search/tests/grader.py b/tasks/layout-page-search/tests/grader.py index 37423cc..a1e0a75 100644 --- a/tasks/layout-page-search/tests/grader.py +++ b/tasks/layout-page-search/tests/grader.py @@ -29,7 +29,8 @@ def child_env(): "HOME": "/work/index", "USER": "submission", "LOGNAME": "submission", - "PATH": "/opt/conda/bin:/usr/local/bin:/usr/bin:/bin", + "JAVA_HOME": "/opt/java/openjdk", + "PATH": "/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin", "LANG": "C.UTF-8", "PYTHONUNBUFFERED": "1", "PYTHONDONTWRITEBYTECODE": "1", diff --git a/tasks/legal-stance-retrieval/tests/grader.py b/tasks/legal-stance-retrieval/tests/grader.py index 1676058..51cd11b 100644 --- a/tasks/legal-stance-retrieval/tests/grader.py +++ b/tasks/legal-stance-retrieval/tests/grader.py @@ -129,7 +129,8 @@ def submission_command(command: list[str]) -> list[str]: f"HOME={INDEX_DIR}", "USER=submission", "LOGNAME=submission", - "PATH=/opt/conda/bin:/usr/local/bin:/usr/bin:/bin", + "JAVA_HOME=/opt/java/openjdk", + "PATH=/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin", "LANG=C.UTF-8", "PYTHONUNBUFFERED=1", "PYTHONDONTWRITEBYTECODE=1", diff --git a/tasks/long-document-reranking/tests/grader.py b/tasks/long-document-reranking/tests/grader.py index b063811..e5e30e6 100755 --- a/tasks/long-document-reranking/tests/grader.py +++ b/tasks/long-document-reranking/tests/grader.py @@ -38,7 +38,8 @@ "HOME=/home/submission", "USER=submission", "LOGNAME=submission", - "PATH=/opt/conda/bin:/usr/local/bin:/usr/bin:/bin", + "JAVA_HOME=/opt/java/openjdk", + "PATH=/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin", "LANG=C.UTF-8", "PYTHONUNBUFFERED=1", ] diff --git a/tasks/long-pdf-evidence-vectorless/tests/run_queries.py b/tasks/long-pdf-evidence-vectorless/tests/run_queries.py index 55baaa0..b95a2fe 100644 --- a/tasks/long-pdf-evidence-vectorless/tests/run_queries.py +++ b/tasks/long-pdf-evidence-vectorless/tests/run_queries.py @@ -18,7 +18,8 @@ def submission_env(): env = { "HOME": "/home/submission", "USER": "submission", "LOGNAME": "submission", - "PATH": "/opt/conda/bin:/usr/local/bin:/usr/bin:/bin", "LANG": "C.UTF-8", + "JAVA_HOME": "/opt/java/openjdk", + "PATH": "/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin", "LANG": "C.UTF-8", "PYTHONUNBUFFERED": "1", "TOKENIZERS_PARALLELISM": "false", } for key in ("OPENROUTER_API_KEY", "HTTP_PROXY", "HTTPS_PROXY", diff --git a/tasks/long-pdf-evidence-vectorless/tests/test.sh b/tasks/long-pdf-evidence-vectorless/tests/test.sh index da2e7f3..e92aed7 100755 --- a/tasks/long-pdf-evidence-vectorless/tests/test.sh +++ b/tasks/long-pdf-evidence-vectorless/tests/test.sh @@ -29,7 +29,8 @@ SUBMISSION_COMMAND=( "HOME=/home/submission" "USER=submission" "LOGNAME=submission" - "PATH=/opt/conda/bin:/usr/local/bin:/usr/bin:/bin" + "JAVA_HOME=/opt/java/openjdk" + "PATH=/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin" "LANG=C.UTF-8" "PYTHONUNBUFFERED=1" "TOKENIZERS_PARALLELISM=false" diff --git a/tasks/long-pdf-evidence/tests/run_queries.py b/tasks/long-pdf-evidence/tests/run_queries.py index 6038066..d14f1d4 100644 --- a/tasks/long-pdf-evidence/tests/run_queries.py +++ b/tasks/long-pdf-evidence/tests/run_queries.py @@ -18,7 +18,8 @@ def submission_env(): env = { "HOME": "/home/submission", "USER": "submission", "LOGNAME": "submission", - "PATH": "/opt/conda/bin:/usr/local/bin:/usr/bin:/bin", "LANG": "C.UTF-8", + "JAVA_HOME": "/opt/java/openjdk", + "PATH": "/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin", "LANG": "C.UTF-8", "PYTHONUNBUFFERED": "1", "TOKENIZERS_PARALLELISM": "false", } for key in ("OPENROUTER_API_KEY", "JINA_API_KEY", "HTTP_PROXY", "HTTPS_PROXY", diff --git a/tasks/long-pdf-evidence/tests/test.sh b/tasks/long-pdf-evidence/tests/test.sh index 07e5ccd..6660165 100755 --- a/tasks/long-pdf-evidence/tests/test.sh +++ b/tasks/long-pdf-evidence/tests/test.sh @@ -29,7 +29,8 @@ SUBMISSION_COMMAND=( "HOME=/home/submission" "USER=submission" "LOGNAME=submission" - "PATH=/opt/conda/bin:/usr/local/bin:/usr/bin:/bin" + "JAVA_HOME=/opt/java/openjdk" + "PATH=/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin" "LANG=C.UTF-8" "PYTHONUNBUFFERED=1" "TOKENIZERS_PARALLELISM=false" diff --git a/tasks/memory-constrained-dense-retrieval/tests/grader.py b/tasks/memory-constrained-dense-retrieval/tests/grader.py index ecdc5b6..abea04e 100644 --- a/tasks/memory-constrained-dense-retrieval/tests/grader.py +++ b/tasks/memory-constrained-dense-retrieval/tests/grader.py @@ -66,7 +66,8 @@ f"HOME={INDEX_DIR}", "USER=submission", "LOGNAME=submission", - "PATH=/opt/conda/bin:/usr/local/bin:/usr/bin:/bin", + "JAVA_HOME=/opt/java/openjdk", + "PATH=/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin", "LANG=C.UTF-8", "PYTHONUNBUFFERED=1", "PYTHONDONTWRITEBYTECODE=1", diff --git a/tasks/methodology-inspiration-retrieval/tests/grader.py b/tasks/methodology-inspiration-retrieval/tests/grader.py index d2e7e63..b40bf04 100644 --- a/tasks/methodology-inspiration-retrieval/tests/grader.py +++ b/tasks/methodology-inspiration-retrieval/tests/grader.py @@ -40,7 +40,8 @@ def read_jsonl(path): def child_command(command): - environment = ["PATH=/opt/conda/bin:/usr/local/bin:/usr/bin:/bin", "USER=submission", + environment = ["JAVA_HOME=/opt/java/openjdk", + "PATH=/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin", "USER=submission", "LOGNAME=submission", f"HOME={INDEX}", "LANG=C.UTF-8", "PYTHONUNBUFFERED=1", "PYTHONDONTWRITEBYTECODE=1", "TOKENIZERS_PARALLELISM=false", "OMP_NUM_THREADS=8", "OPENBLAS_NUM_THREADS=8", "HF_HUB_OFFLINE=1", diff --git a/tasks/multilingual-vector-postprocessing/environment/runtime/process.py b/tasks/multilingual-vector-postprocessing/environment/runtime/process.py index 978eea5..e55e3f8 100644 --- a/tasks/multilingual-vector-postprocessing/environment/runtime/process.py +++ b/tasks/multilingual-vector-postprocessing/environment/runtime/process.py @@ -28,7 +28,7 @@ def __init__(self, submission, work, log, deadline, sandbox=False, require_gpu=T work.mkdir(parents=True, exist_ok=True) work.chmod(0o777) environment = {k: os.environ[k] for k in ("PATH", "LD_LIBRARY_PATH", "CUDA_VISIBLE_DEVICES", "NVIDIA_VISIBLE_DEVICES", "NVIDIA_DRIVER_CAPABILITIES", "SEARCH_SWE_VERIFIER_SANDBOX") if k in os.environ} - environment.update(HOME=str(work), TMPDIR=str(work), XDG_CACHE_HOME=str(work / "cache"), + environment.update(JAVA_HOME="/opt/java/openjdk", HOME=str(work), TMPDIR=str(work), XDG_CACHE_HOME=str(work / "cache"), CUDA_CACHE_PATH=str(work / "cuda-cache"), TRITON_CACHE_DIR=str(work / "triton-cache"), OMP_NUM_THREADS="16", OPENBLAS_NUM_THREADS="16", MKL_NUM_THREADS="16", PYTHONNOUSERSITE="1", PYTHONDONTWRITEBYTECODE="1", HF_HUB_OFFLINE="1", TRANSFORMERS_OFFLINE="1") diff --git a/tasks/multilingual-vector-postprocessing/tests/runtime/process.py b/tasks/multilingual-vector-postprocessing/tests/runtime/process.py index 978eea5..e55e3f8 100644 --- a/tasks/multilingual-vector-postprocessing/tests/runtime/process.py +++ b/tasks/multilingual-vector-postprocessing/tests/runtime/process.py @@ -28,7 +28,7 @@ def __init__(self, submission, work, log, deadline, sandbox=False, require_gpu=T work.mkdir(parents=True, exist_ok=True) work.chmod(0o777) environment = {k: os.environ[k] for k in ("PATH", "LD_LIBRARY_PATH", "CUDA_VISIBLE_DEVICES", "NVIDIA_VISIBLE_DEVICES", "NVIDIA_DRIVER_CAPABILITIES", "SEARCH_SWE_VERIFIER_SANDBOX") if k in os.environ} - environment.update(HOME=str(work), TMPDIR=str(work), XDG_CACHE_HOME=str(work / "cache"), + environment.update(JAVA_HOME="/opt/java/openjdk", HOME=str(work), TMPDIR=str(work), XDG_CACHE_HOME=str(work / "cache"), CUDA_CACHE_PATH=str(work / "cuda-cache"), TRITON_CACHE_DIR=str(work / "triton-cache"), OMP_NUM_THREADS="16", OPENBLAS_NUM_THREADS="16", MKL_NUM_THREADS="16", PYTHONNOUSERSITE="1", PYTHONDONTWRITEBYTECODE="1", HF_HUB_OFFLINE="1", TRANSFORMERS_OFFLINE="1") diff --git a/tasks/narrative-clue-search/tests/grader.py b/tasks/narrative-clue-search/tests/grader.py index 61d627b..0666cba 100644 --- a/tasks/narrative-clue-search/tests/grader.py +++ b/tasks/narrative-clue-search/tests/grader.py @@ -29,7 +29,8 @@ def child_env(): "HOME": "/work/index", "USER": "submission", "LOGNAME": "submission", - "PATH": "/opt/conda/bin:/usr/local/bin:/usr/bin:/bin", + "JAVA_HOME": "/opt/java/openjdk", + "PATH": "/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin", "LANG": "C.UTF-8", "PYTHONUNBUFFERED": "1", "PYTHONDONTWRITEBYTECODE": "1", diff --git a/tasks/negative-constraint-retrieval/tests/grader.py b/tasks/negative-constraint-retrieval/tests/grader.py index 2d1a69f..0b5977c 100644 --- a/tasks/negative-constraint-retrieval/tests/grader.py +++ b/tasks/negative-constraint-retrieval/tests/grader.py @@ -161,7 +161,8 @@ def submission_command(command: list[str]) -> list[str]: f"HOME={INDEX_DIR}", "USER=submission", "LOGNAME=submission", - "PATH=/opt/conda/bin:/usr/local/bin:/usr/bin:/bin", + "JAVA_HOME=/opt/java/openjdk", + "PATH=/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin", "LANG=C.UTF-8", "PYTHONUNBUFFERED=1", "PYTHONDONTWRITEBYTECODE=1", diff --git a/tasks/paper-metadata-retrieval/tests/grader.py b/tasks/paper-metadata-retrieval/tests/grader.py index 827868c..8905675 100644 --- a/tasks/paper-metadata-retrieval/tests/grader.py +++ b/tasks/paper-metadata-retrieval/tests/grader.py @@ -119,7 +119,8 @@ def submission_command(command: list[str]) -> list[str]: "HOME=/home/submission", "USER=submission", "LOGNAME=submission", - "PATH=/opt/conda/bin:/usr/local/bin:/usr/bin:/bin", + "JAVA_HOME=/opt/java/openjdk", + "PATH=/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin", "LANG=C.UTF-8", "PYTHONUNBUFFERED=1", "PYTHONDONTWRITEBYTECODE=1", diff --git a/tasks/protein-text-bidirectional-retrieval/environment/runtime/evaluate.py b/tasks/protein-text-bidirectional-retrieval/environment/runtime/evaluate.py index 25b9557..18a9566 100644 --- a/tasks/protein-text-bidirectional-retrieval/environment/runtime/evaluate.py +++ b/tasks/protein-text-bidirectional-retrieval/environment/runtime/evaluate.py @@ -220,7 +220,7 @@ def __init__(self, group, output, resources, phase): self.response_limit = (32 << 20) if phase == 'candidates' else (64 << 10) env = {k: os.environ[k] for k in ['PATH', 'LD_LIBRARY_PATH', 'CUDA_VISIBLE_DEVICES', 'NVIDIA_VISIBLE_DEVICES', 'NVIDIA_DRIVER_CAPABILITIES'] if k in os.environ} - env.update(HOME=str(self.work), TMPDIR=str(self.work), RETRIEVAL_WORK_DIR=str(self.work), + env.update(JAVA_HOME='/opt/java/openjdk', HOME=str(self.work), TMPDIR=str(self.work), RETRIEVAL_WORK_DIR=str(self.work), XDG_CACHE_HOME=str(self.work / 'cache'), HF_HOME=str(self.work / 'hf'), OMP_NUM_THREADS='16', OPENBLAS_NUM_THREADS='16', MKL_NUM_THREADS='16', TOKENIZERS_PARALLELISM='false', PYTHONUNBUFFERED='1', HF_HUB_OFFLINE='1', TRANSFORMERS_OFFLINE='1') diff --git a/tasks/quantity-aware-retrieval/tests/grader.py b/tasks/quantity-aware-retrieval/tests/grader.py index aa6189c..147ccdf 100644 --- a/tasks/quantity-aware-retrieval/tests/grader.py +++ b/tasks/quantity-aware-retrieval/tests/grader.py @@ -41,7 +41,8 @@ def read_jsonl(path): def child_command(command): - environment = ["PATH=/opt/conda/bin:/usr/local/bin:/usr/bin:/bin", "USER=submission", + environment = ["JAVA_HOME=/opt/java/openjdk", + "PATH=/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin", "USER=submission", "LOGNAME=submission", f"HOME={INDEX}", "LANG=C.UTF-8", "PYTHONUNBUFFERED=1", "PYTHONDONTWRITEBYTECODE=1", "TOKENIZERS_PARALLELISM=false", "OMP_NUM_THREADS=2", "OPENBLAS_NUM_THREADS=1", "HF_HUB_OFFLINE=1", diff --git a/tasks/query-encoder-alignment/tests/evaluate.py b/tasks/query-encoder-alignment/tests/evaluate.py index 44f34f9..6cac4ab 100644 --- a/tasks/query-encoder-alignment/tests/evaluate.py +++ b/tasks/query-encoder-alignment/tests/evaluate.py @@ -122,7 +122,8 @@ def main(): os.chown(scratch, 10001, 10001) output = scratch / "results.jsonl" env = {"HOME": str(scratch), "TMPDIR": str(scratch), - "PATH": "/opt/conda/bin:/usr/bin:/bin", "LD_LIBRARY_PATH": "/opt/conda/lib", + "JAVA_HOME": "/opt/java/openjdk", + "PATH": "/opt/conda/bin:/opt/java/openjdk/bin:/usr/bin:/bin", "LD_LIBRARY_PATH": "/opt/conda/lib", "LANG": "C.UTF-8", "LC_ALL": "C.UTF-8", "HF_HUB_OFFLINE": "1", "TRANSFORMERS_OFFLINE": "1", "PYTHONDONTWRITEBYTECODE": "1", "PYTHONUNBUFFERED": "1", "OMP_NUM_THREADS": "8", "OPENBLAS_NUM_THREADS": "8"} diff --git a/tasks/query-encoder-alignment/tests/run_evaluation.sh b/tasks/query-encoder-alignment/tests/run_evaluation.sh index 1480f74..c0c4810 100644 --- a/tasks/query-encoder-alignment/tests/run_evaluation.sh +++ b/tasks/query-encoder-alignment/tests/run_evaluation.sh @@ -1,7 +1,8 @@ #!/usr/bin/env bash set -euo pipefail exec /usr/bin/env -i \ - HOME=/root PATH=/opt/conda/bin:/usr/bin:/bin \ + JAVA_HOME=/opt/java/openjdk \ + HOME=/root PATH=/opt/conda/bin:/opt/java/openjdk/bin:/usr/bin:/bin \ LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64:/opt/conda/lib \ LANG=C.UTF-8 LC_ALL=C.UTF-8 HF_HUB_OFFLINE=1 TRANSFORMERS_OFFLINE=1 \ OMP_NUM_THREADS=8 OPENBLAS_NUM_THREADS=8 PYTHONDONTWRITEBYTECODE=1 \ diff --git a/tasks/reasoning-query-rewriting/tests/grader.py b/tasks/reasoning-query-rewriting/tests/grader.py index ed73df2..07eed87 100644 --- a/tasks/reasoning-query-rewriting/tests/grader.py +++ b/tasks/reasoning-query-rewriting/tests/grader.py @@ -160,7 +160,8 @@ def submission_command(command: list[str]) -> list[str]: f"HOME={INDEX_DIR}", "USER=submission", "LOGNAME=submission", - "PATH=/opt/conda/bin:/usr/local/bin:/usr/bin:/bin", + "JAVA_HOME=/opt/java/openjdk", + "PATH=/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin", "LANG=C.UTF-8", "PYTHONUNBUFFERED=1", "PYTHONDONTWRITEBYTECODE=1", diff --git a/tasks/same-place-image-search/tests/grader.py b/tasks/same-place-image-search/tests/grader.py index fa36e2f..9802369 100644 --- a/tasks/same-place-image-search/tests/grader.py +++ b/tasks/same-place-image-search/tests/grader.py @@ -31,7 +31,8 @@ def child_env(): "HOME": home, "USER": "submission", "LOGNAME": "submission", - "PATH": "/opt/conda/bin:/usr/local/bin:/usr/bin:/bin", + "JAVA_HOME": "/opt/java/openjdk", + "PATH": "/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin", "LANG": "C.UTF-8", "PYTHONUNBUFFERED": "1", "PYTHONDONTWRITEBYTECODE": "1", diff --git a/tasks/scientific-paper-qa/tests/run_queries.py b/tasks/scientific-paper-qa/tests/run_queries.py index bf5ee22..999c993 100644 --- a/tasks/scientific-paper-qa/tests/run_queries.py +++ b/tasks/scientific-paper-qa/tests/run_queries.py @@ -17,7 +17,8 @@ def submission_env(): env = { "HOME": "/home/submission", "USER": "submission", "LOGNAME": "submission", - "PATH": "/opt/conda/bin:/usr/local/bin:/usr/bin:/bin", "LANG": "C.UTF-8", + "JAVA_HOME": "/opt/java/openjdk", + "PATH": "/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin", "LANG": "C.UTF-8", "PYTHONUNBUFFERED": "1", } for key in ("OPENROUTER_API_KEY", "JINA_API_KEY", "HTTP_PROXY", "HTTPS_PROXY", diff --git a/tasks/scientific-paper-qa/tests/test.sh b/tasks/scientific-paper-qa/tests/test.sh index d60f69e..b80cb93 100755 --- a/tasks/scientific-paper-qa/tests/test.sh +++ b/tasks/scientific-paper-qa/tests/test.sh @@ -28,7 +28,8 @@ SUBMISSION_COMMAND=( "HOME=/home/submission" "USER=submission" "LOGNAME=submission" - "PATH=/opt/conda/bin:/usr/local/bin:/usr/bin:/bin" + "JAVA_HOME=/opt/java/openjdk" + "PATH=/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin" "LANG=C.UTF-8" "PYTHONUNBUFFERED=1" "OPENROUTER_API_KEY=${OPENROUTER_API_KEY:-}" diff --git a/tasks/sketch-text-search/tests/grader.py b/tasks/sketch-text-search/tests/grader.py index 3aaa1f6..e1f78e2 100644 --- a/tasks/sketch-text-search/tests/grader.py +++ b/tasks/sketch-text-search/tests/grader.py @@ -31,7 +31,8 @@ def child_env(): "HOME": home, "USER": "submission", "LOGNAME": "submission", - "PATH": "/opt/conda/bin:/usr/local/bin:/usr/bin:/bin", + "JAVA_HOME": "/opt/java/openjdk", + "PATH": "/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin", "LANG": "C.UTF-8", "PYTHONUNBUFFERED": "1", "PYTHONDONTWRITEBYTECODE": "1", diff --git a/tasks/sparse-retrieval-pruning/tests/isolate.py b/tasks/sparse-retrieval-pruning/tests/isolate.py index 8405b62..3bd5b4c 100644 --- a/tasks/sparse-retrieval-pruning/tests/isolate.py +++ b/tasks/sparse-retrieval-pruning/tests/isolate.py @@ -126,7 +126,7 @@ def call(number, *args): def launch(command, readable, writable, cwd, cpu): rules = [(p, READ | READ_DIR | EXECUTE) for p in - ["/usr", "/opt/conda", "/bin", "/lib", "/lib64", "/etc", "/sys/devices/system/cpu"] + ["/usr", "/opt/conda", "/opt/java", "/bin", "/lib", "/lib64", "/etc", "/sys/devices/system/cpu"] if Path(p).exists()] rules += [(str(p), READ | READ_DIR | EXECUTE) for p in readable] rules += [(str(p), ALL) for p in writable] diff --git a/tasks/sparse-retrieval-pruning/tests/run_with_metrics.py b/tasks/sparse-retrieval-pruning/tests/run_with_metrics.py index 164e0a9..3f52b44 100755 --- a/tasks/sparse-retrieval-pruning/tests/run_with_metrics.py +++ b/tasks/sparse-retrieval-pruning/tests/run_with_metrics.py @@ -24,7 +24,8 @@ def stop_members(): def run(command, *, metrics_path, log_prefix, timeout, readable, writable, scratch, cpu): - env = {'PATH': '/opt/conda/bin:/usr/local/bin:/usr/bin:/bin', + env = {'JAVA_HOME': '/opt/java/openjdk', + 'PATH': '/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin', 'HOME': str(scratch), 'TMPDIR': str(scratch), 'LANG': 'C.UTF-8', 'USER': 'submission', 'LOGNAME': 'submission', 'PYTHONUNBUFFERED': '1', 'PYTHONDONTWRITEBYTECODE': '1'} diff --git a/tasks/sparse-retrieval-pruning/tests/test.sh b/tasks/sparse-retrieval-pruning/tests/test.sh index 32898fb..05e2618 100755 --- a/tasks/sparse-retrieval-pruning/tests/test.sh +++ b/tasks/sparse-retrieval-pruning/tests/test.sh @@ -23,7 +23,8 @@ cleanup() { exit "$status" } trap cleanup EXIT -if ! /usr/bin/env -i PATH=/opt/conda/bin:/usr/local/bin:/usr/bin:/bin LANG=C.UTF-8 \ +if ! /usr/bin/env -i PATH=/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin LANG=C.UTF-8 \ + JAVA_HOME=/opt/java/openjdk \ /opt/conda/bin/python /tests/evaluate.py; then exit 1; fi # The trajectory judge is verifier-side and runs only after all submission diff --git a/tasks/spoken-query-search/tests/grader.py b/tasks/spoken-query-search/tests/grader.py index f4cc4d4..c99bd3f 100644 --- a/tasks/spoken-query-search/tests/grader.py +++ b/tasks/spoken-query-search/tests/grader.py @@ -31,7 +31,8 @@ def child_env(): "HOME": home, "USER": "submission", "LOGNAME": "submission", - "PATH": "/opt/conda/bin:/usr/local/bin:/usr/bin:/bin", + "JAVA_HOME": "/opt/java/openjdk", + "PATH": "/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin", "LANG": "C.UTF-8", "PYTHONUNBUFFERED": "1", "PYTHONDONTWRITEBYTECODE": "1", diff --git a/tasks/training-error-tracing/tests/grade.py b/tasks/training-error-tracing/tests/grade.py index 0a7a86e..df771c6 100644 --- a/tasks/training-error-tracing/tests/grade.py +++ b/tasks/training-error-tracing/tests/grade.py @@ -204,7 +204,8 @@ def verify_public_readability(roots, *, write_paths=(), context="Public task inp def candidate_environment(index): - result = {"PATH": "/opt/conda/bin:/usr/local/bin:/usr/bin:/bin", "HOME": str(index / "home"), + result = {"JAVA_HOME": "/opt/java/openjdk", + "PATH": "/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin", "HOME": str(index / "home"), "USER": "submission", "LOGNAME": "submission", "LANG": "C.UTF-8", "TMPDIR": str(index / "tmp"), "XDG_CACHE_HOME": str(index / "cache"), "HF_HOME": str(index / "hf"), "HF_HUB_OFFLINE": "1", "TRANSFORMERS_OFFLINE": "1", diff --git a/tasks/video-moment-search/tests/grader.py b/tasks/video-moment-search/tests/grader.py index 9dd72c1..e7059ed 100644 --- a/tasks/video-moment-search/tests/grader.py +++ b/tasks/video-moment-search/tests/grader.py @@ -31,7 +31,8 @@ def child_env(): "HOME": home, "USER": "submission", "LOGNAME": "submission", - "PATH": "/opt/conda/bin:/usr/local/bin:/usr/bin:/bin", + "JAVA_HOME": "/opt/java/openjdk", + "PATH": "/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin", "LANG": "C.UTF-8", "PYTHONUNBUFFERED": "1", "PYTHONDONTWRITEBYTECODE": "1", diff --git a/tasks/visual-document-qa/tests/grader.py b/tasks/visual-document-qa/tests/grader.py index dbc0bde..8174974 100644 --- a/tasks/visual-document-qa/tests/grader.py +++ b/tasks/visual-document-qa/tests/grader.py @@ -40,7 +40,8 @@ def child_env(): "HOME": "/work/index", "USER": "submission", "LOGNAME": "submission", - "PATH": "/opt/conda/bin:/usr/local/bin:/usr/bin:/bin", + "JAVA_HOME": "/opt/java/openjdk", + "PATH": "/opt/conda/bin:/opt/java/openjdk/bin:/usr/local/bin:/usr/bin:/bin", "LANG": "C.UTF-8", "PYTHONUNBUFFERED": "1", "PYTHONDONTWRITEBYTECODE": "1", diff --git a/tests/unit/test_submission_java.py b/tests/unit/test_submission_java.py new file mode 100644 index 0000000..0daafe1 --- /dev/null +++ b/tests/unit/test_submission_java.py @@ -0,0 +1,80 @@ +"""Exercise task environment builders without importing or running their graders.""" + +import ast +import inspect +import os +from pathlib import Path +import unittest +from unittest.mock import patch + + +ROOT = Path(__file__).resolve().parents[2] +JAVA_HOME = "/opt/java/openjdk" +BUILDERS = {"submission_env", "child_env", "candidate_environment", + "submission_command", "child_command"} + + +def environment_builders(): + for path in sorted((ROOT / "tasks").glob("*/tests/*.py")): + tree = ast.parse(path.read_text(), filename=str(path)) + functions = [node for node in tree.body + if isinstance(node, ast.FunctionDef) and node.name in BUILDERS] + if not functions: + continue + namespace = {"os": os, "Path": Path, "INDEX": Path("/work/index"), + "INDEX_DIR": Path("/work/index"), "QUERY_PHASE": False} + for node in tree.body: + if isinstance(node, ast.Assign): + for target in node.targets: + if isinstance(target, ast.Name) and target.id in { + "AGENT_API_NAMES", "BUILD_API_NAMES", "ENV", "SUBMISSION_USER", + }: + namespace[target.id] = ast.literal_eval(node.value) + # Loading just these functions avoids grader imports, data reads and setup. + future = ast.ImportFrom(module="__future__", names=[ast.alias(name="annotations")], level=0) + module = ast.fix_missing_locations(ast.Module(body=[future, *functions], type_ignores=[])) + exec(compile(module, str(path), "exec"), namespace) + for function in functions: + yield path, namespace[function.name] + + +def submission_environment(function, query_phase): + work = Path("/tmp/java-runtime-fixture") + arguments = {"home": work, "index": work, "work": work, "runtime": work, + "cpu_ids": [0, 1], "allow_api": not query_phase, "answer": query_phase, + "command": ["/bin/true"]} + function.__globals__["QUERY_PHASE"] = query_phase + result = function(**{name: arguments[name] for name in inspect.signature(function).parameters}) + if isinstance(result, dict): + return result + # Command builders launch env -i after dropping privileges. + environment = {} + for argument in result[result.index("-i") + 1:]: + if "=" not in argument: + break + key, value = argument.split("=", 1) + environment[key] = value + return environment + + +class SubmissionJavaTests(unittest.TestCase): + def test_java_is_available_without_forwarding_private_credentials(self): + builders = list(environment_builders()) + self.assertTrue(builders) + parent = {"PATH": f"/opt/conda/bin:{JAVA_HOME}/bin:/usr/local/bin:/usr/bin:/bin", + "JAVA_HOME": "/unrelated-parent-java", + "OPENAI_API_KEY": "coding-fixture", "OPENAI_BASE_URL": "https://private.invalid", + "VERIFIER_OPENAI_API_KEY": "judge-fixture", "UNRELATED_SECRET": "private-fixture"} + for path, function in builders: + for query_phase in (False, True): + with self.subTest(task=path.parent.parent.name, function=function.__name__, + query_phase=query_phase), patch.dict(os.environ, parent, clear=True): + environment = submission_environment(function, query_phase) + self.assertEqual(environment["JAVA_HOME"], JAVA_HOME) + self.assertIn(f"{JAVA_HOME}/bin", environment["PATH"].split(":")) + for key in parent.keys() - {"PATH", "JAVA_HOME"}: + self.assertNotIn(key, environment) + + +if __name__ == "__main__": + unittest.main()