core: implicitly create a per-template slice for all instantiated units by default

If no explicit slice is configured for an instantiated unit, create an
implicit one for all instances of the same template.
This commit is contained in:
Lennart Poettering 2013-07-11 03:52:43 +02:00
parent e2ca86cf78
commit a883394464

View file

@ -2030,6 +2030,8 @@ char *unit_default_cgroup_path(Unit *u) {
}
int unit_add_default_slice(Unit *u) {
_cleanup_free_ char *b = NULL;
const char *slice_name;
Unit *slice;
int r;
@ -2041,7 +2043,38 @@ int unit_add_default_slice(Unit *u) {
if (!unit_get_cgroup_context(u))
return 0;
r = manager_load_unit(u->manager, u->manager->running_as == SYSTEMD_SYSTEM ? SPECIAL_SYSTEM_SLICE : SPECIAL_ROOT_SLICE, NULL, NULL, &slice);
if (u->instance) {
_cleanup_free_ char *prefix = NULL, *escaped = NULL;
;
/* Implicitly place all instantiated units in their
* own per-template slice */
prefix = unit_name_to_prefix(u->id);
if (!prefix)
return -ENOMEM;
/* The prefix is already escaped, but it might include
* "-" which has a special meaning for slice units,
* hence escape it here extra. */
escaped = strreplace(prefix, "-", "\\x2d");
if (!escaped)
return -ENOMEM;
if (u->manager->running_as == SYSTEMD_SYSTEM)
b = strjoin("system-", escaped, ".slice", NULL);
else
b = strappend(escaped, ".slice");
if (!b)
return -ENOMEM;
slice_name = b;
} else
slice_name =
u->manager->running_as == SYSTEMD_SYSTEM
? SPECIAL_SYSTEM_SLICE
: SPECIAL_ROOT_SLICE;
r = manager_load_unit(u->manager, slice_name, NULL, NULL, &slice);
if (r < 0)
return r;