Skip to content

Commit 874bf8d

Browse files
authored
Merge pull request #6533 from hjoliver/fix-job-runner-mgr
Fix unlinking old job out/err files.
2 parents ab0042a + 2dcea16 commit 874bf8d

File tree

2 files changed

+61
-6
lines changed

2 files changed

+61
-6
lines changed

cylc/flow/job_runner_mgr.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -373,14 +373,15 @@ def job_kill(self, st_file_path):
373373

374374
@classmethod
375375
def _create_nn(cls, job_file_path):
376-
"""Create NN symbolic link, if necessary.
376+
"""Create NN symbolic link if necessary, and remove any old job logs.
377+
378+
If NN => 01, remove numbered dirs with submit numbers greater than 01.
377379
378-
If NN => 01, remove numbered directories with submit numbers greater
379-
than 01.
380380
Helper for "self._job_submit_impl".
381381
382382
"""
383383
job_file_dir = os.path.dirname(job_file_path)
384+
384385
source = os.path.basename(job_file_dir)
385386
task_log_dir = os.path.dirname(job_file_dir)
386387
nn_path = os.path.join(task_log_dir, "NN")
@@ -393,6 +394,7 @@ def _create_nn(cls, job_file_path):
393394
old_source = None
394395
if old_source is None:
395396
os.symlink(source, nn_path)
397+
396398
# On submit 1, remove any left over digit directories from prev runs
397399
if source == "01":
398400
for name in os.listdir(task_log_dir):
@@ -401,6 +403,11 @@ def _create_nn(cls, job_file_path):
401403
rmtree(
402404
os.path.join(task_log_dir, name), ignore_errors=True)
403405

406+
# Delete old job logs if necessary
407+
for name in JOB_LOG_ERR, JOB_LOG_OUT:
408+
with suppress(FileNotFoundError):
409+
os.unlink(os.path.join(job_file_dir, name))
410+
404411
@classmethod
405412
def _filter_submit_output(cls, st_file_path, job_runner, out, err):
406413
"""Filter submit command output, if relevant."""
@@ -567,9 +574,6 @@ def _job_submit_impl(
567574

568575
# Create NN symbolic link, if necessary
569576
self._create_nn(job_file_path)
570-
for name in JOB_LOG_ERR, JOB_LOG_OUT:
571-
with suppress(OSError):
572-
os.unlink(os.path.join(job_file_path, name))
573577

574578
# Start new status file
575579
with open(f"{job_file_path}.status", "w") as job_status_file:

tests/integration/test_job_runner_mgr.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from cylc.flow.pathutil import get_workflow_run_job_dir
2525
from cylc.flow.task_state import TASK_STATUS_RUNNING
2626
from cylc.flow.subprocctx import SubProcContext
27+
from cylc.flow.task_job_logs import JOB_LOG_OUT, JOB_LOG_ERR
2728

2829

2930
async def test_kill_error(one, start, test_dir, capsys, log_filter):
@@ -82,3 +83,53 @@ async def test_kill_error(one, start, test_dir, capsys, log_filter):
8283
level=logging.WARNING,
8384
)
8485
assert itask.state(TASK_STATUS_RUNNING)
86+
87+
88+
async def test_create_nn_new(one, start):
89+
"""Test _create_nn.
90+
91+
It should create the NN symlink.
92+
"""
93+
async with start(one):
94+
itask = one.pool.get_tasks()[0]
95+
96+
workflow_job_log_dir = Path(get_workflow_run_job_dir(one.workflow))
97+
job_id = itask.tokens.duplicate(job='01').relative_id
98+
job_log_dir = Path(workflow_job_log_dir, job_id)
99+
job_log_dir.mkdir(parents=True)
100+
101+
# call _create_nn
102+
JobRunnerManager()._create_nn(job_log_dir / 'job')
103+
104+
# check the symlink exists
105+
assert (job_log_dir.parent / "NN").is_symlink()
106+
107+
108+
async def test_create_nn_old(one, start):
109+
"""Test _create_nn.
110+
111+
It should remove existing job logs, if the dir already exists.
112+
"""
113+
async with start(one):
114+
itask = one.pool.get_tasks()[0]
115+
116+
# fake some old job logs
117+
workflow_job_log_dir = Path(get_workflow_run_job_dir(one.workflow))
118+
job_id = itask.tokens.duplicate(job='01').relative_id
119+
job_log_dir = Path(workflow_job_log_dir, job_id)
120+
job_log_dir.mkdir(parents=True)
121+
122+
job_logs = []
123+
for name in JOB_LOG_OUT, JOB_LOG_ERR:
124+
job_logs.append(job_log_dir / name)
125+
126+
# create the logs
127+
for job_log in job_logs:
128+
job_log.touch()
129+
130+
# call _create_nn
131+
JobRunnerManager()._create_nn(job_log_dir / 'job')
132+
133+
# check they were removed
134+
for job_log in job_logs:
135+
assert not job_log.is_file()

0 commit comments

Comments
 (0)