cgroup: simplify how instantiated units are mapped to cgroups
Previously for an instantiated unit foo@bar.service we created a cgroup foo@.service/foo@bar.service, in order to place all instances of the same template inside the same subtree. As we now implicitly add all instantiated units into one per-template slice we don't need this complexity anymore, and instance units can map directly to the cgroups of their full name.
This commit is contained in:
parent
8a84192905
commit
d7bd3de065
|
@ -1991,7 +1991,7 @@ char *unit_dbus_path(Unit *u) {
|
||||||
}
|
}
|
||||||
|
|
||||||
char *unit_default_cgroup_path(Unit *u) {
|
char *unit_default_cgroup_path(Unit *u) {
|
||||||
_cleanup_free_ char *escaped_instance = NULL, *slice = NULL;
|
_cleanup_free_ char *escaped = NULL, *slice = NULL;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
assert(u);
|
assert(u);
|
||||||
|
@ -2005,28 +2005,14 @@ char *unit_default_cgroup_path(Unit *u) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
escaped_instance = cg_escape(u->id);
|
escaped = cg_escape(u->id);
|
||||||
if (!escaped_instance)
|
if (!escaped)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (u->instance) {
|
if (slice)
|
||||||
_cleanup_free_ char *t = NULL, *escaped_template = NULL;
|
return strjoin(u->manager->cgroup_root, "/", slice, "/", escaped, NULL);
|
||||||
|
else
|
||||||
t = unit_name_template(u->id);
|
return strjoin(u->manager->cgroup_root, "/", escaped, NULL);
|
||||||
if (!t)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
escaped_template = cg_escape(t);
|
|
||||||
if (!escaped_template)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
return strjoin(u->manager->cgroup_root, "/",
|
|
||||||
slice ? slice : "", slice ? "/" : "",
|
|
||||||
escaped_template, "/", escaped_instance, NULL);
|
|
||||||
} else
|
|
||||||
return strjoin(u->manager->cgroup_root, "/",
|
|
||||||
slice ? slice : "", slice ? "/" : "",
|
|
||||||
escaped_instance, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int unit_add_default_slice(Unit *u) {
|
int unit_add_default_slice(Unit *u) {
|
||||||
|
|
|
@ -1126,7 +1126,7 @@ int cg_pid_get_path_shifted(pid_t pid, char **root, char **cgroup) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int cg_path_decode_unit(const char *cgroup, char **unit){
|
int cg_path_decode_unit(const char *cgroup, char **unit){
|
||||||
char *p, *e, *c, *s, *k;
|
char *e, *c, *s;
|
||||||
|
|
||||||
assert(cgroup);
|
assert(cgroup);
|
||||||
assert(unit);
|
assert(unit);
|
||||||
|
@ -1135,28 +1135,10 @@ int cg_path_decode_unit(const char *cgroup, char **unit){
|
||||||
c = strndupa(cgroup, e - cgroup);
|
c = strndupa(cgroup, e - cgroup);
|
||||||
c = cg_unescape(c);
|
c = cg_unescape(c);
|
||||||
|
|
||||||
/* Could this be a valid unit name? */
|
if (!unit_name_is_valid(c, false))
|
||||||
if (!unit_name_is_valid(c, true))
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (!unit_name_is_template(c))
|
s = strdup(c);
|
||||||
s = strdup(c);
|
|
||||||
else {
|
|
||||||
if (*e != '/')
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
e += strspn(e, "/");
|
|
||||||
|
|
||||||
p = strchrnul(e, '/');
|
|
||||||
k = strndupa(e, p - e);
|
|
||||||
k = cg_unescape(k);
|
|
||||||
|
|
||||||
if (!unit_name_is_valid(k, false))
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
s = strdup(k);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!s)
|
if (!s)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
|
|
@ -32,12 +32,15 @@ static void check_p_d_u(const char *path, int code, const char *result) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_path_decode_unit(void) {
|
static void test_path_decode_unit(void) {
|
||||||
check_p_d_u("getty@.service/getty@tty2.service", 0, "getty@tty2.service");
|
check_p_d_u("getty@tty2.service", 0, "getty@tty2.service");
|
||||||
check_p_d_u("getty@.service/getty@tty2.service/xxx", 0, "getty@tty2.service");
|
check_p_d_u("getty@tty2.service/", 0, "getty@tty2.service");
|
||||||
|
check_p_d_u("getty@tty2.service/xxx", 0, "getty@tty2.service");
|
||||||
check_p_d_u("getty@.service/", -EINVAL, NULL);
|
check_p_d_u("getty@.service/", -EINVAL, NULL);
|
||||||
check_p_d_u("getty@.service", -EINVAL, NULL);
|
check_p_d_u("getty@.service", -EINVAL, NULL);
|
||||||
check_p_d_u("getty.service", 0, "getty.service");
|
check_p_d_u("getty.service", 0, "getty.service");
|
||||||
check_p_d_u("getty", -EINVAL, NULL);
|
check_p_d_u("getty", -EINVAL, NULL);
|
||||||
|
check_p_d_u("getty/waldo", -EINVAL, NULL);
|
||||||
|
check_p_d_u("_cpu.service", 0, "cpu.service");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_p_g_u(const char *path, int code, const char *result) {
|
static void check_p_g_u(const char *path, int code, const char *result) {
|
||||||
|
@ -49,13 +52,14 @@ static void check_p_g_u(const char *path, int code, const char *result) {
|
||||||
|
|
||||||
static void test_path_get_unit(void) {
|
static void test_path_get_unit(void) {
|
||||||
check_p_g_u("/system.slice/foobar.service/sdfdsaf", 0, "foobar.service");
|
check_p_g_u("/system.slice/foobar.service/sdfdsaf", 0, "foobar.service");
|
||||||
check_p_g_u("/system.slice/getty@.service/getty@tty5.service", 0, "getty@tty5.service");
|
check_p_g_u("/system.slice/getty@tty5.service", 0, "getty@tty5.service");
|
||||||
check_p_g_u("/system.slice/getty@.service/getty@tty5.service/aaa/bbb", 0, "getty@tty5.service");
|
check_p_g_u("/system.slice/getty@tty5.service/aaa/bbb", 0, "getty@tty5.service");
|
||||||
check_p_g_u("/system.slice/getty@.service/getty@tty5.service/", 0, "getty@tty5.service");
|
check_p_g_u("/system.slice/getty@tty5.service/", 0, "getty@tty5.service");
|
||||||
check_p_g_u("/system.slice/getty@tty6.service/tty5", 0, "getty@tty6.service");
|
check_p_g_u("/system.slice/getty@tty6.service/tty5", 0, "getty@tty6.service");
|
||||||
check_p_g_u("sadfdsafsda", -EINVAL, NULL);
|
check_p_g_u("sadfdsafsda", -EINVAL, NULL);
|
||||||
check_p_g_u("/system.slice/getty####@tty6.service/tty5", -EINVAL, NULL);
|
check_p_g_u("/system.slice/getty####@tty6.service/xxx", -EINVAL, NULL);
|
||||||
check_p_g_u("/system.slice/system-waldo.slice/foobar.service/sdfdsaf", 0, "foobar.service");
|
check_p_g_u("/system.slice/system-waldo.slice/foobar.service/sdfdsaf", 0, "foobar.service");
|
||||||
|
check_p_g_u("/system.slice/system-waldo.slice/_cpu.service/sdfdsaf", 0, "cpu.service");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_p_g_u_u(const char *path, int code, const char *result) {
|
static void check_p_g_u_u(const char *path, int code, const char *result) {
|
||||||
|
@ -71,10 +75,11 @@ static void test_path_get_user_unit(void) {
|
||||||
check_p_g_u_u("/user.slice/user-1002.slice/session-2.scope/foobar.service/waldo", 0, "foobar.service");
|
check_p_g_u_u("/user.slice/user-1002.slice/session-2.scope/foobar.service/waldo", 0, "foobar.service");
|
||||||
check_p_g_u_u("/user.slice/user-1000.slice/session-2.scope/foobar.service/waldo/uuuux", 0, "foobar.service");
|
check_p_g_u_u("/user.slice/user-1000.slice/session-2.scope/foobar.service/waldo/uuuux", 0, "foobar.service");
|
||||||
check_p_g_u_u("/user.slice/user-1000.slice/session-2.scope/waldo/waldo/uuuux", -EINVAL, NULL);
|
check_p_g_u_u("/user.slice/user-1000.slice/session-2.scope/waldo/waldo/uuuux", -EINVAL, NULL);
|
||||||
check_p_g_u_u("/user.slice/user-1000.slice/session-2.scope/foobar@.service/foobar@pie.service/pa/po", 0, "foobar@pie.service");
|
check_p_g_u_u("/user.slice/user-1000.slice/session-2.scope/foobar@pie.service/pa/po", 0, "foobar@pie.service");
|
||||||
check_p_g_u_u("/session-2.scope/foobar@.service/foobar@pie.service/pa/po", 0, "foobar@pie.service");
|
check_p_g_u_u("/session-2.scope/foobar@pie.service/pa/po", 0, "foobar@pie.service");
|
||||||
check_p_g_u_u("/xyz.slice/xyz-waldo.slice/session-77.scope/foobar@.service/foobar@pie.service/pa/po", 0, "foobar@pie.service");
|
check_p_g_u_u("/xyz.slice/xyz-waldo.slice/session-77.scope/foobar@pie.service/pa/po", 0, "foobar@pie.service");
|
||||||
check_p_g_u_u("/meh.service", -ENOENT, NULL);
|
check_p_g_u_u("/meh.service", -ENOENT, NULL);
|
||||||
|
check_p_g_u_u("/session-3.scope/_cpu.service", 0, "cpu.service");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_p_g_s(const char *path, int code, const char *result) {
|
static void check_p_g_s(const char *path, int code, const char *result) {
|
||||||
|
|
Loading…
Reference in a new issue