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;
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;
-- 
slurm-users mailing list -- slurm-users@lists.schedmd.com
To unsubscribe send an email to slurm-users-le...@lists.schedmd.com

Reply via email to