[slurm-users] cgroup issue on non-systemd system

11 views
Skip to first unread message

Rafał Lalik via slurm-users

unread,
Jun 14, 2024, 7:18:42 PMJun 14
to slurm...@lists.schedmd.com
Hello,

per documentation, it is possible to run slurm on non systemd system with IgnoreSystemd=yes in cgroup.conf.

However I had an error with slurmd:

error: common_file_write_content: unable to open '/sys/fs/cgroup/system.slice/cgroup.subtree_control' for writing: No such file or directory
error: Cannot enable cpuset in /sys/fs/cgroup/system.slice/cgroup.subtree_control: No such file or directory
error: common_file_write_content: unable to open '/sys/fs/cgroup/system.slice/cgroup.subtree_control' for writing: No such file or directory
error: Cannot enable memory in /sys/fs/cgroup/system.slice/cgroup.subtree_control: No such file or directory
error: common_file_write_content: unable to open '/sys/fs/cgroup/system.slice/cgroup.subtree_control' for writing: No such file or directory
error: Cannot enable cpu in /sys/fs/cgroup/system.slice/cgroup.subtree_control: No such file or directory
error: Could not create scope directory /sys/fs/cgroup/system.slice/slurmstepd.scope: No such file or directory
error: Couldn't load specified plugin name for cgroup/v2: Plugin init() callback failed
error: cannot create cgroup context for cgroup/v2
error: Unable to initialize cgroup plugin
error: slurmd initialization failed


I could link it to the fact that '/sys/fs/cgroup/system.slice' does not exists when creating '/sys/fs/cgroup/system.slice/slurmstepd.scope' subdir.

I propose small patch to the slurm which allows to create the path recursively (aka `mkdir -p` from shell):
(also here: https://github.com/rlalik/slurm/tree/recurse_mkdir)


diff --git a/src/plugins/cgroup/v2/cgroup_v2.c b/src/plugins/cgroup/v2/cgroup_v2.c
index a18b9e62bd..6b7e2a2e4a 100644
--- a/src/plugins/cgroup/v2/cgroup_v2.c
+++ b/src/plugins/cgroup/v2/cgroup_v2.c
@@ -743,11 +743,40 @@ static int _init_stepd_system_scope(pid_t pid)
return SLURM_SUCCESS;
}

+/* This create path recursively.*/
+bool recurse_mkdir(const char *dirname, int mode)
+{
+ const char *p = dirname;
+ char *temp = calloc(1, strlen(dirname)+1);
+ int ret = 0;
+
+ while ((p = strchr(p, '/')) != NULL) {
+ /* Skip empty elements. Could be just multiple separators
+ * which is okay. */
+ if (p != dirname && *(p-1) == '/') {
+ p++;
+ continue;
+ }
+ /* Put the path up to this point into a temporary to
+ * pass to the make directory function. */
+ memcpy(temp, dirname, p-dirname);
+ temp[p-dirname] = '\0';
+ p++;
+ if ((ret = mkdir(temp, mode)) != 0) {
+ if (errno != EEXIST) {
+ break;
+ }
+ }
+ }
+ free(temp);
+ return ret;
+}
+
static int _init_new_scope(char *scope_path)
{
int rc;

- rc = mkdir(scope_path, 0755);
+ rc = recurse_mkdir(scope_path, 0755);
if (rc && (errno != EEXIST)) {
error("Could not create scope directory %s: %m", scope_path);
return SLURM_ERROR;
recurse_mkdir.patch
Reply all
Reply to author
Forward
0 new messages