From 31efe81b13d6761cf153e71f7ac150751b2d4090 Mon Sep 17 00:00:00 2001 From: Csaba Henk Date: Mon, 7 Feb 2011 01:32:57 +0000 Subject: syncdaemon: add "setattr" server method, needed to synchronize metadata of links/dirs Signed-off-by: Csaba Henk Signed-off-by: Anand V. Avati BUG: 2318 (gsyncd.py :chmod on directory not working) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=2318 --- xlators/features/marker/utils/syncdaemon/master.py | 22 ++++++++++++++-------- .../features/marker/utils/syncdaemon/resource.py | 13 +++++++++++++ 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/xlators/features/marker/utils/syncdaemon/master.py b/xlators/features/marker/utils/syncdaemon/master.py index a2f9f718eb4..1abd0325268 100644 --- a/xlators/features/marker/utils/syncdaemon/master.py +++ b/xlators/features/marker/utils/syncdaemon/master.py @@ -67,7 +67,7 @@ class GMaster(object): self.jobtab[path] = [] self.jobtab[path].append((label, a, lambda : job(*a, **kw))) - def wait(self, path, mark): + def wait(self, path, *args): jobs = self.jobtab.pop(path, []) succeed = True for j in jobs: @@ -75,10 +75,12 @@ class GMaster(object): if not ret: succeed = False if succeed: - self.sendmark(path, mark) + self.sendmark(path, *args) return succeed - def sendmark(self, path, mark): + def sendmark(self, path, mark, adct=None): + if adct: + self.slave.server.setattr(path, adct) self.slave.server.set_xtime(path, self.uuid, mark) def crawl(self, path='.', xtl=None): @@ -141,12 +143,15 @@ class GMaster(object): else: raise for e, xte in chld: - mo = indulgently(e, lambda e: os.lstat(e).st_mode) - if mo == False: + st = indulgently(e, lambda e: os.lstat(e)) + if st == False: continue + mo = st.st_mode + adct = {'own': (st.st_uid, st.st_gid)} if stat.S_ISLNK(mo): - self.slave.server.symlink(os.readlink(e), e) - self.sendmark(e, xte) + if indulgently(e, lambda e: self.slave.server.symlink(os.readlink(e), e)) == False: + continue + self.sendmark(e, xte, adct) elif stat.S_ISREG(mo): logging.debug("syncing %s ..." % e) pb = self.syncer.add(e) @@ -159,7 +164,8 @@ class GMaster(object): logging.error("failed to sync " + e) self.add_job(path, 'reg', regjob, e, xte, pb) elif stat.S_ISDIR(mo): - if indulgently(e, lambda e: (self.add_job(path, 'cwait', self.wait, e, xte), + adct['mode'] = mo + if indulgently(e, lambda e: (self.add_job(path, 'cwait', self.wait, e, xte, adct), self.crawl(e, xte), True)[-1], blame=e) == False: continue diff --git a/xlators/features/marker/utils/syncdaemon/resource.py b/xlators/features/marker/utils/syncdaemon/resource.py index f484d1de5c1..7ba7cb9d453 100644 --- a/xlators/features/marker/utils/syncdaemon/resource.py +++ b/xlators/features/marker/utils/syncdaemon/resource.py @@ -1,6 +1,7 @@ import re import os import sys +import stat import time import errno import struct @@ -156,6 +157,18 @@ class Server(object): def set_xtime(cls, path, uuid, mark): Xattr.lsetxattr(path, '.'.join([cls.GX_NSPACE, uuid, 'xtime']), struct.pack('!II', *mark)) + @staticmethod + def setattr(path, adct): + own = adct.get('own') + if own: + os.lchown(path, *own) + mode = adct.get('mode') + if mode: + os.chmod(path, stat.S_IMODE(mode)) + times = adct.get('times') + if times: + os.utime(path, times) + @staticmethod def pid(): return os.getpid() -- cgit