Skip to content

Commit 711acb7

Browse files
authored
Merge pull request #266 from vkarak/bugfix/serial-policy-crash
Fix serial execution policy crash on keyboard interrupt
2 parents 74ef999 + 09e71ee commit 711acb7

File tree

3 files changed

+24
-20
lines changed

3 files changed

+24
-20
lines changed

reframe/frontend/executors/__init__.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ def abort(self, cause=None):
110110
try:
111111
# FIXME: we should perhaps extend the RegressionTest interface
112112
# for supporting job cancelling
113-
if not self.zombie:
113+
if not self.zombie and self._check.job:
114114
self._check.job.cancel()
115115
except JobNotStartedError:
116116
self.fail((type(exc), exc, None))
@@ -212,10 +212,10 @@ def _retry_failed(self, checks, system):
212212
self._current_run += 1
213213
self._stats.next_run()
214214
if self._stats.current_run != self._current_run:
215-
raise AssertionError('current_run variable out of sync'
216-
'(Runner: %d; TestStats: %d)' %
217-
self._current_run,
218-
self._stats.current_run)
215+
raise AssertionError('current_run variable out of sync'
216+
'(Runner: %d; TestStats: %d)' %
217+
self._current_run,
218+
self._stats.current_run)
219219

220220
self._printer.separator(
221221
'short double line',

unittests/resources/frontend_checks.py

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,6 @@ def setup(self, system, environ, **job_opts):
3131

3232

3333
class BadSetupCheckEarly(BaseFrontendCheck):
34-
def __init__(self, **kwargs):
35-
super().__init__(type(self).__name__, **kwargs)
36-
37-
self.valid_systems = ['*']
38-
self.valid_prog_environs = ['*']
39-
40-
def setup(self, system, environ, **job_opts):
41-
raise ReframeError('Setup failure')
42-
43-
44-
class BadSetupCheckEarlyNonLocal(BaseFrontendCheck):
4534
def __init__(self, **kwargs):
4635
super().__init__(type(self).__name__, **kwargs)
4736
self.valid_systems = ['*']
@@ -111,10 +100,11 @@ def __init__(self, phase='wait', **kwargs):
111100
self.phase = phase
112101

113102
def setup(self, system, environ, **job_opts):
114-
super().setup(system, environ, **job_opts)
115103
if self.phase == 'setup':
116104
raise KeyboardInterrupt
117105

106+
super().setup(system, environ, **job_opts)
107+
118108
def wait(self):
119109
# We do our nasty stuff in wait() to make things more complicated
120110
if self.phase == 'wait':
@@ -176,7 +166,7 @@ def __init__(self, run_to_pass, filename, **kwargs):
176166
def _get_checks(**kwargs):
177167
return [BadSetupCheck(**kwargs),
178168
BadSetupCheckEarly(**kwargs),
179-
BadSetupCheckEarlyNonLocal(**kwargs),
169+
KeyboardInterruptCheck(phase='setup', **kwargs),
180170
NoSystemCheck(**kwargs),
181171
NoPrgEnvCheck(**kwargs),
182172
SanityFailureCheck(**kwargs),

unittests/test_cli.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,10 +168,22 @@ def test_check_failure(self):
168168

169169
def test_check_setup_failure(self):
170170
self.checkpath = ['unittests/resources/frontend_checks.py']
171-
self.more_options = ['-t', 'BadSetupCheckEarlyNonLocal']
171+
self.more_options = ['-t', 'BadSetupCheckEarly']
172172
self.local = False
173173

174174
returncode, stdout, stderr = self._run_reframe()
175+
self.assertNotIn('Traceback', stdout)
176+
self.assertNotIn('Traceback', stderr)
177+
self.assertIn('FAILED', stdout)
178+
self.assertNotEqual(returncode, 0)
179+
180+
def test_check_kbd_interrupt(self):
181+
self.checkpath = ['unittests/resources/frontend_checks.py']
182+
self.more_options = ['-t', 'KeyboardInterruptCheck']
183+
self.local = False
184+
185+
returncode, stdout, stderr = self._run_reframe()
186+
self.assertNotIn('Traceback', stdout)
175187
self.assertNotIn('Traceback', stderr)
176188
self.assertIn('FAILED', stdout)
177189
self.assertNotEqual(returncode, 0)
@@ -184,6 +196,7 @@ def test_check_sanity_failure(self):
184196
self.assertIn('FAILED', stdout)
185197

186198
# This is a normal failure, it should not raise any exception
199+
self.assertNotIn('Traceback', stdout)
187200
self.assertNotIn('Traceback', stderr)
188201
self.assertNotEqual(returncode, 0)
189202
self.assertTrue(self._stage_exists('SanityFailureCheck',
@@ -197,6 +210,7 @@ def test_performance_check_failure(self):
197210
self.assertIn('FAILED', stdout)
198211

199212
# This is a normal failure, it should not raise any exception
213+
self.assertNotIn('Traceback', stdout)
200214
self.assertNotIn('Traceback', stderr)
201215
self.assertNotEqual(0, returncode)
202216
self.assertTrue(self._stage_exists('PerformanceFailureCheck',
@@ -284,6 +298,7 @@ def test_execution_modes(self):
284298
self.mode = 'unittest'
285299

286300
returncode, stdout, stderr = self._run_reframe()
301+
self.assertNotIn('Traceback', stdout)
287302
self.assertNotIn('Traceback', stderr)
288303
self.assertNotIn('FAILED', stdout)
289304
self.assertIn('PASSED', stdout)
@@ -302,4 +317,3 @@ def test_no_ignore_check_conflicts(self):
302317
self.action = 'list'
303318
returncode, *_ = self._run_reframe()
304319
self.assertNotEqual(0, returncode)
305-

0 commit comments

Comments
 (0)