Skip to content

Commit 68be363

Browse files
committed
Define JobStatus and make query_job_status return a JobStatus
1 parent ff9ab2a commit 68be363

File tree

1 file changed

+37
-38
lines changed

1 file changed

+37
-38
lines changed

batchspawner/batchspawner.py

Lines changed: 37 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424

2525
import xml.etree.ElementTree as ET
2626

27+
from enum import Enum
28+
2729
from jinja2 import Template
2830

2931
from tornado import gen
@@ -55,6 +57,11 @@ def format_template(template, *args, **kwargs):
5557
return Template(template).render(*args, **kwargs)
5658
return template.format(*args, **kwargs)
5759

60+
class JobStatus(Enum):
61+
NOTQUEUED = 0
62+
RUNNING = 1
63+
PENDING = 2
64+
UNKNOWN = 3
5865

5966
class BatchSpawnerBase(Spawner):
6067
"""Base class for spawners using resource manager batch job submission mechanisms
@@ -264,9 +271,8 @@ async def submit_batch_script(self):
264271

265272
async def query_job_status(self):
266273
if self.job_id is None or len(self.job_id) == 0:
267-
# job not running
268274
self.job_status = ''
269-
return self.job_status
275+
return JobStatus.NOTQUEUED
270276
subvars = self.get_req_subvars()
271277
subvars['job_id'] = self.job_id
272278
cmd = ' '.join((format_template(self.exec_prefix, **subvars),
@@ -279,8 +285,15 @@ async def query_job_status(self):
279285
except Exception as e:
280286
self.log.error('Error querying job ' + self.job_id)
281287
self.job_status = ''
282-
finally:
283-
return self.job_status
288+
289+
if self.state_isrunning():
290+
return JobStatus.RUNNING
291+
elif self.state_ispending():
292+
return JobStatus.PENDING
293+
elif self.state_isunknown():
294+
return JobStatus.UNKNOWN
295+
else:
296+
return JobStatus.NOTQUEUED
284297

285298
batch_cancel_cmd = Unicode('',
286299
help="Command to stop/cancel a previously submitted job. Formatted like batch_query_cmd."
@@ -337,16 +350,10 @@ def state_gethost(self):
337350

338351
async def poll(self):
339352
"""Poll the process"""
340-
if self.job_id is not None and len(self.job_id) > 0:
341-
await self.query_job_status()
342-
if self.state_isrunning() or self.state_ispending() or self.state_isunknown():
343-
return None
344-
else:
345-
self.clear_state()
346-
return 1
347-
348-
if not self.job_id:
349-
# no job id means it's not running
353+
status = await self.query_job_status()
354+
if status in (JobStatus.PENDING, JobStatus.RUNNING, JobStatus.UNKNOWN):
355+
return None
356+
else:
350357
self.clear_state()
351358
return 1
352359

@@ -371,18 +378,19 @@ async def start(self):
371378
if len(self.job_id) == 0:
372379
raise RuntimeError("Jupyter batch job submission failure (no jobid in output)")
373380
while True:
374-
await self.query_job_status()
375-
if self.state_isrunning():
381+
status = await self.query_job_status()
382+
if status == JobStatus.RUNNING:
376383
break
384+
elif status == JobStatus.PENDING:
385+
self.log.debug('Job ' + self.job_id + ' still pending')
386+
elif status == JobStatus.UNKNOWN:
387+
self.log.debug('Job ' + self.job_id + ' still unknown')
377388
else:
378-
if self.state_ispending():
379-
self.log.debug('Job ' + self.job_id + ' still pending')
380-
else:
381-
self.log.warning('Job ' + self.job_id + ' neither pending nor running.\n' +
382-
self.job_status)
383-
raise RuntimeError('The Jupyter batch job has disappeared'
384-
' while pending in the queue or died immediately'
385-
' after starting.')
389+
self.log.warning('Job ' + self.job_id + ' neither pending nor running.\n' +
390+
self.job_status)
391+
raise RuntimeError('The Jupyter batch job has disappeared'
392+
' while pending in the queue or died immediately'
393+
' after starting.')
386394
await gen.sleep(self.startup_poll_interval)
387395

388396
self.ip = self.state_gethost()
@@ -415,8 +423,8 @@ async def stop(self, now=False):
415423
if now:
416424
return
417425
for i in range(10):
418-
await self.query_job_status()
419-
if not self.state_isrunning() and not self.state_isunknown():
426+
status = await self.query_job_status()
427+
if not status in (JobStatus.RUNNING, JobStatus.UNKNOWN):
420428
return
421429
await gen.sleep(1.0)
422430
if self.job_id:
@@ -477,24 +485,15 @@ class BatchSpawnerRegexStates(BatchSpawnerBase):
477485

478486
def state_ispending(self):
479487
assert self.state_pending_re, "Misconfigured: define state_running_re"
480-
if self.job_status and re.search(self.state_pending_re, self.job_status):
481-
return True
482-
else:
483-
return False
488+
return self.job_status and re.search(self.state_pending_re, self.job_status)
484489

485490
def state_isrunning(self):
486491
assert self.state_running_re, "Misconfigured: define state_running_re"
487-
if self.job_status and re.search(self.state_running_re, self.job_status):
488-
return True
489-
else:
490-
return False
492+
return self.job_status and re.search(self.state_running_re, self.job_status)
491493

492494
def state_isunknown(self):
493495
assert self.state_unknown_re, "Misconfigured: define state_unknown_re"
494-
if self.job_status and re.search(self.state_unknown_re, self.job_status):
495-
return True
496-
else:
497-
return False
496+
return self.job_status and re.search(self.state_unknown_re, self.job_status)
498497

499498
def state_gethost(self):
500499
assert self.state_exechost_re, "Misconfigured: define state_exechost_re"

0 commit comments

Comments
 (0)