chiark / gitweb /
nspawn: suffix the nspawn cgroups with ".nspawn"
authorLennart Poettering <lennart@poettering.net>
Mon, 22 Apr 2013 20:26:06 +0000 (17:26 -0300)
committerLennart Poettering <lennart@poettering.net>
Tue, 23 Apr 2013 02:14:12 +0000 (23:14 -0300)
As discussed with Dan Berrange it's a good idea to suffix all objects in
the cgroup tree with ".something", so that when the system is
partitioned using a resource management tool we can drop objects of
different types into the same partition directory without generate
namespace conflicts.

We'l add this to the Pax Control Group document as soon as write access
to the fdo wiki is restored.

src/nspawn/nspawn.c
src/shared/cgroup-util.c
src/test/test-cgroup-util.c

index 0a5a151202f0a7c652b6464ff93aed82b826ab7c..1e7df38c16c54340c05713e77267af1b70335e2c 100644 (file)
@@ -1298,7 +1298,7 @@ int main(int argc, char *argv[]) {
                 goto finish;
         }
 
-        newcg = strjoin(machine_root, "/", arg_machine, NULL);
+        newcg = strjoin(machine_root, "/", arg_machine, ".nspawn", NULL);
         if (!newcg) {
                 log_error("Failed to allocate cgroup path.");
                 goto finish;
index 5d44342bbe1647be0f7726ec10892b8c88998a20..e54b94658c0e73a0d9c447f70d71b0be6c48c839 100644 (file)
@@ -1320,7 +1320,7 @@ int cg_pid_get_user_unit(pid_t pid, char **unit) {
 
 int cg_path_get_machine_name(const char *path, char **machine) {
         const char *e, *n;
-        char *s;
+        char *s, *dot;
 
         assert(path);
         assert(machine);
@@ -1337,6 +1337,10 @@ int cg_path_get_machine_name(const char *path, char **machine) {
         if (!s)
                 return -ENOMEM;
 
+        dot = strrchr(s, '.');
+        if (dot)
+                *dot = 0;
+
         *machine = s;
         return 0;
 }
index 5eaa129418d3142998da70104476d571eb9c8031..f632df11eb0ca319d7281a99e00f0109e27ed71e 100644 (file)
@@ -89,11 +89,51 @@ static void test_get_paths(void) {
         log_info("Machine = %s", d);
 }
 
+static void test_proc(void) {
+        _cleanup_closedir_ DIR *d = NULL;
+        struct dirent *de;
+        int r;
+
+        d = opendir("/proc");
+        assert_se(d);
+
+        FOREACH_DIRENT(de, d, break) {
+                _cleanup_free_ char *path = NULL, *path_shifted = NULL, *session = NULL, *unit = NULL, *user_unit = NULL, *machine = NULL, *prefix = NULL;
+                pid_t pid;
+
+                if (de->d_type != DT_DIR &&
+                    de->d_type != DT_UNKNOWN)
+                        continue;
+
+                r = parse_pid(de->d_name, &pid);
+                if (r < 0)
+                        continue;
+
+                cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, pid, &path);
+                cg_pid_get_path_shifted(pid, &prefix, &path_shifted);
+                cg_pid_get_session(pid, &session);
+                cg_pid_get_unit(pid, &unit);
+                cg_pid_get_user_unit(pid, &user_unit);
+                cg_pid_get_machine_name(pid, &machine);
+
+                printf("%lu\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",
+                       (unsigned long) pid,
+                       path,
+                       prefix,
+                       path_shifted,
+                       session,
+                       unit,
+                       user_unit,
+                       machine);
+        }
+}
+
 int main(void) {
         test_path_decode_unit();
         test_path_get_unit();
         test_path_get_user_unit();
         test_get_paths();
+        test_proc();
 
         return 0;
 }