Skip to content

Commit 3636e74

Browse files
swillnergiovtorres
authored andcommitted
Add ntasks and cpus_per_task options, fix db_conn in slurmdb_jobs (#146)
* Fix ntasks job option,work_dir job option and slurmdb_jobs db connection * Add options involving ntasks_set and cpus_set * Use db_conn of class and fix cleanup * Merge slurmdb_jobs.__free into slurmdb_jobs.__dealloc__ * Add num_tasks output * Add simple test for submitting with ntasks and cpus_per_task
1 parent 3f16419 commit 3636e74

File tree

2 files changed

+43
-19
lines changed

2 files changed

+43
-19
lines changed

pyslurm/pyslurm.pyx

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2182,6 +2182,7 @@ cdef class job:
21822182
Job_dict[u'ntasks_per_board'] = self._record.ntasks_per_board
21832183
Job_dict[u'num_cpus'] = self._record.num_cpus
21842184
Job_dict[u'num_nodes'] = self._record.num_nodes
2185+
Job_dict[u'num_tasks'] = self._record.num_tasks
21852186

21862187
if self._record.pack_job_id:
21872188
Job_dict[u'pack_job_id'] = self._record.pack_job_id
@@ -2580,6 +2581,7 @@ cdef class job:
25802581
wckey = job_opts.get("wckey").encode("UTF-8", "replace")
25812582
desc.wckey = wckey
25822583

2584+
# TODO when nodelist is set, min_nodes needs to be adjusted accordingly
25832585
if job_opts.get("nodelist"):
25842586
req_nodes = job_opts.get("nodelist").encode("UTF-8", "replace")
25852587
desc.req_nodes = req_nodes
@@ -2601,7 +2603,12 @@ cdef class job:
26012603
licenses = job_opts.get("licenses").encode("UTF-8", "replace")
26022604
desc.licenses = licenses
26032605

2604-
# TODO: nodes_set
2606+
if job_opts.get("min_nodes"):
2607+
desc.min_nodes = job_opts.get("min_nodes")
2608+
if job_opts.get("max_nodes"):
2609+
desc.max_nodes = job_opts.get("max_nodes")
2610+
elif "ntasks" in job_opts and job_opts.get("min_nodes") == 0:
2611+
desc.min_nodes = 0
26052612

26062613
if job_opts.get("ntasks_per_node"):
26072614
ntasks_per_node = job_opts.get("ntasks_per_node")
@@ -2732,20 +2739,22 @@ cdef class job:
27322739
if job_opts.get("tmpdisk"):
27332740
desc.pn_min_tmp_disk = job_opts.get("tmpdisk")
27342741

2735-
# TODO: declare and use MAX macro or use python max()?
2736-
# if job_opts.get("overcommit"):
2737-
# desc.min_cpus = max(job_opts.get("min_nodes", 1)
2738-
# desc.overcommit = job_opts.get("overcommit")
2739-
# elif job_opts.get("cpus_set"):
2740-
# # TODO: cpus_set
2741-
# # check for ntasks and cpus_per_task before multiplying
2742-
# desc.min_cpus = job_opts.get("ntasks") * job_opts.get("cpus_per_task")
2743-
# elif job_opts.get("nodes_set") and job_opts.get("min_nodes") == 0:
2744-
# desc.min_cpus = 0
2745-
# else:
2746-
# desc.min_cpus = job_opts.get("ntasks")
2747-
2748-
# TODO: ntasks_set, cpus_set
2742+
if job_opts.get("overcommit"):
2743+
desc.min_cpus = max(job_opts.get("min_nodes", 1), 1)
2744+
desc.overcommit = job_opts.get("overcommit")
2745+
elif job_opts.get("cpus_per_task"):
2746+
desc.min_cpus = job_opts.get("ntasks", 1) * job_opts.get("cpus_per_task")
2747+
elif job_opts.get("nodelist") and job_opts.get("min_nodes") == 0:
2748+
desc.min_cpus = 0
2749+
else:
2750+
desc.min_cpus = job_opts.get("ntasks", 1)
2751+
2752+
if job_opts.get("cpus_per_task"):
2753+
desc.cpus_per_task = job_opts.get("cpus_per_task")
2754+
2755+
if job_opts.get("ntasks"):
2756+
desc.num_tasks = job_opts.get("ntasks")
2757+
27492758
if job_opts.get("ntasks_per_socket"):
27502759
desc.ntasks_per_socket = job_opts.get("ntasks_per_socket")
27512760

@@ -2833,8 +2842,13 @@ cdef class job:
28332842

28342843
# FIXME: should this be python's getcwd or C's getcwd?
28352844
# also, allow option to specify work_dir, if not, set default
2836-
cwd = os.getcwd().encode("UTF-8", "replace")
2837-
desc.work_dir = cwd
2845+
2846+
if job_opts.get("work_dir"):
2847+
work_dir = job_opts.get("work_dir").encode("UTF-8", "replace")
2848+
desc.work_dir = work_dir
2849+
else:
2850+
cwd = os.getcwd().encode("UTF-8", "replace")
2851+
desc.work_dir = cwd
28382852

28392853
if job_opts.get("requeue"):
28402854
desc.requeue = job_opts.get("requeue")
@@ -5561,9 +5575,11 @@ cdef class slurmdb_jobs:
55615575

55625576
def __cinit__(self):
55635577
self.job_cond = <slurm.slurmdb_job_cond_t *>slurm.xmalloc(sizeof(slurm.slurmdb_job_cond_t))
5578+
self.db_conn = slurm.slurmdb_connection_get()
55645579

55655580
def __dealloc__(self):
5566-
pass
5581+
slurm.xfree(self.job_cond)
5582+
slurm.slurmdb_connection_close(&self.db_conn)
55675583

55685584
def get(self, jobids=[], starttime=0, endtime=0):
55695585
u"""Get Slurmdb information about some jobs.

tests/test-job.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,17 @@
77

88
def test_job_submit():
99
"""Job: Test job().submit_batch_job()."""
10-
test_job = {"wrap": "sleep 3600", "job_name": "pyslurm_test_job"}
10+
test_job = {
11+
"wrap": "sleep 3600",
12+
"job_name": "pyslurm_test_job",
13+
"ntasks": 2,
14+
"cpus_per_task": 3,
15+
}
1116
test_job_id = pyslurm.job().submit_batch_job(test_job)
1217
test_job_search = pyslurm.job().find(name="name", val="pyslurm_test_job")
1318
assert_true(test_job_id in test_job_search)
19+
assert_equals(test_job_search["cpus_per_task"], 3)
20+
assert_equals(test_job_search["num_tasks"], 2)
1421

1522

1623
def test_job_get():
@@ -58,6 +65,7 @@ def test_job_scontrol():
5865
assert_equals(test_job_info["nice"], int(sctl_dict["Nice"]))
5966
assert_equals(test_job_info["num_cpus"], int(sctl_dict["NumCPUs"]))
6067
assert_equals(test_job_info["num_nodes"], int(sctl_dict["NumNodes"]))
68+
assert_equals(test_job_info["num_tasks"], int(sctl_dict["NumTasks"]))
6169
assert_equals(test_job_info["partition"], sctl_dict["Partition"])
6270
assert_equals(test_job_info["priority"], int(sctl_dict["Priority"]))
6371
assert_equals(test_job_info["state_reason"], sctl_dict["Reason"])

0 commit comments

Comments
 (0)