diff options
author | Kotresh HR <khiremat@redhat.com> | 2018-06-07 04:11:25 -0400 |
---|---|---|
committer | Kotresh HR <khiremat@redhat.com> | 2018-06-22 11:37:25 +0000 |
commit | 8a7e70a221778cd54c8bda9d6c2a522511d36ed1 (patch) | |
tree | 3545d4930bbec15d808d2d9f9a9b9598325e0bda /geo-replication | |
parent | 4b7707382bc763f089e14334c2b7f3139e186c1f (diff) |
geo-rep: Fix geo-rep for older versions of unshare
Geo-rep mounts are private to worker. It uses
mount namespace using unshare command to achieve
the same. Well, the unshare command has to support
'--propagation' option. So geo-rep breaks on the
systems with older unshare version. The patch
makes it fall back to lazy umount behaviour if
the unshare does not support propagation option.
fixes: bz#1589782
Change-Id: Ia614f068aede288d63ac62fea4461b1865066054
Signed-off-by: Kotresh HR <khiremat@redhat.com>
Diffstat (limited to 'geo-replication')
-rw-r--r-- | geo-replication/syncdaemon/monitor.py | 15 | ||||
-rw-r--r-- | geo-replication/syncdaemon/resource.py | 17 | ||||
-rw-r--r-- | geo-replication/syncdaemon/syncdutils.py | 17 |
3 files changed, 42 insertions, 7 deletions
diff --git a/geo-replication/syncdaemon/monitor.py b/geo-replication/syncdaemon/monitor.py index 0d1423aca9f..40818427bfe 100644 --- a/geo-replication/syncdaemon/monitor.py +++ b/geo-replication/syncdaemon/monitor.py @@ -26,7 +26,7 @@ from syncdutils import set_term_handler, GsyncdError from syncdutils import Thread, finalize, Volinfo, VolinfoFromGconf from syncdutils import gf_event, EVENT_GEOREP_FAULTY, get_up_nodes from gsyncdstatus import GeorepStatus, set_monitor_status - +from syncdutils import unshare_propagation_supported ParseError = XET.ParseError if hasattr(XET, 'ParseError') else SyntaxError @@ -225,9 +225,16 @@ class Monitor(object): if access_mount: os.execv(sys.executable, args_to_worker) else: - unshare_cmd = ['unshare', '-m', '--propagation', 'private'] - cmd = unshare_cmd + args_to_worker - os.execvp("unshare", cmd) + if unshare_propagation_supported(): + logging.debug("Worker would mount volume privately") + unshare_cmd = ['unshare', '-m', '--propagation', + 'private'] + cmd = unshare_cmd + args_to_worker + os.execvp("unshare", cmd) + else: + logging.debug("Mount is not private. It would be lazy" + " umounted") + os.execv(sys.executable, args_to_worker) cpids.add(cpid) agents.add(apid) diff --git a/geo-replication/syncdaemon/resource.py b/geo-replication/syncdaemon/resource.py index a75d0ddfccd..e261812f39f 100644 --- a/geo-replication/syncdaemon/resource.py +++ b/geo-replication/syncdaemon/resource.py @@ -40,6 +40,7 @@ from syncdutils import GX_GFID_CANONICAL_LEN from gsyncdstatus import GeorepStatus from syncdutils import lf, Popen, sup, Volinfo from syncdutils import Xattr, matching_disk_gfid, get_gfid_from_mnt +from syncdutils import unshare_propagation_supported ENOTSUP = getattr(errno, 'ENOTSUP', 'EOPNOTSUPP') @@ -900,15 +901,25 @@ class Mounter(object): assert(mntdata[-1] == '\0') mntpt = mntdata[:-1] assert(mntpt) - if mounted and rconf.args.subcmd == "slave" \ + + umount_master = False + umount_slave = False + if rconf.args.subcmd == "worker" \ + and not unshare_propagation_supported() \ + and not gconf.get("access-mount"): + umount_master = True + if rconf.args.subcmd == "slave" \ and not gconf.get("slave-access-mount"): + umount_slave = True + + if mounted and (umount_master or umount_slave): po = self.umount_l(mntpt) po.terminate_geterr(fail_on_err=False) if po.returncode != 0: po.errlog() rv = po.returncode - if rconf.args.subcmd == "slave" \ - and not gconf.get("slave-access-mount"): + logging.debug("Lazy umount done: %s" % mntpt) + if umount_master or umount_slave: self.cleanup_mntpt(mntpt) except: logging.exception('mount cleanup failure:') diff --git a/geo-replication/syncdaemon/syncdutils.py b/geo-replication/syncdaemon/syncdutils.py index ab6753ee96c..6acc9f17ad7 100644 --- a/geo-replication/syncdaemon/syncdutils.py +++ b/geo-replication/syncdaemon/syncdutils.py @@ -65,6 +65,7 @@ CHANGELOG_AGENT_SERVER_VERSION = 1.0 CHANGELOG_AGENT_CLIENT_VERSION = 1.0 NodeID = None rsync_version = None +unshare_mnt_propagation = None SPACE_ESCAPE_CHAR = "%20" NEWLINE_ESCAPE_CHAR = "%0A" PERCENTAGE_ESCAPE_CHAR = "%25" @@ -626,6 +627,22 @@ def get_master_and_slave_data_from_args(args): return (master_name, slave_data) +def unshare_propagation_supported(): + global unshare_mnt_propagation + if unshare_mnt_propagation is not None: + return unshare_mnt_propagation + + unshare_mnt_propagation = False + p = subprocess.Popen(["unshare", "--help"], + stderr=subprocess.PIPE, + stdout=subprocess.PIPE) + out, err = p.communicate() + if p.returncode == 0: + if "propagation" in out: + unshare_mnt_propagation = True + + return unshare_mnt_propagation + def get_rsync_version(rsync_cmd): global rsync_version |