<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 "ve" and</div><div class="gmail_quote">"beancounter" as private, and skips them, thus they are omitted now.</div><div class="gmail_quote">
<br>
Signed-off-by: Pavel Vokhmyanin <<a href="mailto:pvokhmyanin@virtuozzo.com">pvokhmyanin@virtuozzo.com</a>><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 = "cgexec"<br>
<br>
<br>
vz_cgroup_mount_map = {<br>
- "/sys/fs/cgroup/cpu,cpuacct": "cpu",<br>
- "/sys/fs/cgroup/cpuset": "cpuset",<br>
- "/sys/fs/cgroup/net_cls": "net_cls",<br>
- "/sys/fs/cgroup/memory": "memory",<br>
- "/sys/fs/cgroup/devices": "devices",<br>
- "/sys/fs/cgroup/blkio": "blkio",<br>
- "/sys/fs/cgroup/freezer": "freezer",<br>
- "/sys/fs/cgroup/beancounter": "beancounter",<br>
- "/sys/fs/cgroup/ve": "ve",<br>
- "/sys/fs/cgroup/perf_event": "perf_event",<br>
- "/sys/fs/cgroup/hugetlb": "hugetlb",<br>
- "/sys/fs/cgroup/systemd": "systemd",<br>
+ "cpu,cpuacct": "cpu",<br>
+ "cpuset": "cpuset",<br>
+ "net_cls": "net_cls",<br>
+ "memory": "memory",<br>
+ "devices": "devices",<br>
+ "blkio": "blkio",<br>
+ "freezer": "freezer",<br>
+ "perf_event": "perf_event",<br>
+ "hugetlb": "hugetlb",<br>
+ "systemd": "systemd",<br>
}<br>
<br>
<br>
@@ -129,7 +127,6 @@ class p_haul_type(object):<br>
<br>
def adjust_criu_req(self, req):<br>
"""Add module-specific options to criu request"""<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("/proc/self/mountinfo") 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."cpu,cpuacct"), walk each<br>
+ for cgname in cgkey.split(","):<br>
+<br>
+ # Substite "systemd" with "name=systemd" option<br>
+ if cgname == "systemd":<br>
+ cgname = "name=systemd"<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] != "cgroup":<br>
+ continue<br>
+ if cgname in mi_line[10].split(","):<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 = "/var/run/ve/{0}.init.pid".<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>