<div dir="ltr"><div class="gmail_quote">libvzctl generates map dynamically by iterating through the known<br>
list and looking up actual mount points, however p.haul just uses<br>
hardcoded map. Due to difference in algorithms they might generate<br>
different maps which leads to migration failure. Libvzctl treats &quot;ve&quot; and</div><div class="gmail_quote">&quot;beancounter&quot; as private, and skips them, thus they are omitted now.</div><div class="gmail_quote">
<br>
Signed-off-by: Pavel Vokhmyanin &lt;<a href="mailto:pvokhmyanin@virtuozzo.com">pvokhmyanin@virtuozzo.com</a>&gt;<br>
---<br>
 phaul/p_haul_vz.py | 49 ++++++++++++++++++++++++++++++<wbr>++++---------------<br>
 1 file changed, 34 insertions(+), 15 deletions(-)<br>
<br>
diff --git a/phaul/p_haul_vz.py b/phaul/p_haul_vz.py<br>
index a7dacd8..9f66da7 100644<br>
--- a/phaul/p_haul_vz.py<br>
+++ b/phaul/p_haul_vz.py<br>
@@ -23,18 +23,16 @@ cgexec_bin = &quot;cgexec&quot;<br>
<br>
<br>
 vz_cgroup_mount_map = {<br>
-       &quot;/sys/fs/cgroup/cpu,cpuacct&quot;: &quot;cpu&quot;,<br>
-       &quot;/sys/fs/cgroup/cpuset&quot;: &quot;cpuset&quot;,<br>
-       &quot;/sys/fs/cgroup/net_cls&quot;: &quot;net_cls&quot;,<br>
-       &quot;/sys/fs/cgroup/memory&quot;: &quot;memory&quot;,<br>
-       &quot;/sys/fs/cgroup/devices&quot;: &quot;devices&quot;,<br>
-       &quot;/sys/fs/cgroup/blkio&quot;: &quot;blkio&quot;,<br>
-       &quot;/sys/fs/cgroup/freezer&quot;: &quot;freezer&quot;,<br>
-       &quot;/sys/fs/cgroup/beancounter&quot;: &quot;beancounter&quot;,<br>
-       &quot;/sys/fs/cgroup/ve&quot;: &quot;ve&quot;,<br>
-       &quot;/sys/fs/cgroup/perf_event&quot;: &quot;perf_event&quot;,<br>
-       &quot;/sys/fs/cgroup/hugetlb&quot;: &quot;hugetlb&quot;,<br>
-       &quot;/sys/fs/cgroup/systemd&quot;: &quot;systemd&quot;,<br>
+       &quot;cpu,cpuacct&quot;: &quot;cpu&quot;,<br>
+       &quot;cpuset&quot;: &quot;cpuset&quot;,<br>
+       &quot;net_cls&quot;: &quot;net_cls&quot;,<br>
+       &quot;memory&quot;: &quot;memory&quot;,<br>
+       &quot;devices&quot;: &quot;devices&quot;,<br>
+       &quot;blkio&quot;: &quot;blkio&quot;,<br>
+       &quot;freezer&quot;: &quot;freezer&quot;,<br>
+       &quot;perf_event&quot;: &quot;perf_event&quot;,<br>
+       &quot;hugetlb&quot;: &quot;hugetlb&quot;,<br>
+       &quot;systemd&quot;: &quot;systemd&quot;,<br>
 }<br>
<br>
<br>
@@ -129,7 +127,6 @@ class p_haul_type(object):<br>
<br>
        def adjust_criu_req(self, req):<br>
                &quot;&quot;&quot;Add module-specific options to criu request&quot;&quot;&quot;<br>
-<br>
                # Specify dump specific options<br>
                if req.type == pycriu.rpc.DUMP:<br>
<br>
@@ -140,8 +137,7 @@ class p_haul_type(object):<br>
                        req.opts.manage_cgroups = True<br>
<br>
                        # Setup mapping for external Virtuozzo specific cgroup mounts<br>
-                       for key, value in vz_cgroup_mount_map.items():<br>
-                               req.opts.ext_mnt.add(key=key, val=value)<br>
+                       self.__fill_vz_cgroup_ext_<wbr>mount_map(req)<br>
<br>
                        # Specify secondary ploop disks as external<br>
                        disks = self.__parse_secondary_disks_<wbr>arg(self.__secondary_disks)<br>
@@ -162,6 +158,29 @@ class p_haul_type(object):<br>
                        # Increase timeout up to 180 seconds<br>
                        req.opts.timeout = 180<br>
<br>
+       def __fill_vz_cgroup_ext_mount_<wbr>map(self, req):<br>
+               with open(&quot;/proc/self/mountinfo&quot;) as x:<br>
+                       mountinfo = x.readlines()<br>
+               # Walk cgroups maps<br>
+               for cgkey in vz_cgroup_mount_map:<br>
+<br>
+                       # If key consists of two cgroups (e.g.&quot;cpu,cpuacct&quot;), walk each<br>
+                       for cgname in cgkey.split(&quot;,&quot;):<br>
+<br>
+                               # Substite &quot;systemd&quot; with &quot;name=systemd&quot; option<br>
+                               if cgname == &quot;systemd&quot;:<br>
+                                       cgname = &quot;name=systemd&quot;<br>
+<br>
+                               # Iterate through lines in mountinfo until we find a match<br>
+                               for buf in mountinfo:<br>
+                                       mi_line = buf.split()<br>
+                                       if mi_line[8] != &quot;cgroup&quot;:<br>
+                                               continue<br>
+                                       if cgname in mi_line[10].split(&quot;,&quot;):<br>
+                                               req.opts.ext_mnt.add(key = mi_line[4],<br>
+                                                               val = vz_cgroup_mount_map[cgkey])<br>
+                                               break<br>
+<br>
        def root_task_pid(self):<br>
                path = &quot;/var/run/ve/{0}.init.pid&quot;.<wbr>format(self._ctid)<br>
                with open(path) as pidfile:<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.8.3.1<br>
<br>
</font></span></div><br></div>