Skip to content

Commit af7f04b

Browse files
committed
add debug flags, fs dampening factor and logging level RPCs
1 parent 8c5af16 commit af7f04b

File tree

3 files changed

+208
-3
lines changed

3 files changed

+208
-3
lines changed

pyslurm/core/slurmctld.pxd

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ from pyslurm.slurm cimport (
3535
slurm_shutdown,
3636
slurm_ping,
3737
slurm_takeover,
38+
slurm_set_debugflags,
39+
slurm_set_debug_level,
40+
slurm_set_schedlog_level,
41+
slurm_set_fs_dampeningfactor,
3842
ping_all_controllers,
3943
controller_ping_t,
4044
cpu_bind_type_t,

pyslurm/core/slurmctld.pyx

Lines changed: 203 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,192 @@ def takeover(index = 1):
186186
verify_rpc(slurm_takeover(index))
187187

188188

189+
def add_debug_flags(flags):
190+
"""Add DebugFlags to slurmctld
191+
192+
Args:
193+
flags (list):
194+
For an available list of possible values, please check the
195+
`slurm.conf` documentation under `DebugFlags`.
196+
197+
Raises:
198+
(pyslurm.RPCError): When setting the debug flags was not successful.
199+
200+
Examples:
201+
>>> from pyslurm import slurmctld
202+
>>> slurmctld.add_debug_flags(["CpuFrequency"])
203+
"""
204+
if not flags:
205+
return
206+
207+
data = _debug_flags_str_to_int(flags)
208+
if not data:
209+
raise RPCError(msg="Invalid Debug Flags specified.")
210+
211+
verify_rpc(slurm_set_debugflags(data, 0))
212+
213+
214+
def remove_debug_flags(flags):
215+
"""Remove DebugFlags from slurmctld.
216+
217+
Args:
218+
flags (list):
219+
For an available list of possible values, please check the
220+
`slurm.conf` documentation under `DebugFlags`.
221+
222+
Raises:
223+
(pyslurm.RPCError): When removing the debug flags was not successful.
224+
225+
Examples:
226+
>>> from pyslurm import slurmctld
227+
>>> slurmctld.remove_debug_flags(["CpuFrequency"])
228+
"""
229+
if not flags:
230+
return
231+
232+
data = _debug_flags_str_to_int(flags)
233+
if not data:
234+
raise RPCError(msg="Invalid Debug Flags specified.")
235+
236+
verify_rpc(slurm_set_debugflags(0, data))
237+
238+
239+
def clear_debug_flags():
240+
"""Remove all currently set debug flags from slurmctld.
241+
242+
Raises:
243+
(pyslurm.RPCError): When removing the debug flags was not successful.
244+
245+
Examples:
246+
>>> from pyslurm import slurmctld
247+
>>> slurmctld.clear_debug_flags()
248+
"""
249+
current_flags = get_debug_flags()
250+
if not current_flags:
251+
return
252+
253+
data = _debug_flags_str_to_int(current_flags)
254+
verify_rpc(slurm_set_debugflags(0, data))
255+
256+
257+
def get_debug_flags():
258+
"""Get the current list of debug flags for the slurmctld.
259+
260+
Raises:
261+
(pyslurm.RPCError): When getting the debug flags was not successful.
262+
263+
Examples:
264+
>>> from pyslurm import slurmctld
265+
>>> flags = slurmctld.get_debug_flags()
266+
>>> print(flags)
267+
['CpuFrequency', 'Backfill']
268+
"""
269+
return Config.load().debug_flags
270+
271+
272+
def set_log_level(level):
273+
"""Set the logging level for slurmctld.
274+
275+
Args:
276+
level (str):
277+
For an available list of possible values, please check the
278+
`slurm.conf` documentation under `SlurmctldDebug`.
279+
280+
Raises:
281+
(pyslurm.RPCError): When setting the log level was not successful.
282+
283+
Examples:
284+
>>> from pyslurm import slurmctld
285+
>>> slurmctld.set_log_level("quiet")
286+
"""
287+
data = _log_level_str_to_int(level)
288+
verify_rpc(slurm_set_debug_level(data))
289+
290+
291+
def get_log_level():
292+
"""Get the current log level for the slurmctld.
293+
294+
Raises:
295+
(pyslurm.RPCError): When getting the log level was not successful.
296+
297+
Examples:
298+
>>> from pyslurm import slurmctld
299+
>>> level = slurmctld.get_log_level()
300+
>>> print(level)
301+
quiet
302+
"""
303+
return Config.load().slurmctld_log_level
304+
305+
306+
def enable_scheduler_logging():
307+
"""Enable scheduler logging for slurmctld.
308+
309+
Raises:
310+
(pyslurm.RPCError): When enabling scheduler logging was not successful.
311+
312+
Examples:
313+
>>> from pyslurm import slurmctld
314+
>>> slurmctld.enable_scheduler_logging()
315+
"""
316+
verify_rpc(slurm_set_schedlog_level(1))
317+
318+
319+
def is_scheduler_logging_enabled():
320+
"""Check whether scheduler logging is enabled for slurmctld.
321+
322+
Returns:
323+
(bool): Whether scheduler logging is enabled or not.
324+
325+
Raises:
326+
(pyslurm.RPCError): When getting the scheduler logging was not
327+
successful.
328+
329+
Examples:
330+
>>> from pyslurm import slurmctld
331+
>>> print(slurmctld.is_scheduler_logging_enabled())
332+
False
333+
"""
334+
return Config.load().scheduler_logging
335+
336+
337+
def set_fair_share_dampening_factor(factor):
338+
"""Set the FairShare Dampening factor.
339+
340+
Args:
341+
factor (int):
342+
The factor to set. A minimum value of `1`, and a maximum value of
343+
`65535` are allowed.
344+
345+
Raises:
346+
(pyslurm.RPCError): When setting the factor was not successful.
347+
348+
Examples:
349+
>>> from pyslurm import slurmctld
350+
>>> slurmctld.set_fair_share_dampening_factor(100)
351+
"""
352+
max_value = (2 ** 16) - 1
353+
if not factor or factor >= max_value:
354+
raise RPCError(msg=f"Invalid Dampening factor: {factor}. "
355+
f"Factor must be between 0 and {max_value}.")
356+
357+
verify_rpc(slurm_set_fs_dampeningfactor(factor))
358+
359+
360+
def get_fair_share_dampening_factor():
361+
"""Get the currently set FairShare Dampening factor.
362+
363+
Raises:
364+
(pyslurm.RPCError): When getting the factor was not successful.
365+
366+
Examples:
367+
>>> from pyslurm import slurmctld
368+
>>> factor = slurmctld.get_fair_share_dampening_factor()
369+
>>> print(factor)
370+
100
371+
"""
372+
return Config.load().fair_share_dampening_factor
373+
374+
189375
cdef class MPIConfig:
190376

191377
def __init__(self):
@@ -1022,8 +1208,8 @@ cdef class Config:
10221208
return cstr.to_unicode(self.ptr.sched_logfile)
10231209

10241210
@property
1025-
def scheduler_log_level(self):
1026-
return u16_parse(self.ptr.sched_log_level, zero_is_noval=False)
1211+
def scheduler_logging(self):
1212+
return u16_parse_bool(self.ptr.sched_log_level)
10271213

10281214
@property
10291215
def scheduler_parameters(self):
@@ -1344,7 +1530,13 @@ def _debug_flags_int_to_list(flags):
13441530

13451531

13461532
def _debug_flags_str_to_int(flags):
1347-
pass
1533+
cdef:
1534+
uint64_t flags_num = 0
1535+
char *flags_str = NULL
1536+
1537+
flags_str = cstr.from_unicode(cstr.list_to_str(flags))
1538+
slurm.debug_str2flags(flags_str, &flags_num)
1539+
return flags_num
13481540

13491541

13501542
# https://github.com/SchedMD/slurm/blob/01a3aac7c59c9b32a9dd4e395aa5a97a8aea4f08/slurm/slurm.h#L621
@@ -1432,6 +1624,14 @@ def _log_level_int_to_str(flags):
14321624
return data
14331625

14341626

1627+
def _log_level_str_to_int(level):
1628+
cdef uint16_t data = slurm.log_string2num(str(level))
1629+
if u16_parse(data, zero_is_noval=False) is None:
1630+
raise RPCError(msg=f"Invalid Log level: {level}.")
1631+
1632+
return data
1633+
1634+
14351635
def _acct_store_flags_int_to_str(flags):
14361636
cdef list out = []
14371637

pyslurm/slurm/extra.pxi

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,7 @@ cdef extern char *priority_flags_string(uint16_t priority_flags)
314314
cdef extern char* prolog_flags2str(uint16_t prolog_flags)
315315
cdef extern uint16_t prolog_str2flags(char *prolog_flags)
316316
cdef extern char *log_num2string(uint16_t inx)
317+
cdef extern uint16_t log_string2num(const char *name)
317318
cdef extern char *private_data_string(uint16_t private_data, char *str, int str_len)
318319
cdef extern char *reconfig_flags2str(uint16_t reconfig_flags)
319320
cdef extern uint16_t reconfig_str2flags(char *reconfig_flags)

0 commit comments

Comments
 (0)