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