diff options
| author | Csaba Henk <csaba@gluster.com> | 2011-04-16 10:32:53 +0000 | 
|---|---|---|
| committer | Anand Avati <avati@gluster.com> | 2011-04-16 10:51:31 -0700 | 
| commit | c78dafac7f82de8a7b72f42fcd58c01dbc4a88df (patch) | |
| tree | 751282782c091ba820ee612ccf572ed4b4ace87f | |
| parent | 679c3986b9b72d19d6057d400ec8f1fba1569853 (diff) | |
syncdaemon: load xattrs from libc on-demand
This reduces startup time for invocations other than master / slave role
(kind of which now proliferates glusterd)
Signed-off-by: Csaba Henk <csaba@gluster.com>
Signed-off-by: Anand Avati <avati@gluster.com>
BUG: 2780 (geo-replication operations take too much time to complete)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=2780
| -rw-r--r-- | xlators/features/marker/utils/syncdaemon/Makefile.am | 2 | ||||
| -rw-r--r-- | xlators/features/marker/utils/syncdaemon/libcxattr.py | 63 | ||||
| -rw-r--r-- | xlators/features/marker/utils/syncdaemon/resource.py | 66 | 
3 files changed, 75 insertions, 56 deletions
diff --git a/xlators/features/marker/utils/syncdaemon/Makefile.am b/xlators/features/marker/utils/syncdaemon/Makefile.am index c900fa93260..ef2dc9aea2c 100644 --- a/xlators/features/marker/utils/syncdaemon/Makefile.am +++ b/xlators/features/marker/utils/syncdaemon/Makefile.am @@ -1,5 +1,5 @@  syncdaemondir = $(libexecdir)/glusterfs/python/syncdaemon -syncdaemon_PYTHON = gconf.py gsyncd.py __init__.py master.py README.md repce.py resource.py configinterface.py syncdutils.py monitor.py +syncdaemon_PYTHON = gconf.py gsyncd.py __init__.py master.py README.md repce.py resource.py configinterface.py syncdutils.py monitor.py libcxattr.py  CLEANFILES = diff --git a/xlators/features/marker/utils/syncdaemon/libcxattr.py b/xlators/features/marker/utils/syncdaemon/libcxattr.py new file mode 100644 index 00000000000..907a16c7802 --- /dev/null +++ b/xlators/features/marker/utils/syncdaemon/libcxattr.py @@ -0,0 +1,63 @@ +import os +from ctypes import * +from ctypes.util import find_library + +class Xattr(object): + +    libc = CDLL(find_library("libc")) + +    @classmethod +    def geterrno(cls): +        return c_int.in_dll(cls.libc, 'errno').value + +    @classmethod +    def raise_oserr(cls): +        errn = cls.geterrno() +        raise OSError(errn, os.strerror(errn)) + +    @classmethod +    def _query_xattr(cls, path, siz, syscall, *a): +        if siz: +            buf = create_string_buffer('\0' * siz) +        else: +            buf = None +        ret = getattr(cls.libc, syscall)(*((path,) + a + (buf, siz))) +        if ret == -1: +            cls.raise_oserr() +        if siz: +            return buf.raw[:ret] +        else: +            return ret + +    @classmethod +    def lgetxattr(cls, path, attr, siz=0): +        return cls._query_xattr( path, siz, 'lgetxattr', attr) + +    @classmethod +    def llistxattr(cls, path, siz=0): +        ret = cls._query_xattr(path, siz, 'llistxattr') +        if isinstance(ret, str): +            ret = ret.split('\0') +        return ret + +    @classmethod +    def lsetxattr(cls, path, attr, val): +        ret = cls.libc.lsetxattr(path, attr, val, len(val), 0) +        if ret == -1: +            cls.raise_oserr() + +    @classmethod +    def lremovexattr(cls, path, attr): +        ret = cls.libc.lremovexattr(path, attr) +        if ret == -1: +            cls.raise_oserr() + +    @classmethod +    def llistxattr_buf(cls, path): +        size = cls.llistxattr(path) +        if size  == -1: +            raise_oserr() +        return cls.llistxattr(path, size) + + + diff --git a/xlators/features/marker/utils/syncdaemon/resource.py b/xlators/features/marker/utils/syncdaemon/resource.py index dbbb2d90289..45953727647 100644 --- a/xlators/features/marker/utils/syncdaemon/resource.py +++ b/xlators/features/marker/utils/syncdaemon/resource.py @@ -10,8 +10,6 @@ import select  import socket  import logging  import tempfile -from ctypes import * -from ctypes.util import find_library  from errno import EEXIST, ENOENT, ENODATA, ENOTDIR, ELOOP, EISDIR  from gconf import gconf @@ -56,62 +54,20 @@ def parse_url(ustr):      return getattr(this, sch.upper())(path) -class Xattr(object): +class _MetaXattr(object): -    libc = CDLL(find_library("libc")) +    # load Xattr stuff on-demand -    @classmethod -    def geterrno(cls): -        return c_int.in_dll(cls.libc, 'errno').value - -    @classmethod -    def raise_oserr(cls): -        errn = cls.geterrno() -        raise OSError(errn, os.strerror(errn)) - -    @classmethod -    def _query_xattr(cls, path, siz, syscall, *a): -        if siz: -            buf = create_string_buffer('\0' * siz) -        else: -            buf = None -        ret = getattr(cls.libc, syscall)(*((path,) + a + (buf, siz))) -        if ret == -1: -            cls.raise_oserr() -        if siz: -            return buf.raw[:ret] -        else: -            return ret - -    @classmethod -    def lgetxattr(cls, path, attr, siz=0): -        return cls._query_xattr( path, siz, 'lgetxattr', attr) - -    @classmethod -    def llistxattr(cls, path, siz=0): -        ret = cls._query_xattr(path, siz, 'llistxattr') -        if isinstance(ret, str): -            ret = ret.split('\0') -        return ret - -    @classmethod -    def lsetxattr(cls, path, attr, val): -        ret = cls.libc.lsetxattr(path, attr, val, len(val), 0) -        if ret == -1: -            cls.raise_oserr() - -    @classmethod -    def lremovexattr(cls, path, attr): -        ret = cls.libc.lremovexattr(path, attr) -        if ret == -1: -            cls.raise_oserr() +    def __getattr__(self, meth): +        from libcxattr import Xattr as LXattr +        xmeth = [ m for m in dir(LXattr) if m[0] != '_' ] +        if not meth in xmeth: +            return +        for m in xmeth: +            setattr(self, m, getattr(LXattr, m)) +        return getattr(self, meth) -    @classmethod -    def llistxattr_buf(cls, path): -        size = cls.llistxattr(path) -        if size  == -1: -            raise_oserr() -        return cls.llistxattr(path, size) +Xattr = _MetaXattr()  class Server(object):  | 
