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 /xlators/features/marker/utils/syncdaemon/libcxattr.py | |
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
Diffstat (limited to 'xlators/features/marker/utils/syncdaemon/libcxattr.py')
-rw-r--r-- | xlators/features/marker/utils/syncdaemon/libcxattr.py | 63 |
1 files changed, 63 insertions, 0 deletions
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) + + + |