Skip to content

Commit 118c89f

Browse files
authored
fix Sandbox.archive() (#1678)
1 parent c3659b8 commit 118c89f

File tree

5 files changed

+29
-24
lines changed

5 files changed

+29
-24
lines changed

cms/grading/Sandbox.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -743,17 +743,16 @@ def cleanup(self, delete: bool = False):
743743
# Delete the working directory.
744744
rmtree(self._outer_dir)
745745

746-
def archive(self) -> str | None:
746+
def archive(self, file_cacher: FileCacher) -> str | None:
747747
"""Archive the directory where the sandbox operated.
748748
749749
Stores the archived sandbox in the file cacher and returns its digest.
750750
Returns None if archiving failed.
751751
752+
file_cacher: the FileCacher instance to use.
752753
"""
753754
logger.info("Archiving sandbox in %s.", self.get_root_path())
754755

755-
assert self.file_cacher is not None
756-
757756
with tempfile.TemporaryFile(dir=self.temp_dir) as sandbox_archive:
758757
# Archive the working directory
759758
content_path = self.get_root_path()
@@ -766,7 +765,7 @@ def archive(self) -> str | None:
766765

767766
# Put archive to FS
768767
sandbox_archive.seek(0)
769-
return self.file_cacher.put_file_from_fobj(
768+
return file_cacher.put_file_from_fobj(
770769
sandbox_archive, "Sandbox %s" % self.get_root_path()
771770
)
772771

cms/grading/tasktypes/Batch.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import os
2626

2727
from cms.db import Executable
28+
from cms.db.filecacher import FileCacher
29+
from cms.grading.Job import CompilationJob, EvaluationJob
2830
from cms.grading.ParameterTypes import ParameterTypeCollection, \
2931
ParameterTypeChoice, ParameterTypeString
3032
from cms.grading.language import Language
@@ -196,15 +198,15 @@ def _executable_filename(codenames: Iterable[str], language: Language) -> str:
196198
for codename in codenames))
197199
return name + language.executable_extension
198200

199-
def _do_compile(self, job, file_cacher):
201+
def _do_compile(self, job: CompilationJob, file_cacher: FileCacher):
200202
language = get_language(job.language)
201203
source_ext = language.source_extension
202204

203205
# Create the list of filenames to be passed to the compiler. If we use
204206
# a grader, it needs to be in first position in the command line, and
205207
# we check that it exists.
206-
filenames_to_compile = []
207-
filenames_and_digests_to_get = {}
208+
filenames_to_compile: list[str] = []
209+
filenames_and_digests_to_get: dict[str, str] = {}
208210
# The grader, that must have been provided (copy and add to
209211
# compilation).
210212
if self._uses_grader():
@@ -258,16 +260,16 @@ def _do_compile(self, job, file_cacher):
258260
Executable(executable_filename, digest)
259261

260262
# Cleanup.
261-
delete_sandbox(sandbox, job)
263+
delete_sandbox(sandbox, job, file_cacher)
262264

263-
def compile(self, job, file_cacher):
265+
def compile(self, job: CompilationJob, file_cacher: FileCacher):
264266
"""See TaskType.compile."""
265267
if not check_files_number(job, 1, or_more=True):
266268
return
267269

268270
self._do_compile(job, file_cacher)
269271

270-
def _execution_step(self, job, file_cacher):
272+
def _execution_step(self, job: EvaluationJob, file_cacher: FileCacher):
271273
# Prepare the execution
272274
executable_filename = next(iter(job.executables.keys()))
273275
language = get_language(job.language)
@@ -385,7 +387,7 @@ def _evaluate_step(self, job, file_cacher, output_file_params, outcome, text, st
385387
job.admin_text = admin_text
386388

387389
if sandbox is not None:
388-
delete_sandbox(sandbox, job)
390+
delete_sandbox(sandbox, job, file_cacher)
389391

390392
def evaluate(self, job, file_cacher):
391393
"""See TaskType.evaluate."""

cms/grading/tasktypes/Communication.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030

3131
from cms import config, rmtree
3232
from cms.db import Executable
33+
from cms.db.filecacher import FileCacher
34+
from cms.grading.Job import CompilationJob, EvaluationJob
3335
from cms.grading.ParameterTypes import ParameterTypeChoice, ParameterTypeInt
3436
from cms.grading.Sandbox import wait_without_std, Sandbox
3537
from cms.grading.language import Language
@@ -181,7 +183,7 @@ def _executable_filename(codenames: Iterable[str], language: Language) -> str:
181183
for codename in codenames))
182184
return name + language.executable_extension
183185

184-
def compile(self, job, file_cacher):
186+
def compile(self, job: CompilationJob, file_cacher: FileCacher):
185187
"""See TaskType.compile."""
186188
language = get_language(job.language)
187189
source_ext = language.source_extension
@@ -243,9 +245,9 @@ def compile(self, job, file_cacher):
243245
Executable(executable_filename, digest)
244246

245247
# Cleanup.
246-
delete_sandbox(sandbox, job)
248+
delete_sandbox(sandbox, job, file_cacher)
247249

248-
def evaluate(self, job, file_cacher):
250+
def evaluate(self, job: EvaluationJob, file_cacher: FileCacher):
249251
"""See TaskType.evaluate."""
250252
if not check_executables_number(job, 1):
251253
return
@@ -439,9 +441,9 @@ def evaluate(self, job, file_cacher):
439441
job.plus = stats_user
440442
job.admin_text = admin_text
441443

442-
delete_sandbox(sandbox_mgr, job)
444+
delete_sandbox(sandbox_mgr, job, file_cacher)
443445
for s in sandbox_user:
444-
delete_sandbox(s, job)
446+
delete_sandbox(s, job, file_cacher)
445447
if job.success and not config.worker.keep_sandbox and not job.keep_sandbox:
446448
for d in fifo_dir:
447449
rmtree(d)

cms/grading/tasktypes/TwoSteps.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828

2929
from cms import config
3030
from cms.db import Executable
31+
from cms.db.filecacher import FileCacher
32+
from cms.grading.Job import CompilationJob, EvaluationJob
3133
from cms.grading.ParameterTypes import ParameterTypeChoice
3234
from cms.grading.Sandbox import wait_without_std
3335
from cms.grading.languagemanager import LANGUAGES, get_language
@@ -138,7 +140,7 @@ def get_auto_managers(self):
138140
def _uses_checker(self) -> bool:
139141
return self.output_eval == TwoSteps.OUTPUT_EVAL_CHECKER
140142

141-
def compile(self, job, file_cacher):
143+
def compile(self, job: CompilationJob, file_cacher: FileCacher):
142144
"""See TaskType.compile."""
143145
language = get_language(job.language)
144146
source_ext = language.source_extension
@@ -211,9 +213,9 @@ def compile(self, job, file_cacher):
211213
Executable(executable_filename, digest)
212214

213215
# Cleanup
214-
delete_sandbox(sandbox, job)
216+
delete_sandbox(sandbox, job, file_cacher)
215217

216-
def evaluate(self, job, file_cacher):
218+
def evaluate(self, job: EvaluationJob, file_cacher: FileCacher):
217219
"""See TaskType.evaluate."""
218220
if not check_executables_number(job, 1):
219221
return
@@ -352,5 +354,5 @@ def evaluate(self, job, file_cacher):
352354
job.admin_text = admin_text
353355
job.plus = stats
354356

355-
delete_sandbox(first_sandbox, job)
356-
delete_sandbox(second_sandbox, job)
357+
delete_sandbox(first_sandbox, job, file_cacher)
358+
delete_sandbox(second_sandbox, job, file_cacher)

cms/grading/tasktypes/util.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def create_sandbox(box_index: int, file_cacher: FileCacher, name: str | None = N
7171
return sandbox
7272

7373

74-
def delete_sandbox(sandbox: Sandbox, job: Job, success: bool | None = None):
74+
def delete_sandbox(sandbox: Sandbox, job: Job, file_cacher: FileCacher, success: bool | None = None):
7575
"""Delete the sandbox, if the configuration and job was ok.
7676
7777
sandbox: the sandbox to delete.
@@ -85,7 +85,7 @@ def delete_sandbox(sandbox: Sandbox, job: Job, success: bool | None = None):
8585

8686
# Archive the sandbox if required
8787
if job.archive_sandbox:
88-
sandbox_digest = sandbox.archive()
88+
sandbox_digest = sandbox.archive(file_cacher)
8989
if sandbox_digest is not None:
9090
job.sandbox_digests[sandbox.get_root_path()] = sandbox_digest
9191

@@ -282,7 +282,7 @@ def eval_output(
282282
sandbox, file_cacher, checker_digest, job.input, job.output,
283283
EVAL_USER_OUTPUT_FILENAME, extra_args)
284284

285-
delete_sandbox(sandbox, job, success)
285+
delete_sandbox(sandbox, job, file_cacher, success)
286286
return success, outcome, text, admin_text
287287

288288
else:

0 commit comments

Comments
 (0)