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>
This commit is contained in:
parent
4b7707382b
commit
8a7e70a221
@ -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)
|
||||
|
@ -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:')
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user