diff options
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  | 
